diff --git a/.changeset/ai-hungry-bear.md b/.changeset/ai-hungry-bear.md new file mode 100644 index 00000000000..444a92082bf --- /dev/null +++ b/.changeset/ai-hungry-bear.md @@ -0,0 +1,9 @@ +"@module-federation/enhanced": minor +--- + +Enhancements to layer handling in module federation tests and configuration. + +- Improved handling of `shareKey` for layers within `ConsumeSharedPlugin` and `ProvideSharedPlugin`. + - Conditionally prepend the `shareKey` with the `layer` if applicable. +- Introduced new layer configurations to support more nuanced federation scenarios that consider multiple layers of dependency. +``` diff --git a/.changeset/ai-sleepy-fox.md b/.changeset/ai-sleepy-fox.md new file mode 100644 index 00000000000..36d84f71503 --- /dev/null +++ b/.changeset/ai-sleepy-fox.md @@ -0,0 +1,9 @@ +--- +"@module-federation/enhanced": patch +--- + +Refactored module sharing configuration handling. + +- Simplified plugin schema for better maintainability +- Improved layer-based module sharing test coverage +- Removed redundant plugin exports diff --git a/.changeset/ai-sleepy-tiger.md b/.changeset/ai-sleepy-tiger.md new file mode 100644 index 00000000000..6c11ece998e --- /dev/null +++ b/.changeset/ai-sleepy-tiger.md @@ -0,0 +1,6 @@ +--- +"@module-federation/runtime": minor +--- + +- Added a new property 'layer' of type string or null to SharedConfig. +``` diff --git a/.changeset/brown-badgers-fetch.md b/.changeset/brown-badgers-fetch.md new file mode 100644 index 00000000000..00d28f1f096 --- /dev/null +++ b/.changeset/brown-badgers-fetch.md @@ -0,0 +1,5 @@ +--- +'@module-federation/enhanced': minor +--- + +support request option on ConsumeSharePlugin. Allows matching requests like the object key of shared does diff --git a/.changeset/shy-snails-battle.md b/.changeset/shy-snails-battle.md new file mode 100644 index 00000000000..8d4fb5ec2f1 --- /dev/null +++ b/.changeset/shy-snails-battle.md @@ -0,0 +1,5 @@ +--- +'@module-federation/enhanced': minor +--- + +Layer support for Provide Share Plugin diff --git a/.gitignore b/.gitignore index fffaf8e2ec1..fbb33765fd5 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,7 @@ /.nx # dependencies node_modules - +next.js # IDEs and editors /.idea .project @@ -70,4 +70,7 @@ packages/enhanced/test/js # storybook cases !apps/rslib-module/@mf-types/** -**/vite.config.{js,ts,mjs,mts,cjs,cts}.timestamp* \ No newline at end of file +**/vite.config.{js,ts,mjs,mts,cjs,cts}.timestamp* + +# Federation +**/.federation diff --git a/apps/next-app-router-4000/.eslintrc.json b/apps/next-app-router-4000/.eslintrc.json new file mode 100755 index 00000000000..bffb357a712 --- /dev/null +++ b/apps/next-app-router-4000/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/apps/next-app-router-4000/.gitignore b/apps/next-app-router-4000/.gitignore new file mode 100755 index 00000000000..6d1ed289361 --- /dev/null +++ b/apps/next-app-router-4000/.gitignore @@ -0,0 +1,37 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +/.yarn + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env* +!.env*.example + +# vercel +.vercel + +# typescript +*.tsbuildinfo diff --git a/apps/next-app-router-4000/.npmrc b/apps/next-app-router-4000/.npmrc new file mode 100644 index 00000000000..cffe8cdef13 --- /dev/null +++ b/apps/next-app-router-4000/.npmrc @@ -0,0 +1 @@ +save-exact=true diff --git a/apps/next-app-router-4000/.prettierignore b/apps/next-app-router-4000/.prettierignore new file mode 100644 index 00000000000..a66d7e1f76d --- /dev/null +++ b/apps/next-app-router-4000/.prettierignore @@ -0,0 +1,2 @@ +.next +pnpm-lock.yaml diff --git a/apps/next-app-router-4000/app/api/categories/category.d.ts b/apps/next-app-router-4000/app/api/categories/category.d.ts new file mode 100644 index 00000000000..dccaa7448d2 --- /dev/null +++ b/apps/next-app-router-4000/app/api/categories/category.d.ts @@ -0,0 +1,6 @@ +export type Category = { + name: string; + slug: string; + count: number; + parent: string | null; +}; diff --git a/apps/next-app-router-4000/app/api/categories/getCategories.ts b/apps/next-app-router-4000/app/api/categories/getCategories.ts new file mode 100644 index 00000000000..989a293429c --- /dev/null +++ b/apps/next-app-router-4000/app/api/categories/getCategories.ts @@ -0,0 +1,52 @@ +import { notFound } from 'next/navigation'; +import type { Category } from './category'; + +// `server-only` guarantees any modules that import code in file +// will never run on the client. Even though this particular API +// doesn't currently use sensitive environment variables, it's +// good practice to add `server-only` preemptively. +import 'server-only'; + +export async function getCategories({ parent }: { parent?: string } = {}) { + const res = await fetch( + `https://app-playground-api.vercel.app/api/categories${ + parent ? `?parent=${parent}` : '' + }`, + ); + + if (!res.ok) { + // Render the closest `error.js` Error Boundary + throw new Error('Something went wrong!'); + } + + const categories = (await res.json()) as Category[]; + + if (categories.length === 0) { + // Render the closest `not-found.js` Error Boundary + notFound(); + } + + return categories; +} + +export async function getCategory({ slug }: { slug: string }) { + const res = await fetch( + `https://app-playground-api.vercel.app/api/categories${ + slug ? `?slug=${slug}` : '' + }`, + ); + + if (!res.ok) { + // Render the closest `error.js` Error Boundary + throw new Error('Something went wrong!'); + } + + const category = (await res.json()) as Category; + + if (!category) { + // Render the closest `not-found.js` Error Boundary + notFound(); + } + + return category; +} diff --git a/apps/next-app-router-4000/app/api/og/Inter-SemiBold.ttf b/apps/next-app-router-4000/app/api/og/Inter-SemiBold.ttf new file mode 100644 index 00000000000..278ceaa36ba Binary files /dev/null and b/apps/next-app-router-4000/app/api/og/Inter-SemiBold.ttf differ diff --git a/apps/next-app-router-4000/app/api/og/route.tsx b/apps/next-app-router-4000/app/api/og/route.tsx new file mode 100644 index 00000000000..48c1bfaebdc --- /dev/null +++ b/apps/next-app-router-4000/app/api/og/route.tsx @@ -0,0 +1,656 @@ +import type { NextRequest } from 'next/server'; +import { ImageResponse } from 'next/og'; +import type { ReactElement } from 'react'; + +export const runtime = 'edge'; + +const interSemiBold = fetch( + new URL('./Inter-SemiBold.ttf', import.meta.url), +).then((res) => res.arrayBuffer()); + +export async function GET(req: NextRequest): Promise { + try { + const { searchParams } = new URL(req.url); + const isLight = req.headers.get('Sec-CH-Prefers-Color-Scheme') === 'light'; + + const title = searchParams.has('title') + ? searchParams.get('title') + : 'App Router Playground'; + + return new ImageResponse( + ( +
+ {isLight ? : } +
+ {title} +
+
+ ), + { + width: 843, + height: 441, + fonts: [ + { + name: 'Inter', + data: await interSemiBold, + style: 'normal', + weight: 400, + }, + ], + }, + ); + } catch (e) { + if (!(e instanceof Error)) throw e; + + // eslint-disable-next-line no-console + console.log(e.message); + return new Response(`Failed to generate the image`, { + status: 500, + }); + } +} + +function LightSvg(): ReactElement { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +function DarkSvg(): ReactElement { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/apps/next-app-router-4000/app/api/products/product.d.ts b/apps/next-app-router-4000/app/api/products/product.d.ts new file mode 100644 index 00000000000..c279cf7637d --- /dev/null +++ b/apps/next-app-router-4000/app/api/products/product.d.ts @@ -0,0 +1,37 @@ +export type Product = { + id: string; + stock: number; + rating: number; + name: string; + description: string; + price: Price; + isBestSeller: boolean; + leadTime: number; + image?: string; + imageBlur?: string; + discount?: Discount; + usedPrice?: UsedPrice; +}; + +type Price = { + amount: number; + currency: Currency; + scale: number; +}; + +type Currency = { + code: string; + base: number; + exponent: number; +}; + +type Discount = { + percent: number; + expires?: number; +}; + +type UsedPrice = { + amount: number; + currency: Currency; + scale: number; +}; diff --git a/apps/next-app-router-4000/app/api/revalidate/route.ts b/apps/next-app-router-4000/app/api/revalidate/route.ts new file mode 100644 index 00000000000..fc676f685cb --- /dev/null +++ b/apps/next-app-router-4000/app/api/revalidate/route.ts @@ -0,0 +1,16 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { revalidatePath, revalidateTag } from 'next/cache'; + +export async function GET(request: NextRequest) { + const path = request.nextUrl.searchParams.get('path') || '/isr/[id]'; + const collection = + request.nextUrl.searchParams.get('collection') || 'collection'; + revalidatePath(path); + revalidateTag(collection); + console.log('revalidated', path, collection); + return NextResponse.json({ + revalidated: true, + now: Date.now(), + cache: 'no-store', + }); +} diff --git a/apps/next-app-router-4000/app/api/reviews/getReviews.ts b/apps/next-app-router-4000/app/api/reviews/getReviews.ts new file mode 100644 index 00000000000..a42b409ee00 --- /dev/null +++ b/apps/next-app-router-4000/app/api/reviews/getReviews.ts @@ -0,0 +1,26 @@ +import { notFound } from 'next/navigation'; +import type { Review } from './review'; + +// `server-only` guarantees any modules that import code in file +// will never run on the client. Even though this particular api +// doesn't currently use sensitive environment variables, it's +// good practise to add `server-only` preemptively. +import 'server-only'; + +export async function getReviews() { + const res = await fetch(`https://app-playground-api.vercel.app/api/reviews`); + + if (!res.ok) { + // Render the closest `error.js` Error Boundary + throw new Error('Something went wrong!'); + } + + const reviews = (await res.json()) as Review[]; + + if (reviews.length === 0) { + // Render the closest `not-found.js` Error Boundary + notFound(); + } + + return reviews; +} diff --git a/apps/next-app-router-4000/app/api/reviews/review.d.ts b/apps/next-app-router-4000/app/api/reviews/review.d.ts new file mode 100644 index 00000000000..0135e4d2dd2 --- /dev/null +++ b/apps/next-app-router-4000/app/api/reviews/review.d.ts @@ -0,0 +1,6 @@ +export type Review = { + id: string; + name: string; + rating: number; + text: string; +}; diff --git a/apps/next-app-router-4000/app/context/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4000/app/context/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..3b2e5d0eaf6 --- /dev/null +++ b/apps/next-app-router-4000/app/context/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,23 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { notFound } from 'next/navigation'; +import { Counter } from '../../context-click-counter'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string; subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( + +
+

+ {category.name} +

+ + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/context/[categorySlug]/layout.tsx b/apps/next-app-router-4000/app/context/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..514d27900fe --- /dev/null +++ b/apps/next-app-router-4000/app/context/[categorySlug]/layout.tsx @@ -0,0 +1,37 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { TabGroup } from '#/ui/tab-group'; +import { Counter } from '../context-click-counter'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( + +
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
{children}
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/context/[categorySlug]/page.tsx b/apps/next-app-router-4000/app/context/[categorySlug]/page.tsx new file mode 100644 index 00000000000..121a5be9fb4 --- /dev/null +++ b/apps/next-app-router-4000/app/context/[categorySlug]/page.tsx @@ -0,0 +1,22 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { Counter } from '../context-click-counter'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + + return ( + +
+

+ All {category.name} +

+ + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/context/context-click-counter.tsx b/apps/next-app-router-4000/app/context/context-click-counter.tsx new file mode 100644 index 00000000000..a59be8aeb2f --- /dev/null +++ b/apps/next-app-router-4000/app/context/context-click-counter.tsx @@ -0,0 +1,47 @@ +'use client'; + +import { useCounter } from './counter-context'; +import React from 'react'; +import { Boundary } from '#/ui/boundary'; +import dynamic from 'next/dynamic'; +const Button = dynamic(() => import('remote_4001/Button'), { ssr: true }); + +const ContextClickCounter = () => { + const [count, setCount] = useCounter(); + + return ( + + + + + ); +}; + +export const Counter = () => { + const [count] = useCounter(); + + return ( + +
+ {count} Clicks +
+
+ ); +}; + +export default ContextClickCounter; diff --git a/apps/next-app-router-4000/app/context/counter-context.tsx b/apps/next-app-router-4000/app/context/counter-context.tsx new file mode 100644 index 00000000000..999c04477e9 --- /dev/null +++ b/apps/next-app-router-4000/app/context/counter-context.tsx @@ -0,0 +1,24 @@ +'use client'; + +import React from 'react'; + +const CounterContext = React.createContext< + [number, React.Dispatch>] | undefined +>(undefined); + +export function CounterProvider({ children }: { children: React.ReactNode }) { + const [count, setCount] = React.useState(0); + return ( + + {children} + + ); +} + +export function useCounter() { + const context = React.useContext(CounterContext); + if (context === undefined) { + throw new Error('useCounter must be used within a CounterProvider'); + } + return context; +} diff --git a/apps/next-app-router-4000/app/context/layout.tsx b/apps/next-app-router-4000/app/context/layout.tsx new file mode 100644 index 00000000000..8caed20a1c4 --- /dev/null +++ b/apps/next-app-router-4000/app/context/layout.tsx @@ -0,0 +1,66 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { TabGroup } from '#/ui/tab-group'; +import { CounterProvider } from 'app/context/counter-context'; +import React from 'react'; +import ContextClickCounter from './context-click-counter'; + +const title = 'Client Context'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + return ( + + + + +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> +
+ + +
{children}
+
+
+
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/context/page.tsx b/apps/next-app-router-4000/app/context/page.tsx new file mode 100644 index 00000000000..4828d0a6c68 --- /dev/null +++ b/apps/next-app-router-4000/app/context/page.tsx @@ -0,0 +1,30 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Client Context

+ +
    +
  • + This example uses context to share state between Client Components + that cross the Server/Client Component boundary. +
  • +
  • + Try incrementing the counter and navigating between pages. Note how + the counter state is shared across the app even though they are inside + different layouts and pages that are Server Components. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/error-handling/[categorySlug]/[subCategorySlug]/error.tsx b/apps/next-app-router-4000/app/error-handling/[categorySlug]/[subCategorySlug]/error.tsx new file mode 100644 index 00000000000..bed2b1c2525 --- /dev/null +++ b/apps/next-app-router-4000/app/error-handling/[categorySlug]/[subCategorySlug]/error.tsx @@ -0,0 +1,26 @@ +'use client'; + +import { Boundary } from '#/ui/boundary'; +import Button from 'remote_4001/Button'; +import React from 'react'; + +export default function Error({ error, reset }: any) { + React.useEffect(() => { + console.log('logging error:', error); + }, [error]); + + return ( + +
+

Error

+

{error?.message}

+
+ +
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/error-handling/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4000/app/error-handling/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..0917d305fcb --- /dev/null +++ b/apps/next-app-router-4000/app/error-handling/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,25 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import BuggyButton from '#/ui/buggy-button'; +import { SkeletonCard } from '#/ui/skeleton-card'; +import { notFound } from 'next/navigation'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string; subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ + + +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/error-handling/[categorySlug]/error.tsx b/apps/next-app-router-4000/app/error-handling/[categorySlug]/error.tsx new file mode 100644 index 00000000000..a3b35cc8051 --- /dev/null +++ b/apps/next-app-router-4000/app/error-handling/[categorySlug]/error.tsx @@ -0,0 +1,23 @@ +'use client'; + +import { Boundary } from '#/ui/boundary'; +import Button from 'remote_4001/Button'; +import React from 'react'; + +export default function Error({ error, reset }: any) { + React.useEffect(() => { + console.log('logging error:', error); + }, [error]); + + return ( + +
+

Error

+

{error?.message}

+
+ +
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/error-handling/[categorySlug]/layout.tsx b/apps/next-app-router-4000/app/error-handling/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..02934ebc6cf --- /dev/null +++ b/apps/next-app-router-4000/app/error-handling/[categorySlug]/layout.tsx @@ -0,0 +1,42 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/error-handling/[categorySlug]/page.tsx b/apps/next-app-router-4000/app/error-handling/[categorySlug]/page.tsx new file mode 100644 index 00000000000..1cb6382c394 --- /dev/null +++ b/apps/next-app-router-4000/app/error-handling/[categorySlug]/page.tsx @@ -0,0 +1,27 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import BuggyButton from '#/ui/buggy-button'; +import { SkeletonCard } from '#/ui/skeleton-card'; +import { notFound } from 'next/navigation'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + + return ( +
+

+ All {category.name} +

+ + + +
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/error-handling/[categorySlug]/template.tsx b/apps/next-app-router-4000/app/error-handling/[categorySlug]/template.tsx new file mode 100644 index 00000000000..de11d76dc30 --- /dev/null +++ b/apps/next-app-router-4000/app/error-handling/[categorySlug]/template.tsx @@ -0,0 +1,5 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/error-handling/error.tsx b/apps/next-app-router-4000/app/error-handling/error.tsx new file mode 100644 index 00000000000..70a7ef16ecb --- /dev/null +++ b/apps/next-app-router-4000/app/error-handling/error.tsx @@ -0,0 +1,23 @@ +'use client'; + +import { Boundary } from '#/ui/boundary'; +import Button from 'remote_4001/Button'; +import React from 'react'; + +export default function Error({ error, reset }: any) { + React.useEffect(() => { + console.log('logging error:', error); + }, [error]); + + return ( + +
+

Error

+

{error?.message}

+
+ +
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/error-handling/layout.tsx b/apps/next-app-router-4000/app/error-handling/layout.tsx new file mode 100644 index 00000000000..506e7d4ba89 --- /dev/null +++ b/apps/next-app-router-4000/app/error-handling/layout.tsx @@ -0,0 +1,47 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Error Handling'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/error-handling/page.tsx b/apps/next-app-router-4000/app/error-handling/page.tsx new file mode 100644 index 00000000000..8852aa4337c --- /dev/null +++ b/apps/next-app-router-4000/app/error-handling/page.tsx @@ -0,0 +1,34 @@ +import BuggyButton from '#/ui/buggy-button'; +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Error Handling

+ +
    +
  • + error.js defines the error boundary for a route segment + and the children below it. It can be used to show specific error + information, and functionality to attempt to recover from the error. +
  • +
  • + Trying navigation pages and triggering an error inside nested layouts. + Notice how the error is isolated to that segment, while the rest of + the app remains interactive. +
  • +
+ +
+ + + + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/error-handling/template.tsx b/apps/next-app-router-4000/app/error-handling/template.tsx new file mode 100644 index 00000000000..de11d76dc30 --- /dev/null +++ b/apps/next-app-router-4000/app/error-handling/template.tsx @@ -0,0 +1,5 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/favicon.ico b/apps/next-app-router-4000/app/favicon.ico new file mode 100644 index 00000000000..af98450595e Binary files /dev/null and b/apps/next-app-router-4000/app/favicon.ico differ diff --git a/apps/next-app-router-4000/app/hooks/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4000/app/hooks/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..72ad9f58087 --- /dev/null +++ b/apps/next-app-router-4000/app/hooks/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,17 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { HooksClient } from '#/app/hooks/_components/router-context'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string; subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ + +
+ ); +} diff --git a/apps/next-app-router-4000/app/hooks/[categorySlug]/layout.tsx b/apps/next-app-router-4000/app/hooks/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..1ba58575f65 --- /dev/null +++ b/apps/next-app-router-4000/app/hooks/[categorySlug]/layout.tsx @@ -0,0 +1,43 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { LayoutHooks } from '#/app/hooks/_components/router-context-layout'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ + + +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/hooks/[categorySlug]/page.tsx b/apps/next-app-router-4000/app/hooks/[categorySlug]/page.tsx new file mode 100644 index 00000000000..a518e7c3c52 --- /dev/null +++ b/apps/next-app-router-4000/app/hooks/[categorySlug]/page.tsx @@ -0,0 +1,19 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { HooksClient } from '#/app/hooks/_components/router-context'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + + return ( +
+

+ All {category.name} +

+ + +
+ ); +} diff --git a/apps/next-app-router-4000/app/hooks/[categorySlug]/template.tsx b/apps/next-app-router-4000/app/hooks/[categorySlug]/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/hooks/[categorySlug]/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/hooks/_components/router-context-layout.tsx b/apps/next-app-router-4000/app/hooks/_components/router-context-layout.tsx new file mode 100644 index 00000000000..ce4c8118548 --- /dev/null +++ b/apps/next-app-router-4000/app/hooks/_components/router-context-layout.tsx @@ -0,0 +1,29 @@ +'use client'; + +import { Boundary } from '#/ui/boundary'; +import { + useSelectedLayoutSegment, + useSelectedLayoutSegments, +} from 'next/navigation'; + +export function LayoutHooks() { + const selectedLayoutSegment = useSelectedLayoutSegment(); + const selectedLayoutSegments = useSelectedLayoutSegments(); + + return selectedLayoutSegment ? ( + +
+
+          {JSON.stringify(
+            {
+              useSelectedLayoutSegment: selectedLayoutSegment,
+              useSelectedLayoutSegments: selectedLayoutSegments,
+            },
+            null,
+            2,
+          )}
+        
+
+
+ ) : null; +} diff --git a/apps/next-app-router-4000/app/hooks/_components/router-context.tsx b/apps/next-app-router-4000/app/hooks/_components/router-context.tsx new file mode 100644 index 00000000000..42fe045c2ed --- /dev/null +++ b/apps/next-app-router-4000/app/hooks/_components/router-context.tsx @@ -0,0 +1,40 @@ +'use client'; + +import { Boundary } from '#/ui/boundary'; +import { + useParams, + usePathname, + useSearchParams, + useSelectedLayoutSegment, + useSelectedLayoutSegments, +} from 'next/navigation'; + +export function HooksClient() { + const pathname = usePathname(); + const params = useParams(); + const selectedLayoutSegment = useSelectedLayoutSegment(); + const selectedLayoutSegments = useSelectedLayoutSegments(); + const searchParams = useSearchParams(); + + return ( + +
+
+          {JSON.stringify(
+            {
+              usePathname: pathname,
+              useParams: params,
+              useSearchParams: searchParams
+                ? Object.fromEntries(searchParams.entries())
+                : {},
+              useSelectedLayoutSegment: selectedLayoutSegment,
+              useSelectedLayoutSegments: selectedLayoutSegments,
+            },
+            null,
+            2,
+          )}
+        
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/hooks/layout.tsx b/apps/next-app-router-4000/app/hooks/layout.tsx new file mode 100644 index 00000000000..ac30b428cd1 --- /dev/null +++ b/apps/next-app-router-4000/app/hooks/layout.tsx @@ -0,0 +1,50 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { LayoutHooks } from '#/app/hooks/_components/router-context-layout'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Hooks'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ + + +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/hooks/page.tsx b/apps/next-app-router-4000/app/hooks/page.tsx new file mode 100644 index 00000000000..c216fb991d6 --- /dev/null +++ b/apps/next-app-router-4000/app/hooks/page.tsx @@ -0,0 +1,32 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+
+

Client Component Hooks

+ +
    +
  • + Next.js provides a number of hooks for accessing routing information + from client components. +
  • +
  • + Try navigating each page and observing the output of each hook + called from the current routes layout.js and{' '} + page.js files. +
  • +
+ +
+ + Docs + + + Code + +
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/hooks/template.tsx b/apps/next-app-router-4000/app/hooks/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/hooks/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/isr/[id]/page.tsx b/apps/next-app-router-4000/app/isr/[id]/page.tsx new file mode 100644 index 00000000000..c95d3484f70 --- /dev/null +++ b/apps/next-app-router-4000/app/isr/[id]/page.tsx @@ -0,0 +1,30 @@ +import { RenderingInfo } from '#/ui/rendering-info'; + +export const dynamicParams = true; + +export async function generateStaticParams() { + return [{ id: '1' }, { id: '2' }, { id: '3' }]; +} + +export default async function Page(props: { params: Promise<{ id: string }> }) { + const params = await props.params; + const res = await fetch( + `https://jsonplaceholder.typicode.com/posts/${params.id}`, + { next: { revalidate: 60, tags: ['collection'] } }, + ); + const data = (await res.json()) as { title: string; body: string }; + + return ( +
+
+

+ {data.title} +

+

{data.body}

+
+
+ +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/isr/layout.tsx b/apps/next-app-router-4000/app/isr/layout.tsx new file mode 100644 index 00000000000..7cf3e34bd8e --- /dev/null +++ b/apps/next-app-router-4000/app/isr/layout.tsx @@ -0,0 +1,35 @@ +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Incremental Static Regeneration (ISR)'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default function Layout({ children }: { children: React.ReactNode }) { + const ids = [{ id: '1' }, { id: '2' }, { id: '3' }]; + + return ( +
+ ({ + text: `Post ${x.id}`, + slug: x.id, + })), + ]} + /> + +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/isr/loading.tsx b/apps/next-app-router-4000/app/isr/loading.tsx new file mode 100644 index 00000000000..2c150f871d2 --- /dev/null +++ b/apps/next-app-router-4000/app/isr/loading.tsx @@ -0,0 +1,5 @@ +import { RenderingPageSkeleton } from '#/ui/rendering-page-skeleton'; + +export default function Loading() { + return ; +} diff --git a/apps/next-app-router-4000/app/isr/page.tsx b/apps/next-app-router-4000/app/isr/page.tsx new file mode 100644 index 00000000000..d90ff0298bb --- /dev/null +++ b/apps/next-app-router-4000/app/isr/page.tsx @@ -0,0 +1,30 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Incremental Static Regeneration

+ +
    +
  • In this example, three posts fetch data using granular ISR.
  • +
  • Caches responses are fresh for 60 seconds.
  • +
  • + Try navigating to each post and noting the timestamp of when the page + was rendered. Refresh the page after 60 seconds to trigger a + revalidation for the next request. Refresh again to see the + revalidated page. +
  • +
  • Note that the fetch cache can be persisted across builds.
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/isr/template.tsx b/apps/next-app-router-4000/app/isr/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/isr/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/layout.tsx b/apps/next-app-router-4000/app/layout.tsx new file mode 100644 index 00000000000..ed79b53661a --- /dev/null +++ b/apps/next-app-router-4000/app/layout.tsx @@ -0,0 +1,53 @@ +import '#/styles/globals.css'; +import { AddressBar } from '#/ui/address-bar'; +import Byline from '#/ui/byline'; +// import { GlobalNav } from 'remote_4001/GlobalNav(rsc)'; +import { Metadata } from 'next'; + +export const metadata: Metadata = { + title: { + default: 'Next.js App Router', + template: '%s | Next.js App Router', + }, + metadataBase: new URL('https://app-router.vercel.app'), + description: + 'A playground to explore new Next.js App Router features such as nested layouts, instant loading states, streaming, and component level data fetching.', + openGraph: { + title: 'Next.js App Router Playground', + description: + 'A playground to explore new Next.js App Router features such as nested layouts, instant loading states, streaming, and component level data fetching.', + images: [`/api/og?title=Next.js App Router`], + }, + twitter: { + card: 'summary_large_image', + }, +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + {/**/} + +
+
+
+
+ +
+
+ +
+
{children}
+
+ +
+
+ + + ); +} diff --git a/apps/next-app-router-4000/app/layouts/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4000/app/layouts/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..4bbfae6d332 --- /dev/null +++ b/apps/next-app-router-4000/app/layouts/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,21 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/layouts/[categorySlug]/layout.tsx b/apps/next-app-router-4000/app/layouts/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..548d0baae9c --- /dev/null +++ b/apps/next-app-router-4000/app/layouts/[categorySlug]/layout.tsx @@ -0,0 +1,40 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/layouts/[categorySlug]/page.tsx b/apps/next-app-router-4000/app/layouts/[categorySlug]/page.tsx new file mode 100644 index 00000000000..672e25359c6 --- /dev/null +++ b/apps/next-app-router-4000/app/layouts/[categorySlug]/page.tsx @@ -0,0 +1,23 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + + return ( +
+

+ All {category.name} +

+ +
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/layouts/[categorySlug]/template.tsx b/apps/next-app-router-4000/app/layouts/[categorySlug]/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/layouts/[categorySlug]/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/layouts/layout.tsx b/apps/next-app-router-4000/app/layouts/layout.tsx new file mode 100644 index 00000000000..108ba315b9e --- /dev/null +++ b/apps/next-app-router-4000/app/layouts/layout.tsx @@ -0,0 +1,47 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Nested Layouts'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/layouts/page.tsx b/apps/next-app-router-4000/app/layouts/page.tsx new file mode 100644 index 00000000000..f636922b482 --- /dev/null +++ b/apps/next-app-router-4000/app/layouts/page.tsx @@ -0,0 +1,27 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Layouts

+ +
    +
  • + A layout is UI that is shared between multiple pages. On navigation, + layouts preserve state, remain interactive, and do not re-render. Two + or more layouts can also be nested. +
  • +
  • Try navigating between categories and sub categories.
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/layouts/template.tsx b/apps/next-app-router-4000/app/layouts/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/layouts/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/loading/[categorySlug]/page.tsx b/apps/next-app-router-4000/app/loading/[categorySlug]/page.tsx new file mode 100644 index 00000000000..1c1476a5a6c --- /dev/null +++ b/apps/next-app-router-4000/app/loading/[categorySlug]/page.tsx @@ -0,0 +1,43 @@ +import type { Category } from '#/app/api/categories/category'; +import { SkeletonCard } from '#/ui/skeleton-card'; +import { notFound } from 'next/navigation'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const res = await fetch( + // We intentionally delay the response to simulate a slow data + // request that would benefit from `loading.js` + `https://app-playground-api.vercel.app/api/categories?delay=1000&slug=${params.categorySlug}`, + { + // We intentionally disable Next.js Cache to better demo + // `loading.js` + cache: 'no-cache', + }, + ); + + if (!res.ok) { + // Render the closest `error.js` Error Boundary + throw new Error('Something went wrong!'); + } + + const category = (await res.json()) as Category; + + if (!category) { + // Render the closest `not-found.js` Error Boundary + notFound(); + } + + return ( +
+

{category.name}

+ +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/loading/layout.tsx b/apps/next-app-router-4000/app/loading/layout.tsx new file mode 100644 index 00000000000..0a38bb59e20 --- /dev/null +++ b/apps/next-app-router-4000/app/loading/layout.tsx @@ -0,0 +1,47 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import { notFound } from 'next/navigation'; +import React from 'react'; + +const title = 'Loading'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/loading/loading.tsx b/apps/next-app-router-4000/app/loading/loading.tsx new file mode 100644 index 00000000000..7cd327a15f3 --- /dev/null +++ b/apps/next-app-router-4000/app/loading/loading.tsx @@ -0,0 +1,17 @@ +import { SkeletonCard } from '#/ui/skeleton-card'; +export default function Loading() { + return ( +
+

Loading...

+ +
+ + + + + + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/loading/page.tsx b/apps/next-app-router-4000/app/loading/page.tsx new file mode 100644 index 00000000000..544dbea59ed --- /dev/null +++ b/apps/next-app-router-4000/app/loading/page.tsx @@ -0,0 +1,35 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Instant Loading States

+ +
    +
  • + This example has an artificial delay when "fetching" data + for each category page. loading.js is used to show a + loading skeleton immediately while data for category page loads before + being streamed in. +
  • +
  • + Shared layouts remain interactive while nested layouts or pages load. + Try clicking the counter while the children load. +
  • +
  • + Navigation is interruptible. Try navigating to one category, then + clicking a second category before the first one has loaded. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/loading/template.tsx b/apps/next-app-router-4000/app/loading/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/loading/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/not-found.tsx b/apps/next-app-router-4000/app/not-found.tsx new file mode 100644 index 00000000000..51b3d5ad4e4 --- /dev/null +++ b/apps/next-app-router-4000/app/not-found.tsx @@ -0,0 +1,13 @@ +import { Boundary } from '#/ui/boundary'; + +export default function NotFound() { + return ( + +
+

Not Found

+ +

Could not find requested resource

+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/not-found/[categorySlug]/[subCategorySlug]/not-found.tsx b/apps/next-app-router-4000/app/not-found/[categorySlug]/[subCategorySlug]/not-found.tsx new file mode 100644 index 00000000000..6bf5c5b3ceb --- /dev/null +++ b/apps/next-app-router-4000/app/not-found/[categorySlug]/[subCategorySlug]/not-found.tsx @@ -0,0 +1,16 @@ +import { Boundary } from '#/ui/boundary'; + +export default function NotFound() { + return ( + +
+

Sub Category Not Found

+ +

Could not find requested resource

+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/not-found/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4000/app/not-found/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..ed9d0322965 --- /dev/null +++ b/apps/next-app-router-4000/app/not-found/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,26 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string; subCategorySlug: string }>; +}) { + const params = await props.params; + // - `getCategory()` returns `notFound()` if the fetched data is `null` or `undefined`. + // - `notFound()` renders the closest `not-found.tsx` in the route segment hierarchy. + // - For `layout.js`, the closest `not-found.tsx` starts from the parent segment. + // - For `page.js`, the closest `not-found.tsx` starts from the same segment. + // - Learn more: https://nextjs.org/docs/app/building-your-application/routing#component-hierarchy. + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/not-found/[categorySlug]/layout.tsx b/apps/next-app-router-4000/app/not-found/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..13caeb5571e --- /dev/null +++ b/apps/next-app-router-4000/app/not-found/[categorySlug]/layout.tsx @@ -0,0 +1,51 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + // - `getCategory()` returns `notFound()` if the fetched data is `null` or `undefined`. + // - `notFound()` renders the closest `not-found.tsx` in the route segment hierarchy. + // - For `layout.js`, the closest `not-found.tsx` starts from the parent segment. + // - For `page.js`, the closest `not-found.tsx` starts from the same segment. + // - Learn more: https://nextjs.org/docs/app/building-your-application/routing#component-hierarchy. + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+
+ ({ + text: x.name, + slug: x.slug, + })), + { + text: 'Subcategory That Does Not Exist', + slug: 'does-not-exist', + }, + ]} + /> + +
+ +
+
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/not-found/[categorySlug]/not-found.tsx b/apps/next-app-router-4000/app/not-found/[categorySlug]/not-found.tsx new file mode 100644 index 00000000000..4f789bdc9d1 --- /dev/null +++ b/apps/next-app-router-4000/app/not-found/[categorySlug]/not-found.tsx @@ -0,0 +1,13 @@ +import { Boundary } from '#/ui/boundary'; + +export default function NotFound() { + return ( + +
+

Category Not Found

+ +

Could not find requested resource

+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/not-found/[categorySlug]/page.tsx b/apps/next-app-router-4000/app/not-found/[categorySlug]/page.tsx new file mode 100644 index 00000000000..f2f91ecc632 --- /dev/null +++ b/apps/next-app-router-4000/app/not-found/[categorySlug]/page.tsx @@ -0,0 +1,28 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + // - `getCategory()` returns `notFound()` if the fetched data is `null` or `undefined`. + // - `notFound()` renders the closest `not-found.tsx` in the route segment hierarchy. + // - For `layout.js`, the closest `not-found.tsx` starts from the parent segment. + // - For `page.js`, the closest `not-found.tsx` starts from the same segment. + // - Learn more: https://nextjs.org/docs/app/building-your-application/routing#component-hierarchy. + const category = await getCategory({ slug: params.categorySlug }); + + return ( +
+

+ All {category.name} +

+ +
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/not-found/[categorySlug]/template.tsx b/apps/next-app-router-4000/app/not-found/[categorySlug]/template.tsx new file mode 100644 index 00000000000..de11d76dc30 --- /dev/null +++ b/apps/next-app-router-4000/app/not-found/[categorySlug]/template.tsx @@ -0,0 +1,5 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/not-found/layout.tsx b/apps/next-app-router-4000/app/not-found/layout.tsx new file mode 100644 index 00000000000..87df3e0297b --- /dev/null +++ b/apps/next-app-router-4000/app/not-found/layout.tsx @@ -0,0 +1,51 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Not Found'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + { + text: 'Category That Does Not Exist', + slug: 'does-not-exist', + }, + ]} + /> + +
+ +
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/not-found/not-found.tsx b/apps/next-app-router-4000/app/not-found/not-found.tsx new file mode 100644 index 00000000000..6fd919d0777 --- /dev/null +++ b/apps/next-app-router-4000/app/not-found/not-found.tsx @@ -0,0 +1,13 @@ +import { Boundary } from '#/ui/boundary'; + +export default function NotFound() { + return ( + +
+

Not Found

+ +

Could not find requested resource

+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/not-found/page.tsx b/apps/next-app-router-4000/app/not-found/page.tsx new file mode 100644 index 00000000000..42bc8b3d535 --- /dev/null +++ b/apps/next-app-router-4000/app/not-found/page.tsx @@ -0,0 +1,54 @@ +import { ExternalLink } from '#/ui/external-link'; +import Link from 'next/link'; + +export default function Page() { + return ( +
+

Not Found

+ +
    +
  • + + + not-found.js + + {' '} + file is used to render UI when the{' '} + + + notFound() + + {' '} + function is thrown within a route segment. +
  • +
  • + In this example, when fetching the data we return{' '} + notFound() for{' '} + Categories and{' '} + + Sub Categories + {' '} + that do not exist. This renders the closest appropriate{' '} + not-found.js. +
  • +
  • + + Note: not-found.js currently only renders when + triggered by the notFound() function. We're + working on support for catching unmatched routes (404). + +
  • +
+ +
+ + Docs + + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/not-found/template.tsx b/apps/next-app-router-4000/app/not-found/template.tsx new file mode 100644 index 00000000000..de11d76dc30 --- /dev/null +++ b/apps/next-app-router-4000/app/not-found/template.tsx @@ -0,0 +1,5 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/page.tsx b/apps/next-app-router-4000/app/page.tsx new file mode 100644 index 00000000000..0c8b03c0c0e --- /dev/null +++ b/apps/next-app-router-4000/app/page.tsx @@ -0,0 +1,47 @@ +import { demos } from '#/lib/demos'; +import Link from 'next/link'; +import dynamic from 'next/dynamic'; +const Button = dynamic(() => import('remote_4001/Button'), { ssr: true }); + +export default function Page() { + return ( +
+ +

Examples

+ +
+ {demos.map((section) => { + return ( +
+
+ {section.name} +
+ +
+ {section.items.map((item) => { + return ( + +
+ {item.name} +
+ + {item.description ? ( +
+ {item.description} +
+ ) : null} + + ); + })} +
+
+ ); + })} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/@audience/default.tsx b/apps/next-app-router-4000/app/parallel-routes/@audience/default.tsx new file mode 100644 index 00000000000..2d141a3d32b --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/@audience/default.tsx @@ -0,0 +1,47 @@ +import { CurrentRoute } from '#/app/parallel-routes/_ui/current-route'; +import { Boundary } from '#/ui/boundary'; +import Link from 'next/link'; + +export default function Default() { + return ( + +
+

Default UI

+ +

+ Default UI is rendered because the @audience slot{' '} + does not contain a route segment that matches the + current{' '} + + / + {' '} + route. +

+ +
    +
  • + + @audience/ + + /page.js + {' '} + does not exist. +
  • + +
  • + @audience/default.js exists. +
  • +
+ +
+ + Home + +
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/@audience/demographics/page.tsx b/apps/next-app-router-4000/app/parallel-routes/@audience/demographics/page.tsx new file mode 100644 index 00000000000..94fb886c860 --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/@audience/demographics/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

Demographics

+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/@audience/layout.tsx b/apps/next-app-router-4000/app/parallel-routes/@audience/layout.tsx new file mode 100644 index 00000000000..de0189c5aad --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/@audience/layout.tsx @@ -0,0 +1,29 @@ +import { Boundary } from '#/ui/boundary'; +import { TabGroup } from '#/ui/tab-group'; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + +
+ + + {children} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/@audience/page.tsx b/apps/next-app-router-4000/app/parallel-routes/@audience/page.tsx new file mode 100644 index 00000000000..3af70b68693 --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/@audience/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

Home

+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/@audience/subscribers/page.tsx b/apps/next-app-router-4000/app/parallel-routes/@audience/subscribers/page.tsx new file mode 100644 index 00000000000..2f1df01665c --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/@audience/subscribers/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

Subscribers

+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/@views/default.tsx b/apps/next-app-router-4000/app/parallel-routes/@views/default.tsx new file mode 100644 index 00000000000..04054c9dd82 --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/@views/default.tsx @@ -0,0 +1,46 @@ +import { CurrentRoute } from '#/app/parallel-routes/_ui/current-route'; +import { Boundary } from '#/ui/boundary'; +import Link from 'next/link'; + +export default function Default() { + return ( + +
+

Default UI

+ +

+ Default UI is rendered because the @views slot{' '} + does not contain a route segment that matches the + current{' '} + + / + {' '} + route. +

+ +
    +
  • + + @views/ + + /page.js + {' '} + does not exist. +
  • + +
  • + @views/default.js exists. +
  • +
+
+ + Home + +
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/@views/impressions/page.tsx b/apps/next-app-router-4000/app/parallel-routes/@views/impressions/page.tsx new file mode 100644 index 00000000000..014ffc879a8 --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/@views/impressions/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

Impressions

+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/@views/layout.tsx b/apps/next-app-router-4000/app/parallel-routes/@views/layout.tsx new file mode 100644 index 00000000000..53d028c9375 --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/@views/layout.tsx @@ -0,0 +1,28 @@ +import { Boundary } from '#/ui/boundary'; +import { TabGroup } from '#/ui/tab-group'; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + +
+ + {children} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/@views/page.tsx b/apps/next-app-router-4000/app/parallel-routes/@views/page.tsx new file mode 100644 index 00000000000..c8f222581aa --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/@views/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

Home

+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/@views/view-duration/page.tsx b/apps/next-app-router-4000/app/parallel-routes/@views/view-duration/page.tsx new file mode 100644 index 00000000000..a95983c9491 --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/@views/view-duration/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

View Duration

+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/_ui/current-route.tsx b/apps/next-app-router-4000/app/parallel-routes/_ui/current-route.tsx new file mode 100644 index 00000000000..ca756b54acc --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/_ui/current-route.tsx @@ -0,0 +1,9 @@ +'use client'; + +import { usePathname } from 'next/navigation'; + +export function CurrentRoute({ slice = 2 }: { slice?: number }) { + const pathname = usePathname(); + + return <>{pathname?.split('/').slice(slice).join('/')}; +} diff --git a/apps/next-app-router-4000/app/parallel-routes/default.tsx b/apps/next-app-router-4000/app/parallel-routes/default.tsx new file mode 100644 index 00000000000..bc636c13e67 --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/default.tsx @@ -0,0 +1,54 @@ +import { CurrentRoute } from '#/app/parallel-routes/_ui/current-route'; +import { Boundary } from '#/ui/boundary'; +import Link from 'next/link'; + +export default function Default() { + return ( + +
+

Default UI

+ +

+ Default UI is rendered because the implicit @children{' '} + slot does not contain a route segment that matches + the current{' '} + + / + {' '} + route. +

+ +
    +
  • + + parallel-routes/ + + /page.js + {' '} + OR{' '} + + parallel-routes/@children/ + + /page.js + {' '} + do not exist. +
  • + +
  • + parallel-routes/default.js OR{' '} + parallel-routes/@children/default.js exists. +
  • +
+ +
+ + Home + +
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/layout.tsx b/apps/next-app-router-4000/app/parallel-routes/layout.tsx new file mode 100644 index 00000000000..db0f3ad8ea9 --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/layout.tsx @@ -0,0 +1,32 @@ +const title = 'Parallel Routes'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default function Layout({ + children, + audience, + views, +}: { + children: React.ReactNode; + audience: React.ReactNode; + views: React.ReactNode; +}) { + return ( +
+
+ {children} + +
+ {audience} + {views} +
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/not-found.tsx b/apps/next-app-router-4000/app/parallel-routes/not-found.tsx new file mode 100644 index 00000000000..0a093b49d74 --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/not-found.tsx @@ -0,0 +1,13 @@ +import { Boundary } from '#/ui/boundary'; + +export default function NotFound() { + return ( + +
+

Not Found

+ +

Could not find requested resource

+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/parallel-routes/page.tsx b/apps/next-app-router-4000/app/parallel-routes/page.tsx new file mode 100644 index 00000000000..f681f4e6af2 --- /dev/null +++ b/apps/next-app-router-4000/app/parallel-routes/page.tsx @@ -0,0 +1,52 @@ +import { Boundary } from '#/ui/boundary'; +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( + +
+

Parallel Routes

+
    +
  • + Parallel Routes allow you to simultaneously or conditionally render + multiple pages, with independent navigation, in the same layout. +
  • +
  • + Parallel Routes can be used for advanced routing patterns like{' '} + + Conditional Routes + {' '} + and{' '} + + Intercepted Routes + + . +
  • +
  • + Try using the tabs in one parallel route to navigate. Notice the URL + changes but the unaffected parallel route is preserved. +
  • +
  • + Try using the browser's backwards and forwards navigation. + Notice the browser's URL history state and active UI state is + correctly synced. +
  • +
  • + Try navigating to a tab in one parallel route and refreshing the + browser. Notice you can choose what UI to show parallel routes that + don't match the initial URL. +
  • +
+
+ + Docs + + + + Code + +
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/patterns/active-links/_components/nav-links.tsx b/apps/next-app-router-4000/app/patterns/active-links/_components/nav-links.tsx new file mode 100644 index 00000000000..4b6ce37cab1 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/active-links/_components/nav-links.tsx @@ -0,0 +1,34 @@ +'use client'; + +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; +import clsx from 'clsx'; + +export function NavLinks({ + links, +}: { + links: { href: string; name: string }[]; +}) { + // Alternatively, you could use `useParams` or `useSelectedLayoutSegment(s)` + const pathname = usePathname(); + + return ( + + ); +} diff --git a/apps/next-app-router-4000/app/patterns/active-links/community/page.tsx b/apps/next-app-router-4000/app/patterns/active-links/community/page.tsx new file mode 100644 index 00000000000..c068b02d3b2 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/active-links/community/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Community

; +} diff --git a/apps/next-app-router-4000/app/patterns/active-links/layout.tsx b/apps/next-app-router-4000/app/patterns/active-links/layout.tsx new file mode 100644 index 00000000000..ab5017e9e85 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/active-links/layout.tsx @@ -0,0 +1,32 @@ +import { NavLinks } from '#/app/patterns/active-links/_components/nav-links'; +import { NextLogoDark } from '#/ui/next-logo'; +import Image from 'next/image'; +import Link from 'next/link'; + +export default function Layout({ children }: { children: React.ReactNode }) { + // Hardcoded links or fetched from db + const links = [ + { href: '/patterns/active-links', name: 'Home' }, + { href: '/patterns/active-links/profile', name: 'Profile' }, + { href: '/patterns/active-links/community', name: 'Community' }, + { href: '/patterns/active-links/settings', name: 'Settings' }, + ]; + + return ( +
+
+ + + User + +
+
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/patterns/active-links/page.tsx b/apps/next-app-router-4000/app/patterns/active-links/page.tsx new file mode 100644 index 00000000000..17c847eeb0c --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/active-links/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Home

; +} diff --git a/apps/next-app-router-4000/app/patterns/active-links/profile/page.tsx b/apps/next-app-router-4000/app/patterns/active-links/profile/page.tsx new file mode 100644 index 00000000000..d22888e45d7 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/active-links/profile/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Profile

; +} diff --git a/apps/next-app-router-4000/app/patterns/active-links/settings/page.tsx b/apps/next-app-router-4000/app/patterns/active-links/settings/page.tsx new file mode 100644 index 00000000000..ab769269f16 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/active-links/settings/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Settings

; +} diff --git a/apps/next-app-router-4000/app/patterns/breadcrumbs/@slot/[...all]/page.tsx b/apps/next-app-router-4000/app/patterns/breadcrumbs/@slot/[...all]/page.tsx new file mode 100644 index 00000000000..24a98c10136 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/breadcrumbs/@slot/[...all]/page.tsx @@ -0,0 +1,25 @@ +import { Breadcrumbs } from '#/app/patterns/breadcrumbs/_components/breadcrumbs'; + +export default async function Page(props: { + params: Promise<{ + all: string[]; + }>; +}) { + const params = await props.params; + + const { all } = params; + + // Note: you could fetch breadcrumb data based on params here + // e.g. title, slug, children/siblings (for dropdowns) + const items = [ + { + text: 'Home', + href: '/patterns/breadcrumbs', + }, + ...all.map((param) => ({ + text: param, + href: `/patterns/breadcrumbs/${param}`, + })), + ]; + return ; +} diff --git a/apps/next-app-router-4000/app/patterns/breadcrumbs/@slot/page.tsx b/apps/next-app-router-4000/app/patterns/breadcrumbs/@slot/page.tsx new file mode 100644 index 00000000000..212e9b903e3 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/breadcrumbs/@slot/page.tsx @@ -0,0 +1,13 @@ +import { Breadcrumbs } from '#/app/patterns/breadcrumbs/_components/breadcrumbs'; + +// Note: Next.js doesn't currently support optional catchAll segments in parallel routes. +// In the mean time, this file will match the "/breadcrumb" route. +export default function Page() { + const items = [ + { + text: 'Home', + href: '/patterns/breadcrumbs', + }, + ]; + return ; +} diff --git a/apps/next-app-router-4000/app/patterns/breadcrumbs/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4000/app/patterns/breadcrumbs/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..4bbfae6d332 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/breadcrumbs/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,21 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/patterns/breadcrumbs/[categorySlug]/layout.tsx b/apps/next-app-router-4000/app/patterns/breadcrumbs/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..cfef26af394 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/breadcrumbs/[categorySlug]/layout.tsx @@ -0,0 +1,35 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> +
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/patterns/breadcrumbs/[categorySlug]/page.tsx b/apps/next-app-router-4000/app/patterns/breadcrumbs/[categorySlug]/page.tsx new file mode 100644 index 00000000000..672e25359c6 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/breadcrumbs/[categorySlug]/page.tsx @@ -0,0 +1,23 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + + return ( +
+

+ All {category.name} +

+ +
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/patterns/breadcrumbs/_components/breadcrumbs.tsx b/apps/next-app-router-4000/app/patterns/breadcrumbs/_components/breadcrumbs.tsx new file mode 100644 index 00000000000..452724b1d0f --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/breadcrumbs/_components/breadcrumbs.tsx @@ -0,0 +1,31 @@ +import { ChevronRightIcon } from '@heroicons/react/24/outline'; +import Link from 'next/link'; +import { Fragment } from 'react'; + +export function Breadcrumbs({ + items, +}: { + items: { text: string; href: string }[]; +}) { + return ( +
+ {items.map((item, i) => { + return ( + + {i === 0 ? null : ( + + )} + + + {item.text} + + + ); + })} +
+ ); +} diff --git a/apps/next-app-router-4000/app/patterns/breadcrumbs/layout.tsx b/apps/next-app-router-4000/app/patterns/breadcrumbs/layout.tsx new file mode 100644 index 00000000000..e100c42f805 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/breadcrumbs/layout.tsx @@ -0,0 +1,47 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Breadcrumbs with Parallel Routes'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, + slot, +}: { + children: React.ReactNode; + slot: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+ {slot} + +
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> +
+ + {children} +
+ ); +} diff --git a/apps/next-app-router-4000/app/patterns/breadcrumbs/page.tsx b/apps/next-app-router-4000/app/patterns/breadcrumbs/page.tsx new file mode 100644 index 00000000000..579a2c5f6ac --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/breadcrumbs/page.tsx @@ -0,0 +1,43 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

+ Shared server-side UI that depends on URL information +

+ +
    +
  • + Typically, when you have shared UI, you'd put it inside a layout. + However, layouts do not receive searchParams and{' '} + params lower than their segment. This is a challenge for + shared UI like breadcrumbs that depends on the URL information. +
  • +
  • + For simple cases, you can move the UI to Client Components and use + router hooks such as usePathname and{' '} + useSearchParams. +
  • +
  • + This example shows how to use Parallel Routes and a{' '} + page.js in a catch all route to have pockets of shared UI + across your app. +
  • +
  • + Try navigating between categories and sub categories. Notice the + breadcrumbs can derive URL information. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/patterns/layout.tsx b/apps/next-app-router-4000/app/patterns/layout.tsx new file mode 100644 index 00000000000..d9758696867 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/layout.tsx @@ -0,0 +1,13 @@ +const title = 'Snippets'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default function Layout({ children }: { children: React.ReactNode }) { + return children; +} diff --git a/apps/next-app-router-4000/app/patterns/page.tsx b/apps/next-app-router-4000/app/patterns/page.tsx new file mode 100644 index 00000000000..c630e1c5f6c --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/page.tsx @@ -0,0 +1,56 @@ +import { ExternalLink } from '#/ui/external-link'; +import Link from 'next/link'; + +const items = [ + { + name: 'Active links', + slug: 'active-links', + description: 'Update the style of the current active link', + }, + { + name: 'Breadcrumbs', + slug: 'breadcrumbs', + description: 'Shared server-side Breadcrumb UI using Parallel Routes', + }, + { + name: 'Updating URL search params', + slug: 'search-params', + description: 'Update searchParams using `useRouter` and ``', + }, +]; + +export default function Page() { + return ( +
+

Patterns

+ +
+ {items.map((item) => { + return ( + +
+ {item.name} +
+ + {item.description ? ( +
+ {item.description} +
+ ) : null} + + ); + })} +
+ +
+ + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/patterns/search-params/active-link.tsx b/apps/next-app-router-4000/app/patterns/search-params/active-link.tsx new file mode 100644 index 00000000000..f22ccbf9364 --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/search-params/active-link.tsx @@ -0,0 +1,30 @@ +'use client'; + +import clsx from 'clsx'; +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; + +export default function ActiveLink({ + isActive, + searchParams, + children, +}: { + isActive: boolean; + searchParams: string; + children: React.ReactNode; +}) { + const pathname = usePathname(); + + return ( + + {children} + + ); +} diff --git a/apps/next-app-router-4000/app/patterns/search-params/client.tsx b/apps/next-app-router-4000/app/patterns/search-params/client.tsx new file mode 100644 index 00000000000..a72f89e5a7c --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/search-params/client.tsx @@ -0,0 +1,82 @@ +'use client'; + +import clsx from 'clsx'; +import { usePathname, useRouter, useSearchParams } from 'next/navigation'; +import { useCallback, useMemo } from 'react'; + +export default function Client({ + options, +}: { + options: { + name: string; + value: string; + items: string[]; + }[]; +}) { + const searchParams = useSearchParams()!; + const pathname = usePathname(); + const router = useRouter(); + + const selectedOptions = useMemo(() => { + // Get the initial selected options from the URL's searchParams + const params = new URLSearchParams(searchParams); + + // Preselect the first value of each option if its not + // included in the current searchParams + options.forEach((option) => { + if (!searchParams.has(option.value)) { + params.set(option.value, option.items[0]); + } + }); + + return params; + }, [searchParams, options]); + + const updateSearchParam = useCallback( + (name: string, value: string) => { + // Merge the current searchParams with the new param set + const params = new URLSearchParams(searchParams); + params.set(name, value); + + // Perform a new navigation to the updated URL. The current `page.js` will + // receive a new `searchParams` prop with the updated values. + router.push(pathname + '?' + params.toString()); // or router.replace() + }, + [router, pathname, searchParams], + ); + + return ( + <> +
+ {options.map((option) => ( +
+
{option.name}
+ +
+ {option.items.map((item) => { + const isActive = selectedOptions.get(option.value) === item; + + return ( + + ); + })} +
+
+ ))} +
+ + ); +} diff --git a/apps/next-app-router-4000/app/patterns/search-params/page.tsx b/apps/next-app-router-4000/app/patterns/search-params/page.tsx new file mode 100644 index 00000000000..fa94328726f --- /dev/null +++ b/apps/next-app-router-4000/app/patterns/search-params/page.tsx @@ -0,0 +1,106 @@ +import { Boundary } from '#/ui/boundary'; +import { ExternalLink } from '#/ui/external-link'; +import { Suspense } from 'react'; +import ActiveLink from './active-link'; +import Client from './client'; + +const options = [ + { + name: 'Sort', + value: 'sort', + items: ['asc', 'desc'], + }, + { + name: 'Page', + value: 'page', + items: ['1', '2', '3'], + }, + { + name: 'Items Per Page', + value: 'perPage', + items: ['10', '25', '100'], + }, +]; + +export const dynamic = 'force-dynamic'; + +export default async function Page(props: { searchParams: Promise }) { + const searchParams = await props.searchParams; + return ( +
+

+ Updating searchParams +

+

+ The useSearchParams hook returns a read only version of{' '} + URLSearchParams. You can use{' '} + useRouter() or <Link> to set new{' '} + searchParams. After a navigation is performed, the current{' '} + page.js will receive an updated searchParams{' '} + prop. +

+
+
+ +

+ Using useRouter() +

+ + + + +
+ + + Docs + +
+ +
+ +

+ Using <Link> +

+ +
+ {options.map((option) => { + return ( +
+
{option.name}
+ +
+ {option.items.map((item, i) => { + const isActive = + // set the first item as active if no search param is set + (!searchParams[option.value] && i === 0) || + // otherwise check if the current item is the active one + item === searchParams[option.value]; + + // create new searchParams object for easier manipulation + const params = new URLSearchParams(searchParams); + params.set(option.value, item); + return ( + + {item} + + ); + })} +
+
+ ); + })} +
+
+ + + Docs + +
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/route-groups/(checkout)/checkout/page.tsx b/apps/next-app-router-4000/app/route-groups/(checkout)/checkout/page.tsx new file mode 100644 index 00000000000..80dc7c2458e --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(checkout)/checkout/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Checkout

; +} diff --git a/apps/next-app-router-4000/app/route-groups/(checkout)/layout.tsx b/apps/next-app-router-4000/app/route-groups/(checkout)/layout.tsx new file mode 100644 index 00000000000..7054058ef16 --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(checkout)/layout.tsx @@ -0,0 +1,23 @@ +import { Boundary } from '#/ui/boundary'; +import { TabNavItem } from '#/ui/tab-nav-item'; +import React from 'react'; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + +
+
+
+ Back +
+
+ +
{children}
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/route-groups/(checkout)/template.tsx b/apps/next-app-router-4000/app/route-groups/(checkout)/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(checkout)/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/route-groups/(main)/layout.tsx b/apps/next-app-router-4000/app/route-groups/(main)/layout.tsx new file mode 100644 index 00000000000..bcc0006a866 --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(main)/layout.tsx @@ -0,0 +1,46 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( + +
+
+ ({ + text: x.name, + slug: x.slug, + })), + { text: 'Checkout', slug: 'checkout' }, + { text: 'Blog', slug: 'blog' }, + ]} + /> + +
+ +
+
+ +
{children}
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/route-groups/(main)/page.tsx b/apps/next-app-router-4000/app/route-groups/(main)/page.tsx new file mode 100644 index 00000000000..b3b778e397a --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(main)/page.tsx @@ -0,0 +1,38 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Route Groups

+ +
    +
  • + This example uses Route Groups to create layouts for different + sections of the app without affecting the URL structure. +
  • +
  • + Try navigating pages and noting the different layouts used for each + section. +
  • +
  • Route groups can be used to:
  • +
      +
    • Opt a route segment out of a shared layout.
    • +
    • Organize routes without affecting the URL structure.
    • +
    • + Create multiple root layouts by partitioning the top level of the + application. +
    • +
    +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/route-groups/(main)/template.tsx b/apps/next-app-router-4000/app/route-groups/(main)/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(main)/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/route-groups/(marketing)/blog/page.tsx b/apps/next-app-router-4000/app/route-groups/(marketing)/blog/page.tsx new file mode 100644 index 00000000000..1b1a8a4e52b --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(marketing)/blog/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Blog

; +} diff --git a/apps/next-app-router-4000/app/route-groups/(marketing)/layout.tsx b/apps/next-app-router-4000/app/route-groups/(marketing)/layout.tsx new file mode 100644 index 00000000000..2417ef5e4f8 --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(marketing)/layout.tsx @@ -0,0 +1,46 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( + +
+
+ ({ + text: x.name, + slug: x.slug, + })), + { text: 'Checkout', slug: 'checkout' }, + { text: 'Blog', slug: 'blog' }, + ]} + /> + +
+ +
+
+ +
{children}
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/route-groups/(marketing)/template.tsx b/apps/next-app-router-4000/app/route-groups/(marketing)/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(marketing)/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..ca6da06338b --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,22 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; +import { notFound } from 'next/navigation'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string; subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/layout.tsx b/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..69b74e3a8bb --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/layout.tsx @@ -0,0 +1,39 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/page.tsx b/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/page.tsx new file mode 100644 index 00000000000..df3bd10827f --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/page.tsx @@ -0,0 +1,22 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + return ( +
+

+ All {category.name} +

+ +
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/template.tsx b/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(shop)/[categorySlug]/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/route-groups/(shop)/layout.tsx b/apps/next-app-router-4000/app/route-groups/(shop)/layout.tsx new file mode 100644 index 00000000000..7884628bc29 --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(shop)/layout.tsx @@ -0,0 +1,42 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( + +
+
+ ({ + text: x.name, + slug: x.slug, + })), + { text: 'Checkout', slug: 'checkout' }, + { text: 'Blog', slug: 'blog' }, + ]} + /> + +
+ +
+
+ +
{children}
+
+
+ ); +} diff --git a/apps/next-app-router-4000/app/route-groups/(shop)/template.tsx b/apps/next-app-router-4000/app/route-groups/(shop)/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/(shop)/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/route-groups/layout.tsx b/apps/next-app-router-4000/app/route-groups/layout.tsx new file mode 100644 index 00000000000..8c5355869d9 --- /dev/null +++ b/apps/next-app-router-4000/app/route-groups/layout.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +const title = 'Route Groups'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default function Layout({ children }: { children: React.ReactNode }) { + return children; +} diff --git a/apps/next-app-router-4000/app/ssg/[id]/page.tsx b/apps/next-app-router-4000/app/ssg/[id]/page.tsx new file mode 100644 index 00000000000..4e2c40d37ca --- /dev/null +++ b/apps/next-app-router-4000/app/ssg/[id]/page.tsx @@ -0,0 +1,35 @@ +import { RenderingInfo } from '#/ui/rendering-info'; +import { notFound } from 'next/navigation'; + +export async function generateStaticParams() { + // Generate two pages at build time and the rest (3-100) on-demand + return [{ id: '1' }, { id: '2' }]; +} + +export default async function Page(props: { params: Promise<{ id: string }> }) { + const params = await props.params; + if (Number(params.id) >= 100) { + notFound(); + } + + const res = await fetch( + `https://jsonplaceholder.typicode.com/posts/${params.id}`, + ); + const data = (await res.json()) as { title: string; body: string }; + + const isOnDemand = Number(params.id) >= 3; + + return ( +
+
+

+ {data.title} +

+

{data.body}

+
+
+ +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/ssg/layout.tsx b/apps/next-app-router-4000/app/ssg/layout.tsx new file mode 100644 index 00000000000..3ca03680c4e --- /dev/null +++ b/apps/next-app-router-4000/app/ssg/layout.tsx @@ -0,0 +1,28 @@ +import { Tab } from '#/ui/tab'; +import React from 'react'; +import { RandomPostTab } from './random-post-tab'; + +const title = 'Static Data'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( +
+
+ + + + +
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/ssg/loading.tsx b/apps/next-app-router-4000/app/ssg/loading.tsx new file mode 100644 index 00000000000..2c150f871d2 --- /dev/null +++ b/apps/next-app-router-4000/app/ssg/loading.tsx @@ -0,0 +1,5 @@ +import { RenderingPageSkeleton } from '#/ui/rendering-page-skeleton'; + +export default function Loading() { + return ; +} diff --git a/apps/next-app-router-4000/app/ssg/page.tsx b/apps/next-app-router-4000/app/ssg/page.tsx new file mode 100644 index 00000000000..3133fa73b3d --- /dev/null +++ b/apps/next-app-router-4000/app/ssg/page.tsx @@ -0,0 +1,31 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Static Data

+ +
    +
  • By default, data fetching in Next.js is cached static.
  • +
  • This example statically caches data fetches for Post 1 and 2.
  • +
  • + A random third post is fetched on-demand the first time it is + requested. +
  • +
  • + Try navigating to each post and noting the timestamp of when the page + was rendered. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/ssg/random-post-tab.tsx b/apps/next-app-router-4000/app/ssg/random-post-tab.tsx new file mode 100644 index 00000000000..3d92f7aecf1 --- /dev/null +++ b/apps/next-app-router-4000/app/ssg/random-post-tab.tsx @@ -0,0 +1,32 @@ +'use client'; + +import { Tab } from '#/ui/tab'; +import clsx from 'clsx'; +import React, { useEffect } from 'react'; + +const randomNumber = (min: number, max: number) => + Math.floor(Math.random() * (max - min + 1) + min); + +export function RandomPostTab({ path }: { path: string }) { + const [post, setPost] = React.useState( + null, + ); + + useEffect(() => { + const randomId = String(randomNumber(3, 100)); + setPost({ text: `Post ${randomId} (On Demand)`, slug: randomId }); + }, []); + + return ( +
+ {post ? ( + + ) : null} +
+ ); +} diff --git a/apps/next-app-router-4000/app/ssg/template.tsx b/apps/next-app-router-4000/app/ssg/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/ssg/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/ssr/[id]/page.tsx b/apps/next-app-router-4000/app/ssr/[id]/page.tsx new file mode 100644 index 00000000000..c4e89fae45d --- /dev/null +++ b/apps/next-app-router-4000/app/ssr/[id]/page.tsx @@ -0,0 +1,24 @@ +import { RenderingInfo } from '#/ui/rendering-info'; + +export default async function Page(props: { params: Promise<{ id: string }> }) { + const params = await props.params; + const res = await fetch( + `https://jsonplaceholder.typicode.com/posts/${params.id}`, + { cache: 'no-store' }, + ); + const data = (await res.json()) as { title: string; body: string }; + + return ( +
+
+

+ {data.title} +

+

{data.body}

+
+
+ +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/ssr/layout.tsx b/apps/next-app-router-4000/app/ssr/layout.tsx new file mode 100644 index 00000000000..3ed3464f0b7 --- /dev/null +++ b/apps/next-app-router-4000/app/ssr/layout.tsx @@ -0,0 +1,34 @@ +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Dynamic Data'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; +export default function Layout({ children }: { children: React.ReactNode }) { + const ids = [{ id: '1' }, { id: '2' }, { id: '3' }]; + + return ( +
+ ({ + text: `Post ${x.id}`, + slug: x.id, + })), + ]} + /> + +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/ssr/loading.tsx b/apps/next-app-router-4000/app/ssr/loading.tsx new file mode 100644 index 00000000000..2c150f871d2 --- /dev/null +++ b/apps/next-app-router-4000/app/ssr/loading.tsx @@ -0,0 +1,5 @@ +import { RenderingPageSkeleton } from '#/ui/rendering-page-skeleton'; + +export default function Loading() { + return ; +} diff --git a/apps/next-app-router-4000/app/ssr/page.tsx b/apps/next-app-router-4000/app/ssr/page.tsx new file mode 100644 index 00000000000..a7b057a676f --- /dev/null +++ b/apps/next-app-router-4000/app/ssr/page.tsx @@ -0,0 +1,29 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Dynamic Data

+ +
    +
  • + Dynamic, or server-rendered data, is fetched fresh on each request. +
  • +
  • In this example, the post responses are explicitly not cached.
  • +
  • + Try navigating to each post and noting the timestamp of when the page + was rendered. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/ssr/template.tsx b/apps/next-app-router-4000/app/ssr/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/ssr/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/streaming/_components/add-to-cart.tsx b/apps/next-app-router-4000/app/streaming/_components/add-to-cart.tsx new file mode 100644 index 00000000000..1f0ddd20f68 --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/_components/add-to-cart.tsx @@ -0,0 +1,56 @@ +'use client'; + +import { useRouter } from 'next/navigation'; +import { useTransition } from 'react'; +import { useCartCount } from './cart-count-context'; + +export function AddToCart({ initialCartCount }: { initialCartCount: number }) { + const router = useRouter(); + const [isPending, startTransition] = useTransition(); + + const [, setOptimisticCartCount] = useCartCount(); + + const addToCart = () => { + setOptimisticCartCount(initialCartCount + 1); + + // update the cart count cookie + document.cookie = `_cart_count=${initialCartCount + 1}; path=/; max-age=${ + 60 * 60 * 24 * 30 + }};`; + + // Normally you would also send a request to the server to add the item + // to the current users cart + // await fetch(`https://api.acme.com/...`); + + // Use a transition and isPending to create inline loading UI + startTransition(() => { + setOptimisticCartCount(null); + + // Refresh the current route and fetch new data from the server without + // losing client-side browser or React state. + router.refresh(); + + // We're working on more fine-grained data mutation and revalidation: + // https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions + }); + }; + + return ( + + ); +} diff --git a/apps/next-app-router-4000/app/streaming/_components/cart-count-context.tsx b/apps/next-app-router-4000/app/streaming/_components/cart-count-context.tsx new file mode 100644 index 00000000000..83fff442f0b --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/_components/cart-count-context.tsx @@ -0,0 +1,36 @@ +'use client'; + +import React, { useState } from 'react'; + +const CartCountContext = React.createContext< + [number, React.Dispatch>] | undefined +>(undefined); + +export function CartCountProvider({ + children, + initialCartCount, +}: { + children: React.ReactNode; + initialCartCount: number; +}) { + const [optimisticCartCount, setOptimisticCartCount] = useState( + null, + ); + + const count = + optimisticCartCount !== null ? optimisticCartCount : initialCartCount; + + return ( + + {children} + + ); +} + +export function useCartCount() { + const context = React.useContext(CartCountContext); + if (context === undefined) { + throw new Error('useCartCount must be used within a CartCountProvider'); + } + return context; +} diff --git a/apps/next-app-router-4000/app/streaming/_components/cart-count.tsx b/apps/next-app-router-4000/app/streaming/_components/cart-count.tsx new file mode 100644 index 00000000000..cc740ba9830 --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/_components/cart-count.tsx @@ -0,0 +1,8 @@ +'use client'; + +import { useCartCount } from './cart-count-context'; + +export function CartCount() { + const [count] = useCartCount(); + return {count}; +} diff --git a/apps/next-app-router-4000/app/streaming/_components/header.tsx b/apps/next-app-router-4000/app/streaming/_components/header.tsx new file mode 100644 index 00000000000..9c097ff8b08 --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/_components/header.tsx @@ -0,0 +1,53 @@ +import { NextLogoLight } from '#/ui/next-logo'; +import { + MagnifyingGlassIcon, + ShoppingCartIcon, +} from '@heroicons/react/24/solid'; +import Image from 'next/image'; +import Link from 'next/link'; +import { CartCount } from './cart-count'; + +export function Header() { + return ( +
+
+ +
+ +
+ + +
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+ + User +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/streaming/_components/pricing.tsx b/apps/next-app-router-4000/app/streaming/_components/pricing.tsx new file mode 100644 index 00000000000..d252fddaedb --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/_components/pricing.tsx @@ -0,0 +1,84 @@ +import type { Product } from '#/app/api/products/product'; +import { Ping } from '#/ui/ping'; +import { ProductEstimatedArrival } from '#/ui/product-estimated-arrival'; +import { ProductLowStockWarning } from '#/ui/product-low-stock-warning'; +import { ProductPrice } from '#/ui/product-price'; +import { ProductSplitPayments } from '#/ui/product-split-payments'; +import { ProductUsedPrice } from '#/ui/product-used-price'; +import { dinero, type DineroSnapshot } from 'dinero.js'; +import { Suspense } from 'react'; +import { AddToCart } from './add-to-cart'; + +function LoadingDots() { + return ( +
+ + + • + + + • + + + • + + +
+ ); +} + +async function UserSpecificDetails({ productId }: { productId: string }) { + const data = await fetch( + `https://app-playground-api.vercel.app/api/products?id=${productId}&delay=500&filter=price,usedPrice,leadTime,stock`, + { + // We intentionally disable Next.js Cache to better demo + // streaming + cache: 'no-store', + }, + ); + + const product = (await data.json()) as Product; + + const price = dinero(product.price as DineroSnapshot); + + return ( + <> + + {product.usedPrice ? ( + + ) : null} + + {product.stock <= 1 ? ( + + ) : null} + + ); +} + +export function Pricing({ + product, + cartCount, +}: { + product: Product; + cartCount: string; +}) { + const price = dinero(product.price as DineroSnapshot); + + return ( +
+ + +
+
+ +
+
+ + }> + + + + +
+ ); +} diff --git a/apps/next-app-router-4000/app/streaming/_components/recommended-products.tsx b/apps/next-app-router-4000/app/streaming/_components/recommended-products.tsx new file mode 100644 index 00000000000..09c72f3e3c1 --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/_components/recommended-products.tsx @@ -0,0 +1,65 @@ +import { Product } from '#/app/api/products/product'; +import { ProductCard } from '#/ui/product-card'; + +export async function RecommendedProducts({ + path, + data, +}: { + path: string; + data: Promise; +}) { + const products = (await data.then((res) => res.json())) as Product[]; + + return ( +
+
+
+ Recommended Products for You +
+
+ Based on your preferences and shopping habits +
+
+
+ {products.map((product) => ( +
+ +
+ ))} +
+
+ ); +} + +const shimmer = `relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_1.5s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent`; + +function ProductSkeleton() { + return ( +
+
+ +
+
+
+
+
+ ); +} + +export function RecommendedProductsSkeleton() { + return ( +
+
+
+
+
+ +
+ + + + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/streaming/_components/reviews.tsx b/apps/next-app-router-4000/app/streaming/_components/reviews.tsx new file mode 100644 index 00000000000..ab45a45bfb5 --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/_components/reviews.tsx @@ -0,0 +1,43 @@ +import type { Review } from '#/app/api/reviews/review'; +import { ProductReviewCard } from '#/ui/product-review-card'; + +export async function Reviews({ data }: { data: Promise }) { + const reviews = (await data.then((res) => res.json())) as Review[]; + + return ( +
+
Customer Reviews
+
+ {reviews.map((review) => { + return ; + })} +
+
+ ); +} + +const shimmer = `relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_1.5s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent`; + +function Skeleton() { + return ( +
+
+
+
+
+
+ ); +} + +export function ReviewsSkeleton() { + return ( +
+
+ +
+ + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/streaming/_components/single-product.tsx b/apps/next-app-router-4000/app/streaming/_components/single-product.tsx new file mode 100644 index 00000000000..139bd6be3dd --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/_components/single-product.tsx @@ -0,0 +1,76 @@ +import { Pricing } from '#/app/streaming/_components/pricing'; +import type { Product } from '#/app/api/products/product'; +import { ProductRating } from '#/ui/product-rating'; +import { cookies } from 'next/headers'; +import Image from 'next/image'; + +export const SingleProduct = async ({ data }: { data: Promise }) => { + const product = (await data.then((res) => res.json())) as Product; + + // Get the cart count from the users cookies and pass it to the client + // AddToCart component + const cartCount = (await cookies()).get('_cart_count')?.value || '0'; + + return ( +
+
+
+ {product.name} + +
+
+ {product.name} +
+
+ {product.name} +
+
+ {product.name} +
+
+
+
+ +
+
+ {product.name} +
+ + + +
+

{product.description}

+

{product.description}

+
+
+ +
+ +
+
+ ); +}; diff --git a/apps/next-app-router-4000/app/streaming/edge/layout.tsx b/apps/next-app-router-4000/app/streaming/edge/layout.tsx new file mode 100644 index 00000000000..6a482c4aa27 --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/edge/layout.tsx @@ -0,0 +1,46 @@ +import { Boundary } from '#/ui/boundary'; +import { cookies } from 'next/headers'; +import React from 'react'; +import { CartCountProvider } from '../_components/cart-count-context'; +import { Header } from '../_components/header'; + +export const metadata = { + title: 'Streaming (Edge Runtime)', +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const cartCount = Number((await cookies()).get('_cart_count')?.value || '0'); + + return ( + <> +
+
    +
  • + Primary product information is loaded first as part of the initial + response. +
  • +
  • + Secondary, more personalized details (that might be slower) like + ship date, other recommended products, and customer reviews are + progressively streamed in. +
  • +
  • Try refreshing or navigating to other recommended products.
  • +
+
+ + + +
+
+ + {children} +
+
+
+ + ); +} diff --git a/apps/next-app-router-4000/app/streaming/edge/product/[id]/page.tsx b/apps/next-app-router-4000/app/streaming/edge/product/[id]/page.tsx new file mode 100644 index 00000000000..be56a674d40 --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/edge/product/[id]/page.tsx @@ -0,0 +1,66 @@ +import { + RecommendedProducts, + RecommendedProductsSkeleton, +} from '#/app/streaming/_components/recommended-products'; +import { Reviews, ReviewsSkeleton } from '#/app/streaming/_components/reviews'; +import { SingleProduct } from '#/app/streaming/_components/single-product'; +import { Ping } from '#/ui/ping'; +import { Suspense } from 'react'; + +export const runtime = 'edge'; + +export default async function Page(props: { params: Promise<{ id: string }> }) { + const params = await props.params; + return ( +
+ + +
+
+ +
+
+ + }> + + + +
+
+ +
+
+ + }> + + +
+ ); +} diff --git a/apps/next-app-router-4000/app/streaming/layout.tsx b/apps/next-app-router-4000/app/streaming/layout.tsx new file mode 100644 index 00000000000..a6b84433e3e --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/layout.tsx @@ -0,0 +1,45 @@ +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Streaming'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + return ( +
+
+ +
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/streaming/node/layout.tsx b/apps/next-app-router-4000/app/streaming/node/layout.tsx new file mode 100644 index 00000000000..9d389013731 --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/node/layout.tsx @@ -0,0 +1,45 @@ +import { Boundary } from '#/ui/boundary'; +import { cookies } from 'next/headers'; +import React from 'react'; +import { CartCountProvider } from '../_components/cart-count-context'; +import { Header } from '../_components/header'; + +export const metadata = { + title: 'Streaming (Node Runtime)', +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const cartCount = Number((await cookies()).get('_cart_count')?.value || '0'); + + return ( + <> +
+
    +
  • + Primary product information is loaded first as part of the initial + response. +
  • +
  • + Secondary, more personalized details (that might be slower) like + ship date, other recommended products, and customer reviews are + progressively streamed in. +
  • +
  • Try refreshing or navigating to other recommended products.
  • +
+
+ + +
+
+ + {children} +
+
+
+ + ); +} diff --git a/apps/next-app-router-4000/app/streaming/node/product/[id]/page.tsx b/apps/next-app-router-4000/app/streaming/node/product/[id]/page.tsx new file mode 100644 index 00000000000..b40f468f1ca --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/node/product/[id]/page.tsx @@ -0,0 +1,64 @@ +import { + RecommendedProducts, + RecommendedProductsSkeleton, +} from '#/app/streaming/_components/recommended-products'; +import { Reviews, ReviewsSkeleton } from '#/app/streaming/_components/reviews'; +import { SingleProduct } from '#/app/streaming/_components/single-product'; +import { Ping } from '#/ui/ping'; +import { Suspense } from 'react'; + +export default async function Page(props: { params: Promise<{ id: string }> }) { + const params = await props.params; + return ( +
+ + +
+
+ +
+
+ + }> + + + +
+
+ +
+
+ + }> + + +
+ ); +} diff --git a/apps/next-app-router-4000/app/streaming/page.tsx b/apps/next-app-router-4000/app/streaming/page.tsx new file mode 100644 index 00000000000..4aa68dc9551 --- /dev/null +++ b/apps/next-app-router-4000/app/streaming/page.tsx @@ -0,0 +1,38 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default async function Page() { + return ( +
+

Streaming with Suspense

+ +
    +
  • + Streaming allows you to progressively render and send units of the UI + from the server to the client. +
  • + +
  • + This allows the user to see and interact with the most essential parts + of the page while the rest of the content loads - instead of waiting + for the whole page to load before they can interact with anything. +
  • + +
  • Streaming works with both Edge and Node runtimes.
  • + +
  • + Try streaming by selecting a runtime in the + navigation above. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/styling/css-modules/page.tsx b/apps/next-app-router-4000/app/styling/css-modules/page.tsx new file mode 100644 index 00000000000..a9cf5e25820 --- /dev/null +++ b/apps/next-app-router-4000/app/styling/css-modules/page.tsx @@ -0,0 +1,27 @@ +'use client'; + +import styles from './styles.module.css'; + +const SkeletonCard = () => ( +
+
+
+
+
+
+); + +export default function Page() { + return ( +
+

+ Styled with CSS Modules +

+
+ + + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/styling/css-modules/styles.module.css b/apps/next-app-router-4000/app/styling/css-modules/styles.module.css new file mode 100644 index 00000000000..c434f7b160a --- /dev/null +++ b/apps/next-app-router-4000/app/styling/css-modules/styles.module.css @@ -0,0 +1,54 @@ +.container { + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + gap: 1.5rem /* 24px */; +} + +@media (min-width: 1024px) { + .container { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +.skeleton { + padding: 1rem /* 16px */; + border-radius: 1rem /* 16px */; + background-color: rgb(24 24 27 / 0.8); +} + +.skeleton-img, +.skeleton-btn, +.skeleton-line-one, +.skeleton-line-two { + border-radius: 0.5rem /* 8px */; +} + +.skeleton-img { + height: 3.5rem /* 56px */; + background-color: rgb(63 63 70 / 1); +} + +.skeleton-btn, +.skeleton-line-one, +.skeleton-line-two { + margin-top: 0.75rem /* 12px */; + height: 0.75rem /* 12px */; +} + +.skeleton-btn { + background-color: rgb(121 40 202 / 1); + width: 25%; +} + +.skeleton-line-one, +.skeleton-line-two { + background-color: rgb(63 63 70 / 1); +} + +.skeleton-line-one { + width: 91.666667%; +} + +.skeleton-line-two { + width: 66.666667%; +} diff --git a/apps/next-app-router-4000/app/styling/global-css/page.tsx b/apps/next-app-router-4000/app/styling/global-css/page.tsx new file mode 100644 index 00000000000..aa39cc31044 --- /dev/null +++ b/apps/next-app-router-4000/app/styling/global-css/page.tsx @@ -0,0 +1,25 @@ +import './styles.css'; + +const SkeletonCard = () => ( +
+
+
+
+
+
+); + +export default function Page() { + return ( +
+

+ Styled with a Global CSS Stylesheet +

+
+ + + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/styling/global-css/styles.css b/apps/next-app-router-4000/app/styling/global-css/styles.css new file mode 100644 index 00000000000..c7b408ef9fc --- /dev/null +++ b/apps/next-app-router-4000/app/styling/global-css/styles.css @@ -0,0 +1,54 @@ +.container { + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + gap: 1.5rem /* 24px */; +} + +@media (min-width: 1024px) { + .container { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +.skeleton { + padding: 1rem /* 16px */; + border-radius: 1rem /* 16px */; + background-color: rgb(24 24 27 / 0.8); +} + +.skeleton-img, +.skeleton-btn, +.skeleton-line-one, +.skeleton-line-two { + border-radius: 0.5rem /* 8px */; +} + +.skeleton-img { + height: 3.5rem /* 56px */; + background-color: rgb(63 63 70 / 1); +} + +.skeleton-btn, +.skeleton-line-one, +.skeleton-line-two { + margin-top: 0.75rem /* 12px */; + height: 0.75rem /* 12px */; +} + +.skeleton-btn { + background-color: rgb(245 166 35 / 1); + width: 25%; +} + +.skeleton-line-one, +.skeleton-line-two { + background-color: rgb(63 63 70 / 1); +} + +.skeleton-line-one { + width: 91.666667%; +} + +.skeleton-line-two { + width: 66.666667%; +} diff --git a/apps/next-app-router-4000/app/styling/layout.tsx b/apps/next-app-router-4000/app/styling/layout.tsx new file mode 100644 index 00000000000..a49a612b565 --- /dev/null +++ b/apps/next-app-router-4000/app/styling/layout.tsx @@ -0,0 +1,52 @@ +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Styling'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +const items = [ + { + text: 'Global CSS', + slug: 'global-css', + }, + { + text: 'CSS Modules', + slug: 'css-modules', + }, + { + text: 'Styled Components', + slug: 'styled-components', + }, + { + text: 'Styled JSX', + slug: 'styled-jsx', + }, + { + text: 'Tailwind CSS', + slug: 'tailwind', + }, +]; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( +
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4000/app/styling/page.tsx b/apps/next-app-router-4000/app/styling/page.tsx new file mode 100644 index 00000000000..fc2df59e419 --- /dev/null +++ b/apps/next-app-router-4000/app/styling/page.tsx @@ -0,0 +1,23 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Styling

+ +
    +
  • This example shows different styling solutions.
  • +
+ +
+ + Docs + + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/styling/styled-components/layout.tsx b/apps/next-app-router-4000/app/styling/styled-components/layout.tsx new file mode 100644 index 00000000000..bc3ce606379 --- /dev/null +++ b/apps/next-app-router-4000/app/styling/styled-components/layout.tsx @@ -0,0 +1,5 @@ +import StyledComponentsRegistry from './registry'; + +export default function Layout({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/styling/styled-components/page.tsx b/apps/next-app-router-4000/app/styling/styled-components/page.tsx new file mode 100644 index 00000000000..dc1f3f35c1d --- /dev/null +++ b/apps/next-app-router-4000/app/styling/styled-components/page.tsx @@ -0,0 +1,69 @@ +'use client'; + +import styled from 'styled-components'; + +const Container = styled.div` + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1.5rem /* 24px */; +`; + +const SkeletonInner = styled.div` + padding: 1rem /* 16px */; + background-color: rgb(24 24 27 / 0.8); + border-radius: 1rem /* 16px */; +`; + +const SkeletonImg = styled.div` + height: 3.5rem /* 56px */; + border-radius: 0.5rem /* 8px */; + background-color: rgb(63 63 70 / 1); +`; + +const SkeletonBtn = styled.div` + margin-top: 0.75rem /* 12px */; + width: 25%; + height: 0.75rem /* 12px */; + border-radius: 0.5rem /* 8px */; + background-color: rgb(255 0 128 / 1); +`; + +const SkeletonLineOne = styled.div` + margin-top: 0.75rem /* 12px */; + height: 0.75rem /* 12px */; + width: 91.666667%; + border-radius: 0.5rem /* 8px */; + background-color: rgb(63 63 70 / 1); +`; + +const SkeletonLineTwo = styled.div` + margin-top: 0.75rem /* 12px */; + height: 0.75rem /* 12px */; + width: 66.666667%; + border-radius: 0.5rem /* 8px */; + background-color: rgb(63 63 70 / 1); +`; + +const Skeleton = () => ( + + + + + + +); + +export default function Page() { + return ( +
+

+ Styled with Styled Components +

+ + + + + +
+ ); +} diff --git a/apps/next-app-router-4000/app/styling/styled-components/registry.tsx b/apps/next-app-router-4000/app/styling/styled-components/registry.tsx new file mode 100644 index 00000000000..79346eae087 --- /dev/null +++ b/apps/next-app-router-4000/app/styling/styled-components/registry.tsx @@ -0,0 +1,29 @@ +'use client'; + +import React, { useState } from 'react'; +import { useServerInsertedHTML } from 'next/navigation'; +import { ServerStyleSheet, StyleSheetManager } from 'styled-components'; + +export default function StyledComponentsRegistry({ + children, +}: { + children: React.ReactNode; +}) { + // Only create stylesheet once with lazy initial state + // x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-state + const [styledComponentsStyleSheet] = useState(() => new ServerStyleSheet()); + + useServerInsertedHTML(() => { + const styles = styledComponentsStyleSheet.getStyleElement(); + styledComponentsStyleSheet.instance.clearTag(); + return <>{styles}; + }); + + if (typeof window !== 'undefined') return <>{children}; + + return ( + + {children} + + ); +} diff --git a/apps/next-app-router-4000/app/styling/styled-jsx/layout.tsx b/apps/next-app-router-4000/app/styling/styled-jsx/layout.tsx new file mode 100644 index 00000000000..0072c517b27 --- /dev/null +++ b/apps/next-app-router-4000/app/styling/styled-jsx/layout.tsx @@ -0,0 +1,5 @@ +import StyledJsxRegistry from './registry'; + +export default function Layout({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/app/styling/styled-jsx/page.tsx b/apps/next-app-router-4000/app/styling/styled-jsx/page.tsx new file mode 100644 index 00000000000..60f514a285c --- /dev/null +++ b/apps/next-app-router-4000/app/styling/styled-jsx/page.tsx @@ -0,0 +1,85 @@ +'use client'; + +const SkeletonCard = () => ( + <> +
+
+
+
+
+
+ + +); + +export default function Page() { + return ( +
+

+ Styled with Styled JSX +

+
+ + + +
+ + +
+ ); +} diff --git a/apps/next-app-router-4000/app/styling/styled-jsx/registry.tsx b/apps/next-app-router-4000/app/styling/styled-jsx/registry.tsx new file mode 100644 index 00000000000..c2936d07169 --- /dev/null +++ b/apps/next-app-router-4000/app/styling/styled-jsx/registry.tsx @@ -0,0 +1,23 @@ +'use client'; + +import React, { useState } from 'react'; +import { useServerInsertedHTML } from 'next/navigation'; +import { StyleRegistry, createStyleRegistry } from 'styled-jsx'; + +export default function StyledJsxRegistry({ + children, +}: { + children: React.ReactNode; +}) { + // Only create stylesheet once with lazy initial state + // x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-state + const [jsxStyleRegistry] = useState(() => createStyleRegistry()); + + useServerInsertedHTML(() => { + const styles = jsxStyleRegistry.styles(); + jsxStyleRegistry.flush(); + return <>{styles}; + }); + + return {children}; +} diff --git a/apps/next-app-router-4000/app/styling/tailwind/page.tsx b/apps/next-app-router-4000/app/styling/tailwind/page.tsx new file mode 100644 index 00000000000..7ead53333fa --- /dev/null +++ b/apps/next-app-router-4000/app/styling/tailwind/page.tsx @@ -0,0 +1,24 @@ +const SkeletonCard = () => ( +
+
+
+
+
+
+); + +export default function Page() { + return ( +
+

+ Styled with Tailwind CSS +

+ +
+ + + +
+
+ ); +} diff --git a/apps/next-app-router-4000/app/styling/template.tsx b/apps/next-app-router-4000/app/styling/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4000/app/styling/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4000/lib/demos.ts b/apps/next-app-router-4000/lib/demos.ts new file mode 100644 index 00000000000..79a1d38ff7d --- /dev/null +++ b/apps/next-app-router-4000/lib/demos.ts @@ -0,0 +1,106 @@ +export type Item = { + name: string; + slug: string; + description?: string; +}; + +export const demos: { name: string; items: Item[] }[] = [ + { + name: 'Layouts', + items: [ + { + name: 'Nested Layouts', + slug: 'layouts', + description: 'Create UI that is shared across routes', + }, + { + name: 'Grouped Layouts', + slug: 'route-groups', + description: 'Organize routes without affecting URL paths', + }, + { + name: 'Parallel Routes', + slug: 'parallel-routes', + description: 'Render multiple pages in the same layout', + }, + ], + }, + { + name: 'File Conventions', + items: [ + { + name: 'Loading', + slug: 'loading', + description: + 'Create meaningful Loading UI for specific parts of an app', + }, + { + name: 'Error', + slug: 'error-handling', + description: 'Create Error UI for specific parts of an app', + }, + { + name: 'Not Found', + slug: 'not-found', + description: 'Create Not Found UI for specific parts of an app', + }, + ], + }, + { + name: 'Data Fetching', + items: [ + { + name: 'Streaming with Suspense', + slug: 'streaming', + description: + 'Streaming data fetching from the server with React Suspense', + }, + { + name: 'Static Data', + slug: 'ssg', + description: 'Generate static pages', + }, + { + name: 'Dynamic Data', + slug: 'ssr', + description: 'Server-render pages', + }, + { + name: 'Incremental Static Regeneration', + slug: 'isr', + description: 'Get the best of both worlds between static & dynamic', + }, + ], + }, + { + name: 'Components', + items: [ + { + name: 'Client Context', + slug: 'context', + description: + 'Pass context between Client Components that cross Server/Client Component boundary', + }, + ], + }, + { + name: 'Misc', + items: [ + { + name: 'Patterns', + slug: 'patterns', + description: 'A collection of useful App Router patterns', + }, + { + name: 'Client Component Hooks', + slug: 'hooks', + description: 'Preview the routing hooks available in Client Components', + }, + { + name: 'CSS and CSS-in-JS', + slug: 'styling', + description: 'Preview the supported styling solutions', + }, + ], + }, +]; diff --git a/apps/next-app-router-4000/license.md b/apps/next-app-router-4000/license.md new file mode 100644 index 00000000000..ec9dcd99d17 --- /dev/null +++ b/apps/next-app-router-4000/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2024 Vercel, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/apps/next-app-router-4000/next-env.d.ts b/apps/next-app-router-4000/next-env.d.ts new file mode 100755 index 00000000000..40c3d68096c --- /dev/null +++ b/apps/next-app-router-4000/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/apps/next-app-router-4000/next.config.js b/apps/next-app-router-4000/next.config.js new file mode 100644 index 00000000000..da2ee672d59 --- /dev/null +++ b/apps/next-app-router-4000/next.config.js @@ -0,0 +1,72 @@ +const { withNx } = require('@nx/next/plugins/with-nx'); +const NextFederationPlugin = require('@module-federation/nextjs-mf'); + +/** + * @type {import('@nx/next/plugins/with-nx').WithNxOptions} + **/ +const nextConfig = { + nx: { + // Set this to true if you would like to to use SVGR + // See: https://github.com/gregberge/svgr + svgr: false, + }, + port: 4000, + webpack(config, options) { + const { isServer } = options; + config.watchOptions = { + ignored: ['**/node_modules/**', '**/@mf-types/**'], + }; + // used for testing build output snapshots + const remotes = { + remote_4001: `remote_4001@http://localhost:4001/_next/static/${ + isServer ? 'ssr' : 'chunks' + }/remoteEntry.js`, + checkout: `checkout@http://localhost:4000/_next/static/${ + isServer ? 'ssr' : 'chunks' + }/remoteEntry.js`, + home_app: `home_app@http://localhost:4000/_next/static/${ + isServer ? 'ssr' : 'chunks' + }/remoteEntry.js`, + shop: `shop@http://localhost:4000/_next/static/${ + isServer ? 'ssr' : 'chunks' + }/remoteEntry.js`, + }; + + config.plugins.push( + new NextFederationPlugin({ + name: 'home_app', + filename: 'static/chunks/remoteEntry.js', + remotes: { + remote_4001: remotes.remote_4001, + shop: remotes.shop, + checkout: remotes.checkout, + }, + shared: { + // 'react': { + // singleton: true, + // requiredVersion: false + // }, + // 'react-dom': { + // singleton: true, + // requiredVersion: false + // } + }, + extraOptions: { + // debug: false, + // exposePages: true, + // enableImageLoaderFix: true, + // enableUrlLoaderFix: true, + }, + }), + ); + config.plugins.push({ + name: 'xxx', + apply(compiler) { + compiler.options.devtool = false; + }, + }); + return config; + }, +}; + +module.exports = withNx(nextConfig); diff --git a/apps/next-app-router-4000/package.json b/apps/next-app-router-4000/package.json new file mode 100644 index 00000000000..55521bcf4d2 --- /dev/null +++ b/apps/next-app-router-4000/package.json @@ -0,0 +1,52 @@ +{ + "private": true, + "scripts": { + "build": "next build", + "dev": "NEXT_PRIVATE_LOCAL_WEBPACK=true next dev -p 4000", + "lint": "next lint", + "lint-staged": "lint-staged", + "prettier": "prettier --write --ignore-unknown .", + "prettier:check": "prettier --check --ignore-unknown .", + "start": "next start", + "test": "pnpm prettier:check && pnpm lint" + }, + "git": { + "pre-commit": "lint-staged" + }, + "lint-staged": { + "*": "prettier --write --ignore-unknown" + }, + "dependencies": { + "@heroicons/react": "2.1.3", + "clsx": "2.1.1", + "date-fns": "3.6.0", + "dinero.js": "2.0.0-alpha.10", + "ms": "3.0.0-canary.1", + "next": "15.0.0-canary.193", + "react": "19.0.0-rc-cd22717c-20241013", + "react-dom": "19.0.0-rc-cd22717c-20241013", + "server-only": "0.0.1", + "styled-components": "6.1.8", + "use-count-up": "3.0.1", + "vercel": "34.0.0", + "@module-federation/nextjs-mf": "workspace:*" + }, + "devDependencies": { + "@tailwindcss/forms": "0.5.7", + "@tailwindcss/typography": "0.5.12", + "@types/ms": "0.7.34", + "@types/node": "20.12.7", + "@types/react": "npm:types-react@19.0.0-rc.1", + "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1", + "@vercel/git-hooks": "1.0.0", + "autoprefixer": "10.4.19", + "eslint": "9.0.0", + "eslint-config-next": "14.2.2", + "lint-staged": "15.2.2", + "postcss": "8.4.38", + "prettier": "3.2.5", + "prettier-plugin-tailwindcss": "0.5.14", + "tailwindcss": "3.4.3", + "typescript": "5.4.5" + } +} diff --git a/apps/next-app-router-4000/pnpm-lock.yaml b/apps/next-app-router-4000/pnpm-lock.yaml new file mode 100644 index 00000000000..a441c20e752 --- /dev/null +++ b/apps/next-app-router-4000/pnpm-lock.yaml @@ -0,0 +1,5027 @@ +lockfileVersion: '6.0' + +dependencies: + '@heroicons/react': + specifier: 2.1.3 + version: 2.1.3(react@19.0.0-rc-cd22717c-20241013) + clsx: + specifier: 2.1.1 + version: 2.1.1 + date-fns: + specifier: 3.6.0 + version: 3.6.0 + dinero.js: + specifier: 2.0.0-alpha.10 + version: 2.0.0-alpha.10 + ms: + specifier: 3.0.0-canary.1 + version: 3.0.0-canary.1 + next: + specifier: 15.0.0-canary.193 + version: 15.0.0-canary.193(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013) + react: + specifier: 19.0.0-rc-cd22717c-20241013 + version: 19.0.0-rc-cd22717c-20241013 + react-dom: + specifier: 19.0.0-rc-cd22717c-20241013 + version: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013) + server-only: + specifier: 0.0.1 + version: 0.0.1 + styled-components: + specifier: 6.1.8 + version: 6.1.8(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013) + use-count-up: + specifier: 3.0.1 + version: 3.0.1(react@19.0.0-rc-cd22717c-20241013) + vercel: + specifier: 34.0.0 + version: 34.0.0 + +devDependencies: + '@tailwindcss/forms': + specifier: 0.5.7 + version: 0.5.7(tailwindcss@3.4.3) + '@tailwindcss/typography': + specifier: 0.5.12 + version: 0.5.12(tailwindcss@3.4.3) + '@types/ms': + specifier: 0.7.34 + version: 0.7.34 + '@types/node': + specifier: 20.12.7 + version: 20.12.7 + '@types/react': + specifier: npm:types-react@19.0.0-rc.1 + version: /types-react@19.0.0-rc.1 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.1 + version: /types-react-dom@19.0.0-rc.1 + '@vercel/git-hooks': + specifier: 1.0.0 + version: 1.0.0 + autoprefixer: + specifier: 10.4.19 + version: 10.4.19(postcss@8.4.38) + eslint: + specifier: 9.0.0 + version: 9.0.0 + eslint-config-next: + specifier: 14.2.2 + version: 14.2.2(eslint@9.0.0)(typescript@5.4.5) + lint-staged: + specifier: 15.2.2 + version: 15.2.2 + postcss: + specifier: 8.4.38 + version: 8.4.38 + prettier: + specifier: 3.2.5 + version: 3.2.5 + prettier-plugin-tailwindcss: + specifier: 0.5.14 + version: 0.5.14(prettier@3.2.5) + tailwindcss: + specifier: 3.4.3 + version: 3.4.3 + typescript: + specifier: 5.4.5 + version: 5.4.5 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: false + + /@dinero.js/calculator-number@2.0.0-alpha.10: + resolution: {integrity: sha512-EdKG0yykukigfdq+TsxZ9r0Wrg5flYAncKWSfr2snWDXurFsg8JE0oazVraCBA3Vb5LN4vGuFEpTFTH+dIrRCg==} + dependencies: + '@dinero.js/core': 2.0.0-alpha.10 + dev: false + + /@dinero.js/core@2.0.0-alpha.10: + resolution: {integrity: sha512-vjeGXQbNvDXlXK54zaWDydEXyFAvLDj6LCfwO4CTZJIqn3+PaXakaEd5S0AXC6hluPatxnQa5J63x3WQ/Imrjw==} + dependencies: + '@dinero.js/currencies': 2.0.0-alpha.10 + dev: false + + /@dinero.js/currencies@2.0.0-alpha.10: + resolution: {integrity: sha512-IDKaAh0YcJh700uLCrvWtIRCl5sItc3S2rk4IfVJBbms3j+NBDOlVFJnwru+UrMh7VpqU9GlZRsHcHf0NxYE9A==} + dev: false + + /@edge-runtime/format@2.2.1: + resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/node-utils@2.3.0: + resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/ponyfill@2.4.2: + resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/primitives@4.1.0: + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/vm@3.2.0: + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} + engines: {node: '>=16'} + dependencies: + '@edge-runtime/primitives': 4.1.0 + dev: false + + /@emnapi/runtime@1.3.1: + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + requiresBuild: true + dependencies: + tslib: 2.5.0 + dev: false + optional: true + + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + dependencies: + '@emotion/memoize': 0.8.1 + dev: false + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@emotion/unitless@0.8.0: + resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} + dev: false + + /@eslint-community/eslint-utils@4.4.0(eslint@9.0.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 9.0.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@3.0.2: + resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 10.0.1 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@9.0.0: + resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + dev: false + + /@heroicons/react@2.1.3(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==} + peerDependencies: + react: '>= 16' + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + dev: false + + /@humanwhocodes/config-array@0.12.3: + resolution: {integrity: sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + dev: true + + /@img/sharp-darwin-arm64@0.33.5: + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.5: + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.4: + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.4: + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.4: + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.5: + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.4: + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.4: + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.4: + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.4: + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.5: + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.5: + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.5: + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.5: + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.5: + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.5: + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.5: + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.3.1 + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.5: + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.5: + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@next/env@15.0.0-canary.193: + resolution: {integrity: sha512-GBCLGuoPKHF6H/bmtALmKEV/+IsIToVelkM8eZpVDGfWtL03KueC6mUZdhF1trBZenGW3Ly1j0N872koPUcAlw==} + dev: false + + /@next/eslint-plugin-next@14.2.2: + resolution: {integrity: sha512-q+Ec2648JtBpKiu/FSJm8HAsFXlNvioHeBCbTP12T1SGcHYwhqHULSfQgFkPgHDu3kzNp2Kem4J54bK4rPQ5SQ==} + dependencies: + glob: 10.3.10 + dev: true + + /@next/swc-darwin-arm64@15.0.0-canary.193: + resolution: {integrity: sha512-CRq2GfI7r5CcAY1ITTb4FZpK8UTGLrNdYelTuv9zcSe4EhuNb7Qp14XfGGL9LV39ZkP5ypcVHYhkrNbfiL3VuQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@15.0.0-canary.193: + resolution: {integrity: sha512-+0W+NW4JhdcCDwuy8qd/p/zQ7TlfGJ6qSYzamq7nZ+KFWWSJqmBDzTzNfKPxPgdtfHaVyQIN1ThSEJtrah3+dA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@15.0.0-canary.193: + resolution: {integrity: sha512-5RawIR+D7KPI/trRdKudCWPYu98eF6f2js00tctF8jOUvpGs5M06RKvp+DKzgPLxaZIxAq+YIycS/F9E88LECA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@15.0.0-canary.193: + resolution: {integrity: sha512-IdHsXwzkmyMfOE2Ff0C3qeivgnP00l6t+kzoDymv1ldXd9f03T+XgtUtcTWKnVDEKqyBVuKgZHpAm/0JtRvhWg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@15.0.0-canary.193: + resolution: {integrity: sha512-sOvYkCYNUiR/nq5bQuCc/zXqx6jqmRhL8+PxcOTmIQ9YdSsd9oT/ENZzJ4Bf0MiKGyLC7YpjE6ybTUl5TjlvJA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@15.0.0-canary.193: + resolution: {integrity: sha512-tHNzv1CRFP7fVNsQWyhvoVhnLIn6W8OqtUPS9k33X7WRYCRp+bGJQjefPV4Ht+mBNN3oM51uMtKn7EJ6wizrjw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@15.0.0-canary.193: + resolution: {integrity: sha512-RwXjqOXKMF4oiXbQfcTcRfoYUaTl+3xpK6Phz8BnWTeFn0PNUdDZnvUswq4RTZZEAaCw479R35KcnR8SJh/OWw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@15.0.0-canary.193: + resolution: {integrity: sha512-Ib3U2QIzdVOxWa4ChBIbjaEJjg2xDgA71g7/kEMwRTXds8EuKRu9HVwErb+23nxiKiRFEKx9GKTGHURHEKvlJw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: false + + /@rushstack/eslint-patch@1.10.2: + resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} + dev: true + + /@sinclair/typebox@0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + dev: false + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: false + + /@swc/helpers@0.5.13: + resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + dependencies: + tslib: 2.5.0 + dev: false + + /@tailwindcss/forms@0.5.7(tailwindcss@3.4.3): + resolution: {integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.4.3 + dev: true + + /@tailwindcss/typography@0.5.12(tailwindcss@3.4.3): + resolution: {integrity: sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.3 + dev: true + + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: false + + /@ts-morph/common@0.11.1: + resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} + dependencies: + fast-glob: 3.3.2 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + dev: false + + /@tsconfig/node10@1.0.11: + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + dev: false + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: false + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: false + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: true + + /@types/node@14.18.33: + resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} + dev: false + + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: true + + /@types/react@18.2.79: + resolution: {integrity: sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==} + dependencies: + '@types/prop-types': 15.7.5 + csstype: 3.1.2 + dev: true + + /@types/stylis@4.2.0: + resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} + dev: false + + /@typescript-eslint/parser@7.2.0(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.3.4 + eslint: 9.0.0 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@7.2.0: + resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + dev: true + + /@typescript-eslint/types@7.2.0: + resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.5): + resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/visitor-keys@7.2.0: + resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 7.2.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@vercel/build-utils@7.11.0: + resolution: {integrity: sha512-UFrx1hNIjNJJkd0NZrYfaOrmcWhQmrVsbKe9o3L9jX9J1iufG685wIZ9tFCKKC0Fa2HWbNDNzNxrE5SCAS2lyA==} + dev: false + + /@vercel/error-utils@2.0.2: + resolution: {integrity: sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ==} + dev: false + + /@vercel/fun@1.1.0: + resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} + engines: {node: '>= 10'} + dependencies: + '@tootallnate/once': 2.0.0 + async-listen: 1.2.0 + debug: 4.1.1 + execa: 3.2.0 + fs-extra: 8.1.0 + generic-pool: 3.4.2 + micro: 9.3.5-canary.3 + ms: 2.1.1 + node-fetch: 2.6.7 + path-match: 1.2.4 + promisepipe: 3.0.0 + semver: 7.3.5 + stat-mode: 0.3.0 + stream-to-promise: 2.2.0 + tar: 4.4.18 + tree-kill: 1.2.2 + uid-promise: 1.0.0 + uuid: 3.3.2 + xdg-app-paths: 5.1.0 + yauzl-promise: 2.1.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/gatsby-plugin-vercel-analytics@1.0.11: + resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} + dependencies: + web-vitals: 0.2.4 + dev: false + + /@vercel/gatsby-plugin-vercel-builder@2.0.24: + resolution: {integrity: sha512-b02ifu8WCmz4ARjkC9AyuOxpXa0Tmh0uIbDDYvyvDRpvohQY53eC3sXKVOejnmQbi9KojkaJsQRvMTBRh9BUHA==} + dependencies: + '@sinclair/typebox': 0.25.24 + '@vercel/build-utils': 7.11.0 + '@vercel/routing-utils': 3.1.0 + esbuild: 0.14.47 + etag: 1.8.1 + fs-extra: 11.1.0 + dev: false + + /@vercel/git-hooks@1.0.0: + resolution: {integrity: sha512-OxDFAAdyiJ/H0b8zR9rFCu3BIb78LekBXOphOYG3snV4ULhKFX387pBPpqZ9HLiRTejBWBxYEahkw79tuIgdAA==} + requiresBuild: true + dev: true + + /@vercel/go@3.1.1: + resolution: {integrity: sha512-mrzomNYltxkjvtUmaYry5YEyvwTz6c/QQHE5Gr/pPGRIniUiP6T6OFOJ49RBN7e6pRXaNzHPVuidiuBhvHh5+Q==} + dev: false + + /@vercel/hydrogen@1.0.2: + resolution: {integrity: sha512-/Q2MKk1GfOuZAnkE9jQexjtUQqanbY65R+xtJWd9yKIgwcfRI1hxiNH3uXyVM5AvLoY+fxxULkSuxDtUKpkJpQ==} + dependencies: + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + dev: false + + /@vercel/next@4.2.0: + resolution: {integrity: sha512-2KSXdPHpfPWaf0tKTBxOWvdc8e9TPNARjmqtgYUsrl1TVaBNFsZ0GV0kWaVLEw4o7CWfREt8ZY064sNVb1BcAQ==} + dependencies: + '@vercel/nft': 0.26.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/nft@0.26.4: + resolution: {integrity: sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + '@rollup/pluginutils': 4.2.1 + acorn: 8.11.3 + acorn-import-attributes: 1.9.5(acorn@8.11.3) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + node-gyp-build: 4.8.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/node@3.0.26: + resolution: {integrity: sha512-PoyacnoylwpE3+7RFUVHJlbPqtneTCEJVXXx4n8g9ARgUDSRSCwFpJOhiFQon2sS2YtfCzsJa29Z9dAZQedDcQ==} + dependencies: + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 + '@types/node': 14.18.33 + '@vercel/build-utils': 7.11.0 + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4 + '@vercel/static-config': 3.0.0 + async-listen: 3.0.0 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 + esbuild: 0.14.47 + etag: 1.8.1 + node-fetch: 2.6.9 + path-to-regexp: 6.2.1 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) + typescript: 4.9.5 + undici: 5.26.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color + dev: false + + /@vercel/python@4.1.1: + resolution: {integrity: sha512-EbAdKOZ0hPd5b59tLt7R3RQK1azNvuZTrCFRAVHNjqcIHNCmrSvjag5zBGn7Memkk8qWb3+CgBw9K/3LJKei0w==} + dev: false + + /@vercel/redwood@2.0.8: + resolution: {integrity: sha512-hAu7SYXDt+W7kscjtQ5NsuNflXH+QB5/xAdA6FRSS/e41lG6Xq6pqLMDobqq4BR7E2PpppVDw2DUx9KzPNoeEw==} + dependencies: + '@vercel/nft': 0.26.4 + '@vercel/routing-utils': 3.1.0 + semver: 6.3.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/remix-builder@2.1.5: + resolution: {integrity: sha512-VaDhsNg/1lZ7h6GJnaykActeZTRtFQz45qDNwKrHM+Nw5/ocwTun9sCJZY/ziECUNuQEJv95z3wUDhNweG+/9w==} + dependencies: + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/routing-utils@3.1.0: + resolution: {integrity: sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==} + dependencies: + path-to-regexp: 6.1.0 + optionalDependencies: + ajv: 6.12.6 + dev: false + + /@vercel/ruby@2.0.5: + resolution: {integrity: sha512-Gfm8HDech41vf+EPleRzgoJUnDTJerKgckMm4KX0JT860gV9XBMSOWYH7eMWHmMza104+HRCWL7wT6OlpftF2Q==} + dev: false + + /@vercel/static-build@2.4.6: + resolution: {integrity: sha512-LCmEBXRse7Bt46fo4OUzkq6RL1Q26oMWvmbFsW5uKi6bkT8asU1U5/zw9PQTeFQjGRL2vkUi22fGXF6XHuuqsA==} + dependencies: + '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 + '@vercel/gatsby-plugin-vercel-builder': 2.0.24 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + dev: false + + /@vercel/static-config@3.0.0: + resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} + dependencies: + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + ts-morph: 12.0.0 + dev: false + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /acorn-import-attributes@1.9.5(acorn@8.11.3): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.11.3 + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: false + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: false + + /arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + dev: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: false + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + dev: true + + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true + + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + dev: true + + /async-listen@1.2.0: + resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} + dev: false + + /async-listen@3.0.0: + resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} + engines: {node: '>= 14'} + dev: false + + /async-listen@3.0.1: + resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} + engines: {node: '>= 14'} + dev: false + + /async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + dev: false + + /autoprefixer@10.4.19(postcss@8.4.38): + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001611 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + dev: true + + /axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + dev: true + + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001611 + electron-to-chromium: 1.4.740 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: false + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + dev: false + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + dev: false + + /caniuse-lite@1.0.30001611: + resolution: {integrity: sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==} + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chokidar@3.3.1: + resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.3.0 + optionalDependencies: + fsevents: 2.1.3 + dev: false + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: false + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: false + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: true + + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + dependencies: + slice-ansi: 5.0.0 + string-width: 7.1.0 + dev: true + + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + dev: false + + /code-block-writer@10.1.1: + resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + optional: true + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + optional: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: false + + /content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + dev: false + + /convert-hrtime@3.0.0: + resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} + engines: {node: '>=8'} + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + dev: false + + /css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + dev: false + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + dev: false + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: false + + /dinero.js@2.0.0-alpha.10: + resolution: {integrity: sha512-EDiOZanmJBJnFfiz5cUL/I2UI7EXQ0jXf18srqgO7sQhChyBbN39b5sf6T4fq4Oj3f4/6x2L96YPUbMRcUmd/A==} + dependencies: + '@dinero.js/calculator-number': 2.0.0-alpha.10 + '@dinero.js/core': 2.0.0-alpha.10 + '@dinero.js/currencies': 2.0.0-alpha.10 + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /edge-runtime@2.5.9: + resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} + engines: {node: '>=16'} + hasBin: true + dependencies: + '@edge-runtime/format': 2.2.1 + '@edge-runtime/ponyfill': 2.4.2 + '@edge-runtime/vm': 3.2.0 + async-listen: 3.0.1 + mri: 1.2.0 + picocolors: 1.0.0 + pretty-ms: 7.0.1 + signal-exit: 4.0.2 + time-span: 4.0.0 + dev: false + + /electron-to-chromium@1.4.740: + resolution: {integrity: sha512-Yvg5i+iyv7Xm18BRdVPVm8lc7kgxM3r6iwqCH2zB7QZy1kZRNmd0Zqm0zcD9XoFREE5/5rwIuIAOT+/mzGcnZg==} + dev: true + + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.1.0: + resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} + dependencies: + once: 1.3.3 + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + dev: true + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + dev: true + + /es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + dev: false + + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild-android-64@0.14.47: + resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /esbuild-android-arm64@0.14.47: + resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /esbuild-darwin-64@0.14.47: + resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /esbuild-darwin-arm64@0.14.47: + resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /esbuild-freebsd-64@0.14.47: + resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /esbuild-freebsd-arm64@0.14.47: + resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-32@0.14.47: + resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-64@0.14.47: + resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-arm64@0.14.47: + resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-arm@0.14.47: + resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-mips64le@0.14.47: + resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-ppc64le@0.14.47: + resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-riscv64@0.14.47: + resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-s390x@0.14.47: + resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-netbsd-64@0.14.47: + resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /esbuild-openbsd-64@0.14.47: + resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /esbuild-sunos-64@0.14.47: + resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /esbuild-windows-32@0.14.47: + resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /esbuild-windows-64@0.14.47: + resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /esbuild-windows-arm64@0.14.47: + resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /esbuild@0.14.47: + resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-64: 0.14.47 + esbuild-android-arm64: 0.14.47 + esbuild-darwin-64: 0.14.47 + esbuild-darwin-arm64: 0.14.47 + esbuild-freebsd-64: 0.14.47 + esbuild-freebsd-arm64: 0.14.47 + esbuild-linux-32: 0.14.47 + esbuild-linux-64: 0.14.47 + esbuild-linux-arm: 0.14.47 + esbuild-linux-arm64: 0.14.47 + esbuild-linux-mips64le: 0.14.47 + esbuild-linux-ppc64le: 0.14.47 + esbuild-linux-riscv64: 0.14.47 + esbuild-linux-s390x: 0.14.47 + esbuild-netbsd-64: 0.14.47 + esbuild-openbsd-64: 0.14.47 + esbuild-sunos-64: 0.14.47 + esbuild-windows-32: 0.14.47 + esbuild-windows-64: 0.14.47 + esbuild-windows-arm64: 0.14.47 + dev: false + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-config-next@14.2.2(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-12/uFc0KX+wUs7EDpOUGKMXBXZJiBVGdK5/m/QgXOCg2mQ0bQWoKSWNrCeOg7Vum6Kw1d1TW453W6xh+GbHquw==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 14.2.2 + '@rushstack/eslint-patch': 1.10.2 + '@typescript-eslint/parser': 7.2.0(eslint@9.0.0)(typescript@5.4.5) + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@9.0.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@9.0.0) + eslint-plugin-react: 7.34.1(eslint@9.0.0) + eslint-plugin-react-hooks: 4.6.0(eslint@9.0.0) + typescript: 5.4.5 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@9.0.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.16.0 + eslint: 9.0.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.3 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 7.2.0(eslint@9.0.0)(typescript@5.4.5) + debug: 3.2.7 + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@9.0.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 7.2.0(eslint@9.0.0)(typescript@5.4.5) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jsx-a11y@6.8.0(eslint@9.0.0): + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.24.4 + aria-query: 5.3.0 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.18 + eslint: 9.0.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@9.0.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 9.0.0 + dev: true + + /eslint-plugin-react@7.34.1(eslint@9.0.0): + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.3 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.18 + eslint: 9.0.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + dev: true + + /eslint-scope@8.0.1: + resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /eslint@9.0.0: + resolution: {integrity: sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 3.0.2 + '@eslint/js': 9.0.0 + '@humanwhocodes/config-array': 0.12.3 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + escape-string-regexp: 4.0.0 + eslint-scope: 8.0.1 + eslint-visitor-keys: 4.0.0 + espree: 10.0.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@10.0.1: + resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 4.0.0 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + + /events-intercept@2.0.0: + resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} + dev: false + + /execa@3.2.0: + resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} + engines: {node: ^8.12.0 || >=9.7.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: false + + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + dependencies: + flat-cache: 4.0.1 + dev: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + dev: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 + dev: false + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: false + + /fsevents@2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + deprecated: '"Please update to latest v2.3 or v2.2"' + requiresBuild: true + dev: false + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + + /generic-pool@3.4.2: + resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} + engines: {node: '>= 4'} + dev: false + + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: true + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: false + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true + + /get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.0.4 + path-scurry: 1.10.2 + dev: true + + /glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.0.4 + path-scurry: 1.10.2 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: true + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /http-errors@1.4.0: + resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} + engines: {node: '>= 0.6'} + dependencies: + inherits: 2.0.1 + statuses: 1.5.0 + dev: false + + /http-errors@1.7.3: + resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: false + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: false + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + + /inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + dev: true + + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + optional: true + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + dependencies: + get-east-asian-width: 1.2.0 + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true + + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true + + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.15 + dev: true + + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + dev: true + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-to-ts@1.6.4: + resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} + dependencies: + '@types/json-schema': 7.0.15 + ts-toolbelt: 6.15.5 + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: true + + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + dependencies: + language-subtag-registry: 0.3.22 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: true + + /lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lint-staged@15.2.2: + resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 11.1.0 + debug: 4.3.4 + execa: 8.0.1 + lilconfig: 3.0.0 + listr2: 8.0.1 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} + engines: {node: '>=18.0.0'} + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.0.0 + rfdc: 1.3.1 + wrap-ansi: 9.0.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + dependencies: + ansi-escapes: 6.2.1 + cli-cursor: 4.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: false + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /micro@9.3.5-canary.3: + resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} + engines: {node: '>= 8.0.0'} + hasBin: true + dependencies: + arg: 4.1.0 + content-type: 1.0.4 + raw-body: 2.4.1 + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: false + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: false + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + dev: false + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@3.0.0-canary.1: + resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==} + engines: {node: '>=12.13'} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /next@15.0.0-canary.193(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-X17zCn32Tl2lpnYoNFcGlTAkDGAyXGNpnsu6HJec/vrTA5ogi+TArSgorGQdXnKCAR+GnwSn/Um3S46VUvcCxw==} + engines: {node: '>=18.18.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-cd22717c-20241013 + react-dom: ^18.2.0 || 19.0.0-rc-cd22717c-20241013 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + dependencies: + '@next/env': 15.0.0-canary.193 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.13 + busboy: 1.6.0 + caniuse-lite: 1.0.30001611 + postcss: 8.4.31 + react: 19.0.0-rc-cd22717c-20241013 + react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013) + styled-jsx: 5.1.6(react@19.0.0-rc-cd22717c-20241013) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.0-canary.193 + '@next/swc-darwin-x64': 15.0.0-canary.193 + '@next/swc-linux-arm64-gnu': 15.0.0-canary.193 + '@next/swc-linux-arm64-musl': 15.0.0-canary.193 + '@next/swc-linux-x64-gnu': 15.0.0-canary.193 + '@next/swc-linux-x64-musl': 15.0.0-canary.193 + '@next/swc-win32-arm64-msvc': 15.0.0-canary.193 + '@next/swc-win32-x64-msvc': 15.0.0-canary.193 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + hasBin: true + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: false + + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + dev: true + + /object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + dev: false + + /p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + dev: false + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-match@1.2.4: + resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} + dependencies: + http-errors: 1.4.0 + path-to-regexp: 1.8.0 + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + dev: true + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: false + + /path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} + dev: false + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true + + /postcss-import@15.1.0(postcss@8.4.38): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + + /postcss-js@4.0.1(postcss@8.4.38): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + dev: true + + /postcss-load-config@4.0.2(postcss@8.4.38): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.1 + postcss: 8.4.38 + yaml: 2.4.1 + dev: true + + /postcss-nested@6.0.1(postcss@8.4.38): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: true + + /postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + dev: false + + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-plugin-tailwindcss@0.5.14(prettier@3.2.5): + resolution: {integrity: sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + dependencies: + prettier: 3.2.5 + dev: true + + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + dependencies: + parse-ms: 2.1.0 + dev: false + + /promisepipe@3.0.0: + resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /raw-body@2.4.1: + resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.0 + http-errors: 1.7.3 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-NzjTBOXygonUxLRQuUUW5V2QLGkAcyUwJoS8+UWxs089paMvQQfoRD51w65Ovgd2OEQ8Rm3HWx+82fvXiT0czQ==} + peerDependencies: + react: 19.0.0-rc-cd22717c-20241013 + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + scheduler: 0.25.0-rc-cd22717c-20241013 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react@19.0.0-rc-cd22717c-20241013: + resolution: {integrity: sha512-k28GszmyQ1tX/JmeLGZINq5KXiNy/MmN0fCAtcwF8a9INDyVYG0zATCRGJwaPB9WixmkuwPv1BfB1QBfJC7cNg==} + engines: {node: '>=0.10.0'} + dev: false + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.3.0: + resolution: {integrity: sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: true + + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: false + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /scheduler@0.25.0-rc-cd22717c-20241013: + resolution: {integrity: sha512-MnsFR57bKcrYslnbCUsaUG0qBuAArk92VxE0zu6A2Usz38iIuL2uZLunqKlP1W47MF33GrRGDj1sXdPbFKIZfw==} + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + dev: false + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /setprototypeof@1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + dev: false + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + dev: false + + /sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + dev: false + optional: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + optional: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + dev: true + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + /stat-mode@0.3.0: + resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} + dev: false + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: false + + /stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + dependencies: + any-promise: 1.3.0 + dev: false + + /stream-to-promise@2.2.0: + resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + dependencies: + any-promise: 1.3.0 + end-of-stream: 1.1.0 + stream-to-array: 2.3.0 + dev: false + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + dev: true + + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /styled-components@6.1.8(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + dependencies: + '@emotion/is-prop-valid': 1.2.1 + '@emotion/unitless': 0.8.0 + '@types/stylis': 4.2.0 + css-to-react-native: 3.2.0 + csstype: 3.1.2 + postcss: 8.4.31 + react: 19.0.0-rc-cd22717c-20241013 + react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013) + shallowequal: 1.1.0 + stylis: 4.3.1 + tslib: 2.5.0 + dev: false + + /styled-jsx@5.1.6(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 19.0.0-rc-cd22717c-20241013 + dev: false + + /stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + dev: false + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.3.12 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /tailwindcss@3.4.3: + resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /tar@4.4.18: + resolution: {integrity: sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: false + + /tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /time-span@4.0.0: + resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} + engines: {node: '>=10'} + dependencies: + convert-hrtime: 3.0.0 + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /toidentifier@1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: false + + /ts-api-utils@1.3.0(typescript@5.4.5): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.4.5 + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /ts-morph@12.0.0: + resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} + dependencies: + '@ts-morph/common': 0.11.1 + code-block-writer: 10.1.1 + dev: false + + /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.9.5): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.18.33 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false + + /ts-toolbelt@6.15.5: + resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + dev: false + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: true + + /types-react-dom@19.0.0-rc.1: + resolution: {integrity: sha512-VSLZJl8VXCD0fAWp7DUTFUDCcZ8DVXOQmjhJMD03odgeFmu14ZQJHCXeETm3BEAhJqfgJaFkLnGkQv88sRx0fQ==} + dependencies: + '@types/react': 18.2.79 + dev: true + + /types-react@19.0.0-rc.1: + resolution: {integrity: sha512-RshndUfqTW6K3STLPis8BtAYCGOkMbtvYsi90gmVNDZBXUyUc5juf2PE9LfS/JmOlUIRO8cWTS/1MTnmhjDqyQ==} + dependencies: + csstype: 3.1.2 + dev: true + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: false + + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /uid-promise@1.0.0: + resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} + dev: false + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /undici@5.26.5: + resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + dev: false + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /use-count-up@3.0.1(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-jlVsXJYje6jh+xwQaCEYrwHoB+nRyillNEmr21bhe9kw7tpRzyrSq9jQs9UOlo+8hCFkuOmjUihL3IjEK/piVg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + use-elapsed-time: 3.0.2(react@19.0.0-rc-cd22717c-20241013) + dev: false + + /use-elapsed-time@3.0.2(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-2EY9lJ5DWbAvT8wWiEp6Ztnl46DjXz2j78uhWbXaz/bg3OfpbgVucCAlcN8Bih6hTJfFTdVYX9L6ySMn5py/wQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /uuid@3.3.2: + resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: false + + /vercel@34.0.0: + resolution: {integrity: sha512-0Gewf/gB/UDnkGA/wyAzf3wxXuDqCvPFKFkAcByV3PuoCF5j71MqjV3GpFC0rQREF7CZZflFMhoaQO70a9x/fA==} + engines: {node: '>= 16'} + hasBin: true + dependencies: + '@vercel/build-utils': 7.11.0 + '@vercel/fun': 1.1.0 + '@vercel/go': 3.1.1 + '@vercel/hydrogen': 1.0.2 + '@vercel/next': 4.2.0 + '@vercel/node': 3.0.26 + '@vercel/python': 4.1.1 + '@vercel/redwood': 2.0.8 + '@vercel/remix-builder': 2.1.5 + '@vercel/ruby': 2.0.5 + '@vercel/static-build': 2.4.6 + chokidar: 3.3.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color + dev: false + + /web-vitals@0.2.4: + resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + dev: true + + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + string-width: 7.1.0 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /xdg-app-paths@5.1.0: + resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} + engines: {node: '>=6'} + dependencies: + xdg-portable: 7.3.0 + dev: false + + /xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + dependencies: + os-paths: 4.4.0 + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + + /yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + engines: {node: '>= 14'} + hasBin: true + dev: true + + /yauzl-clone@1.0.4: + resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} + engines: {node: '>=6'} + dependencies: + events-intercept: 2.0.0 + dev: false + + /yauzl-promise@2.1.3: + resolution: {integrity: sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==} + engines: {node: '>=6'} + dependencies: + yauzl: 2.10.0 + yauzl-clone: 1.0.4 + dev: false + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/apps/next-app-router-4000/postcss.config.js b/apps/next-app-router-4000/postcss.config.js new file mode 100644 index 00000000000..12a703d900d --- /dev/null +++ b/apps/next-app-router-4000/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/apps/next-app-router-4000/prettier.config.js b/apps/next-app-router-4000/prettier.config.js new file mode 100644 index 00000000000..e73771e3795 --- /dev/null +++ b/apps/next-app-router-4000/prettier.config.js @@ -0,0 +1,9 @@ +module.exports = { + arrowParens: 'always', + semi: true, + trailingComma: 'all', + singleQuote: true, + // pnpm doesn't support plugin autoloading + // https://github.com/tailwindlabs/prettier-plugin-tailwindcss#installation + plugins: ['prettier-plugin-tailwindcss'], +}; diff --git a/apps/next-app-router-4000/project.json b/apps/next-app-router-4000/project.json new file mode 100644 index 00000000000..63f23344afd --- /dev/null +++ b/apps/next-app-router-4000/project.json @@ -0,0 +1,84 @@ +{ + "name": "next-app-router-4000", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/next-app-router-4000", + "projectType": "application", + "tags": [], + "targets": { + "build": { + "executor": "@nx/next:build", + "defaultConfiguration": "production", + "options": { + "outputPath": "apps/next-app-router-4000" + }, + "configurations": { + "development": { + "outputPath": "apps/next-app-router-4000" + }, + "production": {} + }, + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ] + }, + "serve": { + "executor": "nx:run-commands", + "options": { + "command": "pnpm dev", + "cwd": "apps/next-app-router-4000" + }, + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ] + }, + "export": { + "executor": "@nx/next:export", + "options": { + "buildTarget": "next-app-router-4000:build:production" + } + }, + "lint": { + "executor": "@nx/eslint:lint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["apps/next-app-router-4000/**/*.{ts,tsx,js,jsx}"] + } + }, + "e2e": { + "executor": "@nx/cypress:cypress", + "options": { + "cypressConfig": "apps/next-app-router-4000/cypress.config.ts", + "testingType": "e2e", + "baseUrl": "http://localhost:4000", + "key": "27e40c91-5ac3-4433-8a87-651d10f51cf6" + }, + "configurations": { + "production": { + "devServerTarget": "next-app-router-4000:serve:production" + } + } + }, + "test:e2e": { + "executor": "nx:run-commands", + "options": { + "parallel": true, + "commands": [ + { + "command": "lsof -i :4000 || nx run next-app-router-4000:serve", + "forwardAllArgs": false + }, + { + "command": "sleep 4 && nx run next-app-router-4000:e2e", + "forwardAllArgs": true + } + ] + } + } + } +} diff --git a/apps/next-app-router-4000/public/alexander-andrews-brAkTCdnhW8-unsplash.jpg b/apps/next-app-router-4000/public/alexander-andrews-brAkTCdnhW8-unsplash.jpg new file mode 100644 index 00000000000..9d5daa0f5bd Binary files /dev/null and b/apps/next-app-router-4000/public/alexander-andrews-brAkTCdnhW8-unsplash.jpg differ diff --git a/apps/next-app-router-4000/public/eniko-kis-KsLPTsYaqIQ-unsplash.jpg b/apps/next-app-router-4000/public/eniko-kis-KsLPTsYaqIQ-unsplash.jpg new file mode 100644 index 00000000000..40f4ffd5c7f Binary files /dev/null and b/apps/next-app-router-4000/public/eniko-kis-KsLPTsYaqIQ-unsplash.jpg differ diff --git a/apps/next-app-router-4000/public/grid.svg b/apps/next-app-router-4000/public/grid.svg new file mode 100644 index 00000000000..d467ad6de0d --- /dev/null +++ b/apps/next-app-router-4000/public/grid.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/next-app-router-4000/public/guillaume-coupy-6HuoHgK7FN8-unsplash.jpg b/apps/next-app-router-4000/public/guillaume-coupy-6HuoHgK7FN8-unsplash.jpg new file mode 100644 index 00000000000..527bbb514fc Binary files /dev/null and b/apps/next-app-router-4000/public/guillaume-coupy-6HuoHgK7FN8-unsplash.jpg differ diff --git a/apps/next-app-router-4000/public/nextjs-icon-light-background.png b/apps/next-app-router-4000/public/nextjs-icon-light-background.png new file mode 100644 index 00000000000..659139c1819 Binary files /dev/null and b/apps/next-app-router-4000/public/nextjs-icon-light-background.png differ diff --git a/apps/next-app-router-4000/public/patrick-OIFgeLnjwrM-unsplash.jpg b/apps/next-app-router-4000/public/patrick-OIFgeLnjwrM-unsplash.jpg new file mode 100644 index 00000000000..e19a4a1bf82 Binary files /dev/null and b/apps/next-app-router-4000/public/patrick-OIFgeLnjwrM-unsplash.jpg differ diff --git a/apps/next-app-router-4000/public/prince-akachi-LWkFHEGpleE-unsplash.jpg b/apps/next-app-router-4000/public/prince-akachi-LWkFHEGpleE-unsplash.jpg new file mode 100644 index 00000000000..146a680434d Binary files /dev/null and b/apps/next-app-router-4000/public/prince-akachi-LWkFHEGpleE-unsplash.jpg differ diff --git a/apps/next-app-router-4000/public/yoann-siloine-_T4w3JDm6ug-unsplash.jpg b/apps/next-app-router-4000/public/yoann-siloine-_T4w3JDm6ug-unsplash.jpg new file mode 100644 index 00000000000..ca2d17463c5 Binary files /dev/null and b/apps/next-app-router-4000/public/yoann-siloine-_T4w3JDm6ug-unsplash.jpg differ diff --git a/apps/next-app-router-4000/readme.md b/apps/next-app-router-4000/readme.md new file mode 100644 index 00000000000..c6db1f9845e --- /dev/null +++ b/apps/next-app-router-4000/readme.md @@ -0,0 +1,28 @@ +# Next.js App Router Playground + +Next.js recently introduced the App Router with support for: + +- **Layouts:** Easily share UI while preserving state and avoiding re-renders. +- **Server Components:** Making server-first the default for the most dynamic applications. +- **Streaming:** Display instant loading states and stream in updates. +- **Suspense for Data Fetching:** `async`/`await` support and the `use` hook for component-level fetching. + +The App Router can coexist with the existing `pages` directory for incremental adoption. While you **don't need to use the App Router** when upgrading to Next.js 13, we're laying the foundations to build complex interfaces while shipping less JavaScript. + +## Running Locally + +1. Install dependencies: + +```sh +pnpm install +``` + +2. Start the dev server: + +```sh +pnpm dev +``` + +## Documentation + +https://nextjs.org/docs diff --git a/apps/next-app-router-4000/styles/globals.css b/apps/next-app-router-4000/styles/globals.css new file mode 100755 index 00000000000..b5c61c95671 --- /dev/null +++ b/apps/next-app-router-4000/styles/globals.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/apps/next-app-router-4000/tailwind.config.ts b/apps/next-app-router-4000/tailwind.config.ts new file mode 100644 index 00000000000..1dc84971594 --- /dev/null +++ b/apps/next-app-router-4000/tailwind.config.ts @@ -0,0 +1,90 @@ +import colors from 'tailwindcss/colors'; +import { Config } from 'tailwindcss'; + +export default { + content: [ + './app/**/*.{js,ts,jsx,tsx,mdx}', + './pages/**/*.{js,ts,jsx,tsx,mdx}', + './ui/**/*.{js,ts,jsx,tsx,mdx}', + ], + future: { + hoverOnlyWhenSupported: true, + }, + darkMode: 'class', + theme: { + extend: { + // https://vercel.com/design/color + colors: { + gray: colors.zinc, + 'gray-1000': 'rgb(17,17,19)', + 'gray-1100': 'rgb(10,10,11)', + vercel: { + pink: '#FF0080', + blue: '#0070F3', + cyan: '#50E3C2', + orange: '#F5A623', + violet: '#7928CA', + }, + }, + backgroundImage: ({ theme }) => ({ + 'vc-border-gradient': `radial-gradient(at left top, ${theme( + 'colors.gray.500', + )}, 50px, ${theme('colors.gray.800')} 50%)`, + }), + keyframes: ({ theme }) => ({ + rerender: { + '0%': { + ['border-color']: theme('colors.vercel.pink'), + }, + '40%': { + ['border-color']: theme('colors.vercel.pink'), + }, + }, + highlight: { + '0%': { + background: theme('colors.vercel.pink'), + color: theme('colors.white'), + }, + '40%': { + background: theme('colors.vercel.pink'), + color: theme('colors.white'), + }, + }, + loading: { + '0%': { + opacity: '.2', + }, + '20%': { + opacity: '1', + transform: 'translateX(1px)', + }, + to: { + opacity: '.2', + }, + }, + shimmer: { + '100%': { + transform: 'translateX(100%)', + }, + }, + translateXReset: { + '100%': { + transform: 'translateX(0)', + }, + }, + fadeToTransparent: { + '0%': { + opacity: '1', + }, + '40%': { + opacity: '1', + }, + '100%': { + opacity: '0', + }, + }, + }), + }, + }, + plugins: [require('@tailwindcss/typography'), require('@tailwindcss/forms')], +} satisfies Config; diff --git a/apps/next-app-router-4000/tsconfig.json b/apps/next-app-router-4000/tsconfig.json new file mode 100755 index 00000000000..399d25eda35 --- /dev/null +++ b/apps/next-app-router-4000/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "baseUrl": ".", + "paths": { + "#/*": ["./*"] + }, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/apps/next-app-router-4000/ui/address-bar.tsx b/apps/next-app-router-4000/ui/address-bar.tsx new file mode 100644 index 00000000000..03ce8f4d941 --- /dev/null +++ b/apps/next-app-router-4000/ui/address-bar.tsx @@ -0,0 +1,92 @@ +'use client'; + +import React, { Suspense } from 'react'; +import { usePathname, useSearchParams } from 'next/navigation'; + +function Params() { + const searchParams = useSearchParams()!; + + return searchParams.toString().length !== 0 ? ( +
+ ? + {Array.from(searchParams.entries()).map(([key, value], index) => { + return ( + + {index !== 0 ? & : null} + + + {key} + + = + + {value} + + + + ); + })} +
+ ) : null; +} + +export function AddressBar() { + const pathname = usePathname(); + + return ( +
+
+ + + +
+
+
+ acme.com +
+ {pathname ? ( + <> + / + {pathname + .split('/') + .slice(2) + .map((segment) => { + return ( + + + + {segment} + + + + / + + ); + })} + + ) : null} + + + + +
+
+ ); +} diff --git a/apps/next-app-router-4000/ui/boundary.tsx b/apps/next-app-router-4000/ui/boundary.tsx new file mode 100644 index 00000000000..fbc18226ac3 --- /dev/null +++ b/apps/next-app-router-4000/ui/boundary.tsx @@ -0,0 +1,82 @@ +import clsx from 'clsx'; +import React from 'react'; + +const Label = ({ + children, + animateRerendering, + color, +}: { + children: React.ReactNode; + animateRerendering?: boolean; + color?: 'default' | 'pink' | 'blue' | 'violet' | 'cyan' | 'orange'; +}) => { + return ( +
+ {children} +
+ ); +}; +export const Boundary = ({ + children, + labels = ['children'], + size = 'default', + color = 'default', + animateRerendering = true, +}: { + children: React.ReactNode; + labels?: string[]; + size?: 'small' | 'default'; + color?: 'default' | 'pink' | 'blue' | 'violet' | 'cyan' | 'orange'; + animateRerendering?: boolean; +}) => { + return ( +
+
+ {labels.map((label) => { + return ( + + ); + })} +
+ + {children} +
+ ); +}; diff --git a/apps/next-app-router-4000/ui/buggy-button.tsx b/apps/next-app-router-4000/ui/buggy-button.tsx new file mode 100644 index 00000000000..3a0906605d6 --- /dev/null +++ b/apps/next-app-router-4000/ui/buggy-button.tsx @@ -0,0 +1,23 @@ +'use client'; + +import Button from 'remote_4001/Button'; +import React from 'react'; + +export default function BuggyButton() { + const [clicked, setClicked] = React.useState(false); + + if (clicked) { + throw new Error('Oh no! Something went wrong.'); + } + + return ( + + ); +} diff --git a/apps/next-app-router-4000/ui/button.tsx b/apps/next-app-router-4000/ui/button.tsx new file mode 100644 index 00000000000..8aafa7e7a92 --- /dev/null +++ b/apps/next-app-router-4000/ui/button.tsx @@ -0,0 +1,20 @@ +import clsx from 'clsx'; + +export default function Button({ + kind = 'default', + ...props +}: React.ButtonHTMLAttributes & { + kind?: 'default' | 'error'; +}) { + return ( + + ); +} diff --git a/apps/next-app-router-4000/ui/component-tree.tsx b/apps/next-app-router-4000/ui/component-tree.tsx new file mode 100644 index 00000000000..3f3e43ee353 --- /dev/null +++ b/apps/next-app-router-4000/ui/component-tree.tsx @@ -0,0 +1,162 @@ +import { Boundary } from '#/ui/boundary'; +import CountUp from '#/ui/count-up'; +import clsx from 'clsx'; + +type Item = { + name: string; + type: 'server' | 'client'; + size: number; + children?: Item[]; +}; + +const List = ({ items, depth }: { items: Item[]; depth: number }) => { + return ( +
+ {items.map((item, i) => { + const isLast = i === items.length - 1; + + return ( +
+
+
+ {'<'} + {item.name} + {'>'} +
+ +
+ + {item.type === 'client' ? ( + item.size / 1000 + ) : ( + + )} + {' '} + KB +
+
+ + {item.children ? ( + + ) : null} +
+ ); + })} +
+ ); +}; + +// Calculate the total bundle size of a specific component type (client or +// server) in a tree +const sum = (items: Item[], componentType: Item['type']): number => + items.reduce( + (total, item) => + // running total + total + + // add the current component size if it's type is componentType + ((item.type === componentType ? item.size : 0) || 0) + + // add the total size of children components recursively + (item?.children ? sum(item.children, componentType) : 0), + 0, + ); + +export const ComponentTree = ({ items }: { items: Item[] }) => { + const clientTotal = sum(items, 'client'); + const serverTotal = sum(items, 'server'); + const clientDeltaAsPercent = Math.round( + (clientTotal / (clientTotal + serverTotal)) * 100, + ); + + return ( + +
+
+
+ +
+ +
+
+
+
+ {' '} + KB +
+
Bundle Size
+
+ +
+
+
+
+ +
+
+
+ {''} +
+
Client Component
+
+ +
+
+ {''} +
+
Server Component
+
+
+
+
+
+ Note: The component bundle sizes are not yet accurate. +
+
+ + ); +}; diff --git a/apps/next-app-router-4000/ui/count-up.tsx b/apps/next-app-router-4000/ui/count-up.tsx new file mode 100644 index 00000000000..7a2cf99bb09 --- /dev/null +++ b/apps/next-app-router-4000/ui/count-up.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { useCountUp } from 'use-count-up'; + +const CountUp = ({ + start, + end, + duration = 1, +}: { + start: number; + end: number; + duration?: number; +}) => { + const { value } = useCountUp({ + isCounting: true, + end, + start, + duration, + decimalPlaces: 1, + }); + + return {value}; +}; + +export default CountUp; diff --git a/apps/next-app-router-4000/ui/external-link.tsx b/apps/next-app-router-4000/ui/external-link.tsx new file mode 100644 index 00000000000..662994170e0 --- /dev/null +++ b/apps/next-app-router-4000/ui/external-link.tsx @@ -0,0 +1,20 @@ +import { ArrowRightIcon } from '@heroicons/react/24/outline'; + +export const ExternalLink = ({ + children, + href, +}: { + children: React.ReactNode; + href: string; +}) => { + return ( + +
{children}
+ + +
+ ); +}; diff --git a/apps/next-app-router-4000/ui/footer.tsx b/apps/next-app-router-4000/ui/footer.tsx new file mode 100644 index 00000000000..3ac838b2f36 --- /dev/null +++ b/apps/next-app-router-4000/ui/footer.tsx @@ -0,0 +1,41 @@ +'use client'; + +export default function Footer({ + reactVersion, + nextVersion, +}: { + reactVersion: string; + nextVersion: string; +}) { + return ( +
+ + + + Powered by + + + + + +
+
React: {reactVersion}
+
Next: {nextVersion}
+
+
+ ); +} diff --git a/apps/next-app-router-4000/ui/global-nav.tsx b/apps/next-app-router-4000/ui/global-nav.tsx new file mode 100644 index 00000000000..5be9ca6ea55 --- /dev/null +++ b/apps/next-app-router-4000/ui/global-nav.tsx @@ -0,0 +1,100 @@ +'use client'; + +import { demos, type Item } from '#/lib/demos'; +import { NextLogoDark } from '#/ui/next-logo'; +import Link from 'next/link'; +import { useSelectedLayoutSegment } from 'next/navigation'; +import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/solid'; +import clsx from 'clsx'; +import { useState } from 'react'; + +export function GlobalNav() { + const [isOpen, setIsOpen] = useState(false); + const close = () => setIsOpen(false); + + return ( +
+
+ +
+ +
+ +

+ App Router +

+ +
+ + +
+ +
+
+ ); +} + +function GlobalNavItem({ + item, + close, +}: { + item: Item; + close: () => false | void; +}) { + const segment = useSelectedLayoutSegment(); + const isActive = item.slug === segment; + + return ( + + {item.name} + + ); +} diff --git a/apps/next-app-router-4000/ui/header.tsx b/apps/next-app-router-4000/ui/header.tsx new file mode 100644 index 00000000000..8a7c055505a --- /dev/null +++ b/apps/next-app-router-4000/ui/header.tsx @@ -0,0 +1,43 @@ +'use client'; + +import styled from 'styled-components'; + +const HeadContainer = styled.header` + position: relative; + height: 64px; + align-items: center; + padding: 0px 8px; + margin-bottom: 48px; + display: flex; + border: 0 solid #e5e7eb; + color: rgb(244 244 245); + grid-column-start: 2; + grid-column-end: 4; +`; + +const Title = styled.span` + margin: 0 8px; +`; + +const NextJsLogo = (props: any) => ( + + + +); + +export default function Header() { + return ( + + + The React Framework + + ); +} diff --git a/apps/next-app-router-4000/ui/mobile-nav-toggle.tsx b/apps/next-app-router-4000/ui/mobile-nav-toggle.tsx new file mode 100644 index 00000000000..35d77f602a4 --- /dev/null +++ b/apps/next-app-router-4000/ui/mobile-nav-toggle.tsx @@ -0,0 +1,64 @@ +'use client'; + +import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/solid'; +import clsx from 'clsx'; +import React from 'react'; + +const MobileNavContext = React.createContext< + [boolean, React.Dispatch>] | undefined +>(undefined); + +export function MobileNavContextProvider({ + children, +}: { + children: React.ReactNode; +}) { + const [isOpen, setIsOpen] = React.useState(false); + return ( + + {children} + + ); +} + +export function useMobileNavToggle() { + const context = React.useContext(MobileNavContext); + if (context === undefined) { + throw new Error( + 'useMobileNavToggle must be used within a MobileNavContextProvider', + ); + } + return context; +} + +export function MobileNavToggle({ children }: { children: React.ReactNode }) { + const [isOpen, setIsOpen] = useMobileNavToggle(); + + return ( + <> + + +
+ {children} +
+ + ); +} diff --git a/apps/next-app-router-4000/ui/next-logo.tsx b/apps/next-app-router-4000/ui/next-logo.tsx new file mode 100644 index 00000000000..69bec7145ce --- /dev/null +++ b/apps/next-app-router-4000/ui/next-logo.tsx @@ -0,0 +1,117 @@ +export function NextLogoLight() { + return ( + + + + + + + + + + + + + + + + + + + + + ); +} + +export function NextLogoDark() { + return ( + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/apps/next-app-router-4000/ui/ping.tsx b/apps/next-app-router-4000/ui/ping.tsx new file mode 100644 index 00000000000..40768a77ec7 --- /dev/null +++ b/apps/next-app-router-4000/ui/ping.tsx @@ -0,0 +1,8 @@ +export function Ping() { + return ( + + + + + ); +} diff --git a/apps/next-app-router-4000/ui/product-best-seller.tsx b/apps/next-app-router-4000/ui/product-best-seller.tsx new file mode 100644 index 00000000000..d6e10134705 --- /dev/null +++ b/apps/next-app-router-4000/ui/product-best-seller.tsx @@ -0,0 +1,7 @@ +export const ProductBestSeller = () => { + return ( +
+ Best Seller +
+ ); +}; diff --git a/apps/next-app-router-4000/ui/product-card.tsx b/apps/next-app-router-4000/ui/product-card.tsx new file mode 100644 index 00000000000..d10188de451 --- /dev/null +++ b/apps/next-app-router-4000/ui/product-card.tsx @@ -0,0 +1,63 @@ +import { Product } from '#/app/api/products/product'; +import { ProductBestSeller } from '#/ui/product-best-seller'; +import { ProductEstimatedArrival } from '#/ui/product-estimated-arrival'; +import { ProductLowStockWarning } from '#/ui/product-low-stock-warning'; +import { ProductPrice } from '#/ui/product-price'; +import { ProductRating } from '#/ui/product-rating'; +import { ProductUsedPrice } from '#/ui/product-used-price'; +import { dinero, type DineroSnapshot } from 'dinero.js'; +import Image from 'next/image'; +import Link from 'next/link'; + +export const ProductCard = ({ + product, + href, +}: { + product: Product; + href: string; +}) => { + const price = dinero(product.price as DineroSnapshot); + + return ( + +
+
+ {product.isBestSeller ? ( +
+ +
+ ) : null} + {product.name} +
+ +
+ {product.name} +
+ + {product.rating ? : null} + + + + {/* */} + + {product.usedPrice ? ( + + ) : null} + + + + {product.stock <= 1 ? ( + + ) : null} +
+ + ); +}; diff --git a/apps/next-app-router-4000/ui/product-currency-symbol.tsx b/apps/next-app-router-4000/ui/product-currency-symbol.tsx new file mode 100644 index 00000000000..b9d60ace40d --- /dev/null +++ b/apps/next-app-router-4000/ui/product-currency-symbol.tsx @@ -0,0 +1,27 @@ +import { toFormat, type Dinero } from 'dinero.js'; + +export const ProductCurrencySymbol = ({ + dinero, +}: { + dinero: Dinero; +}) => { + let symbol = ''; + switch (toFormat(dinero, ({ currency }) => currency.code)) { + case 'GBP': { + symbol = '£'; + break; + } + + case 'EUR': { + symbol = '€'; + break; + } + + default: { + symbol = '$'; + break; + } + } + + return <>{symbol}; +}; diff --git a/apps/next-app-router-4000/ui/product-deal.tsx b/apps/next-app-router-4000/ui/product-deal.tsx new file mode 100644 index 00000000000..981dfb1f39f --- /dev/null +++ b/apps/next-app-router-4000/ui/product-deal.tsx @@ -0,0 +1,36 @@ +import { ProductCurrencySymbol } from '#/ui/product-currency-symbol'; +import { toUnit, type Dinero } from 'dinero.js'; + +export const ProductDeal = ({ + price: priceRaw, + discount: discountRaw, +}: { + price: Dinero; + discount: { + amount: Dinero; + }; +}) => { + const discount = toUnit(discountRaw.amount); + const price = toUnit(priceRaw); + const percent = Math.round(100 - (discount / price) * 100); + + return ( +
+
+ -{percent}% +
+
+
+ +
+
+ {discount} +
+
+
+ + {price} +
+
+ ); +}; diff --git a/apps/next-app-router-4000/ui/product-estimated-arrival.tsx b/apps/next-app-router-4000/ui/product-estimated-arrival.tsx new file mode 100644 index 00000000000..1b236d4dd41 --- /dev/null +++ b/apps/next-app-router-4000/ui/product-estimated-arrival.tsx @@ -0,0 +1,24 @@ +import { add, format, isTomorrow } from 'date-fns'; + +export const ProductEstimatedArrival = ({ + leadTime, + hasDeliveryTime = false, +}: { + leadTime: number; + hasDeliveryTime?: boolean; +}) => { + const date = add(new Date(), { + days: leadTime, + }); + + return ( +
+ Get it{' '} + + {isTomorrow(date) ? 'tomorrow, ' : null} + {format(date, 'MMM d')} + + {hasDeliveryTime ? <> by 5pm : null} +
+ ); +}; diff --git a/apps/next-app-router-4000/ui/product-lightening-deal.tsx b/apps/next-app-router-4000/ui/product-lightening-deal.tsx new file mode 100644 index 00000000000..d316d020757 --- /dev/null +++ b/apps/next-app-router-4000/ui/product-lightening-deal.tsx @@ -0,0 +1,28 @@ +import { ProductDeal } from '#/ui/product-deal'; +import { add, formatDistanceToNow } from 'date-fns'; +import { type Dinero } from 'dinero.js'; + +export const ProductLighteningDeal = ({ + price, + discount, +}: { + price: Dinero; + discount: { + amount: Dinero; + expires?: number; + }; +}) => { + const date = add(new Date(), { days: discount.expires }); + + return ( + <> +
+
+ Expires in {formatDistanceToNow(date)} +
+
+ + + + ); +}; diff --git a/apps/next-app-router-4000/ui/product-low-stock-warning.tsx b/apps/next-app-router-4000/ui/product-low-stock-warning.tsx new file mode 100644 index 00000000000..26ac0d5e626 --- /dev/null +++ b/apps/next-app-router-4000/ui/product-low-stock-warning.tsx @@ -0,0 +1,13 @@ +export const ProductLowStockWarning = ({ stock }: { stock: number }) => { + if (stock > 3) { + return null; + } + + if (stock === 0) { + return
Out of stock
; + } + + return ( +
Only {stock} left in stock
+ ); +}; diff --git a/apps/next-app-router-4000/ui/product-price.tsx b/apps/next-app-router-4000/ui/product-price.tsx new file mode 100644 index 00000000000..597086e5f74 --- /dev/null +++ b/apps/next-app-router-4000/ui/product-price.tsx @@ -0,0 +1,52 @@ +import { Product } from '#/app/api/products/product'; +import { ProductCurrencySymbol } from '#/ui/product-currency-symbol'; +import { ProductDeal } from '#/ui/product-deal'; +import { ProductLighteningDeal } from '#/ui/product-lightening-deal'; +import { multiply, toUnit, type Dinero } from 'dinero.js'; + +function isDiscount(obj: any): obj is { percent: number; expires?: number } { + return typeof obj?.percent === 'number'; +} + +function formatDiscount( + price: Dinero, + discountRaw: Product['discount'], +) { + return isDiscount(discountRaw) + ? { + amount: multiply(price, { + amount: discountRaw.percent, + scale: 2, + }), + expires: discountRaw.expires, + } + : undefined; +} + +export const ProductPrice = ({ + price, + discount: discountRaw, +}: { + price: Dinero; + discount: Product['discount']; +}) => { + const discount = formatDiscount(price, discountRaw); + + if (discount) { + if (discount?.expires && typeof discount.expires === 'number') { + return ; + } + return ; + } + + return ( +
+
+ +
+
+ {toUnit(price)} +
+
+ ); +}; diff --git a/apps/next-app-router-4000/ui/product-rating.tsx b/apps/next-app-router-4000/ui/product-rating.tsx new file mode 100644 index 00000000000..cc37450378c --- /dev/null +++ b/apps/next-app-router-4000/ui/product-rating.tsx @@ -0,0 +1,17 @@ +import { StarIcon } from '@heroicons/react/24/solid'; +import clsx from 'clsx'; + +export const ProductRating = ({ rating }: { rating: number }) => { + return ( +
+ {Array.from({ length: 5 }).map((_, i) => { + return ( + + ); + })} +
+ ); +}; diff --git a/apps/next-app-router-4000/ui/product-review-card.tsx b/apps/next-app-router-4000/ui/product-review-card.tsx new file mode 100644 index 00000000000..0dae85c2dbb --- /dev/null +++ b/apps/next-app-router-4000/ui/product-review-card.tsx @@ -0,0 +1,19 @@ +import type { Review } from '#/app/api/reviews/review'; +import { ProductRating } from '#/ui/product-rating'; + +export const ProductReviewCard = ({ review }: { review: Review }) => { + return ( +
+
+
+
+
{review.name}
+
+ + {review.rating ? : null} +
+ +
{review.text}
+
+ ); +}; diff --git a/apps/next-app-router-4000/ui/product-split-payments.tsx b/apps/next-app-router-4000/ui/product-split-payments.tsx new file mode 100644 index 00000000000..b1248cc5a8b --- /dev/null +++ b/apps/next-app-router-4000/ui/product-split-payments.tsx @@ -0,0 +1,17 @@ +import { ProductCurrencySymbol } from '#/ui/product-currency-symbol'; +import { allocate, toUnit, up, type Dinero } from 'dinero.js'; + +export const ProductSplitPayments = ({ price }: { price: Dinero }) => { + // only offer split payments for more expensive items + if (toUnit(price) < 150) { + return null; + } + + const [perMonth] = allocate(price, [1, 2]); + return ( +
+ Or + {toUnit(perMonth, { digits: 0, round: up })}/month for 3 months +
+ ); +}; diff --git a/apps/next-app-router-4000/ui/product-used-price.tsx b/apps/next-app-router-4000/ui/product-used-price.tsx new file mode 100644 index 00000000000..db57ed0e65f --- /dev/null +++ b/apps/next-app-router-4000/ui/product-used-price.tsx @@ -0,0 +1,19 @@ +import { Product } from '#/app/api/products/product'; +import { dinero, toUnit, up, type DineroSnapshot } from 'dinero.js'; + +export const ProductUsedPrice = ({ + usedPrice: usedPriceRaw, +}: { + usedPrice: Product['usedPrice']; +}) => { + const usedPrice = dinero(usedPriceRaw as DineroSnapshot); + + return ( +
+
More buying choices
+
+ ${toUnit(usedPrice, { digits: 0, round: up })} (used) +
+
+ ); +}; diff --git a/apps/next-app-router-4000/ui/rendered-time-ago.tsx b/apps/next-app-router-4000/ui/rendered-time-ago.tsx new file mode 100644 index 00000000000..d7c78d1c6b8 --- /dev/null +++ b/apps/next-app-router-4000/ui/rendered-time-ago.tsx @@ -0,0 +1,56 @@ +'use client'; + +import ms from 'ms'; +import { useEffect, useRef, useState } from 'react'; + +// https://github.com/streamich/react-use/blob/master/src/useInterval.ts +const useInterval = (callback: Function, delay?: number | null) => { + const savedCallback = useRef(() => {}); + + useEffect(() => { + savedCallback.current = callback; + }); + + useEffect(() => { + if (delay !== null) { + const interval = setInterval(() => savedCallback.current(), delay || 0); + return () => clearInterval(interval); + } + + return undefined; + }, [delay]); +}; + +export function RenderedTimeAgo({ timestamp }: { timestamp: number }) { + const [msAgo, setMsAgo] = useState(0); + + // update on page change + useEffect(() => { + setMsAgo(Date.now() - timestamp); + }, [timestamp]); + + // update every second + useInterval(() => { + setMsAgo(Date.now() - timestamp); + }, 1000); + + return ( +
+ {msAgo ? ( + <> + + {msAgo >= 1000 ? ms(msAgo) : '0s'} + {' '} + ago + + ) : null} +
+ ); +} diff --git a/apps/next-app-router-4000/ui/rendering-info.tsx b/apps/next-app-router-4000/ui/rendering-info.tsx new file mode 100644 index 00000000000..3048985b506 --- /dev/null +++ b/apps/next-app-router-4000/ui/rendering-info.tsx @@ -0,0 +1,34 @@ +import { RenderedTimeAgo } from '#/ui/rendered-time-ago'; + +export function RenderingInfo({ + type, +}: { + type: 'ssg' | 'ssgod' | 'ssr' | 'isr'; +}) { + let msg = ''; + switch (type) { + case 'ssg': + msg = 'Statically pre-rendered at build time'; + break; + case 'ssgod': + msg = 'Statically rendered on demand'; + break; + case 'isr': + msg = + 'Statically pre-rendered at build time and periodically revalidated'; + break; + case 'ssr': + msg = 'Dynamically rendered at request time'; + break; + } + + return ( +
+
{msg}
+ +
+ +
+
+ ); +} diff --git a/apps/next-app-router-4000/ui/rendering-page-skeleton.tsx b/apps/next-app-router-4000/ui/rendering-page-skeleton.tsx new file mode 100644 index 00000000000..ae8225a0cc9 --- /dev/null +++ b/apps/next-app-router-4000/ui/rendering-page-skeleton.tsx @@ -0,0 +1,18 @@ +const shimmer = `relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_1.5s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent`; + +export function RenderingPageSkeleton() { + return ( +
+
+
+
+
+
+
+
+
+
+
+
+ ); +} diff --git a/apps/next-app-router-4000/ui/section-link.tsx b/apps/next-app-router-4000/ui/section-link.tsx new file mode 100644 index 00000000000..48f4b2edda4 --- /dev/null +++ b/apps/next-app-router-4000/ui/section-link.tsx @@ -0,0 +1,18 @@ +import Link from 'next/link'; + +export const SectionLink = ({ + children, + href, + text, +}: { + children: React.ReactNode; + href: string; + text: string; +}) => ( + +
+ {children} +
+
{text}
+ +); diff --git a/apps/next-app-router-4000/ui/skeleton-card.tsx b/apps/next-app-router-4000/ui/skeleton-card.tsx new file mode 100644 index 00000000000..09e205e6f72 --- /dev/null +++ b/apps/next-app-router-4000/ui/skeleton-card.tsx @@ -0,0 +1,16 @@ +import clsx from 'clsx'; + +export const SkeletonCard = ({ isLoading }: { isLoading?: boolean }) => ( +
+
+
+
+
+
+
+); diff --git a/apps/next-app-router-4000/ui/tab-group.tsx b/apps/next-app-router-4000/ui/tab-group.tsx new file mode 100644 index 00000000000..fb20c54f07b --- /dev/null +++ b/apps/next-app-router-4000/ui/tab-group.tsx @@ -0,0 +1,31 @@ +import { Tab } from '#/ui/tab'; + +export type Item = { + text: string; + slug?: string; + segment?: string; + parallelRoutesKey?: string; +}; + +export const TabGroup = ({ + path, + parallelRoutesKey, + items, +}: { + path: string; + parallelRoutesKey?: string; + items: Item[]; +}) => { + return ( +
+ {items.map((item) => ( + + ))} +
+ ); +}; diff --git a/apps/next-app-router-4000/ui/tab-nav-item.tsx b/apps/next-app-router-4000/ui/tab-nav-item.tsx new file mode 100644 index 00000000000..ad0b10e09e7 --- /dev/null +++ b/apps/next-app-router-4000/ui/tab-nav-item.tsx @@ -0,0 +1,25 @@ +import clsx from 'clsx'; +import Link from 'next/link'; + +export const TabNavItem = ({ + children, + href, + isActive, +}: { + children: React.ReactNode; + href: string; + isActive?: boolean; +}) => { + return ( + + {children} + + ); +}; diff --git a/apps/next-app-router-4000/ui/tab.tsx b/apps/next-app-router-4000/ui/tab.tsx new file mode 100644 index 00000000000..9fa051cb726 --- /dev/null +++ b/apps/next-app-router-4000/ui/tab.tsx @@ -0,0 +1,39 @@ +'use client'; + +import type { Item } from '#/ui/tab-group'; +import clsx from 'clsx'; +import Link from 'next/link'; +import { useSelectedLayoutSegment } from 'next/navigation'; + +export const Tab = ({ + path, + parallelRoutesKey, + item, +}: { + path: string; + parallelRoutesKey?: string; + item: Item; +}) => { + const segment = useSelectedLayoutSegment(parallelRoutesKey); + + const href = item.slug ? path + '/' + item.slug : path; + const isActive = + // Example home pages e.g. `/layouts` + (!item.slug && segment === null) || + segment === item.segment || + // Nested pages e.g. `/layouts/electronics` + segment === item.slug; + + return ( + + {item.text} + + ); +}; diff --git a/apps/next-app-router-4000/ui/vercel-logo.tsx b/apps/next-app-router-4000/ui/vercel-logo.tsx new file mode 100644 index 00000000000..6550d288430 --- /dev/null +++ b/apps/next-app-router-4000/ui/vercel-logo.tsx @@ -0,0 +1,11 @@ +export function VercelLogo() { + return ( + + + + ); +} diff --git a/apps/next-app-router-4001/.eslintrc.json b/apps/next-app-router-4001/.eslintrc.json new file mode 100755 index 00000000000..bffb357a712 --- /dev/null +++ b/apps/next-app-router-4001/.eslintrc.json @@ -0,0 +1,3 @@ +{ + "extends": "next/core-web-vitals" +} diff --git a/apps/next-app-router-4001/.gitignore b/apps/next-app-router-4001/.gitignore new file mode 100755 index 00000000000..6d1ed289361 --- /dev/null +++ b/apps/next-app-router-4001/.gitignore @@ -0,0 +1,37 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js +/.yarn + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# local env files +.env* +!.env*.example + +# vercel +.vercel + +# typescript +*.tsbuildinfo diff --git a/apps/next-app-router-4001/.npmrc b/apps/next-app-router-4001/.npmrc new file mode 100644 index 00000000000..cffe8cdef13 --- /dev/null +++ b/apps/next-app-router-4001/.npmrc @@ -0,0 +1 @@ +save-exact=true diff --git a/apps/next-app-router-4001/.prettierignore b/apps/next-app-router-4001/.prettierignore new file mode 100644 index 00000000000..a66d7e1f76d --- /dev/null +++ b/apps/next-app-router-4001/.prettierignore @@ -0,0 +1,2 @@ +.next +pnpm-lock.yaml diff --git a/apps/next-app-router-4001/app/api/categories/category.d.ts b/apps/next-app-router-4001/app/api/categories/category.d.ts new file mode 100644 index 00000000000..dccaa7448d2 --- /dev/null +++ b/apps/next-app-router-4001/app/api/categories/category.d.ts @@ -0,0 +1,6 @@ +export type Category = { + name: string; + slug: string; + count: number; + parent: string | null; +}; diff --git a/apps/next-app-router-4001/app/api/categories/getCategories.ts b/apps/next-app-router-4001/app/api/categories/getCategories.ts new file mode 100644 index 00000000000..989a293429c --- /dev/null +++ b/apps/next-app-router-4001/app/api/categories/getCategories.ts @@ -0,0 +1,52 @@ +import { notFound } from 'next/navigation'; +import type { Category } from './category'; + +// `server-only` guarantees any modules that import code in file +// will never run on the client. Even though this particular API +// doesn't currently use sensitive environment variables, it's +// good practice to add `server-only` preemptively. +import 'server-only'; + +export async function getCategories({ parent }: { parent?: string } = {}) { + const res = await fetch( + `https://app-playground-api.vercel.app/api/categories${ + parent ? `?parent=${parent}` : '' + }`, + ); + + if (!res.ok) { + // Render the closest `error.js` Error Boundary + throw new Error('Something went wrong!'); + } + + const categories = (await res.json()) as Category[]; + + if (categories.length === 0) { + // Render the closest `not-found.js` Error Boundary + notFound(); + } + + return categories; +} + +export async function getCategory({ slug }: { slug: string }) { + const res = await fetch( + `https://app-playground-api.vercel.app/api/categories${ + slug ? `?slug=${slug}` : '' + }`, + ); + + if (!res.ok) { + // Render the closest `error.js` Error Boundary + throw new Error('Something went wrong!'); + } + + const category = (await res.json()) as Category; + + if (!category) { + // Render the closest `not-found.js` Error Boundary + notFound(); + } + + return category; +} diff --git a/apps/next-app-router-4001/app/api/og/Inter-SemiBold.ttf b/apps/next-app-router-4001/app/api/og/Inter-SemiBold.ttf new file mode 100644 index 00000000000..278ceaa36ba Binary files /dev/null and b/apps/next-app-router-4001/app/api/og/Inter-SemiBold.ttf differ diff --git a/apps/next-app-router-4001/app/api/og/route.tsx b/apps/next-app-router-4001/app/api/og/route.tsx new file mode 100644 index 00000000000..48c1bfaebdc --- /dev/null +++ b/apps/next-app-router-4001/app/api/og/route.tsx @@ -0,0 +1,656 @@ +import type { NextRequest } from 'next/server'; +import { ImageResponse } from 'next/og'; +import type { ReactElement } from 'react'; + +export const runtime = 'edge'; + +const interSemiBold = fetch( + new URL('./Inter-SemiBold.ttf', import.meta.url), +).then((res) => res.arrayBuffer()); + +export async function GET(req: NextRequest): Promise { + try { + const { searchParams } = new URL(req.url); + const isLight = req.headers.get('Sec-CH-Prefers-Color-Scheme') === 'light'; + + const title = searchParams.has('title') + ? searchParams.get('title') + : 'App Router Playground'; + + return new ImageResponse( + ( +
+ {isLight ? : } +
+ {title} +
+
+ ), + { + width: 843, + height: 441, + fonts: [ + { + name: 'Inter', + data: await interSemiBold, + style: 'normal', + weight: 400, + }, + ], + }, + ); + } catch (e) { + if (!(e instanceof Error)) throw e; + + // eslint-disable-next-line no-console + console.log(e.message); + return new Response(`Failed to generate the image`, { + status: 500, + }); + } +} + +function LightSvg(): ReactElement { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +function DarkSvg(): ReactElement { + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/apps/next-app-router-4001/app/api/products/product.d.ts b/apps/next-app-router-4001/app/api/products/product.d.ts new file mode 100644 index 00000000000..c279cf7637d --- /dev/null +++ b/apps/next-app-router-4001/app/api/products/product.d.ts @@ -0,0 +1,37 @@ +export type Product = { + id: string; + stock: number; + rating: number; + name: string; + description: string; + price: Price; + isBestSeller: boolean; + leadTime: number; + image?: string; + imageBlur?: string; + discount?: Discount; + usedPrice?: UsedPrice; +}; + +type Price = { + amount: number; + currency: Currency; + scale: number; +}; + +type Currency = { + code: string; + base: number; + exponent: number; +}; + +type Discount = { + percent: number; + expires?: number; +}; + +type UsedPrice = { + amount: number; + currency: Currency; + scale: number; +}; diff --git a/apps/next-app-router-4001/app/api/revalidate/route.ts b/apps/next-app-router-4001/app/api/revalidate/route.ts new file mode 100644 index 00000000000..fc676f685cb --- /dev/null +++ b/apps/next-app-router-4001/app/api/revalidate/route.ts @@ -0,0 +1,16 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { revalidatePath, revalidateTag } from 'next/cache'; + +export async function GET(request: NextRequest) { + const path = request.nextUrl.searchParams.get('path') || '/isr/[id]'; + const collection = + request.nextUrl.searchParams.get('collection') || 'collection'; + revalidatePath(path); + revalidateTag(collection); + console.log('revalidated', path, collection); + return NextResponse.json({ + revalidated: true, + now: Date.now(), + cache: 'no-store', + }); +} diff --git a/apps/next-app-router-4001/app/api/reviews/getReviews.ts b/apps/next-app-router-4001/app/api/reviews/getReviews.ts new file mode 100644 index 00000000000..a42b409ee00 --- /dev/null +++ b/apps/next-app-router-4001/app/api/reviews/getReviews.ts @@ -0,0 +1,26 @@ +import { notFound } from 'next/navigation'; +import type { Review } from './review'; + +// `server-only` guarantees any modules that import code in file +// will never run on the client. Even though this particular api +// doesn't currently use sensitive environment variables, it's +// good practise to add `server-only` preemptively. +import 'server-only'; + +export async function getReviews() { + const res = await fetch(`https://app-playground-api.vercel.app/api/reviews`); + + if (!res.ok) { + // Render the closest `error.js` Error Boundary + throw new Error('Something went wrong!'); + } + + const reviews = (await res.json()) as Review[]; + + if (reviews.length === 0) { + // Render the closest `not-found.js` Error Boundary + notFound(); + } + + return reviews; +} diff --git a/apps/next-app-router-4001/app/api/reviews/review.d.ts b/apps/next-app-router-4001/app/api/reviews/review.d.ts new file mode 100644 index 00000000000..0135e4d2dd2 --- /dev/null +++ b/apps/next-app-router-4001/app/api/reviews/review.d.ts @@ -0,0 +1,6 @@ +export type Review = { + id: string; + name: string; + rating: number; + text: string; +}; diff --git a/apps/next-app-router-4001/app/context/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4001/app/context/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..3b2e5d0eaf6 --- /dev/null +++ b/apps/next-app-router-4001/app/context/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,23 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { notFound } from 'next/navigation'; +import { Counter } from '../../context-click-counter'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string; subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( + +
+

+ {category.name} +

+ + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/context/[categorySlug]/layout.tsx b/apps/next-app-router-4001/app/context/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..514d27900fe --- /dev/null +++ b/apps/next-app-router-4001/app/context/[categorySlug]/layout.tsx @@ -0,0 +1,37 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { TabGroup } from '#/ui/tab-group'; +import { Counter } from '../context-click-counter'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( + +
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
{children}
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/context/[categorySlug]/page.tsx b/apps/next-app-router-4001/app/context/[categorySlug]/page.tsx new file mode 100644 index 00000000000..121a5be9fb4 --- /dev/null +++ b/apps/next-app-router-4001/app/context/[categorySlug]/page.tsx @@ -0,0 +1,22 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { Counter } from '../context-click-counter'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + + return ( + +
+

+ All {category.name} +

+ + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/context/context-click-counter.tsx b/apps/next-app-router-4001/app/context/context-click-counter.tsx new file mode 100644 index 00000000000..0a36ee3aaea --- /dev/null +++ b/apps/next-app-router-4001/app/context/context-click-counter.tsx @@ -0,0 +1,44 @@ +'use client'; + +import { useCounter } from './counter-context'; +import React from 'react'; +import { Boundary } from '#/ui/boundary'; + +const ContextClickCounter = () => { + const [count, setCount] = useCounter(); + + return ( + + + + ); +}; + +export const Counter = () => { + const [count] = useCounter(); + + return ( + +
+ {count} Clicks +
+
+ ); +}; + +export default ContextClickCounter; diff --git a/apps/next-app-router-4001/app/context/counter-context.tsx b/apps/next-app-router-4001/app/context/counter-context.tsx new file mode 100644 index 00000000000..999c04477e9 --- /dev/null +++ b/apps/next-app-router-4001/app/context/counter-context.tsx @@ -0,0 +1,24 @@ +'use client'; + +import React from 'react'; + +const CounterContext = React.createContext< + [number, React.Dispatch>] | undefined +>(undefined); + +export function CounterProvider({ children }: { children: React.ReactNode }) { + const [count, setCount] = React.useState(0); + return ( + + {children} + + ); +} + +export function useCounter() { + const context = React.useContext(CounterContext); + if (context === undefined) { + throw new Error('useCounter must be used within a CounterProvider'); + } + return context; +} diff --git a/apps/next-app-router-4001/app/context/layout.tsx b/apps/next-app-router-4001/app/context/layout.tsx new file mode 100644 index 00000000000..8caed20a1c4 --- /dev/null +++ b/apps/next-app-router-4001/app/context/layout.tsx @@ -0,0 +1,66 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { TabGroup } from '#/ui/tab-group'; +import { CounterProvider } from 'app/context/counter-context'; +import React from 'react'; +import ContextClickCounter from './context-click-counter'; + +const title = 'Client Context'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + return ( + + + + +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> +
+ + +
{children}
+
+
+
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/context/page.tsx b/apps/next-app-router-4001/app/context/page.tsx new file mode 100644 index 00000000000..4828d0a6c68 --- /dev/null +++ b/apps/next-app-router-4001/app/context/page.tsx @@ -0,0 +1,30 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Client Context

+ +
    +
  • + This example uses context to share state between Client Components + that cross the Server/Client Component boundary. +
  • +
  • + Try incrementing the counter and navigating between pages. Note how + the counter state is shared across the app even though they are inside + different layouts and pages that are Server Components. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/demo/page.tsx b/apps/next-app-router-4001/app/demo/page.tsx new file mode 100644 index 00000000000..25a589d1919 --- /dev/null +++ b/apps/next-app-router-4001/app/demo/page.tsx @@ -0,0 +1,93 @@ +//@ts-check +'use client'; + +import dynamic from 'next/dynamic'; + +// Dynamically import remote components +const Button = dynamic(() => import('remote_4001/Button'), { ssr: true }); +const Header = dynamic(() => import('remote_4001/Header'), { ssr: true }); +const ProductCard = dynamic(() => import('remote_4001/ProductCard'), { + ssr: true, +}); +const TabGroup = dynamic(() => import('remote_4001/TabGroup'), { ssr: true }); +const TabNavItem = dynamic(() => import('remote_4001/TabNavItem'), { + ssr: true, +}); +const CountUp = dynamic(() => import('remote_4001/CountUp'), { ssr: true }); +const RenderingInfo = dynamic(() => import('remote_4001/RenderingInfo'), { + ssr: true, +}); + +export default function DemoPage() { + return ( +
+
+ +
+

Remote Components Demo

+ +
+

Basic UI Components

+
+ + +
+
+ +
+

Navigation Components

+ + + Tab 1 + + + Tab 2 + + + Tab 3 + + +
+ +
+

Product Components

+
+ + +
+
+ +
+

Interactive Components

+
+
+

Count Up Animation

+ +
+
+

Rendering Information

+ +
+
+
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/error-handling/[categorySlug]/[subCategorySlug]/error.tsx b/apps/next-app-router-4001/app/error-handling/[categorySlug]/[subCategorySlug]/error.tsx new file mode 100644 index 00000000000..ee8f211cb20 --- /dev/null +++ b/apps/next-app-router-4001/app/error-handling/[categorySlug]/[subCategorySlug]/error.tsx @@ -0,0 +1,26 @@ +'use client'; + +import { Boundary } from '#/ui/boundary'; +import Button from '#/ui/button'; +import React from 'react'; + +export default function Error({ error, reset }: any) { + React.useEffect(() => { + console.log('logging error:', error); + }, [error]); + + return ( + +
+

Error

+

{error?.message}

+
+ +
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/error-handling/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4001/app/error-handling/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..0917d305fcb --- /dev/null +++ b/apps/next-app-router-4001/app/error-handling/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,25 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import BuggyButton from '#/ui/buggy-button'; +import { SkeletonCard } from '#/ui/skeleton-card'; +import { notFound } from 'next/navigation'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string; subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ + + +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/error-handling/[categorySlug]/error.tsx b/apps/next-app-router-4001/app/error-handling/[categorySlug]/error.tsx new file mode 100644 index 00000000000..088c06aeb4f --- /dev/null +++ b/apps/next-app-router-4001/app/error-handling/[categorySlug]/error.tsx @@ -0,0 +1,23 @@ +'use client'; + +import { Boundary } from '#/ui/boundary'; +import Button from '#/ui/button'; +import React from 'react'; + +export default function Error({ error, reset }: any) { + React.useEffect(() => { + console.log('logging error:', error); + }, [error]); + + return ( + +
+

Error

+

{error?.message}

+
+ +
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/error-handling/[categorySlug]/layout.tsx b/apps/next-app-router-4001/app/error-handling/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..02934ebc6cf --- /dev/null +++ b/apps/next-app-router-4001/app/error-handling/[categorySlug]/layout.tsx @@ -0,0 +1,42 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/error-handling/[categorySlug]/page.tsx b/apps/next-app-router-4001/app/error-handling/[categorySlug]/page.tsx new file mode 100644 index 00000000000..1cb6382c394 --- /dev/null +++ b/apps/next-app-router-4001/app/error-handling/[categorySlug]/page.tsx @@ -0,0 +1,27 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import BuggyButton from '#/ui/buggy-button'; +import { SkeletonCard } from '#/ui/skeleton-card'; +import { notFound } from 'next/navigation'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + + return ( +
+

+ All {category.name} +

+ + + +
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/error-handling/[categorySlug]/template.tsx b/apps/next-app-router-4001/app/error-handling/[categorySlug]/template.tsx new file mode 100644 index 00000000000..de11d76dc30 --- /dev/null +++ b/apps/next-app-router-4001/app/error-handling/[categorySlug]/template.tsx @@ -0,0 +1,5 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/error-handling/error.tsx b/apps/next-app-router-4001/app/error-handling/error.tsx new file mode 100644 index 00000000000..24218e4aed8 --- /dev/null +++ b/apps/next-app-router-4001/app/error-handling/error.tsx @@ -0,0 +1,23 @@ +'use client'; + +import { Boundary } from '#/ui/boundary'; +import Button from '#/ui/button'; +import React from 'react'; + +export default function Error({ error, reset }: any) { + React.useEffect(() => { + console.log('logging error:', error); + }, [error]); + + return ( + +
+

Error

+

{error?.message}

+
+ +
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/error-handling/layout.tsx b/apps/next-app-router-4001/app/error-handling/layout.tsx new file mode 100644 index 00000000000..506e7d4ba89 --- /dev/null +++ b/apps/next-app-router-4001/app/error-handling/layout.tsx @@ -0,0 +1,47 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Error Handling'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/error-handling/page.tsx b/apps/next-app-router-4001/app/error-handling/page.tsx new file mode 100644 index 00000000000..8852aa4337c --- /dev/null +++ b/apps/next-app-router-4001/app/error-handling/page.tsx @@ -0,0 +1,34 @@ +import BuggyButton from '#/ui/buggy-button'; +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Error Handling

+ +
    +
  • + error.js defines the error boundary for a route segment + and the children below it. It can be used to show specific error + information, and functionality to attempt to recover from the error. +
  • +
  • + Trying navigation pages and triggering an error inside nested layouts. + Notice how the error is isolated to that segment, while the rest of + the app remains interactive. +
  • +
+ +
+ + + + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/error-handling/template.tsx b/apps/next-app-router-4001/app/error-handling/template.tsx new file mode 100644 index 00000000000..de11d76dc30 --- /dev/null +++ b/apps/next-app-router-4001/app/error-handling/template.tsx @@ -0,0 +1,5 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/favicon.ico b/apps/next-app-router-4001/app/favicon.ico new file mode 100644 index 00000000000..af98450595e Binary files /dev/null and b/apps/next-app-router-4001/app/favicon.ico differ diff --git a/apps/next-app-router-4001/app/hooks/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4001/app/hooks/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..72ad9f58087 --- /dev/null +++ b/apps/next-app-router-4001/app/hooks/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,17 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { HooksClient } from '#/app/hooks/_components/router-context'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string; subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ + +
+ ); +} diff --git a/apps/next-app-router-4001/app/hooks/[categorySlug]/layout.tsx b/apps/next-app-router-4001/app/hooks/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..1ba58575f65 --- /dev/null +++ b/apps/next-app-router-4001/app/hooks/[categorySlug]/layout.tsx @@ -0,0 +1,43 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { LayoutHooks } from '#/app/hooks/_components/router-context-layout'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ + + +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/hooks/[categorySlug]/page.tsx b/apps/next-app-router-4001/app/hooks/[categorySlug]/page.tsx new file mode 100644 index 00000000000..a518e7c3c52 --- /dev/null +++ b/apps/next-app-router-4001/app/hooks/[categorySlug]/page.tsx @@ -0,0 +1,19 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { HooksClient } from '#/app/hooks/_components/router-context'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + + return ( +
+

+ All {category.name} +

+ + +
+ ); +} diff --git a/apps/next-app-router-4001/app/hooks/[categorySlug]/template.tsx b/apps/next-app-router-4001/app/hooks/[categorySlug]/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/hooks/[categorySlug]/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/hooks/_components/router-context-layout.tsx b/apps/next-app-router-4001/app/hooks/_components/router-context-layout.tsx new file mode 100644 index 00000000000..ce4c8118548 --- /dev/null +++ b/apps/next-app-router-4001/app/hooks/_components/router-context-layout.tsx @@ -0,0 +1,29 @@ +'use client'; + +import { Boundary } from '#/ui/boundary'; +import { + useSelectedLayoutSegment, + useSelectedLayoutSegments, +} from 'next/navigation'; + +export function LayoutHooks() { + const selectedLayoutSegment = useSelectedLayoutSegment(); + const selectedLayoutSegments = useSelectedLayoutSegments(); + + return selectedLayoutSegment ? ( + +
+
+          {JSON.stringify(
+            {
+              useSelectedLayoutSegment: selectedLayoutSegment,
+              useSelectedLayoutSegments: selectedLayoutSegments,
+            },
+            null,
+            2,
+          )}
+        
+
+
+ ) : null; +} diff --git a/apps/next-app-router-4001/app/hooks/_components/router-context.tsx b/apps/next-app-router-4001/app/hooks/_components/router-context.tsx new file mode 100644 index 00000000000..42fe045c2ed --- /dev/null +++ b/apps/next-app-router-4001/app/hooks/_components/router-context.tsx @@ -0,0 +1,40 @@ +'use client'; + +import { Boundary } from '#/ui/boundary'; +import { + useParams, + usePathname, + useSearchParams, + useSelectedLayoutSegment, + useSelectedLayoutSegments, +} from 'next/navigation'; + +export function HooksClient() { + const pathname = usePathname(); + const params = useParams(); + const selectedLayoutSegment = useSelectedLayoutSegment(); + const selectedLayoutSegments = useSelectedLayoutSegments(); + const searchParams = useSearchParams(); + + return ( + +
+
+          {JSON.stringify(
+            {
+              usePathname: pathname,
+              useParams: params,
+              useSearchParams: searchParams
+                ? Object.fromEntries(searchParams.entries())
+                : {},
+              useSelectedLayoutSegment: selectedLayoutSegment,
+              useSelectedLayoutSegments: selectedLayoutSegments,
+            },
+            null,
+            2,
+          )}
+        
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/hooks/layout.tsx b/apps/next-app-router-4001/app/hooks/layout.tsx new file mode 100644 index 00000000000..ac30b428cd1 --- /dev/null +++ b/apps/next-app-router-4001/app/hooks/layout.tsx @@ -0,0 +1,50 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { LayoutHooks } from '#/app/hooks/_components/router-context-layout'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Hooks'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ + + +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/hooks/page.tsx b/apps/next-app-router-4001/app/hooks/page.tsx new file mode 100644 index 00000000000..c216fb991d6 --- /dev/null +++ b/apps/next-app-router-4001/app/hooks/page.tsx @@ -0,0 +1,32 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+
+

Client Component Hooks

+ +
    +
  • + Next.js provides a number of hooks for accessing routing information + from client components. +
  • +
  • + Try navigating each page and observing the output of each hook + called from the current routes layout.js and{' '} + page.js files. +
  • +
+ +
+ + Docs + + + Code + +
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/hooks/template.tsx b/apps/next-app-router-4001/app/hooks/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/hooks/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/isr/[id]/page.tsx b/apps/next-app-router-4001/app/isr/[id]/page.tsx new file mode 100644 index 00000000000..c95d3484f70 --- /dev/null +++ b/apps/next-app-router-4001/app/isr/[id]/page.tsx @@ -0,0 +1,30 @@ +import { RenderingInfo } from '#/ui/rendering-info'; + +export const dynamicParams = true; + +export async function generateStaticParams() { + return [{ id: '1' }, { id: '2' }, { id: '3' }]; +} + +export default async function Page(props: { params: Promise<{ id: string }> }) { + const params = await props.params; + const res = await fetch( + `https://jsonplaceholder.typicode.com/posts/${params.id}`, + { next: { revalidate: 60, tags: ['collection'] } }, + ); + const data = (await res.json()) as { title: string; body: string }; + + return ( +
+
+

+ {data.title} +

+

{data.body}

+
+
+ +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/isr/layout.tsx b/apps/next-app-router-4001/app/isr/layout.tsx new file mode 100644 index 00000000000..7cf3e34bd8e --- /dev/null +++ b/apps/next-app-router-4001/app/isr/layout.tsx @@ -0,0 +1,35 @@ +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Incremental Static Regeneration (ISR)'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default function Layout({ children }: { children: React.ReactNode }) { + const ids = [{ id: '1' }, { id: '2' }, { id: '3' }]; + + return ( +
+ ({ + text: `Post ${x.id}`, + slug: x.id, + })), + ]} + /> + +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/isr/loading.tsx b/apps/next-app-router-4001/app/isr/loading.tsx new file mode 100644 index 00000000000..2c150f871d2 --- /dev/null +++ b/apps/next-app-router-4001/app/isr/loading.tsx @@ -0,0 +1,5 @@ +import { RenderingPageSkeleton } from '#/ui/rendering-page-skeleton'; + +export default function Loading() { + return ; +} diff --git a/apps/next-app-router-4001/app/isr/page.tsx b/apps/next-app-router-4001/app/isr/page.tsx new file mode 100644 index 00000000000..d90ff0298bb --- /dev/null +++ b/apps/next-app-router-4001/app/isr/page.tsx @@ -0,0 +1,30 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Incremental Static Regeneration

+ +
    +
  • In this example, three posts fetch data using granular ISR.
  • +
  • Caches responses are fresh for 60 seconds.
  • +
  • + Try navigating to each post and noting the timestamp of when the page + was rendered. Refresh the page after 60 seconds to trigger a + revalidation for the next request. Refresh again to see the + revalidated page. +
  • +
  • Note that the fetch cache can be persisted across builds.
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/isr/template.tsx b/apps/next-app-router-4001/app/isr/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/isr/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/layout.tsx b/apps/next-app-router-4001/app/layout.tsx new file mode 100644 index 00000000000..ba6662a2c6a --- /dev/null +++ b/apps/next-app-router-4001/app/layout.tsx @@ -0,0 +1,53 @@ +import '#/styles/globals.css'; +import { AddressBar } from '#/ui/address-bar'; +import Byline from '#/ui/byline'; +import { GlobalNav } from '#/ui/global-nav'; +import { Metadata } from 'next'; + +export const metadata: Metadata = { + title: { + default: 'Next.js App Router', + template: '%s | Next.js App Router', + }, + metadataBase: new URL('https://app-router.vercel.app'), + description: + 'A playground to explore new Next.js App Router features such as nested layouts, instant loading states, streaming, and component level data fetching.', + openGraph: { + title: 'Next.js App Router Playground', + description: + 'A playground to explore new Next.js App Router features such as nested layouts, instant loading states, streaming, and component level data fetching.', + images: [`/api/og?title=Next.js App Router`], + }, + twitter: { + card: 'summary_large_image', + }, +}; + +export default function RootLayout({ + children, +}: { + children: React.ReactNode; +}) { + return ( + + + + +
+
+
+
+ +
+
+ +
+
{children}
+
+ +
+
+ + + ); +} diff --git a/apps/next-app-router-4001/app/layouts/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4001/app/layouts/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..4bbfae6d332 --- /dev/null +++ b/apps/next-app-router-4001/app/layouts/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,21 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/layouts/[categorySlug]/layout.tsx b/apps/next-app-router-4001/app/layouts/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..548d0baae9c --- /dev/null +++ b/apps/next-app-router-4001/app/layouts/[categorySlug]/layout.tsx @@ -0,0 +1,40 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/layouts/[categorySlug]/page.tsx b/apps/next-app-router-4001/app/layouts/[categorySlug]/page.tsx new file mode 100644 index 00000000000..672e25359c6 --- /dev/null +++ b/apps/next-app-router-4001/app/layouts/[categorySlug]/page.tsx @@ -0,0 +1,23 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + + return ( +
+

+ All {category.name} +

+ +
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/layouts/[categorySlug]/template.tsx b/apps/next-app-router-4001/app/layouts/[categorySlug]/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/layouts/[categorySlug]/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/layouts/layout.tsx b/apps/next-app-router-4001/app/layouts/layout.tsx new file mode 100644 index 00000000000..108ba315b9e --- /dev/null +++ b/apps/next-app-router-4001/app/layouts/layout.tsx @@ -0,0 +1,47 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Nested Layouts'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/layouts/page.tsx b/apps/next-app-router-4001/app/layouts/page.tsx new file mode 100644 index 00000000000..f636922b482 --- /dev/null +++ b/apps/next-app-router-4001/app/layouts/page.tsx @@ -0,0 +1,27 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Layouts

+ +
    +
  • + A layout is UI that is shared between multiple pages. On navigation, + layouts preserve state, remain interactive, and do not re-render. Two + or more layouts can also be nested. +
  • +
  • Try navigating between categories and sub categories.
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/layouts/template.tsx b/apps/next-app-router-4001/app/layouts/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/layouts/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/loading/[categorySlug]/page.tsx b/apps/next-app-router-4001/app/loading/[categorySlug]/page.tsx new file mode 100644 index 00000000000..1c1476a5a6c --- /dev/null +++ b/apps/next-app-router-4001/app/loading/[categorySlug]/page.tsx @@ -0,0 +1,43 @@ +import type { Category } from '#/app/api/categories/category'; +import { SkeletonCard } from '#/ui/skeleton-card'; +import { notFound } from 'next/navigation'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const res = await fetch( + // We intentionally delay the response to simulate a slow data + // request that would benefit from `loading.js` + `https://app-playground-api.vercel.app/api/categories?delay=1000&slug=${params.categorySlug}`, + { + // We intentionally disable Next.js Cache to better demo + // `loading.js` + cache: 'no-cache', + }, + ); + + if (!res.ok) { + // Render the closest `error.js` Error Boundary + throw new Error('Something went wrong!'); + } + + const category = (await res.json()) as Category; + + if (!category) { + // Render the closest `not-found.js` Error Boundary + notFound(); + } + + return ( +
+

{category.name}

+ +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/loading/layout.tsx b/apps/next-app-router-4001/app/loading/layout.tsx new file mode 100644 index 00000000000..0a38bb59e20 --- /dev/null +++ b/apps/next-app-router-4001/app/loading/layout.tsx @@ -0,0 +1,47 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import { notFound } from 'next/navigation'; +import React from 'react'; + +const title = 'Loading'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/loading/loading.tsx b/apps/next-app-router-4001/app/loading/loading.tsx new file mode 100644 index 00000000000..7cd327a15f3 --- /dev/null +++ b/apps/next-app-router-4001/app/loading/loading.tsx @@ -0,0 +1,17 @@ +import { SkeletonCard } from '#/ui/skeleton-card'; +export default function Loading() { + return ( +
+

Loading...

+ +
+ + + + + + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/loading/page.tsx b/apps/next-app-router-4001/app/loading/page.tsx new file mode 100644 index 00000000000..544dbea59ed --- /dev/null +++ b/apps/next-app-router-4001/app/loading/page.tsx @@ -0,0 +1,35 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Instant Loading States

+ +
    +
  • + This example has an artificial delay when "fetching" data + for each category page. loading.js is used to show a + loading skeleton immediately while data for category page loads before + being streamed in. +
  • +
  • + Shared layouts remain interactive while nested layouts or pages load. + Try clicking the counter while the children load. +
  • +
  • + Navigation is interruptible. Try navigating to one category, then + clicking a second category before the first one has loaded. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/loading/template.tsx b/apps/next-app-router-4001/app/loading/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/loading/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/not-found.tsx b/apps/next-app-router-4001/app/not-found.tsx new file mode 100644 index 00000000000..51b3d5ad4e4 --- /dev/null +++ b/apps/next-app-router-4001/app/not-found.tsx @@ -0,0 +1,13 @@ +import { Boundary } from '#/ui/boundary'; + +export default function NotFound() { + return ( + +
+

Not Found

+ +

Could not find requested resource

+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/not-found/[categorySlug]/[subCategorySlug]/not-found.tsx b/apps/next-app-router-4001/app/not-found/[categorySlug]/[subCategorySlug]/not-found.tsx new file mode 100644 index 00000000000..6bf5c5b3ceb --- /dev/null +++ b/apps/next-app-router-4001/app/not-found/[categorySlug]/[subCategorySlug]/not-found.tsx @@ -0,0 +1,16 @@ +import { Boundary } from '#/ui/boundary'; + +export default function NotFound() { + return ( + +
+

Sub Category Not Found

+ +

Could not find requested resource

+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/not-found/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4001/app/not-found/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..ed9d0322965 --- /dev/null +++ b/apps/next-app-router-4001/app/not-found/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,26 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string; subCategorySlug: string }>; +}) { + const params = await props.params; + // - `getCategory()` returns `notFound()` if the fetched data is `null` or `undefined`. + // - `notFound()` renders the closest `not-found.tsx` in the route segment hierarchy. + // - For `layout.js`, the closest `not-found.tsx` starts from the parent segment. + // - For `page.js`, the closest `not-found.tsx` starts from the same segment. + // - Learn more: https://nextjs.org/docs/app/building-your-application/routing#component-hierarchy. + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/not-found/[categorySlug]/layout.tsx b/apps/next-app-router-4001/app/not-found/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..13caeb5571e --- /dev/null +++ b/apps/next-app-router-4001/app/not-found/[categorySlug]/layout.tsx @@ -0,0 +1,51 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + // - `getCategory()` returns `notFound()` if the fetched data is `null` or `undefined`. + // - `notFound()` renders the closest `not-found.tsx` in the route segment hierarchy. + // - For `layout.js`, the closest `not-found.tsx` starts from the parent segment. + // - For `page.js`, the closest `not-found.tsx` starts from the same segment. + // - Learn more: https://nextjs.org/docs/app/building-your-application/routing#component-hierarchy. + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+
+ ({ + text: x.name, + slug: x.slug, + })), + { + text: 'Subcategory That Does Not Exist', + slug: 'does-not-exist', + }, + ]} + /> + +
+ +
+
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/not-found/[categorySlug]/not-found.tsx b/apps/next-app-router-4001/app/not-found/[categorySlug]/not-found.tsx new file mode 100644 index 00000000000..4f789bdc9d1 --- /dev/null +++ b/apps/next-app-router-4001/app/not-found/[categorySlug]/not-found.tsx @@ -0,0 +1,13 @@ +import { Boundary } from '#/ui/boundary'; + +export default function NotFound() { + return ( + +
+

Category Not Found

+ +

Could not find requested resource

+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/not-found/[categorySlug]/page.tsx b/apps/next-app-router-4001/app/not-found/[categorySlug]/page.tsx new file mode 100644 index 00000000000..f2f91ecc632 --- /dev/null +++ b/apps/next-app-router-4001/app/not-found/[categorySlug]/page.tsx @@ -0,0 +1,28 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + // - `getCategory()` returns `notFound()` if the fetched data is `null` or `undefined`. + // - `notFound()` renders the closest `not-found.tsx` in the route segment hierarchy. + // - For `layout.js`, the closest `not-found.tsx` starts from the parent segment. + // - For `page.js`, the closest `not-found.tsx` starts from the same segment. + // - Learn more: https://nextjs.org/docs/app/building-your-application/routing#component-hierarchy. + const category = await getCategory({ slug: params.categorySlug }); + + return ( +
+

+ All {category.name} +

+ +
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/not-found/[categorySlug]/template.tsx b/apps/next-app-router-4001/app/not-found/[categorySlug]/template.tsx new file mode 100644 index 00000000000..de11d76dc30 --- /dev/null +++ b/apps/next-app-router-4001/app/not-found/[categorySlug]/template.tsx @@ -0,0 +1,5 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/not-found/layout.tsx b/apps/next-app-router-4001/app/not-found/layout.tsx new file mode 100644 index 00000000000..87df3e0297b --- /dev/null +++ b/apps/next-app-router-4001/app/not-found/layout.tsx @@ -0,0 +1,51 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Not Found'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + { + text: 'Category That Does Not Exist', + slug: 'does-not-exist', + }, + ]} + /> + +
+ +
+
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/not-found/not-found.tsx b/apps/next-app-router-4001/app/not-found/not-found.tsx new file mode 100644 index 00000000000..6fd919d0777 --- /dev/null +++ b/apps/next-app-router-4001/app/not-found/not-found.tsx @@ -0,0 +1,13 @@ +import { Boundary } from '#/ui/boundary'; + +export default function NotFound() { + return ( + +
+

Not Found

+ +

Could not find requested resource

+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/not-found/page.tsx b/apps/next-app-router-4001/app/not-found/page.tsx new file mode 100644 index 00000000000..42bc8b3d535 --- /dev/null +++ b/apps/next-app-router-4001/app/not-found/page.tsx @@ -0,0 +1,54 @@ +import { ExternalLink } from '#/ui/external-link'; +import Link from 'next/link'; + +export default function Page() { + return ( +
+

Not Found

+ +
    +
  • + + + not-found.js + + {' '} + file is used to render UI when the{' '} + + + notFound() + + {' '} + function is thrown within a route segment. +
  • +
  • + In this example, when fetching the data we return{' '} + notFound() for{' '} + Categories and{' '} + + Sub Categories + {' '} + that do not exist. This renders the closest appropriate{' '} + not-found.js. +
  • +
  • + + Note: not-found.js currently only renders when + triggered by the notFound() function. We're + working on support for catching unmatched routes (404). + +
  • +
+ +
+ + Docs + + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/not-found/template.tsx b/apps/next-app-router-4001/app/not-found/template.tsx new file mode 100644 index 00000000000..de11d76dc30 --- /dev/null +++ b/apps/next-app-router-4001/app/not-found/template.tsx @@ -0,0 +1,5 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/page.tsx b/apps/next-app-router-4001/app/page.tsx new file mode 100644 index 00000000000..da496ca4858 --- /dev/null +++ b/apps/next-app-router-4001/app/page.tsx @@ -0,0 +1,44 @@ +import { demos } from '#/lib/demos'; +import Link from 'next/link'; + +export default function Page() { + return ( +
+

Examples

+ +
+ {demos.map((section) => { + return ( +
+
+ {section.name} +
+ +
+ {section.items.map((item) => { + return ( + +
+ {item.name} +
+ + {item.description ? ( +
+ {item.description} +
+ ) : null} + + ); + })} +
+
+ ); + })} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/@audience/default.tsx b/apps/next-app-router-4001/app/parallel-routes/@audience/default.tsx new file mode 100644 index 00000000000..2d141a3d32b --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/@audience/default.tsx @@ -0,0 +1,47 @@ +import { CurrentRoute } from '#/app/parallel-routes/_ui/current-route'; +import { Boundary } from '#/ui/boundary'; +import Link from 'next/link'; + +export default function Default() { + return ( + +
+

Default UI

+ +

+ Default UI is rendered because the @audience slot{' '} + does not contain a route segment that matches the + current{' '} + + / + {' '} + route. +

+ +
    +
  • + + @audience/ + + /page.js + {' '} + does not exist. +
  • + +
  • + @audience/default.js exists. +
  • +
+ +
+ + Home + +
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/@audience/demographics/page.tsx b/apps/next-app-router-4001/app/parallel-routes/@audience/demographics/page.tsx new file mode 100644 index 00000000000..94fb886c860 --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/@audience/demographics/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

Demographics

+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/@audience/layout.tsx b/apps/next-app-router-4001/app/parallel-routes/@audience/layout.tsx new file mode 100644 index 00000000000..de0189c5aad --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/@audience/layout.tsx @@ -0,0 +1,29 @@ +import { Boundary } from '#/ui/boundary'; +import { TabGroup } from '#/ui/tab-group'; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + +
+ + + {children} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/@audience/page.tsx b/apps/next-app-router-4001/app/parallel-routes/@audience/page.tsx new file mode 100644 index 00000000000..3af70b68693 --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/@audience/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

Home

+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/@audience/subscribers/page.tsx b/apps/next-app-router-4001/app/parallel-routes/@audience/subscribers/page.tsx new file mode 100644 index 00000000000..2f1df01665c --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/@audience/subscribers/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

Subscribers

+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/@views/default.tsx b/apps/next-app-router-4001/app/parallel-routes/@views/default.tsx new file mode 100644 index 00000000000..04054c9dd82 --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/@views/default.tsx @@ -0,0 +1,46 @@ +import { CurrentRoute } from '#/app/parallel-routes/_ui/current-route'; +import { Boundary } from '#/ui/boundary'; +import Link from 'next/link'; + +export default function Default() { + return ( + +
+

Default UI

+ +

+ Default UI is rendered because the @views slot{' '} + does not contain a route segment that matches the + current{' '} + + / + {' '} + route. +

+ +
    +
  • + + @views/ + + /page.js + {' '} + does not exist. +
  • + +
  • + @views/default.js exists. +
  • +
+
+ + Home + +
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/@views/impressions/page.tsx b/apps/next-app-router-4001/app/parallel-routes/@views/impressions/page.tsx new file mode 100644 index 00000000000..014ffc879a8 --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/@views/impressions/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

Impressions

+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/@views/layout.tsx b/apps/next-app-router-4001/app/parallel-routes/@views/layout.tsx new file mode 100644 index 00000000000..53d028c9375 --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/@views/layout.tsx @@ -0,0 +1,28 @@ +import { Boundary } from '#/ui/boundary'; +import { TabGroup } from '#/ui/tab-group'; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + +
+ + {children} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/@views/page.tsx b/apps/next-app-router-4001/app/parallel-routes/@views/page.tsx new file mode 100644 index 00000000000..c8f222581aa --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/@views/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

Home

+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/@views/view-duration/page.tsx b/apps/next-app-router-4001/app/parallel-routes/@views/view-duration/page.tsx new file mode 100644 index 00000000000..a95983c9491 --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/@views/view-duration/page.tsx @@ -0,0 +1,11 @@ +import { Boundary } from '#/ui/boundary'; + +export default function Page() { + return ( + +
+

View Duration

+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/_ui/current-route.tsx b/apps/next-app-router-4001/app/parallel-routes/_ui/current-route.tsx new file mode 100644 index 00000000000..ca756b54acc --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/_ui/current-route.tsx @@ -0,0 +1,9 @@ +'use client'; + +import { usePathname } from 'next/navigation'; + +export function CurrentRoute({ slice = 2 }: { slice?: number }) { + const pathname = usePathname(); + + return <>{pathname?.split('/').slice(slice).join('/')}; +} diff --git a/apps/next-app-router-4001/app/parallel-routes/default.tsx b/apps/next-app-router-4001/app/parallel-routes/default.tsx new file mode 100644 index 00000000000..bc636c13e67 --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/default.tsx @@ -0,0 +1,54 @@ +import { CurrentRoute } from '#/app/parallel-routes/_ui/current-route'; +import { Boundary } from '#/ui/boundary'; +import Link from 'next/link'; + +export default function Default() { + return ( + +
+

Default UI

+ +

+ Default UI is rendered because the implicit @children{' '} + slot does not contain a route segment that matches + the current{' '} + + / + {' '} + route. +

+ +
    +
  • + + parallel-routes/ + + /page.js + {' '} + OR{' '} + + parallel-routes/@children/ + + /page.js + {' '} + do not exist. +
  • + +
  • + parallel-routes/default.js OR{' '} + parallel-routes/@children/default.js exists. +
  • +
+ +
+ + Home + +
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/layout.tsx b/apps/next-app-router-4001/app/parallel-routes/layout.tsx new file mode 100644 index 00000000000..db0f3ad8ea9 --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/layout.tsx @@ -0,0 +1,32 @@ +const title = 'Parallel Routes'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default function Layout({ + children, + audience, + views, +}: { + children: React.ReactNode; + audience: React.ReactNode; + views: React.ReactNode; +}) { + return ( +
+
+ {children} + +
+ {audience} + {views} +
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/not-found.tsx b/apps/next-app-router-4001/app/parallel-routes/not-found.tsx new file mode 100644 index 00000000000..0a093b49d74 --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/not-found.tsx @@ -0,0 +1,13 @@ +import { Boundary } from '#/ui/boundary'; + +export default function NotFound() { + return ( + +
+

Not Found

+ +

Could not find requested resource

+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/parallel-routes/page.tsx b/apps/next-app-router-4001/app/parallel-routes/page.tsx new file mode 100644 index 00000000000..f681f4e6af2 --- /dev/null +++ b/apps/next-app-router-4001/app/parallel-routes/page.tsx @@ -0,0 +1,52 @@ +import { Boundary } from '#/ui/boundary'; +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( + +
+

Parallel Routes

+
    +
  • + Parallel Routes allow you to simultaneously or conditionally render + multiple pages, with independent navigation, in the same layout. +
  • +
  • + Parallel Routes can be used for advanced routing patterns like{' '} + + Conditional Routes + {' '} + and{' '} + + Intercepted Routes + + . +
  • +
  • + Try using the tabs in one parallel route to navigate. Notice the URL + changes but the unaffected parallel route is preserved. +
  • +
  • + Try using the browser's backwards and forwards navigation. + Notice the browser's URL history state and active UI state is + correctly synced. +
  • +
  • + Try navigating to a tab in one parallel route and refreshing the + browser. Notice you can choose what UI to show parallel routes that + don't match the initial URL. +
  • +
+
+ + Docs + + + + Code + +
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/patterns/active-links/_components/nav-links.tsx b/apps/next-app-router-4001/app/patterns/active-links/_components/nav-links.tsx new file mode 100644 index 00000000000..4b6ce37cab1 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/active-links/_components/nav-links.tsx @@ -0,0 +1,34 @@ +'use client'; + +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; +import clsx from 'clsx'; + +export function NavLinks({ + links, +}: { + links: { href: string; name: string }[]; +}) { + // Alternatively, you could use `useParams` or `useSelectedLayoutSegment(s)` + const pathname = usePathname(); + + return ( + + ); +} diff --git a/apps/next-app-router-4001/app/patterns/active-links/community/page.tsx b/apps/next-app-router-4001/app/patterns/active-links/community/page.tsx new file mode 100644 index 00000000000..c068b02d3b2 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/active-links/community/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Community

; +} diff --git a/apps/next-app-router-4001/app/patterns/active-links/layout.tsx b/apps/next-app-router-4001/app/patterns/active-links/layout.tsx new file mode 100644 index 00000000000..ab5017e9e85 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/active-links/layout.tsx @@ -0,0 +1,32 @@ +import { NavLinks } from '#/app/patterns/active-links/_components/nav-links'; +import { NextLogoDark } from '#/ui/next-logo'; +import Image from 'next/image'; +import Link from 'next/link'; + +export default function Layout({ children }: { children: React.ReactNode }) { + // Hardcoded links or fetched from db + const links = [ + { href: '/patterns/active-links', name: 'Home' }, + { href: '/patterns/active-links/profile', name: 'Profile' }, + { href: '/patterns/active-links/community', name: 'Community' }, + { href: '/patterns/active-links/settings', name: 'Settings' }, + ]; + + return ( +
+
+ + + User + +
+
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/patterns/active-links/page.tsx b/apps/next-app-router-4001/app/patterns/active-links/page.tsx new file mode 100644 index 00000000000..17c847eeb0c --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/active-links/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Home

; +} diff --git a/apps/next-app-router-4001/app/patterns/active-links/profile/page.tsx b/apps/next-app-router-4001/app/patterns/active-links/profile/page.tsx new file mode 100644 index 00000000000..d22888e45d7 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/active-links/profile/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Profile

; +} diff --git a/apps/next-app-router-4001/app/patterns/active-links/settings/page.tsx b/apps/next-app-router-4001/app/patterns/active-links/settings/page.tsx new file mode 100644 index 00000000000..ab769269f16 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/active-links/settings/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Settings

; +} diff --git a/apps/next-app-router-4001/app/patterns/breadcrumbs/@slot/[...all]/page.tsx b/apps/next-app-router-4001/app/patterns/breadcrumbs/@slot/[...all]/page.tsx new file mode 100644 index 00000000000..24a98c10136 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/breadcrumbs/@slot/[...all]/page.tsx @@ -0,0 +1,25 @@ +import { Breadcrumbs } from '#/app/patterns/breadcrumbs/_components/breadcrumbs'; + +export default async function Page(props: { + params: Promise<{ + all: string[]; + }>; +}) { + const params = await props.params; + + const { all } = params; + + // Note: you could fetch breadcrumb data based on params here + // e.g. title, slug, children/siblings (for dropdowns) + const items = [ + { + text: 'Home', + href: '/patterns/breadcrumbs', + }, + ...all.map((param) => ({ + text: param, + href: `/patterns/breadcrumbs/${param}`, + })), + ]; + return ; +} diff --git a/apps/next-app-router-4001/app/patterns/breadcrumbs/@slot/page.tsx b/apps/next-app-router-4001/app/patterns/breadcrumbs/@slot/page.tsx new file mode 100644 index 00000000000..212e9b903e3 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/breadcrumbs/@slot/page.tsx @@ -0,0 +1,13 @@ +import { Breadcrumbs } from '#/app/patterns/breadcrumbs/_components/breadcrumbs'; + +// Note: Next.js doesn't currently support optional catchAll segments in parallel routes. +// In the mean time, this file will match the "/breadcrumb" route. +export default function Page() { + const items = [ + { + text: 'Home', + href: '/patterns/breadcrumbs', + }, + ]; + return ; +} diff --git a/apps/next-app-router-4001/app/patterns/breadcrumbs/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4001/app/patterns/breadcrumbs/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..4bbfae6d332 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/breadcrumbs/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,21 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/patterns/breadcrumbs/[categorySlug]/layout.tsx b/apps/next-app-router-4001/app/patterns/breadcrumbs/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..cfef26af394 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/breadcrumbs/[categorySlug]/layout.tsx @@ -0,0 +1,35 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> +
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/patterns/breadcrumbs/[categorySlug]/page.tsx b/apps/next-app-router-4001/app/patterns/breadcrumbs/[categorySlug]/page.tsx new file mode 100644 index 00000000000..672e25359c6 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/breadcrumbs/[categorySlug]/page.tsx @@ -0,0 +1,23 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + + return ( +
+

+ All {category.name} +

+ +
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/patterns/breadcrumbs/_components/breadcrumbs.tsx b/apps/next-app-router-4001/app/patterns/breadcrumbs/_components/breadcrumbs.tsx new file mode 100644 index 00000000000..452724b1d0f --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/breadcrumbs/_components/breadcrumbs.tsx @@ -0,0 +1,31 @@ +import { ChevronRightIcon } from '@heroicons/react/24/outline'; +import Link from 'next/link'; +import { Fragment } from 'react'; + +export function Breadcrumbs({ + items, +}: { + items: { text: string; href: string }[]; +}) { + return ( +
+ {items.map((item, i) => { + return ( + + {i === 0 ? null : ( + + )} + + + {item.text} + + + ); + })} +
+ ); +} diff --git a/apps/next-app-router-4001/app/patterns/breadcrumbs/layout.tsx b/apps/next-app-router-4001/app/patterns/breadcrumbs/layout.tsx new file mode 100644 index 00000000000..e100c42f805 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/breadcrumbs/layout.tsx @@ -0,0 +1,47 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Breadcrumbs with Parallel Routes'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, + slot, +}: { + children: React.ReactNode; + slot: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( +
+ {slot} + +
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> +
+ + {children} +
+ ); +} diff --git a/apps/next-app-router-4001/app/patterns/breadcrumbs/page.tsx b/apps/next-app-router-4001/app/patterns/breadcrumbs/page.tsx new file mode 100644 index 00000000000..579a2c5f6ac --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/breadcrumbs/page.tsx @@ -0,0 +1,43 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

+ Shared server-side UI that depends on URL information +

+ +
    +
  • + Typically, when you have shared UI, you'd put it inside a layout. + However, layouts do not receive searchParams and{' '} + params lower than their segment. This is a challenge for + shared UI like breadcrumbs that depends on the URL information. +
  • +
  • + For simple cases, you can move the UI to Client Components and use + router hooks such as usePathname and{' '} + useSearchParams. +
  • +
  • + This example shows how to use Parallel Routes and a{' '} + page.js in a catch all route to have pockets of shared UI + across your app. +
  • +
  • + Try navigating between categories and sub categories. Notice the + breadcrumbs can derive URL information. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/patterns/layout.tsx b/apps/next-app-router-4001/app/patterns/layout.tsx new file mode 100644 index 00000000000..d9758696867 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/layout.tsx @@ -0,0 +1,13 @@ +const title = 'Snippets'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default function Layout({ children }: { children: React.ReactNode }) { + return children; +} diff --git a/apps/next-app-router-4001/app/patterns/page.tsx b/apps/next-app-router-4001/app/patterns/page.tsx new file mode 100644 index 00000000000..c630e1c5f6c --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/page.tsx @@ -0,0 +1,56 @@ +import { ExternalLink } from '#/ui/external-link'; +import Link from 'next/link'; + +const items = [ + { + name: 'Active links', + slug: 'active-links', + description: 'Update the style of the current active link', + }, + { + name: 'Breadcrumbs', + slug: 'breadcrumbs', + description: 'Shared server-side Breadcrumb UI using Parallel Routes', + }, + { + name: 'Updating URL search params', + slug: 'search-params', + description: 'Update searchParams using `useRouter` and ``', + }, +]; + +export default function Page() { + return ( +
+

Patterns

+ +
+ {items.map((item) => { + return ( + +
+ {item.name} +
+ + {item.description ? ( +
+ {item.description} +
+ ) : null} + + ); + })} +
+ +
+ + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/patterns/search-params/active-link.tsx b/apps/next-app-router-4001/app/patterns/search-params/active-link.tsx new file mode 100644 index 00000000000..f22ccbf9364 --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/search-params/active-link.tsx @@ -0,0 +1,30 @@ +'use client'; + +import clsx from 'clsx'; +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; + +export default function ActiveLink({ + isActive, + searchParams, + children, +}: { + isActive: boolean; + searchParams: string; + children: React.ReactNode; +}) { + const pathname = usePathname(); + + return ( + + {children} + + ); +} diff --git a/apps/next-app-router-4001/app/patterns/search-params/client.tsx b/apps/next-app-router-4001/app/patterns/search-params/client.tsx new file mode 100644 index 00000000000..a72f89e5a7c --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/search-params/client.tsx @@ -0,0 +1,82 @@ +'use client'; + +import clsx from 'clsx'; +import { usePathname, useRouter, useSearchParams } from 'next/navigation'; +import { useCallback, useMemo } from 'react'; + +export default function Client({ + options, +}: { + options: { + name: string; + value: string; + items: string[]; + }[]; +}) { + const searchParams = useSearchParams()!; + const pathname = usePathname(); + const router = useRouter(); + + const selectedOptions = useMemo(() => { + // Get the initial selected options from the URL's searchParams + const params = new URLSearchParams(searchParams); + + // Preselect the first value of each option if its not + // included in the current searchParams + options.forEach((option) => { + if (!searchParams.has(option.value)) { + params.set(option.value, option.items[0]); + } + }); + + return params; + }, [searchParams, options]); + + const updateSearchParam = useCallback( + (name: string, value: string) => { + // Merge the current searchParams with the new param set + const params = new URLSearchParams(searchParams); + params.set(name, value); + + // Perform a new navigation to the updated URL. The current `page.js` will + // receive a new `searchParams` prop with the updated values. + router.push(pathname + '?' + params.toString()); // or router.replace() + }, + [router, pathname, searchParams], + ); + + return ( + <> +
+ {options.map((option) => ( +
+
{option.name}
+ +
+ {option.items.map((item) => { + const isActive = selectedOptions.get(option.value) === item; + + return ( + + ); + })} +
+
+ ))} +
+ + ); +} diff --git a/apps/next-app-router-4001/app/patterns/search-params/page.tsx b/apps/next-app-router-4001/app/patterns/search-params/page.tsx new file mode 100644 index 00000000000..fa94328726f --- /dev/null +++ b/apps/next-app-router-4001/app/patterns/search-params/page.tsx @@ -0,0 +1,106 @@ +import { Boundary } from '#/ui/boundary'; +import { ExternalLink } from '#/ui/external-link'; +import { Suspense } from 'react'; +import ActiveLink from './active-link'; +import Client from './client'; + +const options = [ + { + name: 'Sort', + value: 'sort', + items: ['asc', 'desc'], + }, + { + name: 'Page', + value: 'page', + items: ['1', '2', '3'], + }, + { + name: 'Items Per Page', + value: 'perPage', + items: ['10', '25', '100'], + }, +]; + +export const dynamic = 'force-dynamic'; + +export default async function Page(props: { searchParams: Promise }) { + const searchParams = await props.searchParams; + return ( +
+

+ Updating searchParams +

+

+ The useSearchParams hook returns a read only version of{' '} + URLSearchParams. You can use{' '} + useRouter() or <Link> to set new{' '} + searchParams. After a navigation is performed, the current{' '} + page.js will receive an updated searchParams{' '} + prop. +

+
+
+ +

+ Using useRouter() +

+ + + + +
+ + + Docs + +
+ +
+ +

+ Using <Link> +

+ +
+ {options.map((option) => { + return ( +
+
{option.name}
+ +
+ {option.items.map((item, i) => { + const isActive = + // set the first item as active if no search param is set + (!searchParams[option.value] && i === 0) || + // otherwise check if the current item is the active one + item === searchParams[option.value]; + + // create new searchParams object for easier manipulation + const params = new URLSearchParams(searchParams); + params.set(option.value, item); + return ( + + {item} + + ); + })} +
+
+ ); + })} +
+
+ + + Docs + +
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/route-groups/(checkout)/checkout/page.tsx b/apps/next-app-router-4001/app/route-groups/(checkout)/checkout/page.tsx new file mode 100644 index 00000000000..80dc7c2458e --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(checkout)/checkout/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Checkout

; +} diff --git a/apps/next-app-router-4001/app/route-groups/(checkout)/layout.tsx b/apps/next-app-router-4001/app/route-groups/(checkout)/layout.tsx new file mode 100644 index 00000000000..7054058ef16 --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(checkout)/layout.tsx @@ -0,0 +1,23 @@ +import { Boundary } from '#/ui/boundary'; +import { TabNavItem } from '#/ui/tab-nav-item'; +import React from 'react'; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( + +
+
+
+ Back +
+
+ +
{children}
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/route-groups/(checkout)/template.tsx b/apps/next-app-router-4001/app/route-groups/(checkout)/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(checkout)/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/route-groups/(main)/layout.tsx b/apps/next-app-router-4001/app/route-groups/(main)/layout.tsx new file mode 100644 index 00000000000..bcc0006a866 --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(main)/layout.tsx @@ -0,0 +1,46 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( + +
+
+ ({ + text: x.name, + slug: x.slug, + })), + { text: 'Checkout', slug: 'checkout' }, + { text: 'Blog', slug: 'blog' }, + ]} + /> + +
+ +
+
+ +
{children}
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/route-groups/(main)/page.tsx b/apps/next-app-router-4001/app/route-groups/(main)/page.tsx new file mode 100644 index 00000000000..b3b778e397a --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(main)/page.tsx @@ -0,0 +1,38 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Route Groups

+ +
    +
  • + This example uses Route Groups to create layouts for different + sections of the app without affecting the URL structure. +
  • +
  • + Try navigating pages and noting the different layouts used for each + section. +
  • +
  • Route groups can be used to:
  • +
      +
    • Opt a route segment out of a shared layout.
    • +
    • Organize routes without affecting the URL structure.
    • +
    • + Create multiple root layouts by partitioning the top level of the + application. +
    • +
    +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/route-groups/(main)/template.tsx b/apps/next-app-router-4001/app/route-groups/(main)/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(main)/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/route-groups/(marketing)/blog/page.tsx b/apps/next-app-router-4001/app/route-groups/(marketing)/blog/page.tsx new file mode 100644 index 00000000000..1b1a8a4e52b --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(marketing)/blog/page.tsx @@ -0,0 +1,3 @@ +export default function Page() { + return

Blog

; +} diff --git a/apps/next-app-router-4001/app/route-groups/(marketing)/layout.tsx b/apps/next-app-router-4001/app/route-groups/(marketing)/layout.tsx new file mode 100644 index 00000000000..2417ef5e4f8 --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(marketing)/layout.tsx @@ -0,0 +1,46 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( + +
+
+ ({ + text: x.name, + slug: x.slug, + })), + { text: 'Checkout', slug: 'checkout' }, + { text: 'Blog', slug: 'blog' }, + ]} + /> + +
+ +
+
+ +
{children}
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/route-groups/(marketing)/template.tsx b/apps/next-app-router-4001/app/route-groups/(marketing)/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(marketing)/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/[subCategorySlug]/page.tsx b/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/[subCategorySlug]/page.tsx new file mode 100644 index 00000000000..ca6da06338b --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/[subCategorySlug]/page.tsx @@ -0,0 +1,22 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; +import { notFound } from 'next/navigation'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string; subCategorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.subCategorySlug }); + + return ( +
+

{category.name}

+ +
+ {Array.from({ length: category.count }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/layout.tsx b/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/layout.tsx new file mode 100644 index 00000000000..69b74e3a8bb --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/layout.tsx @@ -0,0 +1,39 @@ +import { getCategories, getCategory } from '#/app/api/categories/getCategories'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; + +export default async function Layout(props: { + children: React.ReactNode; + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + + const { children } = props; + + const category = await getCategory({ slug: params.categorySlug }); + const categories = await getCategories({ parent: params.categorySlug }); + + return ( +
+
+ ({ + text: x.name, + slug: x.slug, + })), + ]} + /> + +
+ +
+
+
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/page.tsx b/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/page.tsx new file mode 100644 index 00000000000..df3bd10827f --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/page.tsx @@ -0,0 +1,22 @@ +import { getCategory } from '#/app/api/categories/getCategories'; +import { SkeletonCard } from '#/ui/skeleton-card'; + +export default async function Page(props: { + params: Promise<{ categorySlug: string }>; +}) { + const params = await props.params; + const category = await getCategory({ slug: params.categorySlug }); + return ( +
+

+ All {category.name} +

+ +
+ {Array.from({ length: 9 }).map((_, i) => ( + + ))} +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/template.tsx b/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(shop)/[categorySlug]/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/route-groups/(shop)/layout.tsx b/apps/next-app-router-4001/app/route-groups/(shop)/layout.tsx new file mode 100644 index 00000000000..7884628bc29 --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(shop)/layout.tsx @@ -0,0 +1,42 @@ +import { getCategories } from '#/app/api/categories/getCategories'; +import { Boundary } from '#/ui/boundary'; +import { ClickCounter } from '#/ui/click-counter'; +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const categories = await getCategories(); + + return ( + +
+
+ ({ + text: x.name, + slug: x.slug, + })), + { text: 'Checkout', slug: 'checkout' }, + { text: 'Blog', slug: 'blog' }, + ]} + /> + +
+ +
+
+ +
{children}
+
+
+ ); +} diff --git a/apps/next-app-router-4001/app/route-groups/(shop)/template.tsx b/apps/next-app-router-4001/app/route-groups/(shop)/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/(shop)/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/route-groups/layout.tsx b/apps/next-app-router-4001/app/route-groups/layout.tsx new file mode 100644 index 00000000000..8c5355869d9 --- /dev/null +++ b/apps/next-app-router-4001/app/route-groups/layout.tsx @@ -0,0 +1,15 @@ +import React from 'react'; + +const title = 'Route Groups'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default function Layout({ children }: { children: React.ReactNode }) { + return children; +} diff --git a/apps/next-app-router-4001/app/ssg/[id]/page.tsx b/apps/next-app-router-4001/app/ssg/[id]/page.tsx new file mode 100644 index 00000000000..4e2c40d37ca --- /dev/null +++ b/apps/next-app-router-4001/app/ssg/[id]/page.tsx @@ -0,0 +1,35 @@ +import { RenderingInfo } from '#/ui/rendering-info'; +import { notFound } from 'next/navigation'; + +export async function generateStaticParams() { + // Generate two pages at build time and the rest (3-100) on-demand + return [{ id: '1' }, { id: '2' }]; +} + +export default async function Page(props: { params: Promise<{ id: string }> }) { + const params = await props.params; + if (Number(params.id) >= 100) { + notFound(); + } + + const res = await fetch( + `https://jsonplaceholder.typicode.com/posts/${params.id}`, + ); + const data = (await res.json()) as { title: string; body: string }; + + const isOnDemand = Number(params.id) >= 3; + + return ( +
+
+

+ {data.title} +

+

{data.body}

+
+
+ +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/ssg/layout.tsx b/apps/next-app-router-4001/app/ssg/layout.tsx new file mode 100644 index 00000000000..3ca03680c4e --- /dev/null +++ b/apps/next-app-router-4001/app/ssg/layout.tsx @@ -0,0 +1,28 @@ +import { Tab } from '#/ui/tab'; +import React from 'react'; +import { RandomPostTab } from './random-post-tab'; + +const title = 'Static Data'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( +
+
+ + + + +
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/ssg/loading.tsx b/apps/next-app-router-4001/app/ssg/loading.tsx new file mode 100644 index 00000000000..2c150f871d2 --- /dev/null +++ b/apps/next-app-router-4001/app/ssg/loading.tsx @@ -0,0 +1,5 @@ +import { RenderingPageSkeleton } from '#/ui/rendering-page-skeleton'; + +export default function Loading() { + return ; +} diff --git a/apps/next-app-router-4001/app/ssg/page.tsx b/apps/next-app-router-4001/app/ssg/page.tsx new file mode 100644 index 00000000000..3133fa73b3d --- /dev/null +++ b/apps/next-app-router-4001/app/ssg/page.tsx @@ -0,0 +1,31 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Static Data

+ +
    +
  • By default, data fetching in Next.js is cached static.
  • +
  • This example statically caches data fetches for Post 1 and 2.
  • +
  • + A random third post is fetched on-demand the first time it is + requested. +
  • +
  • + Try navigating to each post and noting the timestamp of when the page + was rendered. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/ssg/random-post-tab.tsx b/apps/next-app-router-4001/app/ssg/random-post-tab.tsx new file mode 100644 index 00000000000..3d92f7aecf1 --- /dev/null +++ b/apps/next-app-router-4001/app/ssg/random-post-tab.tsx @@ -0,0 +1,32 @@ +'use client'; + +import { Tab } from '#/ui/tab'; +import clsx from 'clsx'; +import React, { useEffect } from 'react'; + +const randomNumber = (min: number, max: number) => + Math.floor(Math.random() * (max - min + 1) + min); + +export function RandomPostTab({ path }: { path: string }) { + const [post, setPost] = React.useState( + null, + ); + + useEffect(() => { + const randomId = String(randomNumber(3, 100)); + setPost({ text: `Post ${randomId} (On Demand)`, slug: randomId }); + }, []); + + return ( +
+ {post ? ( + + ) : null} +
+ ); +} diff --git a/apps/next-app-router-4001/app/ssg/template.tsx b/apps/next-app-router-4001/app/ssg/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/ssg/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/ssr/[id]/page.tsx b/apps/next-app-router-4001/app/ssr/[id]/page.tsx new file mode 100644 index 00000000000..c4e89fae45d --- /dev/null +++ b/apps/next-app-router-4001/app/ssr/[id]/page.tsx @@ -0,0 +1,24 @@ +import { RenderingInfo } from '#/ui/rendering-info'; + +export default async function Page(props: { params: Promise<{ id: string }> }) { + const params = await props.params; + const res = await fetch( + `https://jsonplaceholder.typicode.com/posts/${params.id}`, + { cache: 'no-store' }, + ); + const data = (await res.json()) as { title: string; body: string }; + + return ( +
+
+

+ {data.title} +

+

{data.body}

+
+
+ +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/ssr/layout.tsx b/apps/next-app-router-4001/app/ssr/layout.tsx new file mode 100644 index 00000000000..3ed3464f0b7 --- /dev/null +++ b/apps/next-app-router-4001/app/ssr/layout.tsx @@ -0,0 +1,34 @@ +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Dynamic Data'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; +export default function Layout({ children }: { children: React.ReactNode }) { + const ids = [{ id: '1' }, { id: '2' }, { id: '3' }]; + + return ( +
+ ({ + text: `Post ${x.id}`, + slug: x.id, + })), + ]} + /> + +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/ssr/loading.tsx b/apps/next-app-router-4001/app/ssr/loading.tsx new file mode 100644 index 00000000000..2c150f871d2 --- /dev/null +++ b/apps/next-app-router-4001/app/ssr/loading.tsx @@ -0,0 +1,5 @@ +import { RenderingPageSkeleton } from '#/ui/rendering-page-skeleton'; + +export default function Loading() { + return ; +} diff --git a/apps/next-app-router-4001/app/ssr/page.tsx b/apps/next-app-router-4001/app/ssr/page.tsx new file mode 100644 index 00000000000..a7b057a676f --- /dev/null +++ b/apps/next-app-router-4001/app/ssr/page.tsx @@ -0,0 +1,29 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Dynamic Data

+ +
    +
  • + Dynamic, or server-rendered data, is fetched fresh on each request. +
  • +
  • In this example, the post responses are explicitly not cached.
  • +
  • + Try navigating to each post and noting the timestamp of when the page + was rendered. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/ssr/template.tsx b/apps/next-app-router-4001/app/ssr/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/ssr/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/streaming/_components/add-to-cart.tsx b/apps/next-app-router-4001/app/streaming/_components/add-to-cart.tsx new file mode 100644 index 00000000000..1f0ddd20f68 --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/_components/add-to-cart.tsx @@ -0,0 +1,56 @@ +'use client'; + +import { useRouter } from 'next/navigation'; +import { useTransition } from 'react'; +import { useCartCount } from './cart-count-context'; + +export function AddToCart({ initialCartCount }: { initialCartCount: number }) { + const router = useRouter(); + const [isPending, startTransition] = useTransition(); + + const [, setOptimisticCartCount] = useCartCount(); + + const addToCart = () => { + setOptimisticCartCount(initialCartCount + 1); + + // update the cart count cookie + document.cookie = `_cart_count=${initialCartCount + 1}; path=/; max-age=${ + 60 * 60 * 24 * 30 + }};`; + + // Normally you would also send a request to the server to add the item + // to the current users cart + // await fetch(`https://api.acme.com/...`); + + // Use a transition and isPending to create inline loading UI + startTransition(() => { + setOptimisticCartCount(null); + + // Refresh the current route and fetch new data from the server without + // losing client-side browser or React state. + router.refresh(); + + // We're working on more fine-grained data mutation and revalidation: + // https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions + }); + }; + + return ( + + ); +} diff --git a/apps/next-app-router-4001/app/streaming/_components/cart-count-context.tsx b/apps/next-app-router-4001/app/streaming/_components/cart-count-context.tsx new file mode 100644 index 00000000000..83fff442f0b --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/_components/cart-count-context.tsx @@ -0,0 +1,36 @@ +'use client'; + +import React, { useState } from 'react'; + +const CartCountContext = React.createContext< + [number, React.Dispatch>] | undefined +>(undefined); + +export function CartCountProvider({ + children, + initialCartCount, +}: { + children: React.ReactNode; + initialCartCount: number; +}) { + const [optimisticCartCount, setOptimisticCartCount] = useState( + null, + ); + + const count = + optimisticCartCount !== null ? optimisticCartCount : initialCartCount; + + return ( + + {children} + + ); +} + +export function useCartCount() { + const context = React.useContext(CartCountContext); + if (context === undefined) { + throw new Error('useCartCount must be used within a CartCountProvider'); + } + return context; +} diff --git a/apps/next-app-router-4001/app/streaming/_components/cart-count.tsx b/apps/next-app-router-4001/app/streaming/_components/cart-count.tsx new file mode 100644 index 00000000000..cc740ba9830 --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/_components/cart-count.tsx @@ -0,0 +1,8 @@ +'use client'; + +import { useCartCount } from './cart-count-context'; + +export function CartCount() { + const [count] = useCartCount(); + return {count}; +} diff --git a/apps/next-app-router-4001/app/streaming/_components/header.tsx b/apps/next-app-router-4001/app/streaming/_components/header.tsx new file mode 100644 index 00000000000..9c097ff8b08 --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/_components/header.tsx @@ -0,0 +1,53 @@ +import { NextLogoLight } from '#/ui/next-logo'; +import { + MagnifyingGlassIcon, + ShoppingCartIcon, +} from '@heroicons/react/24/solid'; +import Image from 'next/image'; +import Link from 'next/link'; +import { CartCount } from './cart-count'; + +export function Header() { + return ( +
+
+ +
+ +
+ + +
+
+ +
+ +
+
+ +
+
+ +
+ +
+
+ + User +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/streaming/_components/pricing.tsx b/apps/next-app-router-4001/app/streaming/_components/pricing.tsx new file mode 100644 index 00000000000..d252fddaedb --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/_components/pricing.tsx @@ -0,0 +1,84 @@ +import type { Product } from '#/app/api/products/product'; +import { Ping } from '#/ui/ping'; +import { ProductEstimatedArrival } from '#/ui/product-estimated-arrival'; +import { ProductLowStockWarning } from '#/ui/product-low-stock-warning'; +import { ProductPrice } from '#/ui/product-price'; +import { ProductSplitPayments } from '#/ui/product-split-payments'; +import { ProductUsedPrice } from '#/ui/product-used-price'; +import { dinero, type DineroSnapshot } from 'dinero.js'; +import { Suspense } from 'react'; +import { AddToCart } from './add-to-cart'; + +function LoadingDots() { + return ( +
+ + + • + + + • + + + • + + +
+ ); +} + +async function UserSpecificDetails({ productId }: { productId: string }) { + const data = await fetch( + `https://app-playground-api.vercel.app/api/products?id=${productId}&delay=500&filter=price,usedPrice,leadTime,stock`, + { + // We intentionally disable Next.js Cache to better demo + // streaming + cache: 'no-store', + }, + ); + + const product = (await data.json()) as Product; + + const price = dinero(product.price as DineroSnapshot); + + return ( + <> + + {product.usedPrice ? ( + + ) : null} + + {product.stock <= 1 ? ( + + ) : null} + + ); +} + +export function Pricing({ + product, + cartCount, +}: { + product: Product; + cartCount: string; +}) { + const price = dinero(product.price as DineroSnapshot); + + return ( +
+ + +
+
+ +
+
+ + }> + + + + +
+ ); +} diff --git a/apps/next-app-router-4001/app/streaming/_components/recommended-products.tsx b/apps/next-app-router-4001/app/streaming/_components/recommended-products.tsx new file mode 100644 index 00000000000..09c72f3e3c1 --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/_components/recommended-products.tsx @@ -0,0 +1,65 @@ +import { Product } from '#/app/api/products/product'; +import { ProductCard } from '#/ui/product-card'; + +export async function RecommendedProducts({ + path, + data, +}: { + path: string; + data: Promise; +}) { + const products = (await data.then((res) => res.json())) as Product[]; + + return ( +
+
+
+ Recommended Products for You +
+
+ Based on your preferences and shopping habits +
+
+
+ {products.map((product) => ( +
+ +
+ ))} +
+
+ ); +} + +const shimmer = `relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_1.5s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent`; + +function ProductSkeleton() { + return ( +
+
+ +
+
+
+
+
+ ); +} + +export function RecommendedProductsSkeleton() { + return ( +
+
+
+
+
+ +
+ + + + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/streaming/_components/reviews.tsx b/apps/next-app-router-4001/app/streaming/_components/reviews.tsx new file mode 100644 index 00000000000..ab45a45bfb5 --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/_components/reviews.tsx @@ -0,0 +1,43 @@ +import type { Review } from '#/app/api/reviews/review'; +import { ProductReviewCard } from '#/ui/product-review-card'; + +export async function Reviews({ data }: { data: Promise }) { + const reviews = (await data.then((res) => res.json())) as Review[]; + + return ( +
+
Customer Reviews
+
+ {reviews.map((review) => { + return ; + })} +
+
+ ); +} + +const shimmer = `relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_1.5s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent`; + +function Skeleton() { + return ( +
+
+
+
+
+
+ ); +} + +export function ReviewsSkeleton() { + return ( +
+
+ +
+ + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/streaming/_components/single-product.tsx b/apps/next-app-router-4001/app/streaming/_components/single-product.tsx new file mode 100644 index 00000000000..139bd6be3dd --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/_components/single-product.tsx @@ -0,0 +1,76 @@ +import { Pricing } from '#/app/streaming/_components/pricing'; +import type { Product } from '#/app/api/products/product'; +import { ProductRating } from '#/ui/product-rating'; +import { cookies } from 'next/headers'; +import Image from 'next/image'; + +export const SingleProduct = async ({ data }: { data: Promise }) => { + const product = (await data.then((res) => res.json())) as Product; + + // Get the cart count from the users cookies and pass it to the client + // AddToCart component + const cartCount = (await cookies()).get('_cart_count')?.value || '0'; + + return ( +
+
+
+ {product.name} + +
+
+ {product.name} +
+
+ {product.name} +
+
+ {product.name} +
+
+
+
+ +
+
+ {product.name} +
+ + + +
+

{product.description}

+

{product.description}

+
+
+ +
+ +
+
+ ); +}; diff --git a/apps/next-app-router-4001/app/streaming/edge/layout.tsx b/apps/next-app-router-4001/app/streaming/edge/layout.tsx new file mode 100644 index 00000000000..6a482c4aa27 --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/edge/layout.tsx @@ -0,0 +1,46 @@ +import { Boundary } from '#/ui/boundary'; +import { cookies } from 'next/headers'; +import React from 'react'; +import { CartCountProvider } from '../_components/cart-count-context'; +import { Header } from '../_components/header'; + +export const metadata = { + title: 'Streaming (Edge Runtime)', +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const cartCount = Number((await cookies()).get('_cart_count')?.value || '0'); + + return ( + <> +
+
    +
  • + Primary product information is loaded first as part of the initial + response. +
  • +
  • + Secondary, more personalized details (that might be slower) like + ship date, other recommended products, and customer reviews are + progressively streamed in. +
  • +
  • Try refreshing or navigating to other recommended products.
  • +
+
+ + + +
+
+ + {children} +
+
+
+ + ); +} diff --git a/apps/next-app-router-4001/app/streaming/edge/product/[id]/page.tsx b/apps/next-app-router-4001/app/streaming/edge/product/[id]/page.tsx new file mode 100644 index 00000000000..be56a674d40 --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/edge/product/[id]/page.tsx @@ -0,0 +1,66 @@ +import { + RecommendedProducts, + RecommendedProductsSkeleton, +} from '#/app/streaming/_components/recommended-products'; +import { Reviews, ReviewsSkeleton } from '#/app/streaming/_components/reviews'; +import { SingleProduct } from '#/app/streaming/_components/single-product'; +import { Ping } from '#/ui/ping'; +import { Suspense } from 'react'; + +export const runtime = 'edge'; + +export default async function Page(props: { params: Promise<{ id: string }> }) { + const params = await props.params; + return ( +
+ + +
+
+ +
+
+ + }> + + + +
+
+ +
+
+ + }> + + +
+ ); +} diff --git a/apps/next-app-router-4001/app/streaming/layout.tsx b/apps/next-app-router-4001/app/streaming/layout.tsx new file mode 100644 index 00000000000..a6b84433e3e --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/layout.tsx @@ -0,0 +1,45 @@ +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Streaming'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + return ( +
+
+ +
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/streaming/node/layout.tsx b/apps/next-app-router-4001/app/streaming/node/layout.tsx new file mode 100644 index 00000000000..9d389013731 --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/node/layout.tsx @@ -0,0 +1,45 @@ +import { Boundary } from '#/ui/boundary'; +import { cookies } from 'next/headers'; +import React from 'react'; +import { CartCountProvider } from '../_components/cart-count-context'; +import { Header } from '../_components/header'; + +export const metadata = { + title: 'Streaming (Node Runtime)', +}; + +export default async function Layout({ + children, +}: { + children: React.ReactNode; +}) { + const cartCount = Number((await cookies()).get('_cart_count')?.value || '0'); + + return ( + <> +
+
    +
  • + Primary product information is loaded first as part of the initial + response. +
  • +
  • + Secondary, more personalized details (that might be slower) like + ship date, other recommended products, and customer reviews are + progressively streamed in. +
  • +
  • Try refreshing or navigating to other recommended products.
  • +
+
+ + +
+
+ + {children} +
+
+
+ + ); +} diff --git a/apps/next-app-router-4001/app/streaming/node/product/[id]/page.tsx b/apps/next-app-router-4001/app/streaming/node/product/[id]/page.tsx new file mode 100644 index 00000000000..b40f468f1ca --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/node/product/[id]/page.tsx @@ -0,0 +1,64 @@ +import { + RecommendedProducts, + RecommendedProductsSkeleton, +} from '#/app/streaming/_components/recommended-products'; +import { Reviews, ReviewsSkeleton } from '#/app/streaming/_components/reviews'; +import { SingleProduct } from '#/app/streaming/_components/single-product'; +import { Ping } from '#/ui/ping'; +import { Suspense } from 'react'; + +export default async function Page(props: { params: Promise<{ id: string }> }) { + const params = await props.params; + return ( +
+ + +
+
+ +
+
+ + }> + + + +
+
+ +
+
+ + }> + + +
+ ); +} diff --git a/apps/next-app-router-4001/app/streaming/page.tsx b/apps/next-app-router-4001/app/streaming/page.tsx new file mode 100644 index 00000000000..4aa68dc9551 --- /dev/null +++ b/apps/next-app-router-4001/app/streaming/page.tsx @@ -0,0 +1,38 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default async function Page() { + return ( +
+

Streaming with Suspense

+ +
    +
  • + Streaming allows you to progressively render and send units of the UI + from the server to the client. +
  • + +
  • + This allows the user to see and interact with the most essential parts + of the page while the rest of the content loads - instead of waiting + for the whole page to load before they can interact with anything. +
  • + +
  • Streaming works with both Edge and Node runtimes.
  • + +
  • + Try streaming by selecting a runtime in the + navigation above. +
  • +
+ +
+ + Docs + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/styling/css-modules/page.tsx b/apps/next-app-router-4001/app/styling/css-modules/page.tsx new file mode 100644 index 00000000000..a9cf5e25820 --- /dev/null +++ b/apps/next-app-router-4001/app/styling/css-modules/page.tsx @@ -0,0 +1,27 @@ +'use client'; + +import styles from './styles.module.css'; + +const SkeletonCard = () => ( +
+
+
+
+
+
+); + +export default function Page() { + return ( +
+

+ Styled with CSS Modules +

+
+ + + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/styling/css-modules/styles.module.css b/apps/next-app-router-4001/app/styling/css-modules/styles.module.css new file mode 100644 index 00000000000..c434f7b160a --- /dev/null +++ b/apps/next-app-router-4001/app/styling/css-modules/styles.module.css @@ -0,0 +1,54 @@ +.container { + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + gap: 1.5rem /* 24px */; +} + +@media (min-width: 1024px) { + .container { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +.skeleton { + padding: 1rem /* 16px */; + border-radius: 1rem /* 16px */; + background-color: rgb(24 24 27 / 0.8); +} + +.skeleton-img, +.skeleton-btn, +.skeleton-line-one, +.skeleton-line-two { + border-radius: 0.5rem /* 8px */; +} + +.skeleton-img { + height: 3.5rem /* 56px */; + background-color: rgb(63 63 70 / 1); +} + +.skeleton-btn, +.skeleton-line-one, +.skeleton-line-two { + margin-top: 0.75rem /* 12px */; + height: 0.75rem /* 12px */; +} + +.skeleton-btn { + background-color: rgb(121 40 202 / 1); + width: 25%; +} + +.skeleton-line-one, +.skeleton-line-two { + background-color: rgb(63 63 70 / 1); +} + +.skeleton-line-one { + width: 91.666667%; +} + +.skeleton-line-two { + width: 66.666667%; +} diff --git a/apps/next-app-router-4001/app/styling/global-css/page.tsx b/apps/next-app-router-4001/app/styling/global-css/page.tsx new file mode 100644 index 00000000000..aa39cc31044 --- /dev/null +++ b/apps/next-app-router-4001/app/styling/global-css/page.tsx @@ -0,0 +1,25 @@ +import './styles.css'; + +const SkeletonCard = () => ( +
+
+
+
+
+
+); + +export default function Page() { + return ( +
+

+ Styled with a Global CSS Stylesheet +

+
+ + + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/styling/global-css/styles.css b/apps/next-app-router-4001/app/styling/global-css/styles.css new file mode 100644 index 00000000000..c7b408ef9fc --- /dev/null +++ b/apps/next-app-router-4001/app/styling/global-css/styles.css @@ -0,0 +1,54 @@ +.container { + display: grid; + grid-template-columns: repeat(1, minmax(0, 1fr)); + gap: 1.5rem /* 24px */; +} + +@media (min-width: 1024px) { + .container { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } +} + +.skeleton { + padding: 1rem /* 16px */; + border-radius: 1rem /* 16px */; + background-color: rgb(24 24 27 / 0.8); +} + +.skeleton-img, +.skeleton-btn, +.skeleton-line-one, +.skeleton-line-two { + border-radius: 0.5rem /* 8px */; +} + +.skeleton-img { + height: 3.5rem /* 56px */; + background-color: rgb(63 63 70 / 1); +} + +.skeleton-btn, +.skeleton-line-one, +.skeleton-line-two { + margin-top: 0.75rem /* 12px */; + height: 0.75rem /* 12px */; +} + +.skeleton-btn { + background-color: rgb(245 166 35 / 1); + width: 25%; +} + +.skeleton-line-one, +.skeleton-line-two { + background-color: rgb(63 63 70 / 1); +} + +.skeleton-line-one { + width: 91.666667%; +} + +.skeleton-line-two { + width: 66.666667%; +} diff --git a/apps/next-app-router-4001/app/styling/layout.tsx b/apps/next-app-router-4001/app/styling/layout.tsx new file mode 100644 index 00000000000..a49a612b565 --- /dev/null +++ b/apps/next-app-router-4001/app/styling/layout.tsx @@ -0,0 +1,52 @@ +import { TabGroup } from '#/ui/tab-group'; +import React from 'react'; + +const title = 'Styling'; + +export const metadata = { + title, + openGraph: { + title, + images: [`/api/og?title=${title}`], + }, +}; + +const items = [ + { + text: 'Global CSS', + slug: 'global-css', + }, + { + text: 'CSS Modules', + slug: 'css-modules', + }, + { + text: 'Styled Components', + slug: 'styled-components', + }, + { + text: 'Styled JSX', + slug: 'styled-jsx', + }, + { + text: 'Tailwind CSS', + slug: 'tailwind', + }, +]; + +export default function Layout({ children }: { children: React.ReactNode }) { + return ( +
+ +
{children}
+
+ ); +} diff --git a/apps/next-app-router-4001/app/styling/page.tsx b/apps/next-app-router-4001/app/styling/page.tsx new file mode 100644 index 00000000000..fc2df59e419 --- /dev/null +++ b/apps/next-app-router-4001/app/styling/page.tsx @@ -0,0 +1,23 @@ +import { ExternalLink } from '#/ui/external-link'; + +export default function Page() { + return ( +
+

Styling

+ +
    +
  • This example shows different styling solutions.
  • +
+ +
+ + Docs + + + + Code + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/styling/styled-components/layout.tsx b/apps/next-app-router-4001/app/styling/styled-components/layout.tsx new file mode 100644 index 00000000000..bc3ce606379 --- /dev/null +++ b/apps/next-app-router-4001/app/styling/styled-components/layout.tsx @@ -0,0 +1,5 @@ +import StyledComponentsRegistry from './registry'; + +export default function Layout({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/styling/styled-components/page.tsx b/apps/next-app-router-4001/app/styling/styled-components/page.tsx new file mode 100644 index 00000000000..dc1f3f35c1d --- /dev/null +++ b/apps/next-app-router-4001/app/styling/styled-components/page.tsx @@ -0,0 +1,69 @@ +'use client'; + +import styled from 'styled-components'; + +const Container = styled.div` + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1.5rem /* 24px */; +`; + +const SkeletonInner = styled.div` + padding: 1rem /* 16px */; + background-color: rgb(24 24 27 / 0.8); + border-radius: 1rem /* 16px */; +`; + +const SkeletonImg = styled.div` + height: 3.5rem /* 56px */; + border-radius: 0.5rem /* 8px */; + background-color: rgb(63 63 70 / 1); +`; + +const SkeletonBtn = styled.div` + margin-top: 0.75rem /* 12px */; + width: 25%; + height: 0.75rem /* 12px */; + border-radius: 0.5rem /* 8px */; + background-color: rgb(255 0 128 / 1); +`; + +const SkeletonLineOne = styled.div` + margin-top: 0.75rem /* 12px */; + height: 0.75rem /* 12px */; + width: 91.666667%; + border-radius: 0.5rem /* 8px */; + background-color: rgb(63 63 70 / 1); +`; + +const SkeletonLineTwo = styled.div` + margin-top: 0.75rem /* 12px */; + height: 0.75rem /* 12px */; + width: 66.666667%; + border-radius: 0.5rem /* 8px */; + background-color: rgb(63 63 70 / 1); +`; + +const Skeleton = () => ( + + + + + + +); + +export default function Page() { + return ( +
+

+ Styled with Styled Components +

+ + + + + +
+ ); +} diff --git a/apps/next-app-router-4001/app/styling/styled-components/registry.tsx b/apps/next-app-router-4001/app/styling/styled-components/registry.tsx new file mode 100644 index 00000000000..79346eae087 --- /dev/null +++ b/apps/next-app-router-4001/app/styling/styled-components/registry.tsx @@ -0,0 +1,29 @@ +'use client'; + +import React, { useState } from 'react'; +import { useServerInsertedHTML } from 'next/navigation'; +import { ServerStyleSheet, StyleSheetManager } from 'styled-components'; + +export default function StyledComponentsRegistry({ + children, +}: { + children: React.ReactNode; +}) { + // Only create stylesheet once with lazy initial state + // x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-state + const [styledComponentsStyleSheet] = useState(() => new ServerStyleSheet()); + + useServerInsertedHTML(() => { + const styles = styledComponentsStyleSheet.getStyleElement(); + styledComponentsStyleSheet.instance.clearTag(); + return <>{styles}; + }); + + if (typeof window !== 'undefined') return <>{children}; + + return ( + + {children} + + ); +} diff --git a/apps/next-app-router-4001/app/styling/styled-jsx/layout.tsx b/apps/next-app-router-4001/app/styling/styled-jsx/layout.tsx new file mode 100644 index 00000000000..0072c517b27 --- /dev/null +++ b/apps/next-app-router-4001/app/styling/styled-jsx/layout.tsx @@ -0,0 +1,5 @@ +import StyledJsxRegistry from './registry'; + +export default function Layout({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/app/styling/styled-jsx/page.tsx b/apps/next-app-router-4001/app/styling/styled-jsx/page.tsx new file mode 100644 index 00000000000..60f514a285c --- /dev/null +++ b/apps/next-app-router-4001/app/styling/styled-jsx/page.tsx @@ -0,0 +1,85 @@ +'use client'; + +const SkeletonCard = () => ( + <> +
+
+
+
+
+
+ + +); + +export default function Page() { + return ( +
+

+ Styled with Styled JSX +

+
+ + + +
+ + +
+ ); +} diff --git a/apps/next-app-router-4001/app/styling/styled-jsx/registry.tsx b/apps/next-app-router-4001/app/styling/styled-jsx/registry.tsx new file mode 100644 index 00000000000..c2936d07169 --- /dev/null +++ b/apps/next-app-router-4001/app/styling/styled-jsx/registry.tsx @@ -0,0 +1,23 @@ +'use client'; + +import React, { useState } from 'react'; +import { useServerInsertedHTML } from 'next/navigation'; +import { StyleRegistry, createStyleRegistry } from 'styled-jsx'; + +export default function StyledJsxRegistry({ + children, +}: { + children: React.ReactNode; +}) { + // Only create stylesheet once with lazy initial state + // x-ref: https://reactjs.org/docs/hooks-reference.html#lazy-initial-state + const [jsxStyleRegistry] = useState(() => createStyleRegistry()); + + useServerInsertedHTML(() => { + const styles = jsxStyleRegistry.styles(); + jsxStyleRegistry.flush(); + return <>{styles}; + }); + + return {children}; +} diff --git a/apps/next-app-router-4001/app/styling/tailwind/page.tsx b/apps/next-app-router-4001/app/styling/tailwind/page.tsx new file mode 100644 index 00000000000..7ead53333fa --- /dev/null +++ b/apps/next-app-router-4001/app/styling/tailwind/page.tsx @@ -0,0 +1,24 @@ +const SkeletonCard = () => ( +
+
+
+
+
+
+); + +export default function Page() { + return ( +
+

+ Styled with Tailwind CSS +

+ +
+ + + +
+
+ ); +} diff --git a/apps/next-app-router-4001/app/styling/template.tsx b/apps/next-app-router-4001/app/styling/template.tsx new file mode 100644 index 00000000000..ad002f10437 --- /dev/null +++ b/apps/next-app-router-4001/app/styling/template.tsx @@ -0,0 +1,6 @@ +import { Boundary } from '#/ui/boundary'; +import React from 'react'; + +export default function Template({ children }: { children: React.ReactNode }) { + return {children}; +} diff --git a/apps/next-app-router-4001/lib/demos.ts b/apps/next-app-router-4001/lib/demos.ts new file mode 100644 index 00000000000..79a1d38ff7d --- /dev/null +++ b/apps/next-app-router-4001/lib/demos.ts @@ -0,0 +1,106 @@ +export type Item = { + name: string; + slug: string; + description?: string; +}; + +export const demos: { name: string; items: Item[] }[] = [ + { + name: 'Layouts', + items: [ + { + name: 'Nested Layouts', + slug: 'layouts', + description: 'Create UI that is shared across routes', + }, + { + name: 'Grouped Layouts', + slug: 'route-groups', + description: 'Organize routes without affecting URL paths', + }, + { + name: 'Parallel Routes', + slug: 'parallel-routes', + description: 'Render multiple pages in the same layout', + }, + ], + }, + { + name: 'File Conventions', + items: [ + { + name: 'Loading', + slug: 'loading', + description: + 'Create meaningful Loading UI for specific parts of an app', + }, + { + name: 'Error', + slug: 'error-handling', + description: 'Create Error UI for specific parts of an app', + }, + { + name: 'Not Found', + slug: 'not-found', + description: 'Create Not Found UI for specific parts of an app', + }, + ], + }, + { + name: 'Data Fetching', + items: [ + { + name: 'Streaming with Suspense', + slug: 'streaming', + description: + 'Streaming data fetching from the server with React Suspense', + }, + { + name: 'Static Data', + slug: 'ssg', + description: 'Generate static pages', + }, + { + name: 'Dynamic Data', + slug: 'ssr', + description: 'Server-render pages', + }, + { + name: 'Incremental Static Regeneration', + slug: 'isr', + description: 'Get the best of both worlds between static & dynamic', + }, + ], + }, + { + name: 'Components', + items: [ + { + name: 'Client Context', + slug: 'context', + description: + 'Pass context between Client Components that cross Server/Client Component boundary', + }, + ], + }, + { + name: 'Misc', + items: [ + { + name: 'Patterns', + slug: 'patterns', + description: 'A collection of useful App Router patterns', + }, + { + name: 'Client Component Hooks', + slug: 'hooks', + description: 'Preview the routing hooks available in Client Components', + }, + { + name: 'CSS and CSS-in-JS', + slug: 'styling', + description: 'Preview the supported styling solutions', + }, + ], + }, +]; diff --git a/apps/next-app-router-4001/license.md b/apps/next-app-router-4001/license.md new file mode 100644 index 00000000000..ec9dcd99d17 --- /dev/null +++ b/apps/next-app-router-4001/license.md @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2024 Vercel, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/apps/next-app-router-4001/next-env.d.ts b/apps/next-app-router-4001/next-env.d.ts new file mode 100755 index 00000000000..40c3d68096c --- /dev/null +++ b/apps/next-app-router-4001/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/building-your-application/configuring/typescript for more information. diff --git a/apps/next-app-router-4001/next.config.js b/apps/next-app-router-4001/next.config.js new file mode 100644 index 00000000000..714745c649c --- /dev/null +++ b/apps/next-app-router-4001/next.config.js @@ -0,0 +1,75 @@ +const { withNx } = require('@nx/next/plugins/with-nx'); +const NextFederationPlugin = require('@module-federation/nextjs-mf'); + +/** + * @type {import('@nx/next/plugins/with-nx').WithNxOptions} + **/ +const nextConfig = { + nx: { + // Set this to true if you would like to to use SVGR + // See: https://github.com/gregberge/svgr + svgr: false, + }, + webpack(config, options) { + const { isServer } = options; + config.watchOptions = { + ignored: ['**/node_modules/**', '**/@mf-types/**'], + }; + config.plugins.push( + new NextFederationPlugin({ + name: 'remote_4001', + filename: 'static/chunks/remoteEntry.js', + exposes: { + // Core UI Components + './Button': './ui/button', + // './Header': isServer ? './ui/header?rsc' : './ui/header?shared', + './Footer': './ui/footer', + // './GlobalNav(rsc)': isServer ? './ui/global-nav?rsc' : './ui/global-nav', + // './GlobalNav(ssr)': isServer ? './ui/global-nav?ssr' : './ui/global-nav', + './GlobalNav': './ui/global-nav', + // + // // Product Related Components + // './ProductCard': './ui/product-card', + // './ProductPrice': './ui/product-price', + // './ProductRating': './ui/product-rating', + // './ProductDeal': './ui/product-deal', + // + // // Navigation Components + // './TabGroup': './ui/tab-group', + // './TabNavItem': './ui/tab-nav-item', + // + // // Utility Components + // './Boundary': './ui/boundary', + // './CountUp': './ui/count-up', + // './RenderedTimeAgo': './ui/rendered-time-ago', + // './RenderingInfo': './ui/rendering-info' + }, + shared: { + // 'react': { + // singleton: true, + // requiredVersion: false + // }, + // 'react-dom': { + // singleton: true, + // requiredVersion: false + // } + }, + extraOptions: { + debug: false, + exposePages: true, + enableImageLoaderFix: true, + enableUrlLoaderFix: true, + }, + }), + ); + config.plugins.push({ + name: 'xxx', + apply(compiler) { + compiler.options.devtool = false; + }, + }); + return config; + }, +}; + +module.exports = withNx(nextConfig); diff --git a/apps/next-app-router-4001/package.json b/apps/next-app-router-4001/package.json new file mode 100644 index 00000000000..8eac0648797 --- /dev/null +++ b/apps/next-app-router-4001/package.json @@ -0,0 +1,52 @@ +{ + "private": true, + "scripts": { + "build": "next build", + "dev": "NEXT_PRIVATE_LOCAL_WEBPACK=true next dev -p 4001", + "lint": "next lint", + "lint-staged": "lint-staged", + "prettier": "prettier --write --ignore-unknown .", + "prettier:check": "prettier --check --ignore-unknown .", + "start": "next start", + "test": "pnpm prettier:check && pnpm lint" + }, + "git": { + "pre-commit": "lint-staged" + }, + "lint-staged": { + "*": "prettier --write --ignore-unknown" + }, + "dependencies": { + "@heroicons/react": "2.1.3", + "clsx": "2.1.1", + "date-fns": "3.6.0", + "dinero.js": "2.0.0-alpha.10", + "ms": "3.0.0-canary.1", + "next": "15.0.0-canary.193", + "react": "19.0.0-rc-cd22717c-20241013", + "react-dom": "19.0.0-rc-cd22717c-20241013", + "server-only": "0.0.1", + "styled-components": "6.1.8", + "use-count-up": "3.0.1", + "vercel": "34.0.0", + "@module-federation/nextjs-mf": "workspace:*" + }, + "devDependencies": { + "@tailwindcss/forms": "0.5.7", + "@tailwindcss/typography": "0.5.12", + "@types/ms": "0.7.34", + "@types/node": "20.12.7", + "@types/react": "npm:types-react@19.0.0-rc.1", + "@types/react-dom": "npm:types-react-dom@19.0.0-rc.1", + "@vercel/git-hooks": "1.0.0", + "autoprefixer": "10.4.19", + "eslint": "9.0.0", + "eslint-config-next": "14.2.2", + "lint-staged": "15.2.2", + "postcss": "8.4.38", + "prettier": "3.2.5", + "prettier-plugin-tailwindcss": "0.5.14", + "tailwindcss": "3.4.3", + "typescript": "5.4.5" + } +} diff --git a/apps/next-app-router-4001/pnpm-lock.yaml b/apps/next-app-router-4001/pnpm-lock.yaml new file mode 100644 index 00000000000..a441c20e752 --- /dev/null +++ b/apps/next-app-router-4001/pnpm-lock.yaml @@ -0,0 +1,5027 @@ +lockfileVersion: '6.0' + +dependencies: + '@heroicons/react': + specifier: 2.1.3 + version: 2.1.3(react@19.0.0-rc-cd22717c-20241013) + clsx: + specifier: 2.1.1 + version: 2.1.1 + date-fns: + specifier: 3.6.0 + version: 3.6.0 + dinero.js: + specifier: 2.0.0-alpha.10 + version: 2.0.0-alpha.10 + ms: + specifier: 3.0.0-canary.1 + version: 3.0.0-canary.1 + next: + specifier: 15.0.0-canary.193 + version: 15.0.0-canary.193(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013) + react: + specifier: 19.0.0-rc-cd22717c-20241013 + version: 19.0.0-rc-cd22717c-20241013 + react-dom: + specifier: 19.0.0-rc-cd22717c-20241013 + version: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013) + server-only: + specifier: 0.0.1 + version: 0.0.1 + styled-components: + specifier: 6.1.8 + version: 6.1.8(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013) + use-count-up: + specifier: 3.0.1 + version: 3.0.1(react@19.0.0-rc-cd22717c-20241013) + vercel: + specifier: 34.0.0 + version: 34.0.0 + +devDependencies: + '@tailwindcss/forms': + specifier: 0.5.7 + version: 0.5.7(tailwindcss@3.4.3) + '@tailwindcss/typography': + specifier: 0.5.12 + version: 0.5.12(tailwindcss@3.4.3) + '@types/ms': + specifier: 0.7.34 + version: 0.7.34 + '@types/node': + specifier: 20.12.7 + version: 20.12.7 + '@types/react': + specifier: npm:types-react@19.0.0-rc.1 + version: /types-react@19.0.0-rc.1 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.1 + version: /types-react-dom@19.0.0-rc.1 + '@vercel/git-hooks': + specifier: 1.0.0 + version: 1.0.0 + autoprefixer: + specifier: 10.4.19 + version: 10.4.19(postcss@8.4.38) + eslint: + specifier: 9.0.0 + version: 9.0.0 + eslint-config-next: + specifier: 14.2.2 + version: 14.2.2(eslint@9.0.0)(typescript@5.4.5) + lint-staged: + specifier: 15.2.2 + version: 15.2.2 + postcss: + specifier: 8.4.38 + version: 8.4.38 + prettier: + specifier: 3.2.5 + version: 3.2.5 + prettier-plugin-tailwindcss: + specifier: 0.5.14 + version: 0.5.14(prettier@3.2.5) + tailwindcss: + specifier: 3.4.3 + version: 3.4.3 + typescript: + specifier: 5.4.5 + version: 5.4.5 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: true + + /@babel/runtime@7.24.4: + resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: false + + /@dinero.js/calculator-number@2.0.0-alpha.10: + resolution: {integrity: sha512-EdKG0yykukigfdq+TsxZ9r0Wrg5flYAncKWSfr2snWDXurFsg8JE0oazVraCBA3Vb5LN4vGuFEpTFTH+dIrRCg==} + dependencies: + '@dinero.js/core': 2.0.0-alpha.10 + dev: false + + /@dinero.js/core@2.0.0-alpha.10: + resolution: {integrity: sha512-vjeGXQbNvDXlXK54zaWDydEXyFAvLDj6LCfwO4CTZJIqn3+PaXakaEd5S0AXC6hluPatxnQa5J63x3WQ/Imrjw==} + dependencies: + '@dinero.js/currencies': 2.0.0-alpha.10 + dev: false + + /@dinero.js/currencies@2.0.0-alpha.10: + resolution: {integrity: sha512-IDKaAh0YcJh700uLCrvWtIRCl5sItc3S2rk4IfVJBbms3j+NBDOlVFJnwru+UrMh7VpqU9GlZRsHcHf0NxYE9A==} + dev: false + + /@edge-runtime/format@2.2.1: + resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/node-utils@2.3.0: + resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/ponyfill@2.4.2: + resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/primitives@4.1.0: + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/vm@3.2.0: + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} + engines: {node: '>=16'} + dependencies: + '@edge-runtime/primitives': 4.1.0 + dev: false + + /@emnapi/runtime@1.3.1: + resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + requiresBuild: true + dependencies: + tslib: 2.5.0 + dev: false + optional: true + + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} + dependencies: + '@emotion/memoize': 0.8.1 + dev: false + + /@emotion/memoize@0.8.1: + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + dev: false + + /@emotion/unitless@0.8.0: + resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} + dev: false + + /@eslint-community/eslint-utils@4.4.0(eslint@9.0.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 9.0.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@3.0.2: + resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 10.0.1 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@9.0.0: + resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /@fastify/busboy@2.1.1: + resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} + engines: {node: '>=14'} + dev: false + + /@heroicons/react@2.1.3(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==} + peerDependencies: + react: '>= 16' + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + dev: false + + /@humanwhocodes/config-array@0.12.3: + resolution: {integrity: sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + dev: true + + /@img/sharp-darwin-arm64@0.33.5: + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.5: + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.4: + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.4: + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.4: + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.5: + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.4: + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.4: + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.4: + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.4: + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.5: + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.5: + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.5 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.5: + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.4 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.5: + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.5: + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.5: + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.5: + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 1.3.1 + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.5: + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.5: + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@mapbox/node-pre-gyp@1.0.11: + resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + hasBin: true + dependencies: + detect-libc: 2.0.3 + https-proxy-agent: 5.0.1 + make-dir: 3.1.0 + node-fetch: 2.7.0 + nopt: 5.0.0 + npmlog: 5.0.1 + rimraf: 3.0.2 + semver: 7.6.3 + tar: 6.2.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@next/env@15.0.0-canary.193: + resolution: {integrity: sha512-GBCLGuoPKHF6H/bmtALmKEV/+IsIToVelkM8eZpVDGfWtL03KueC6mUZdhF1trBZenGW3Ly1j0N872koPUcAlw==} + dev: false + + /@next/eslint-plugin-next@14.2.2: + resolution: {integrity: sha512-q+Ec2648JtBpKiu/FSJm8HAsFXlNvioHeBCbTP12T1SGcHYwhqHULSfQgFkPgHDu3kzNp2Kem4J54bK4rPQ5SQ==} + dependencies: + glob: 10.3.10 + dev: true + + /@next/swc-darwin-arm64@15.0.0-canary.193: + resolution: {integrity: sha512-CRq2GfI7r5CcAY1ITTb4FZpK8UTGLrNdYelTuv9zcSe4EhuNb7Qp14XfGGL9LV39ZkP5ypcVHYhkrNbfiL3VuQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-darwin-x64@15.0.0-canary.193: + resolution: {integrity: sha512-+0W+NW4JhdcCDwuy8qd/p/zQ7TlfGJ6qSYzamq7nZ+KFWWSJqmBDzTzNfKPxPgdtfHaVyQIN1ThSEJtrah3+dA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-gnu@15.0.0-canary.193: + resolution: {integrity: sha512-5RawIR+D7KPI/trRdKudCWPYu98eF6f2js00tctF8jOUvpGs5M06RKvp+DKzgPLxaZIxAq+YIycS/F9E88LECA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-arm64-musl@15.0.0-canary.193: + resolution: {integrity: sha512-IdHsXwzkmyMfOE2Ff0C3qeivgnP00l6t+kzoDymv1ldXd9f03T+XgtUtcTWKnVDEKqyBVuKgZHpAm/0JtRvhWg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-gnu@15.0.0-canary.193: + resolution: {integrity: sha512-sOvYkCYNUiR/nq5bQuCc/zXqx6jqmRhL8+PxcOTmIQ9YdSsd9oT/ENZzJ4Bf0MiKGyLC7YpjE6ybTUl5TjlvJA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-linux-x64-musl@15.0.0-canary.193: + resolution: {integrity: sha512-tHNzv1CRFP7fVNsQWyhvoVhnLIn6W8OqtUPS9k33X7WRYCRp+bGJQjefPV4Ht+mBNN3oM51uMtKn7EJ6wizrjw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-arm64-msvc@15.0.0-canary.193: + resolution: {integrity: sha512-RwXjqOXKMF4oiXbQfcTcRfoYUaTl+3xpK6Phz8BnWTeFn0PNUdDZnvUswq4RTZZEAaCw479R35KcnR8SJh/OWw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@next/swc-win32-x64-msvc@15.0.0-canary.193: + resolution: {integrity: sha512-Ib3U2QIzdVOxWa4ChBIbjaEJjg2xDgA71g7/kEMwRTXds8EuKRu9HVwErb+23nxiKiRFEKx9GKTGHURHEKvlJw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: false + + /@rushstack/eslint-patch@1.10.2: + resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} + dev: true + + /@sinclair/typebox@0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + dev: false + + /@swc/counter@0.1.3: + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + dev: false + + /@swc/helpers@0.5.13: + resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + dependencies: + tslib: 2.5.0 + dev: false + + /@tailwindcss/forms@0.5.7(tailwindcss@3.4.3): + resolution: {integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.4.3 + dev: true + + /@tailwindcss/typography@0.5.12(tailwindcss@3.4.3): + resolution: {integrity: sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.3 + dev: true + + /@tootallnate/once@2.0.0: + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + dev: false + + /@ts-morph/common@0.11.1: + resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} + dependencies: + fast-glob: 3.3.2 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + dev: false + + /@tsconfig/node10@1.0.11: + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + dev: false + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: false + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: false + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: false + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: false + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + dev: true + + /@types/ms@0.7.34: + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + dev: true + + /@types/node@14.18.33: + resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} + dev: false + + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + dependencies: + undici-types: 5.26.5 + dev: true + + /@types/prop-types@15.7.5: + resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} + dev: true + + /@types/react@18.2.79: + resolution: {integrity: sha512-RwGAGXPl9kSXwdNTafkOEuFrTBD5SA2B3iEB96xi8+xu5ddUa/cpvyVCSNn+asgLCTHkb5ZxN8gbuibYJi4s1w==} + dependencies: + '@types/prop-types': 15.7.5 + csstype: 3.1.2 + dev: true + + /@types/stylis@4.2.0: + resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} + dev: false + + /@typescript-eslint/parser@7.2.0(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 7.2.0 + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.3.4 + eslint: 9.0.0 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@7.2.0: + resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + dev: true + + /@typescript-eslint/types@7.2.0: + resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.5): + resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 7.2.0 + '@typescript-eslint/visitor-keys': 7.2.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/visitor-keys@7.2.0: + resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 7.2.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@vercel/build-utils@7.11.0: + resolution: {integrity: sha512-UFrx1hNIjNJJkd0NZrYfaOrmcWhQmrVsbKe9o3L9jX9J1iufG685wIZ9tFCKKC0Fa2HWbNDNzNxrE5SCAS2lyA==} + dev: false + + /@vercel/error-utils@2.0.2: + resolution: {integrity: sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ==} + dev: false + + /@vercel/fun@1.1.0: + resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} + engines: {node: '>= 10'} + dependencies: + '@tootallnate/once': 2.0.0 + async-listen: 1.2.0 + debug: 4.1.1 + execa: 3.2.0 + fs-extra: 8.1.0 + generic-pool: 3.4.2 + micro: 9.3.5-canary.3 + ms: 2.1.1 + node-fetch: 2.6.7 + path-match: 1.2.4 + promisepipe: 3.0.0 + semver: 7.3.5 + stat-mode: 0.3.0 + stream-to-promise: 2.2.0 + tar: 4.4.18 + tree-kill: 1.2.2 + uid-promise: 1.0.0 + uuid: 3.3.2 + xdg-app-paths: 5.1.0 + yauzl-promise: 2.1.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/gatsby-plugin-vercel-analytics@1.0.11: + resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} + dependencies: + web-vitals: 0.2.4 + dev: false + + /@vercel/gatsby-plugin-vercel-builder@2.0.24: + resolution: {integrity: sha512-b02ifu8WCmz4ARjkC9AyuOxpXa0Tmh0uIbDDYvyvDRpvohQY53eC3sXKVOejnmQbi9KojkaJsQRvMTBRh9BUHA==} + dependencies: + '@sinclair/typebox': 0.25.24 + '@vercel/build-utils': 7.11.0 + '@vercel/routing-utils': 3.1.0 + esbuild: 0.14.47 + etag: 1.8.1 + fs-extra: 11.1.0 + dev: false + + /@vercel/git-hooks@1.0.0: + resolution: {integrity: sha512-OxDFAAdyiJ/H0b8zR9rFCu3BIb78LekBXOphOYG3snV4ULhKFX387pBPpqZ9HLiRTejBWBxYEahkw79tuIgdAA==} + requiresBuild: true + dev: true + + /@vercel/go@3.1.1: + resolution: {integrity: sha512-mrzomNYltxkjvtUmaYry5YEyvwTz6c/QQHE5Gr/pPGRIniUiP6T6OFOJ49RBN7e6pRXaNzHPVuidiuBhvHh5+Q==} + dev: false + + /@vercel/hydrogen@1.0.2: + resolution: {integrity: sha512-/Q2MKk1GfOuZAnkE9jQexjtUQqanbY65R+xtJWd9yKIgwcfRI1hxiNH3uXyVM5AvLoY+fxxULkSuxDtUKpkJpQ==} + dependencies: + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + dev: false + + /@vercel/next@4.2.0: + resolution: {integrity: sha512-2KSXdPHpfPWaf0tKTBxOWvdc8e9TPNARjmqtgYUsrl1TVaBNFsZ0GV0kWaVLEw4o7CWfREt8ZY064sNVb1BcAQ==} + dependencies: + '@vercel/nft': 0.26.4 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/nft@0.26.4: + resolution: {integrity: sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11 + '@rollup/pluginutils': 4.2.1 + acorn: 8.11.3 + acorn-import-attributes: 1.9.5(acorn@8.11.3) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + node-gyp-build: 4.8.0 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/node@3.0.26: + resolution: {integrity: sha512-PoyacnoylwpE3+7RFUVHJlbPqtneTCEJVXXx4n8g9ARgUDSRSCwFpJOhiFQon2sS2YtfCzsJa29Z9dAZQedDcQ==} + dependencies: + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 + '@types/node': 14.18.33 + '@vercel/build-utils': 7.11.0 + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4 + '@vercel/static-config': 3.0.0 + async-listen: 3.0.0 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 + esbuild: 0.14.47 + etag: 1.8.1 + node-fetch: 2.6.9 + path-to-regexp: 6.2.1 + ts-morph: 12.0.0 + ts-node: 10.9.1(@types/node@14.18.33)(typescript@4.9.5) + typescript: 4.9.5 + undici: 5.26.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color + dev: false + + /@vercel/python@4.1.1: + resolution: {integrity: sha512-EbAdKOZ0hPd5b59tLt7R3RQK1azNvuZTrCFRAVHNjqcIHNCmrSvjag5zBGn7Memkk8qWb3+CgBw9K/3LJKei0w==} + dev: false + + /@vercel/redwood@2.0.8: + resolution: {integrity: sha512-hAu7SYXDt+W7kscjtQ5NsuNflXH+QB5/xAdA6FRSS/e41lG6Xq6pqLMDobqq4BR7E2PpppVDw2DUx9KzPNoeEw==} + dependencies: + '@vercel/nft': 0.26.4 + '@vercel/routing-utils': 3.1.0 + semver: 6.3.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/remix-builder@2.1.5: + resolution: {integrity: sha512-VaDhsNg/1lZ7h6GJnaykActeZTRtFQz45qDNwKrHM+Nw5/ocwTun9sCJZY/ziECUNuQEJv95z3wUDhNweG+/9w==} + dependencies: + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/routing-utils@3.1.0: + resolution: {integrity: sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==} + dependencies: + path-to-regexp: 6.1.0 + optionalDependencies: + ajv: 6.12.6 + dev: false + + /@vercel/ruby@2.0.5: + resolution: {integrity: sha512-Gfm8HDech41vf+EPleRzgoJUnDTJerKgckMm4KX0JT860gV9XBMSOWYH7eMWHmMza104+HRCWL7wT6OlpftF2Q==} + dev: false + + /@vercel/static-build@2.4.6: + resolution: {integrity: sha512-LCmEBXRse7Bt46fo4OUzkq6RL1Q26oMWvmbFsW5uKi6bkT8asU1U5/zw9PQTeFQjGRL2vkUi22fGXF6XHuuqsA==} + dependencies: + '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 + '@vercel/gatsby-plugin-vercel-builder': 2.0.24 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + dev: false + + /@vercel/static-config@3.0.0: + resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} + dependencies: + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + ts-morph: 12.0.0 + dev: false + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /acorn-import-attributes@1.9.5(acorn@8.11.3): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.11.3 + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + + /ansi-escapes@6.2.1: + resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==} + engines: {node: '>=14.16'} + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: true + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: true + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: false + + /are-we-there-yet@2.0.0: + resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} + engines: {node: '>=10'} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: false + + /arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + dev: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: false + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: true + + /array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + dev: true + + /array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + dev: true + + /array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + dev: true + + /arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + dev: true + + /ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + dev: true + + /async-listen@1.2.0: + resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} + dev: false + + /async-listen@3.0.0: + resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} + engines: {node: '>= 14'} + dev: false + + /async-listen@3.0.1: + resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} + engines: {node: '>= 14'} + dev: false + + /async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + dev: false + + /autoprefixer@10.4.19(postcss@8.4.38): + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001611 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: true + + /available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + dependencies: + possible-typed-array-names: 1.0.0 + dev: true + + /axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + dev: true + + /axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + dependencies: + dequal: 2.0.3 + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001611 + electron-to-chromium: 1.4.740 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + dev: false + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + dev: false + + /bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + dev: false + + /call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + dev: true + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + dev: true + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: true + + /camelize@1.0.1: + resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} + dev: false + + /caniuse-lite@1.0.30001611: + resolution: {integrity: sha512-19NuN1/3PjA3QI8Eki55N8my4LzfkMCRLgCVfrl/slbSAchQfV0+GwjPrK3rq37As4UCLlM/DHajbKkAqbv92Q==} + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: true + + /chokidar@3.3.1: + resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.3.0 + optionalDependencies: + fsevents: 2.1.3 + dev: false + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: false + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: false + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: true + + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + dependencies: + slice-ansi: 5.0.0 + string-width: 7.1.0 + dev: true + + /client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + dev: false + + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + dev: false + + /code-block-writer@10.1.1: + resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + optional: true + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + optional: true + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: true + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: false + + /content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + dev: false + + /convert-hrtime@3.0.0: + resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} + engines: {node: '>=8'} + dev: false + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /css-color-keywords@1.0.0: + resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} + engines: {node: '>=4'} + dev: false + + /css-to-react-native@3.2.0: + resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} + dependencies: + camelize: 1.0.1 + css-color-keywords: 1.0.0 + postcss-value-parser: 4.2.0 + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + + /damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dev: true + + /data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + dev: true + + /date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + dev: false + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: true + + /debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + dev: true + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + dev: true + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + dev: true + + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + dev: false + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: false + + /dinero.js@2.0.0-alpha.10: + resolution: {integrity: sha512-EDiOZanmJBJnFfiz5cUL/I2UI7EXQ0jXf18srqgO7sQhChyBbN39b5sf6T4fq4Oj3f4/6x2L96YPUbMRcUmd/A==} + dependencies: + '@dinero.js/calculator-number': 2.0.0-alpha.10 + '@dinero.js/core': 2.0.0-alpha.10 + '@dinero.js/currencies': 2.0.0-alpha.10 + dev: false + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true + + /edge-runtime@2.5.9: + resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} + engines: {node: '>=16'} + hasBin: true + dependencies: + '@edge-runtime/format': 2.2.1 + '@edge-runtime/ponyfill': 2.4.2 + '@edge-runtime/vm': 3.2.0 + async-listen: 3.0.1 + mri: 1.2.0 + picocolors: 1.0.0 + pretty-ms: 7.0.1 + signal-exit: 4.0.2 + time-span: 4.0.0 + dev: false + + /electron-to-chromium@1.4.740: + resolution: {integrity: sha512-Yvg5i+iyv7Xm18BRdVPVm8lc7kgxM3r6iwqCH2zB7QZy1kZRNmd0Zqm0zcD9XoFREE5/5rwIuIAOT+/mzGcnZg==} + dev: true + + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true + + /end-of-stream@1.1.0: + resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} + dependencies: + once: 1.3.3 + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + dev: false + + /enhanced-resolve@5.16.0: + resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + dev: true + + /es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.3 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + dev: true + + /es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: true + + /es-iterator-helpers@1.0.18: + resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + dev: true + + /es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + dev: false + + /es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: true + + /es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: true + + /es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + dependencies: + hasown: 2.0.2 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + dev: true + + /esbuild-android-64@0.14.47: + resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /esbuild-android-arm64@0.14.47: + resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /esbuild-darwin-64@0.14.47: + resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /esbuild-darwin-arm64@0.14.47: + resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /esbuild-freebsd-64@0.14.47: + resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /esbuild-freebsd-arm64@0.14.47: + resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-32@0.14.47: + resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-64@0.14.47: + resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-arm64@0.14.47: + resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-arm@0.14.47: + resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-mips64le@0.14.47: + resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-ppc64le@0.14.47: + resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-riscv64@0.14.47: + resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-linux-s390x@0.14.47: + resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /esbuild-netbsd-64@0.14.47: + resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /esbuild-openbsd-64@0.14.47: + resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /esbuild-sunos-64@0.14.47: + resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /esbuild-windows-32@0.14.47: + resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /esbuild-windows-64@0.14.47: + resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /esbuild-windows-arm64@0.14.47: + resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /esbuild@0.14.47: + resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-64: 0.14.47 + esbuild-android-arm64: 0.14.47 + esbuild-darwin-64: 0.14.47 + esbuild-darwin-arm64: 0.14.47 + esbuild-freebsd-64: 0.14.47 + esbuild-freebsd-arm64: 0.14.47 + esbuild-linux-32: 0.14.47 + esbuild-linux-64: 0.14.47 + esbuild-linux-arm: 0.14.47 + esbuild-linux-arm64: 0.14.47 + esbuild-linux-mips64le: 0.14.47 + esbuild-linux-ppc64le: 0.14.47 + esbuild-linux-riscv64: 0.14.47 + esbuild-linux-s390x: 0.14.47 + esbuild-netbsd-64: 0.14.47 + esbuild-openbsd-64: 0.14.47 + esbuild-sunos-64: 0.14.47 + esbuild-windows-32: 0.14.47 + esbuild-windows-64: 0.14.47 + esbuild-windows-arm64: 0.14.47 + dev: false + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + dev: true + + /eslint-config-next@14.2.2(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-12/uFc0KX+wUs7EDpOUGKMXBXZJiBVGdK5/m/QgXOCg2mQ0bQWoKSWNrCeOg7Vum6Kw1d1TW453W6xh+GbHquw==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 14.2.2 + '@rushstack/eslint-patch': 1.10.2 + '@typescript-eslint/parser': 7.2.0(eslint@9.0.0)(typescript@5.4.5) + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@9.0.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) + eslint-plugin-jsx-a11y: 6.8.0(eslint@9.0.0) + eslint-plugin-react: 7.34.1(eslint@9.0.0) + eslint-plugin-react-hooks: 4.6.0(eslint@9.0.0) + typescript: 5.4.5 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@9.0.0): + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.16.0 + eslint: 9.0.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.3 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0): + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 7.2.0(eslint@9.0.0)(typescript@5.4.5) + debug: 3.2.7 + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@9.0.0) + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0): + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 7.2.0(eslint@9.0.0)(typescript@5.4.5) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.2.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@9.0.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-jsx-a11y@6.8.0(eslint@9.0.0): + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + '@babel/runtime': 7.24.4 + aria-query: 5.3.0 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.18 + eslint: 9.0.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + dev: true + + /eslint-plugin-react-hooks@4.6.0(eslint@9.0.0): + resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 9.0.0 + dev: true + + /eslint-plugin-react@7.34.1(eslint@9.0.0): + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.3 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.18 + eslint: 9.0.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + dev: true + + /eslint-scope@8.0.1: + resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dev: true + + /eslint@9.0.0: + resolution: {integrity: sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 3.0.2 + '@eslint/js': 9.0.0 + '@humanwhocodes/config-array': 0.12.3 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + escape-string-regexp: 4.0.0 + eslint-scope: 8.0.1 + eslint-visitor-keys: 4.0.0 + espree: 10.0.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@10.0.1: + resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 4.0.0 + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + dev: true + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: false + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + + /events-intercept@2.0.0: + resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} + dev: false + + /execa@3.2.0: + resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} + engines: {node: ^8.12.0 || >=9.7.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: true + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + dev: false + + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + dependencies: + flat-cache: 4.0.1 + dev: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + dev: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + dev: true + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: true + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: true + + /fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + dev: false + + /fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 + dev: false + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: false + + /fsevents@2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + deprecated: '"Please update to latest v2.3 or v2.2"' + requiresBuild: true + dev: false + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: true + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + dev: true + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + dev: true + + /gauge@3.0.2: + resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} + engines: {node: '>=10'} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + + /generic-pool@3.4.2: + resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} + engines: {node: '>= 4'} + dev: false + + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: true + + /get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + dev: false + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: true + + /get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + dev: true + + /get-tsconfig@4.7.3: + resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} + dependencies: + resolve-pkg-maps: 1.0.0 + dev: true + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.0.4 + path-scurry: 1.10.2 + dev: true + + /glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.0.4 + path-scurry: 1.10.2 + dev: true + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.4 + dev: true + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + dev: true + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: true + + /has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + dependencies: + es-define-property: 1.0.0 + dev: true + + /has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + dev: true + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + dev: true + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: true + + /http-errors@1.4.0: + resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} + engines: {node: '>= 0.6'} + dependencies: + inherits: 2.0.1 + statuses: 1.5.0 + dev: false + + /http-errors@1.7.3: + resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: false + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + dev: false + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + + /inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + dev: true + + /is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + optional: true + + /is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + dev: true + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + dev: true + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + dev: true + + /is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + dependencies: + is-typed-array: 1.1.13 + dev: true + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-fullwidth-code-point@4.0.0: + resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==} + engines: {node: '>=12'} + dev: true + + /is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + dependencies: + get-east-asian-width: 1.2.0 + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + dev: true + + /is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + dev: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + dev: true + + /is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + dev: true + + /is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.2 + dev: true + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + dev: true + + /is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.15 + dev: true + + /is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + dev: true + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.7 + dev: true + + /is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + dev: true + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + dev: false + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + dev: true + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + dev: true + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: true + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: true + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-schema-to-ts@1.6.4: + resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} + dependencies: + '@types/json-schema': 7.0.15 + ts-toolbelt: 6.15.5 + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + dev: false + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + dev: true + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: true + + /language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + dependencies: + language-subtag-registry: 0.3.22 + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: true + + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: true + + /lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + dev: true + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: true + + /lint-staged@15.2.2: + resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 11.1.0 + debug: 4.3.4 + execa: 8.0.1 + lilconfig: 3.0.0 + listr2: 8.0.1 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.4 + transitivePeerDependencies: + - supports-color + dev: true + + /listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} + engines: {node: '>=18.0.0'} + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.0.0 + rfdc: 1.3.1 + wrap-ansi: 9.0.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + dev: true + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /log-update@6.0.0: + resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==} + engines: {node: '>=18'} + dependencies: + ansi-escapes: 6.2.1 + cli-cursor: 4.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + dev: true + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: true + + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + dev: false + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /micro@9.3.5-canary.3: + resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} + engines: {node: '>= 8.0.0'} + hasBin: true + dependencies: + arg: 4.1.0 + content-type: 1.0.4 + raw-body: 2.4.1 + dev: false + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true + + /mini-svg-data-uri@1.4.4: + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} + hasBin: true + dev: true + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: false + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: false + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: true + + /minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + dev: false + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + dev: false + + /ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@3.0.0-canary.1: + resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==} + engines: {node: '>=12.13'} + dev: false + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: true + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /next@15.0.0-canary.193(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-X17zCn32Tl2lpnYoNFcGlTAkDGAyXGNpnsu6HJec/vrTA5ogi+TArSgorGQdXnKCAR+GnwSn/Um3S46VUvcCxw==} + engines: {node: '>=18.18.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-cd22717c-20241013 + react-dom: ^18.2.0 || 19.0.0-rc-cd22717c-20241013 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + dependencies: + '@next/env': 15.0.0-canary.193 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.13 + busboy: 1.6.0 + caniuse-lite: 1.0.30001611 + postcss: 8.4.31 + react: 19.0.0-rc-cd22717c-20241013 + react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013) + styled-jsx: 5.1.6(react@19.0.0-rc-cd22717c-20241013) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.0-canary.193 + '@next/swc-darwin-x64': 15.0.0-canary.193 + '@next/swc-linux-arm64-gnu': 15.0.0-canary.193 + '@next/swc-linux-arm64-musl': 15.0.0-canary.193 + '@next/swc-linux-x64-gnu': 15.0.0-canary.193 + '@next/swc-linux-x64-musl': 15.0.0-canary.193 + '@next/swc-win32-arm64-msvc': 15.0.0-canary.193 + '@next/swc-win32-x64-msvc': 15.0.0-canary.193 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + + /node-fetch@2.6.7: + resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch@2.6.9: + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-gyp-build@4.8.0: + resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} + hasBin: true + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: true + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: false + + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: true + + /npmlog@5.0.1: + resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} + dependencies: + are-we-there-yet: 2.0.0 + console-control-strings: 1.1.0 + gauge: 3.0.2 + set-blocking: 2.0.0 + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: true + + /object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + dev: true + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + dev: true + + /object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + dev: true + + /object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + dev: true + + /object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + dev: false + + /p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + dev: true + + /parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + dev: false + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + + /path-match@1.2.4: + resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} + dependencies: + http-errors: 1.4.0 + path-to-regexp: 1.8.0 + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: true + + /path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + dev: true + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + dependencies: + isarray: 0.0.1 + dev: false + + /path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} + dev: false + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + dev: true + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + dev: true + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + dev: true + + /postcss-import@15.1.0(postcss@8.4.38): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + + /postcss-js@4.0.1(postcss@8.4.38): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + dev: true + + /postcss-load-config@4.0.2(postcss@8.4.38): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.1 + postcss: 8.4.38 + yaml: 2.4.1 + dev: true + + /postcss-nested@6.0.1(postcss@8.4.38): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: true + + /postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + dev: false + + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + dev: true + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-plugin-tailwindcss@0.5.14(prettier@3.2.5): + resolution: {integrity: sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + dependencies: + prettier: 3.2.5 + dev: true + + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + dependencies: + parse-ms: 2.1.0 + dev: false + + /promisepipe@3.0.0: + resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} + dev: false + + /prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /raw-body@2.4.1: + resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.0 + http-errors: 1.7.3 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + + /react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-NzjTBOXygonUxLRQuUUW5V2QLGkAcyUwJoS8+UWxs089paMvQQfoRD51w65Ovgd2OEQ8Rm3HWx+82fvXiT0czQ==} + peerDependencies: + react: 19.0.0-rc-cd22717c-20241013 + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + scheduler: 0.25.0-rc-cd22717c-20241013 + dev: false + + /react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + dev: true + + /react@19.0.0-rc-cd22717c-20241013: + resolution: {integrity: sha512-k28GszmyQ1tX/JmeLGZINq5KXiNy/MmN0fCAtcwF8a9INDyVYG0zATCRGJwaPB9WixmkuwPv1BfB1QBfJC7cNg==} + engines: {node: '>=0.10.0'} + dev: false + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: true + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.3.0: + resolution: {integrity: sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: true + + /reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.3 + which-builtin-type: 1.1.3 + dev: true + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: true + + /regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + dev: true + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + dev: false + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + dev: true + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: false + + /resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: true + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: true + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + dev: true + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + dev: true + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + dev: false + + /scheduler@0.25.0-rc-cd22717c-20241013: + resolution: {integrity: sha512-MnsFR57bKcrYslnbCUsaUG0qBuAArk92VxE0zu6A2Usz38iIuL2uZLunqKlP1W47MF33GrRGDj1sXdPbFKIZfw==} + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: true + + /semver@7.6.3: + resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + dev: false + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + dev: true + + /set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + dev: true + + /setprototypeof@1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + dev: false + + /shallowequal@1.1.0: + resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} + dev: false + + /sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.3 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 + dev: false + optional: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + dev: true + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + optional: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /slice-ansi@5.0.0: + resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 4.0.0 + dev: true + + /slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + dev: true + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + /stat-mode@0.3.0: + resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} + dev: false + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + dev: false + + /stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + dependencies: + any-promise: 1.3.0 + dev: false + + /stream-to-promise@2.2.0: + resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + dependencies: + any-promise: 1.3.0 + end-of-stream: 1.1.0 + stream-to-array: 2.3.0 + dev: false + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + dev: false + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: true + + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: true + + /string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + dev: true + + /string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + dev: true + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: true + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /styled-components@6.1.8(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + dependencies: + '@emotion/is-prop-valid': 1.2.1 + '@emotion/unitless': 0.8.0 + '@types/stylis': 4.2.0 + css-to-react-native: 3.2.0 + csstype: 3.1.2 + postcss: 8.4.31 + react: 19.0.0-rc-cd22717c-20241013 + react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013) + shallowequal: 1.1.0 + stylis: 4.3.1 + tslib: 2.5.0 + dev: false + + /styled-jsx@5.1.6(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + client-only: 0.0.1 + react: 19.0.0-rc-cd22717c-20241013 + dev: false + + /stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} + dev: false + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.3.12 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: true + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: true + + /tailwindcss@3.4.3: + resolution: {integrity: sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + dev: true + + /tar@4.4.18: + resolution: {integrity: sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: false + + /tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: true + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: true + + /time-span@4.0.0: + resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} + engines: {node: '>=10'} + dependencies: + convert-hrtime: 3.0.0 + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /toidentifier@1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: false + + /ts-api-utils@1.3.0(typescript@5.4.5): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.4.5 + dev: true + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: true + + /ts-morph@12.0.0: + resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} + dependencies: + '@ts-morph/common': 0.11.1 + code-block-writer: 10.1.1 + dev: false + + /ts-node@10.9.1(@types/node@14.18.33)(typescript@4.9.5): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.18.33 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false + + /ts-toolbelt@6.15.5: + resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + dev: false + + /tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} + dev: false + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + dev: true + + /typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + dev: true + + /types-react-dom@19.0.0-rc.1: + resolution: {integrity: sha512-VSLZJl8VXCD0fAWp7DUTFUDCcZ8DVXOQmjhJMD03odgeFmu14ZQJHCXeETm3BEAhJqfgJaFkLnGkQv88sRx0fQ==} + dependencies: + '@types/react': 18.2.79 + dev: true + + /types-react@19.0.0-rc.1: + resolution: {integrity: sha512-RshndUfqTW6K3STLPis8BtAYCGOkMbtvYsi90gmVNDZBXUyUc5juf2PE9LfS/JmOlUIRO8cWTS/1MTnmhjDqyQ==} + dependencies: + csstype: 3.1.2 + dev: true + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + dev: false + + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + dev: true + + /uid-promise@1.0.0: + resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} + dev: false + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + dev: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: true + + /undici@5.26.5: + resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + dev: false + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /use-count-up@3.0.1(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-jlVsXJYje6jh+xwQaCEYrwHoB+nRyillNEmr21bhe9kw7tpRzyrSq9jQs9UOlo+8hCFkuOmjUihL3IjEK/piVg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + use-elapsed-time: 3.0.2(react@19.0.0-rc-cd22717c-20241013) + dev: false + + /use-elapsed-time@3.0.2(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-2EY9lJ5DWbAvT8wWiEp6Ztnl46DjXz2j78uhWbXaz/bg3OfpbgVucCAlcN8Bih6hTJfFTdVYX9L6ySMn5py/wQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /uuid@3.3.2: + resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: false + + /vercel@34.0.0: + resolution: {integrity: sha512-0Gewf/gB/UDnkGA/wyAzf3wxXuDqCvPFKFkAcByV3PuoCF5j71MqjV3GpFC0rQREF7CZZflFMhoaQO70a9x/fA==} + engines: {node: '>= 16'} + hasBin: true + dependencies: + '@vercel/build-utils': 7.11.0 + '@vercel/fun': 1.1.0 + '@vercel/go': 3.1.1 + '@vercel/hydrogen': 1.0.2 + '@vercel/next': 4.2.0 + '@vercel/node': 3.0.26 + '@vercel/python': 4.1.1 + '@vercel/redwood': 2.0.8 + '@vercel/remix-builder': 2.1.5 + '@vercel/ruby': 2.0.5 + '@vercel/static-build': 2.4.6 + chokidar: 3.3.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color + dev: false + + /web-vitals@0.2.4: + resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + dev: true + + /which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + dev: true + + /which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + dev: true + + /which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + dev: true + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: true + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: true + + /wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + string-width: 7.1.0 + strip-ansi: 7.1.0 + dev: true + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /xdg-app-paths@5.1.0: + resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} + engines: {node: '>=6'} + dependencies: + xdg-portable: 7.3.0 + dev: false + + /xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + dependencies: + os-paths: 4.4.0 + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + + /yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + engines: {node: '>= 14'} + hasBin: true + dev: true + + /yauzl-clone@1.0.4: + resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} + engines: {node: '>=6'} + dependencies: + events-intercept: 2.0.0 + dev: false + + /yauzl-promise@2.1.3: + resolution: {integrity: sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==} + engines: {node: '>=6'} + dependencies: + yauzl: 2.10.0 + yauzl-clone: 1.0.4 + dev: false + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + dev: false + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/apps/next-app-router-4001/postcss.config.js b/apps/next-app-router-4001/postcss.config.js new file mode 100644 index 00000000000..12a703d900d --- /dev/null +++ b/apps/next-app-router-4001/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/apps/next-app-router-4001/prettier.config.js b/apps/next-app-router-4001/prettier.config.js new file mode 100644 index 00000000000..e73771e3795 --- /dev/null +++ b/apps/next-app-router-4001/prettier.config.js @@ -0,0 +1,9 @@ +module.exports = { + arrowParens: 'always', + semi: true, + trailingComma: 'all', + singleQuote: true, + // pnpm doesn't support plugin autoloading + // https://github.com/tailwindlabs/prettier-plugin-tailwindcss#installation + plugins: ['prettier-plugin-tailwindcss'], +}; diff --git a/apps/next-app-router-4001/project.json b/apps/next-app-router-4001/project.json new file mode 100644 index 00000000000..cba17d562e1 --- /dev/null +++ b/apps/next-app-router-4001/project.json @@ -0,0 +1,84 @@ +{ + "name": "next-app-router-4001", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "apps/next-app-router-4001", + "projectType": "application", + "tags": [], + "targets": { + "build": { + "executor": "@nx/next:build", + "defaultConfiguration": "production", + "options": { + "outputPath": "apps/next-app-router-4001" + }, + "configurations": { + "development": { + "outputPath": "apps/next-app-router-4001" + }, + "production": {} + }, + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ] + }, + "serve": { + "executor": "nx:run-commands", + "options": { + "command": "pnpm dev", + "cwd": "apps/next-app-router-4001" + }, + "dependsOn": [ + { + "target": "build", + "dependencies": true + } + ] + }, + "export": { + "executor": "@nx/next:export", + "options": { + "buildTarget": "next-app-router-4001:build:production" + } + }, + "lint": { + "executor": "@nx/eslint:lint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["apps/next-app-router-4001/**/*.{ts,tsx,js,jsx}"] + } + }, + "e2e": { + "executor": "@nx/cypress:cypress", + "options": { + "cypressConfig": "apps/next-app-router-4001/cypress.config.ts", + "testingType": "e2e", + "baseUrl": "http://localhost:4001", + "key": "27e40c91-5ac3-4433-8a87-651d10f51cf6" + }, + "configurations": { + "production": { + "devServerTarget": "next-app-router-4001:serve:production" + } + } + }, + "test:e2e": { + "executor": "nx:run-commands", + "options": { + "parallel": true, + "commands": [ + { + "command": "lsof -i :4001 || nx run next-app-router-4001:serve", + "forwardAllArgs": false + }, + { + "command": "sleep 4 && nx run next-app-router-4001:e2e", + "forwardAllArgs": true + } + ] + } + } + } +} diff --git a/apps/next-app-router-4001/public/alexander-andrews-brAkTCdnhW8-unsplash.jpg b/apps/next-app-router-4001/public/alexander-andrews-brAkTCdnhW8-unsplash.jpg new file mode 100644 index 00000000000..9d5daa0f5bd Binary files /dev/null and b/apps/next-app-router-4001/public/alexander-andrews-brAkTCdnhW8-unsplash.jpg differ diff --git a/apps/next-app-router-4001/public/eniko-kis-KsLPTsYaqIQ-unsplash.jpg b/apps/next-app-router-4001/public/eniko-kis-KsLPTsYaqIQ-unsplash.jpg new file mode 100644 index 00000000000..40f4ffd5c7f Binary files /dev/null and b/apps/next-app-router-4001/public/eniko-kis-KsLPTsYaqIQ-unsplash.jpg differ diff --git a/apps/next-app-router-4001/public/grid.svg b/apps/next-app-router-4001/public/grid.svg new file mode 100644 index 00000000000..d467ad6de0d --- /dev/null +++ b/apps/next-app-router-4001/public/grid.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/apps/next-app-router-4001/public/guillaume-coupy-6HuoHgK7FN8-unsplash.jpg b/apps/next-app-router-4001/public/guillaume-coupy-6HuoHgK7FN8-unsplash.jpg new file mode 100644 index 00000000000..527bbb514fc Binary files /dev/null and b/apps/next-app-router-4001/public/guillaume-coupy-6HuoHgK7FN8-unsplash.jpg differ diff --git a/apps/next-app-router-4001/public/nextjs-icon-light-background.png b/apps/next-app-router-4001/public/nextjs-icon-light-background.png new file mode 100644 index 00000000000..659139c1819 Binary files /dev/null and b/apps/next-app-router-4001/public/nextjs-icon-light-background.png differ diff --git a/apps/next-app-router-4001/public/patrick-OIFgeLnjwrM-unsplash.jpg b/apps/next-app-router-4001/public/patrick-OIFgeLnjwrM-unsplash.jpg new file mode 100644 index 00000000000..e19a4a1bf82 Binary files /dev/null and b/apps/next-app-router-4001/public/patrick-OIFgeLnjwrM-unsplash.jpg differ diff --git a/apps/next-app-router-4001/public/prince-akachi-LWkFHEGpleE-unsplash.jpg b/apps/next-app-router-4001/public/prince-akachi-LWkFHEGpleE-unsplash.jpg new file mode 100644 index 00000000000..146a680434d Binary files /dev/null and b/apps/next-app-router-4001/public/prince-akachi-LWkFHEGpleE-unsplash.jpg differ diff --git a/apps/next-app-router-4001/public/yoann-siloine-_T4w3JDm6ug-unsplash.jpg b/apps/next-app-router-4001/public/yoann-siloine-_T4w3JDm6ug-unsplash.jpg new file mode 100644 index 00000000000..ca2d17463c5 Binary files /dev/null and b/apps/next-app-router-4001/public/yoann-siloine-_T4w3JDm6ug-unsplash.jpg differ diff --git a/apps/next-app-router-4001/readme.md b/apps/next-app-router-4001/readme.md new file mode 100644 index 00000000000..c6db1f9845e --- /dev/null +++ b/apps/next-app-router-4001/readme.md @@ -0,0 +1,28 @@ +# Next.js App Router Playground + +Next.js recently introduced the App Router with support for: + +- **Layouts:** Easily share UI while preserving state and avoiding re-renders. +- **Server Components:** Making server-first the default for the most dynamic applications. +- **Streaming:** Display instant loading states and stream in updates. +- **Suspense for Data Fetching:** `async`/`await` support and the `use` hook for component-level fetching. + +The App Router can coexist with the existing `pages` directory for incremental adoption. While you **don't need to use the App Router** when upgrading to Next.js 13, we're laying the foundations to build complex interfaces while shipping less JavaScript. + +## Running Locally + +1. Install dependencies: + +```sh +pnpm install +``` + +2. Start the dev server: + +```sh +pnpm dev +``` + +## Documentation + +https://nextjs.org/docs diff --git a/apps/next-app-router-4001/styles/globals.css b/apps/next-app-router-4001/styles/globals.css new file mode 100755 index 00000000000..b5c61c95671 --- /dev/null +++ b/apps/next-app-router-4001/styles/globals.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/apps/next-app-router-4001/tailwind.config.ts b/apps/next-app-router-4001/tailwind.config.ts new file mode 100644 index 00000000000..1dc84971594 --- /dev/null +++ b/apps/next-app-router-4001/tailwind.config.ts @@ -0,0 +1,90 @@ +import colors from 'tailwindcss/colors'; +import { Config } from 'tailwindcss'; + +export default { + content: [ + './app/**/*.{js,ts,jsx,tsx,mdx}', + './pages/**/*.{js,ts,jsx,tsx,mdx}', + './ui/**/*.{js,ts,jsx,tsx,mdx}', + ], + future: { + hoverOnlyWhenSupported: true, + }, + darkMode: 'class', + theme: { + extend: { + // https://vercel.com/design/color + colors: { + gray: colors.zinc, + 'gray-1000': 'rgb(17,17,19)', + 'gray-1100': 'rgb(10,10,11)', + vercel: { + pink: '#FF0080', + blue: '#0070F3', + cyan: '#50E3C2', + orange: '#F5A623', + violet: '#7928CA', + }, + }, + backgroundImage: ({ theme }) => ({ + 'vc-border-gradient': `radial-gradient(at left top, ${theme( + 'colors.gray.500', + )}, 50px, ${theme('colors.gray.800')} 50%)`, + }), + keyframes: ({ theme }) => ({ + rerender: { + '0%': { + ['border-color']: theme('colors.vercel.pink'), + }, + '40%': { + ['border-color']: theme('colors.vercel.pink'), + }, + }, + highlight: { + '0%': { + background: theme('colors.vercel.pink'), + color: theme('colors.white'), + }, + '40%': { + background: theme('colors.vercel.pink'), + color: theme('colors.white'), + }, + }, + loading: { + '0%': { + opacity: '.2', + }, + '20%': { + opacity: '1', + transform: 'translateX(1px)', + }, + to: { + opacity: '.2', + }, + }, + shimmer: { + '100%': { + transform: 'translateX(100%)', + }, + }, + translateXReset: { + '100%': { + transform: 'translateX(0)', + }, + }, + fadeToTransparent: { + '0%': { + opacity: '1', + }, + '40%': { + opacity: '1', + }, + '100%': { + opacity: '0', + }, + }, + }), + }, + }, + plugins: [require('@tailwindcss/typography'), require('@tailwindcss/forms')], +} satisfies Config; diff --git a/apps/next-app-router-4001/tsconfig.json b/apps/next-app-router-4001/tsconfig.json new file mode 100755 index 00000000000..399d25eda35 --- /dev/null +++ b/apps/next-app-router-4001/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "es5", + "lib": ["dom", "dom.iterable", "esnext"], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "forceConsistentCasingInFileNames": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "baseUrl": ".", + "paths": { + "#/*": ["./*"] + }, + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/apps/next-app-router-4001/ui/address-bar.tsx b/apps/next-app-router-4001/ui/address-bar.tsx new file mode 100644 index 00000000000..03ce8f4d941 --- /dev/null +++ b/apps/next-app-router-4001/ui/address-bar.tsx @@ -0,0 +1,92 @@ +'use client'; + +import React, { Suspense } from 'react'; +import { usePathname, useSearchParams } from 'next/navigation'; + +function Params() { + const searchParams = useSearchParams()!; + + return searchParams.toString().length !== 0 ? ( +
+ ? + {Array.from(searchParams.entries()).map(([key, value], index) => { + return ( + + {index !== 0 ? & : null} + + + {key} + + = + + {value} + + + + ); + })} +
+ ) : null; +} + +export function AddressBar() { + const pathname = usePathname(); + + return ( +
+
+ + + +
+
+
+ acme.com +
+ {pathname ? ( + <> + / + {pathname + .split('/') + .slice(2) + .map((segment) => { + return ( + + + + {segment} + + + + / + + ); + })} + + ) : null} + + + + +
+
+ ); +} diff --git a/apps/next-app-router-4001/ui/boundary.tsx b/apps/next-app-router-4001/ui/boundary.tsx new file mode 100644 index 00000000000..fbc18226ac3 --- /dev/null +++ b/apps/next-app-router-4001/ui/boundary.tsx @@ -0,0 +1,82 @@ +import clsx from 'clsx'; +import React from 'react'; + +const Label = ({ + children, + animateRerendering, + color, +}: { + children: React.ReactNode; + animateRerendering?: boolean; + color?: 'default' | 'pink' | 'blue' | 'violet' | 'cyan' | 'orange'; +}) => { + return ( +
+ {children} +
+ ); +}; +export const Boundary = ({ + children, + labels = ['children'], + size = 'default', + color = 'default', + animateRerendering = true, +}: { + children: React.ReactNode; + labels?: string[]; + size?: 'small' | 'default'; + color?: 'default' | 'pink' | 'blue' | 'violet' | 'cyan' | 'orange'; + animateRerendering?: boolean; +}) => { + return ( +
+
+ {labels.map((label) => { + return ( + + ); + })} +
+ + {children} +
+ ); +}; diff --git a/apps/next-app-router-4001/ui/buggy-button.tsx b/apps/next-app-router-4001/ui/buggy-button.tsx new file mode 100644 index 00000000000..b2190b2a2f9 --- /dev/null +++ b/apps/next-app-router-4001/ui/buggy-button.tsx @@ -0,0 +1,23 @@ +'use client'; + +import Button from '#/ui/button'; +import React from 'react'; + +export default function BuggyButton() { + const [clicked, setClicked] = React.useState(false); + + if (clicked) { + throw new Error('Oh no! Something went wrong.'); + } + + return ( + + ); +} diff --git a/apps/next-app-router-4001/ui/button.tsx b/apps/next-app-router-4001/ui/button.tsx new file mode 100644 index 00000000000..8aafa7e7a92 --- /dev/null +++ b/apps/next-app-router-4001/ui/button.tsx @@ -0,0 +1,20 @@ +import clsx from 'clsx'; + +export default function Button({ + kind = 'default', + ...props +}: React.ButtonHTMLAttributes & { + kind?: 'default' | 'error'; +}) { + return ( + + ); +} diff --git a/apps/next-app-router-4001/ui/component-tree.tsx b/apps/next-app-router-4001/ui/component-tree.tsx new file mode 100644 index 00000000000..3f3e43ee353 --- /dev/null +++ b/apps/next-app-router-4001/ui/component-tree.tsx @@ -0,0 +1,162 @@ +import { Boundary } from '#/ui/boundary'; +import CountUp from '#/ui/count-up'; +import clsx from 'clsx'; + +type Item = { + name: string; + type: 'server' | 'client'; + size: number; + children?: Item[]; +}; + +const List = ({ items, depth }: { items: Item[]; depth: number }) => { + return ( +
+ {items.map((item, i) => { + const isLast = i === items.length - 1; + + return ( +
+
+
+ {'<'} + {item.name} + {'>'} +
+ +
+ + {item.type === 'client' ? ( + item.size / 1000 + ) : ( + + )} + {' '} + KB +
+
+ + {item.children ? ( + + ) : null} +
+ ); + })} +
+ ); +}; + +// Calculate the total bundle size of a specific component type (client or +// server) in a tree +const sum = (items: Item[], componentType: Item['type']): number => + items.reduce( + (total, item) => + // running total + total + + // add the current component size if it's type is componentType + ((item.type === componentType ? item.size : 0) || 0) + + // add the total size of children components recursively + (item?.children ? sum(item.children, componentType) : 0), + 0, + ); + +export const ComponentTree = ({ items }: { items: Item[] }) => { + const clientTotal = sum(items, 'client'); + const serverTotal = sum(items, 'server'); + const clientDeltaAsPercent = Math.round( + (clientTotal / (clientTotal + serverTotal)) * 100, + ); + + return ( + +
+
+
+ +
+ +
+
+
+
+ {' '} + KB +
+
Bundle Size
+
+ +
+
+
+
+ +
+
+
+ {''} +
+
Client Component
+
+ +
+
+ {''} +
+
Server Component
+
+
+
+
+
+ Note: The component bundle sizes are not yet accurate. +
+
+ + ); +}; diff --git a/apps/next-app-router-4001/ui/count-up.tsx b/apps/next-app-router-4001/ui/count-up.tsx new file mode 100644 index 00000000000..7a2cf99bb09 --- /dev/null +++ b/apps/next-app-router-4001/ui/count-up.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { useCountUp } from 'use-count-up'; + +const CountUp = ({ + start, + end, + duration = 1, +}: { + start: number; + end: number; + duration?: number; +}) => { + const { value } = useCountUp({ + isCounting: true, + end, + start, + duration, + decimalPlaces: 1, + }); + + return {value}; +}; + +export default CountUp; diff --git a/apps/next-app-router-4001/ui/external-link.tsx b/apps/next-app-router-4001/ui/external-link.tsx new file mode 100644 index 00000000000..662994170e0 --- /dev/null +++ b/apps/next-app-router-4001/ui/external-link.tsx @@ -0,0 +1,20 @@ +import { ArrowRightIcon } from '@heroicons/react/24/outline'; + +export const ExternalLink = ({ + children, + href, +}: { + children: React.ReactNode; + href: string; +}) => { + return ( + +
{children}
+ + +
+ ); +}; diff --git a/apps/next-app-router-4001/ui/footer.tsx b/apps/next-app-router-4001/ui/footer.tsx new file mode 100644 index 00000000000..3ac838b2f36 --- /dev/null +++ b/apps/next-app-router-4001/ui/footer.tsx @@ -0,0 +1,41 @@ +'use client'; + +export default function Footer({ + reactVersion, + nextVersion, +}: { + reactVersion: string; + nextVersion: string; +}) { + return ( +
+ + + + Powered by + + + + + +
+
React: {reactVersion}
+
Next: {nextVersion}
+
+
+ ); +} diff --git a/apps/next-app-router-4001/ui/global-nav.tsx b/apps/next-app-router-4001/ui/global-nav.tsx new file mode 100644 index 00000000000..5be9ca6ea55 --- /dev/null +++ b/apps/next-app-router-4001/ui/global-nav.tsx @@ -0,0 +1,100 @@ +'use client'; + +import { demos, type Item } from '#/lib/demos'; +import { NextLogoDark } from '#/ui/next-logo'; +import Link from 'next/link'; +import { useSelectedLayoutSegment } from 'next/navigation'; +import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/solid'; +import clsx from 'clsx'; +import { useState } from 'react'; + +export function GlobalNav() { + const [isOpen, setIsOpen] = useState(false); + const close = () => setIsOpen(false); + + return ( +
+
+ +
+ +
+ +

+ App Router +

+ +
+ + +
+ +
+
+ ); +} + +function GlobalNavItem({ + item, + close, +}: { + item: Item; + close: () => false | void; +}) { + const segment = useSelectedLayoutSegment(); + const isActive = item.slug === segment; + + return ( + + {item.name} + + ); +} diff --git a/apps/next-app-router-4001/ui/header.tsx b/apps/next-app-router-4001/ui/header.tsx new file mode 100644 index 00000000000..8a7c055505a --- /dev/null +++ b/apps/next-app-router-4001/ui/header.tsx @@ -0,0 +1,43 @@ +'use client'; + +import styled from 'styled-components'; + +const HeadContainer = styled.header` + position: relative; + height: 64px; + align-items: center; + padding: 0px 8px; + margin-bottom: 48px; + display: flex; + border: 0 solid #e5e7eb; + color: rgb(244 244 245); + grid-column-start: 2; + grid-column-end: 4; +`; + +const Title = styled.span` + margin: 0 8px; +`; + +const NextJsLogo = (props: any) => ( + + + +); + +export default function Header() { + return ( + + + The React Framework + + ); +} diff --git a/apps/next-app-router-4001/ui/mobile-nav-toggle.tsx b/apps/next-app-router-4001/ui/mobile-nav-toggle.tsx new file mode 100644 index 00000000000..35d77f602a4 --- /dev/null +++ b/apps/next-app-router-4001/ui/mobile-nav-toggle.tsx @@ -0,0 +1,64 @@ +'use client'; + +import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/solid'; +import clsx from 'clsx'; +import React from 'react'; + +const MobileNavContext = React.createContext< + [boolean, React.Dispatch>] | undefined +>(undefined); + +export function MobileNavContextProvider({ + children, +}: { + children: React.ReactNode; +}) { + const [isOpen, setIsOpen] = React.useState(false); + return ( + + {children} + + ); +} + +export function useMobileNavToggle() { + const context = React.useContext(MobileNavContext); + if (context === undefined) { + throw new Error( + 'useMobileNavToggle must be used within a MobileNavContextProvider', + ); + } + return context; +} + +export function MobileNavToggle({ children }: { children: React.ReactNode }) { + const [isOpen, setIsOpen] = useMobileNavToggle(); + + return ( + <> + + +
+ {children} +
+ + ); +} diff --git a/apps/next-app-router-4001/ui/next-logo.tsx b/apps/next-app-router-4001/ui/next-logo.tsx new file mode 100644 index 00000000000..69bec7145ce --- /dev/null +++ b/apps/next-app-router-4001/ui/next-logo.tsx @@ -0,0 +1,117 @@ +export function NextLogoLight() { + return ( + + + + + + + + + + + + + + + + + + + + + ); +} + +export function NextLogoDark() { + return ( + + + + + + + + + + + + + + + + + + + + + ); +} diff --git a/apps/next-app-router-4001/ui/ping.tsx b/apps/next-app-router-4001/ui/ping.tsx new file mode 100644 index 00000000000..40768a77ec7 --- /dev/null +++ b/apps/next-app-router-4001/ui/ping.tsx @@ -0,0 +1,8 @@ +export function Ping() { + return ( + + + + + ); +} diff --git a/apps/next-app-router-4001/ui/product-best-seller.tsx b/apps/next-app-router-4001/ui/product-best-seller.tsx new file mode 100644 index 00000000000..d6e10134705 --- /dev/null +++ b/apps/next-app-router-4001/ui/product-best-seller.tsx @@ -0,0 +1,7 @@ +export const ProductBestSeller = () => { + return ( +
+ Best Seller +
+ ); +}; diff --git a/apps/next-app-router-4001/ui/product-card.tsx b/apps/next-app-router-4001/ui/product-card.tsx new file mode 100644 index 00000000000..d10188de451 --- /dev/null +++ b/apps/next-app-router-4001/ui/product-card.tsx @@ -0,0 +1,63 @@ +import { Product } from '#/app/api/products/product'; +import { ProductBestSeller } from '#/ui/product-best-seller'; +import { ProductEstimatedArrival } from '#/ui/product-estimated-arrival'; +import { ProductLowStockWarning } from '#/ui/product-low-stock-warning'; +import { ProductPrice } from '#/ui/product-price'; +import { ProductRating } from '#/ui/product-rating'; +import { ProductUsedPrice } from '#/ui/product-used-price'; +import { dinero, type DineroSnapshot } from 'dinero.js'; +import Image from 'next/image'; +import Link from 'next/link'; + +export const ProductCard = ({ + product, + href, +}: { + product: Product; + href: string; +}) => { + const price = dinero(product.price as DineroSnapshot); + + return ( + +
+
+ {product.isBestSeller ? ( +
+ +
+ ) : null} + {product.name} +
+ +
+ {product.name} +
+ + {product.rating ? : null} + + + + {/* */} + + {product.usedPrice ? ( + + ) : null} + + + + {product.stock <= 1 ? ( + + ) : null} +
+ + ); +}; diff --git a/apps/next-app-router-4001/ui/product-currency-symbol.tsx b/apps/next-app-router-4001/ui/product-currency-symbol.tsx new file mode 100644 index 00000000000..b9d60ace40d --- /dev/null +++ b/apps/next-app-router-4001/ui/product-currency-symbol.tsx @@ -0,0 +1,27 @@ +import { toFormat, type Dinero } from 'dinero.js'; + +export const ProductCurrencySymbol = ({ + dinero, +}: { + dinero: Dinero; +}) => { + let symbol = ''; + switch (toFormat(dinero, ({ currency }) => currency.code)) { + case 'GBP': { + symbol = '£'; + break; + } + + case 'EUR': { + symbol = '€'; + break; + } + + default: { + symbol = '$'; + break; + } + } + + return <>{symbol}; +}; diff --git a/apps/next-app-router-4001/ui/product-deal.tsx b/apps/next-app-router-4001/ui/product-deal.tsx new file mode 100644 index 00000000000..981dfb1f39f --- /dev/null +++ b/apps/next-app-router-4001/ui/product-deal.tsx @@ -0,0 +1,36 @@ +import { ProductCurrencySymbol } from '#/ui/product-currency-symbol'; +import { toUnit, type Dinero } from 'dinero.js'; + +export const ProductDeal = ({ + price: priceRaw, + discount: discountRaw, +}: { + price: Dinero; + discount: { + amount: Dinero; + }; +}) => { + const discount = toUnit(discountRaw.amount); + const price = toUnit(priceRaw); + const percent = Math.round(100 - (discount / price) * 100); + + return ( +
+
+ -{percent}% +
+
+
+ +
+
+ {discount} +
+
+
+ + {price} +
+
+ ); +}; diff --git a/apps/next-app-router-4001/ui/product-estimated-arrival.tsx b/apps/next-app-router-4001/ui/product-estimated-arrival.tsx new file mode 100644 index 00000000000..1b236d4dd41 --- /dev/null +++ b/apps/next-app-router-4001/ui/product-estimated-arrival.tsx @@ -0,0 +1,24 @@ +import { add, format, isTomorrow } from 'date-fns'; + +export const ProductEstimatedArrival = ({ + leadTime, + hasDeliveryTime = false, +}: { + leadTime: number; + hasDeliveryTime?: boolean; +}) => { + const date = add(new Date(), { + days: leadTime, + }); + + return ( +
+ Get it{' '} + + {isTomorrow(date) ? 'tomorrow, ' : null} + {format(date, 'MMM d')} + + {hasDeliveryTime ? <> by 5pm : null} +
+ ); +}; diff --git a/apps/next-app-router-4001/ui/product-lightening-deal.tsx b/apps/next-app-router-4001/ui/product-lightening-deal.tsx new file mode 100644 index 00000000000..d316d020757 --- /dev/null +++ b/apps/next-app-router-4001/ui/product-lightening-deal.tsx @@ -0,0 +1,28 @@ +import { ProductDeal } from '#/ui/product-deal'; +import { add, formatDistanceToNow } from 'date-fns'; +import { type Dinero } from 'dinero.js'; + +export const ProductLighteningDeal = ({ + price, + discount, +}: { + price: Dinero; + discount: { + amount: Dinero; + expires?: number; + }; +}) => { + const date = add(new Date(), { days: discount.expires }); + + return ( + <> +
+
+ Expires in {formatDistanceToNow(date)} +
+
+ + + + ); +}; diff --git a/apps/next-app-router-4001/ui/product-low-stock-warning.tsx b/apps/next-app-router-4001/ui/product-low-stock-warning.tsx new file mode 100644 index 00000000000..26ac0d5e626 --- /dev/null +++ b/apps/next-app-router-4001/ui/product-low-stock-warning.tsx @@ -0,0 +1,13 @@ +export const ProductLowStockWarning = ({ stock }: { stock: number }) => { + if (stock > 3) { + return null; + } + + if (stock === 0) { + return
Out of stock
; + } + + return ( +
Only {stock} left in stock
+ ); +}; diff --git a/apps/next-app-router-4001/ui/product-price.tsx b/apps/next-app-router-4001/ui/product-price.tsx new file mode 100644 index 00000000000..597086e5f74 --- /dev/null +++ b/apps/next-app-router-4001/ui/product-price.tsx @@ -0,0 +1,52 @@ +import { Product } from '#/app/api/products/product'; +import { ProductCurrencySymbol } from '#/ui/product-currency-symbol'; +import { ProductDeal } from '#/ui/product-deal'; +import { ProductLighteningDeal } from '#/ui/product-lightening-deal'; +import { multiply, toUnit, type Dinero } from 'dinero.js'; + +function isDiscount(obj: any): obj is { percent: number; expires?: number } { + return typeof obj?.percent === 'number'; +} + +function formatDiscount( + price: Dinero, + discountRaw: Product['discount'], +) { + return isDiscount(discountRaw) + ? { + amount: multiply(price, { + amount: discountRaw.percent, + scale: 2, + }), + expires: discountRaw.expires, + } + : undefined; +} + +export const ProductPrice = ({ + price, + discount: discountRaw, +}: { + price: Dinero; + discount: Product['discount']; +}) => { + const discount = formatDiscount(price, discountRaw); + + if (discount) { + if (discount?.expires && typeof discount.expires === 'number') { + return ; + } + return ; + } + + return ( +
+
+ +
+
+ {toUnit(price)} +
+
+ ); +}; diff --git a/apps/next-app-router-4001/ui/product-rating.tsx b/apps/next-app-router-4001/ui/product-rating.tsx new file mode 100644 index 00000000000..cc37450378c --- /dev/null +++ b/apps/next-app-router-4001/ui/product-rating.tsx @@ -0,0 +1,17 @@ +import { StarIcon } from '@heroicons/react/24/solid'; +import clsx from 'clsx'; + +export const ProductRating = ({ rating }: { rating: number }) => { + return ( +
+ {Array.from({ length: 5 }).map((_, i) => { + return ( + + ); + })} +
+ ); +}; diff --git a/apps/next-app-router-4001/ui/product-review-card.tsx b/apps/next-app-router-4001/ui/product-review-card.tsx new file mode 100644 index 00000000000..0dae85c2dbb --- /dev/null +++ b/apps/next-app-router-4001/ui/product-review-card.tsx @@ -0,0 +1,19 @@ +import type { Review } from '#/app/api/reviews/review'; +import { ProductRating } from '#/ui/product-rating'; + +export const ProductReviewCard = ({ review }: { review: Review }) => { + return ( +
+
+
+
+
{review.name}
+
+ + {review.rating ? : null} +
+ +
{review.text}
+
+ ); +}; diff --git a/apps/next-app-router-4001/ui/product-split-payments.tsx b/apps/next-app-router-4001/ui/product-split-payments.tsx new file mode 100644 index 00000000000..b1248cc5a8b --- /dev/null +++ b/apps/next-app-router-4001/ui/product-split-payments.tsx @@ -0,0 +1,17 @@ +import { ProductCurrencySymbol } from '#/ui/product-currency-symbol'; +import { allocate, toUnit, up, type Dinero } from 'dinero.js'; + +export const ProductSplitPayments = ({ price }: { price: Dinero }) => { + // only offer split payments for more expensive items + if (toUnit(price) < 150) { + return null; + } + + const [perMonth] = allocate(price, [1, 2]); + return ( +
+ Or + {toUnit(perMonth, { digits: 0, round: up })}/month for 3 months +
+ ); +}; diff --git a/apps/next-app-router-4001/ui/product-used-price.tsx b/apps/next-app-router-4001/ui/product-used-price.tsx new file mode 100644 index 00000000000..db57ed0e65f --- /dev/null +++ b/apps/next-app-router-4001/ui/product-used-price.tsx @@ -0,0 +1,19 @@ +import { Product } from '#/app/api/products/product'; +import { dinero, toUnit, up, type DineroSnapshot } from 'dinero.js'; + +export const ProductUsedPrice = ({ + usedPrice: usedPriceRaw, +}: { + usedPrice: Product['usedPrice']; +}) => { + const usedPrice = dinero(usedPriceRaw as DineroSnapshot); + + return ( +
+
More buying choices
+
+ ${toUnit(usedPrice, { digits: 0, round: up })} (used) +
+
+ ); +}; diff --git a/apps/next-app-router-4001/ui/rendered-time-ago.tsx b/apps/next-app-router-4001/ui/rendered-time-ago.tsx new file mode 100644 index 00000000000..d7c78d1c6b8 --- /dev/null +++ b/apps/next-app-router-4001/ui/rendered-time-ago.tsx @@ -0,0 +1,56 @@ +'use client'; + +import ms from 'ms'; +import { useEffect, useRef, useState } from 'react'; + +// https://github.com/streamich/react-use/blob/master/src/useInterval.ts +const useInterval = (callback: Function, delay?: number | null) => { + const savedCallback = useRef(() => {}); + + useEffect(() => { + savedCallback.current = callback; + }); + + useEffect(() => { + if (delay !== null) { + const interval = setInterval(() => savedCallback.current(), delay || 0); + return () => clearInterval(interval); + } + + return undefined; + }, [delay]); +}; + +export function RenderedTimeAgo({ timestamp }: { timestamp: number }) { + const [msAgo, setMsAgo] = useState(0); + + // update on page change + useEffect(() => { + setMsAgo(Date.now() - timestamp); + }, [timestamp]); + + // update every second + useInterval(() => { + setMsAgo(Date.now() - timestamp); + }, 1000); + + return ( +
+ {msAgo ? ( + <> + + {msAgo >= 1000 ? ms(msAgo) : '0s'} + {' '} + ago + + ) : null} +
+ ); +} diff --git a/apps/next-app-router-4001/ui/rendering-info.tsx b/apps/next-app-router-4001/ui/rendering-info.tsx new file mode 100644 index 00000000000..3048985b506 --- /dev/null +++ b/apps/next-app-router-4001/ui/rendering-info.tsx @@ -0,0 +1,34 @@ +import { RenderedTimeAgo } from '#/ui/rendered-time-ago'; + +export function RenderingInfo({ + type, +}: { + type: 'ssg' | 'ssgod' | 'ssr' | 'isr'; +}) { + let msg = ''; + switch (type) { + case 'ssg': + msg = 'Statically pre-rendered at build time'; + break; + case 'ssgod': + msg = 'Statically rendered on demand'; + break; + case 'isr': + msg = + 'Statically pre-rendered at build time and periodically revalidated'; + break; + case 'ssr': + msg = 'Dynamically rendered at request time'; + break; + } + + return ( +
+
{msg}
+ +
+ +
+
+ ); +} diff --git a/apps/next-app-router-4001/ui/rendering-page-skeleton.tsx b/apps/next-app-router-4001/ui/rendering-page-skeleton.tsx new file mode 100644 index 00000000000..ae8225a0cc9 --- /dev/null +++ b/apps/next-app-router-4001/ui/rendering-page-skeleton.tsx @@ -0,0 +1,18 @@ +const shimmer = `relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_1.5s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent`; + +export function RenderingPageSkeleton() { + return ( +
+
+
+
+
+
+
+
+
+
+
+
+ ); +} diff --git a/apps/next-app-router-4001/ui/section-link.tsx b/apps/next-app-router-4001/ui/section-link.tsx new file mode 100644 index 00000000000..48f4b2edda4 --- /dev/null +++ b/apps/next-app-router-4001/ui/section-link.tsx @@ -0,0 +1,18 @@ +import Link from 'next/link'; + +export const SectionLink = ({ + children, + href, + text, +}: { + children: React.ReactNode; + href: string; + text: string; +}) => ( + +
+ {children} +
+
{text}
+ +); diff --git a/apps/next-app-router-4001/ui/skeleton-card.tsx b/apps/next-app-router-4001/ui/skeleton-card.tsx new file mode 100644 index 00000000000..09e205e6f72 --- /dev/null +++ b/apps/next-app-router-4001/ui/skeleton-card.tsx @@ -0,0 +1,16 @@ +import clsx from 'clsx'; + +export const SkeletonCard = ({ isLoading }: { isLoading?: boolean }) => ( +
+
+
+
+
+
+
+); diff --git a/apps/next-app-router-4001/ui/tab-group.tsx b/apps/next-app-router-4001/ui/tab-group.tsx new file mode 100644 index 00000000000..fb20c54f07b --- /dev/null +++ b/apps/next-app-router-4001/ui/tab-group.tsx @@ -0,0 +1,31 @@ +import { Tab } from '#/ui/tab'; + +export type Item = { + text: string; + slug?: string; + segment?: string; + parallelRoutesKey?: string; +}; + +export const TabGroup = ({ + path, + parallelRoutesKey, + items, +}: { + path: string; + parallelRoutesKey?: string; + items: Item[]; +}) => { + return ( +
+ {items.map((item) => ( + + ))} +
+ ); +}; diff --git a/apps/next-app-router-4001/ui/tab-nav-item.tsx b/apps/next-app-router-4001/ui/tab-nav-item.tsx new file mode 100644 index 00000000000..ad0b10e09e7 --- /dev/null +++ b/apps/next-app-router-4001/ui/tab-nav-item.tsx @@ -0,0 +1,25 @@ +import clsx from 'clsx'; +import Link from 'next/link'; + +export const TabNavItem = ({ + children, + href, + isActive, +}: { + children: React.ReactNode; + href: string; + isActive?: boolean; +}) => { + return ( + + {children} + + ); +}; diff --git a/apps/next-app-router-4001/ui/tab.tsx b/apps/next-app-router-4001/ui/tab.tsx new file mode 100644 index 00000000000..9fa051cb726 --- /dev/null +++ b/apps/next-app-router-4001/ui/tab.tsx @@ -0,0 +1,39 @@ +'use client'; + +import type { Item } from '#/ui/tab-group'; +import clsx from 'clsx'; +import Link from 'next/link'; +import { useSelectedLayoutSegment } from 'next/navigation'; + +export const Tab = ({ + path, + parallelRoutesKey, + item, +}: { + path: string; + parallelRoutesKey?: string; + item: Item; +}) => { + const segment = useSelectedLayoutSegment(parallelRoutesKey); + + const href = item.slug ? path + '/' + item.slug : path; + const isActive = + // Example home pages e.g. `/layouts` + (!item.slug && segment === null) || + segment === item.segment || + // Nested pages e.g. `/layouts/electronics` + segment === item.slug; + + return ( + + {item.text} + + ); +}; diff --git a/apps/next-app-router-4001/ui/vercel-logo.tsx b/apps/next-app-router-4001/ui/vercel-logo.tsx new file mode 100644 index 00000000000..6550d288430 --- /dev/null +++ b/apps/next-app-router-4001/ui/vercel-logo.tsx @@ -0,0 +1,11 @@ +export function VercelLogo() { + return ( + + + + ); +} diff --git a/package.json b/package.json index 9579b6f7f2b..7707706dd0f 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "commit": "cz", "docs": "typedoc", "f": "nx format:write", + "enhanced:jest": "pnpm build && cd packages/enhanced && NODE_OPTIONS=--experimental-vm-modules npx jest test/ConfigTestCases.basictest.js", "lint": "nx run-many --target=lint", "test": "nx run-many --target=test", "build": "nx run-many --target=build --parallel=5 --projects=tag:type:pkg", @@ -229,6 +230,7 @@ "vue-tsc": "^2.0.26", "wait-on": "^7.2.0", "webpack": "5.93.0", + "webpack-cli": "^5.1.4", "webpack-virtual-modules": "0.6.2", "whatwg-fetch": "^3.6.20", "yargs": "^17.7.2" diff --git a/packages/enhanced/src/declarations/plugins/sharing/ConsumeSharedModule.d.ts b/packages/enhanced/src/declarations/plugins/sharing/ConsumeSharedModule.d.ts new file mode 100644 index 00000000000..096f0df9f14 --- /dev/null +++ b/packages/enhanced/src/declarations/plugins/sharing/ConsumeSharedModule.d.ts @@ -0,0 +1,53 @@ +export type ConsumeOptions = { + /** + * fallback request + */ + import?: string | undefined; + /** + * resolved fallback request + */ + importResolved?: string | undefined; + /** + * The actual request to use for importing the module. If not specified, the property name/key will be used. + */ + request?: string; + /** + * global share key + */ + shareKey: string; + /** + * share scope + */ + shareScope: string; + /** + * version requirement + */ + requiredVersion: + | import('webpack/lib/util/semver').SemVerRange + | false + | undefined; + /** + * package name to determine required version automatically + */ + packageName: string; + /** + * don't use shared version even if version isn't valid + */ + strictVersion: boolean; + /** + * use single global version + */ + singleton: boolean; + /** + * include the fallback module in a sync way + */ + eager: boolean; + /** + * Share a specific layer of the module, if the module supports layers + */ + layer?: string | null; + /** + * Issuer layer in which the module should be resolved + */ + issuerLayer?: string | null; +}; diff --git a/packages/enhanced/src/declarations/plugins/sharing/ConsumeSharedPlugin.d.ts b/packages/enhanced/src/declarations/plugins/sharing/ConsumeSharedPlugin.d.ts index 96e816c31c1..f56a1d94e07 100644 --- a/packages/enhanced/src/declarations/plugins/sharing/ConsumeSharedPlugin.d.ts +++ b/packages/enhanced/src/declarations/plugins/sharing/ConsumeSharedPlugin.d.ts @@ -71,4 +71,16 @@ export interface ConsumesConfig { * Do not accept shared module if version is not valid (defaults to yes, if local fallback module is available and shared module is not a singleton, otherwise no, has no effect if there is no required version specified). */ strictVersion?: boolean; + /** + * Issuer layer in which the module should be resolved. + */ + issuerLayer?: string; + /** + * Layer for the shared module. + */ + layer?: string; + /** + * The actual request to use for importing the module. If not specified, the property name/key will be used. + */ + request?: string; } diff --git a/packages/enhanced/src/declarations/plugins/sharing/ProvideSharedPlugin.d.ts b/packages/enhanced/src/declarations/plugins/sharing/ProvideSharedPlugin.d.ts index 02d53ee0880..e907f234547 100644 --- a/packages/enhanced/src/declarations/plugins/sharing/ProvideSharedPlugin.d.ts +++ b/packages/enhanced/src/declarations/plugins/sharing/ProvideSharedPlugin.d.ts @@ -64,4 +64,12 @@ export interface ProvidesConfig { * Do not accept shared module if version is not valid (defaults to yes, if local fallback module is available and shared module is not a singleton, otherwise no, has no effect if there is no required version specified). */ strictVersion?: boolean; + /** + * Layer for the shared module. + */ + layer?: string; + /** + * The actual request to use for importing the module. If not specified, the property name/key will be used. + */ + request?: string; } diff --git a/packages/enhanced/src/declarations/plugins/sharing/SharePlugin.d.ts b/packages/enhanced/src/declarations/plugins/sharing/SharePlugin.d.ts index 9bd1c035286..8d1e197af1e 100644 --- a/packages/enhanced/src/declarations/plugins/sharing/SharePlugin.d.ts +++ b/packages/enhanced/src/declarations/plugins/sharing/SharePlugin.d.ts @@ -75,4 +75,16 @@ export interface SharedConfig { * Version of the provided module. Will replace lower matching versions, but not higher. */ version?: false | string; + /** + * Issuer layer in which the module should be resolved. + */ + issuerLayer?: string; + /** + * Layer for the shared module. + */ + layer?: string; + /** + * The actual request to use for importing the module. Defaults to the property name. + */ + request?: string; } diff --git a/packages/enhanced/src/lib/sharing/ConsumeSharedModule.ts b/packages/enhanced/src/lib/sharing/ConsumeSharedModule.ts index 9d0484eb852..ce6b34bde49 100644 --- a/packages/enhanced/src/lib/sharing/ConsumeSharedModule.ts +++ b/packages/enhanced/src/lib/sharing/ConsumeSharedModule.ts @@ -24,6 +24,7 @@ import type { import ConsumeSharedFallbackDependency from './ConsumeSharedFallbackDependency'; import { normalizeConsumeShareOptions } from './utils'; import { WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE } from '../Constants'; +import type { ConsumeOptions } from '../../declarations/plugins/sharing/ConsumeSharedModule'; const { rangeToString, stringifyHoley } = require( normalizeWebpackPath('webpack/lib/util/semver'), @@ -38,48 +39,6 @@ const makeSerializable = require( normalizeWebpackPath('webpack/lib/util/makeSerializable'), ) as typeof import('webpack/lib/util/makeSerializable'); -export type ConsumeOptions = { - /** - * fallback request - */ - import?: string | undefined; - /** - * resolved fallback request - */ - importResolved?: string | undefined; - /** - * global share key - */ - shareKey: string; - /** - * share scope - */ - shareScope: string; - /** - * version requirement - */ - requiredVersion: - | import('webpack/lib/util/semver').SemVerRange - | false - | undefined; - /** - * package name to determine required version automatically - */ - packageName: string; - /** - * don't use shared version even if version isn't valid - */ - strictVersion: boolean; - /** - * use single global version - */ - singleton: boolean; - /** - * include the fallback module in a sync way - */ - eager: boolean; -}; - /** * @typedef {Object} ConsumeOptions * @property {string=} import fallback request @@ -91,6 +50,8 @@ export type ConsumeOptions = { * @property {boolean} strictVersion don't use shared version even if version isn't valid * @property {boolean} singleton use single global version * @property {boolean} eager include the fallback module in a sync way + * @property {string | null=} layer Share a specific layer of the module, if the module supports layers + * @property {string | null=} issuerLayer Issuer layer in which the module should be resolved */ const TYPES = new Set(['consume-shared']); @@ -103,7 +64,12 @@ class ConsumeSharedModule extends Module { * @param {ConsumeOptions} options consume options */ constructor(context: string, options: ConsumeOptions) { - super(WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE, context); + super( + WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE, + context, + options?.layer ?? null, + ); + this.layer = options?.layer ?? null; this.options = options; } @@ -119,10 +85,11 @@ class ConsumeSharedModule extends Module { strictVersion, singleton, eager, + layer, } = this.options; return `${WEBPACK_MODULE_TYPE_CONSUME_SHARED_MODULE}|${shareScope}|${shareKey}|${ requiredVersion && rangeToString(requiredVersion) - }|${strictVersion}|${importResolved}|${singleton}|${eager}`; + }|${strictVersion}|${importResolved}|${singleton}|${eager}|${layer}`; } /** @@ -138,6 +105,7 @@ class ConsumeSharedModule extends Module { strictVersion, singleton, eager, + layer, } = this.options; return `consume shared module (${shareScope}) ${shareKey}@${ requiredVersion ? rangeToString(requiredVersion) : '*' @@ -145,7 +113,7 @@ class ConsumeSharedModule extends Module { importResolved ? ` (fallback: ${requestShortener.shorten(importResolved)})` : '' - }${eager ? ' (eager)' : ''}`; + }${eager ? ' (eager)' : ''}${layer ? ` (${layer})` : ''}`; } /** @@ -166,7 +134,6 @@ class ConsumeSharedModule extends Module { * @param {function((WebpackError | null)=, boolean=): void} callback callback function, returns true, if the module needs a rebuild * @returns {void} */ - // @ts-ignore override needBuild( context: NeedBuildContext, callback: (error?: WebpackError | null, needsRebuild?: boolean) => void, @@ -182,7 +149,6 @@ class ConsumeSharedModule extends Module { * @param {function(WebpackError=): void} callback callback function * @returns {void} */ - // @ts-ignore override build( options: WebpackOptions, compilation: Compilation, @@ -225,10 +191,8 @@ class ConsumeSharedModule extends Module { * @param {UpdateHashContext} context context * @returns {void} */ - // @ts-ignore override updateHash(hash: Hash, context: UpdateHashContext): void { hash.update(JSON.stringify(this.options)); - // @ts-ignore super.updateHash(hash, context); } @@ -236,7 +200,6 @@ class ConsumeSharedModule extends Module { * @param {CodeGenerationContext} context context for code generation * @returns {CodeGenerationResult} result */ - // @ts-ignore override codeGeneration({ chunkGraph, moduleGraph, @@ -257,7 +220,6 @@ class ConsumeSharedModule extends Module { if (eager) { const dep = this.dependencies[0]; fallbackCode = runtimeTemplate.syncModuleFactory({ - // @ts-ignore dependency: dep, chunkGraph, runtimeRequirements, @@ -266,7 +228,6 @@ class ConsumeSharedModule extends Module { } else { const block = this.blocks[0]; fallbackCode = runtimeTemplate.asyncModuleFactory({ - // @ts-ignore block, chunkGraph, runtimeRequirements, @@ -320,6 +281,7 @@ class ConsumeSharedModule extends Module { override serialize(context: ObjectSerializerContext): void { const { write } = context; write(this.options); + write(this.layer); super.serialize(context); } @@ -328,7 +290,10 @@ class ConsumeSharedModule extends Module { */ override deserialize(context: ObjectDeserializerContext): void { const { read } = context; - this.options = read(); + const options = read(); + const layer = read(); + this.options = options; + this.layer = layer; super.deserialize(context); } } diff --git a/packages/enhanced/src/lib/sharing/ConsumeSharedPlugin.ts b/packages/enhanced/src/lib/sharing/ConsumeSharedPlugin.ts index 01648deee0f..1ae93165b80 100644 --- a/packages/enhanced/src/lib/sharing/ConsumeSharedPlugin.ts +++ b/packages/enhanced/src/lib/sharing/ConsumeSharedPlugin.ts @@ -9,9 +9,8 @@ import { normalizeWebpackPath, } from '@module-federation/sdk/normalize-webpack-path'; import { isRequiredVersion } from '@module-federation/sdk'; -import type { Compiler, Compilation } from 'webpack'; +import type { Compiler, Compilation, Module } from 'webpack'; import { parseOptions } from '../container/options'; -import { ConsumeOptions } from './ConsumeSharedModule'; import { ConsumeSharedPluginOptions } from '../../declarations/plugins/sharing/ConsumeSharedPlugin'; import { resolveMatchedConfigs } from './resolveMatchedConfigs'; import { @@ -29,6 +28,9 @@ import ProvideForSharedDependency from './ProvideForSharedDependency'; import FederationRuntimePlugin from '../container/runtime/FederationRuntimePlugin'; import ShareRuntimeModule from './ShareRuntimeModule'; import type { SemVerRange } from 'webpack/lib/util/semver'; +import type { ResolveData } from 'webpack/lib/NormalModuleFactory'; +import type { ModuleFactoryCreateDataContextInfo } from 'webpack/lib/ModuleFactory'; +import type { ConsumeOptions } from '../../declarations/plugins/sharing/ConsumeSharedModule'; const ModuleNotFoundError = require( normalizeWebpackPath('webpack/lib/ModuleNotFoundError'), @@ -48,17 +50,8 @@ const createSchemaValidation = require( const validate = createSchemaValidation( //eslint-disable-next-line - require( - normalizeWebpackPath( - 'webpack/schemas/plugins/sharing/ConsumeSharedPlugin.check.js', - ), - ), - () => - require( - normalizeWebpackPath( - 'webpack/schemas/plugins/sharing/ConsumeSharedPlugin.json', - ), - ), + require('../../schemas/sharing/ConsumeSharedPlugin.check.js'), + () => require('../../schemas/sharing/ConsumeSharedPlugin'), { name: 'Consume Shared Plugin', baseDataPath: 'options', @@ -69,6 +62,17 @@ const RESOLVE_OPTIONS: ResolveOptionsWithDependencyType = { dependencyType: 'esm', }; const PLUGIN_NAME = 'ConsumeSharedPlugin'; + +// Helper function to create composite key +function createLookupKey( + request: string, + contextInfo: ModuleFactoryCreateDataContextInfo, +): string { + return contextInfo.issuerLayer + ? `(${contextInfo.issuerLayer})${request}` + : request; +} + class ConsumeSharedPlugin { private _consumes: [string, ConsumeOptions][]; @@ -94,6 +98,9 @@ class ConsumeSharedPlugin { strictVersion: false, singleton: false, eager: false, + issuerLayer: undefined, + layer: undefined, + request: key, } : // key is a request/key // item is a version @@ -107,24 +114,37 @@ class ConsumeSharedPlugin { packageName: undefined, singleton: false, eager: false, + issuerLayer: undefined, + layer: undefined, + request: key, }; return result; }, - (item, key) => ({ - import: item.import === false ? undefined : item.import || key, - shareScope: item.shareScope || options.shareScope || 'default', - shareKey: item.shareKey || key, - // @ts-ignore webpack internal semver has some issue, use runtime semver , related issue: https://github.com/webpack/webpack/issues/17756 - requiredVersion: item.requiredVersion, - strictVersion: - typeof item.strictVersion === 'boolean' - ? item.strictVersion - : item.import !== false && !item.singleton, - //@ts-ignore - packageName: item.packageName, - singleton: !!item.singleton, - eager: !!item.eager, - }), + (item, key) => { + const request = item.request || key; + return { + import: item.import === false ? undefined : item.import || request, + shareScope: item.shareScope || options.shareScope || 'default', + shareKey: item.layer + ? `(${item.layer})${item.shareKey || request}` + : item.shareKey || request, + requiredVersion: + item.requiredVersion === false + ? false + : // @ts-ignore webpack internal semver has some issue, use runtime semver , related issue: https://github.com/webpack/webpack/issues/17756 + (item.requiredVersion as SemVerRange), + strictVersion: + typeof item.strictVersion === 'boolean' + ? item.strictVersion + : item.import !== false && !item.singleton, + packageName: item.packageName, + singleton: !!item.singleton, + eager: !!item.eager, + issuerLayer: item.issuerLayer ? item.issuerLayer : undefined, + layer: item.layer ? item.layer : undefined, + request, + } as ConsumeOptions; + }, ); } @@ -296,33 +316,40 @@ class ConsumeSharedPlugin { normalModuleFactory.hooks.factorize.tapPromise( PLUGIN_NAME, - ({ context, request, dependencies }) => + async (resolveData: ResolveData): Promise => { + const { context, request, dependencies, contextInfo } = resolveData; // wait for resolving to be complete - //@ts-ignore - promise.then(() => { + return promise.then(() => { if ( dependencies[0] instanceof ConsumeSharedFallbackDependency || dependencies[0] instanceof ProvideForSharedDependency ) { return; } - const match = unresolvedConsumes.get(request); + const match = unresolvedConsumes.get( + createLookupKey(request, contextInfo), + ); + if (match !== undefined) { return createConsumeSharedModule(context, request, match); } for (const [prefix, options] of prefixedConsumes) { - if (request.startsWith(prefix)) { - const remainder = request.slice(prefix.length); + const lookup = options.request || prefix; + if (request.startsWith(lookup)) { + const remainder = request.slice(lookup.length); return createConsumeSharedModule(context, request, { ...options, import: options.import ? options.import + remainder : undefined, shareKey: options.shareKey + remainder, + layer: options.layer || contextInfo.issuerLayer, }); } } - }), + return; + }); + }, ); normalModuleFactory.hooks.createModule.tapPromise( PLUGIN_NAME, diff --git a/packages/enhanced/src/lib/sharing/ProvideSharedDependency.ts b/packages/enhanced/src/lib/sharing/ProvideSharedDependency.ts index 91202c010df..eb61bae23b8 100644 --- a/packages/enhanced/src/lib/sharing/ProvideSharedDependency.ts +++ b/packages/enhanced/src/lib/sharing/ProvideSharedDependency.ts @@ -26,6 +26,7 @@ class ProvideSharedDependency extends Dependency { requiredVersion: string | false; strictVersion: boolean; singleton: boolean; + layer?: string; /** * @param {string} shareScope share scope @@ -36,6 +37,7 @@ class ProvideSharedDependency extends Dependency { * @param {boolean} requiredVersion version requirement * @param {boolean} strictVersion don't use shared version even if version isn't valid * @param {boolean} singleton use single global version + * @param {string} [layer] layer information */ constructor( shareScope: string, @@ -46,6 +48,7 @@ class ProvideSharedDependency extends Dependency { requiredVersion: string | false, strictVersion: boolean, singleton: boolean, + layer?: string, ) { super(); this.shareScope = shareScope; @@ -56,6 +59,7 @@ class ProvideSharedDependency extends Dependency { this.requiredVersion = requiredVersion; this.strictVersion = strictVersion; this.singleton = singleton; + this.layer = layer; } override get type(): string { @@ -66,7 +70,7 @@ class ProvideSharedDependency extends Dependency { * @returns {string | null} an identifier to merge equal requests */ override getResourceIdentifier(): string | null { - return `provide module (${this.shareScope}) ${this.request} as ${ + return `provide module (${this.shareScope})${this.layer ? ` (${this.layer})` : ''} ${this.request} as ${ this.name } @ ${this.version}${this.eager ? ' (eager)' : ''}`; } @@ -77,12 +81,13 @@ class ProvideSharedDependency extends Dependency { override serialize(context: ObjectSerializerContext): void { context.write(this.shareScope); context.write(this.name); - context.write(this.request); context.write(this.version); + context.write(this.request); context.write(this.eager); context.write(this.requiredVersion); context.write(this.strictVersion); context.write(this.singleton); + context.write(this.layer); super.serialize(context); } @@ -103,8 +108,9 @@ class ProvideSharedDependency extends Dependency { read(), read(), read(), + read(), ); - //@ts-ignore + // @ts-expect-error - webpack serializer pattern requires static property this.shareScope = context.read(); obj.deserialize(context); return obj; diff --git a/packages/enhanced/src/lib/sharing/ProvideSharedModule.ts b/packages/enhanced/src/lib/sharing/ProvideSharedModule.ts index fae5e3fc71e..9ba3fad26f0 100644 --- a/packages/enhanced/src/lib/sharing/ProvideSharedModule.ts +++ b/packages/enhanced/src/lib/sharing/ProvideSharedModule.ts @@ -53,6 +53,7 @@ class ProvideSharedModule extends Module { * @param {boolean} requiredVersion version requirement * @param {boolean} strictVersion don't use shared version even if version isn't valid * @param {boolean} singleton use single global version + * @param {string} [layer] layer information */ constructor( shareScope: string, @@ -63,8 +64,9 @@ class ProvideSharedModule extends Module { requiredVersion: string | false, strictVersion: boolean, singleton: boolean, + layer?: string, ) { - super(WEBPACK_MODULE_TYPE_PROVIDE); + super(WEBPACK_MODULE_TYPE_PROVIDE, undefined, layer); this._shareScope = shareScope; this._name = name; this._version = version; @@ -79,7 +81,9 @@ class ProvideSharedModule extends Module { * @returns {string} a unique identifier of the module */ override identifier(): string { - return `provide module (${this._shareScope}) ${this._name}@${this._version} = ${this._request}`; + return `provide module (${this._shareScope})${ + this.layer ? ` (${this.layer})` : '' + } ${this._name}@${this._version} = ${this._request}`; } /** @@ -87,9 +91,9 @@ class ProvideSharedModule extends Module { * @returns {string} a user readable identifier of the module */ override readableIdentifier(requestShortener: RequestShortener): string { - return `provide shared module (${this._shareScope}) ${this._name}@${ - this._version - } = ${requestShortener.shorten(this._request)}`; + return `provide shared module (${this._shareScope})${ + this.layer ? ` (${this.layer})` : '' + } ${this._name}@${this._version} = ${requestShortener.shorten(this._request)}`; } /** @@ -107,7 +111,6 @@ class ProvideSharedModule extends Module { * @param {function((WebpackError | null)=, boolean=): void} callback callback function, returns true, if the module needs a rebuild * @returns {void} */ - // @ts-ignore override needBuild( context: NeedBuildContext, callback: (error?: WebpackError | null, needsRebuild?: boolean) => void, @@ -123,7 +126,6 @@ class ProvideSharedModule extends Module { * @param {function(WebpackError=): void} callback callback function * @returns {void} */ - // @ts-ignore override build( options: WebpackOptions, compilation: Compilation, @@ -168,7 +170,6 @@ class ProvideSharedModule extends Module { * @param {CodeGenerationContext} context context for code generation * @returns {CodeGenerationResult} result */ - // @ts-ignore override codeGeneration({ runtimeTemplate, moduleGraph, @@ -177,14 +178,12 @@ class ProvideSharedModule extends Module { const runtimeRequirements = new Set([RuntimeGlobals.initializeSharing]); const moduleGetter = this._eager ? runtimeTemplate.syncModuleFactory({ - //@ts-ignore dependency: this.dependencies[0], chunkGraph, request: this._request, runtimeRequirements, }) : runtimeTemplate.asyncModuleFactory({ - //@ts-ignore block: this.blocks[0], chunkGraph, request: this._request, @@ -213,6 +212,7 @@ class ProvideSharedModule extends Module { requiredVersion: this._requiredVersion, strictVersion: this._strictVersion, singleton: this._singleton, + layer: this.layer, }, }); return { sources, data, runtimeRequirements }; @@ -231,6 +231,7 @@ class ProvideSharedModule extends Module { write(this._requiredVersion); write(this._strictVersion); write(this._singleton); + write(this.layer); super.serialize(context); } @@ -249,6 +250,7 @@ class ProvideSharedModule extends Module { read(), read(), read(), + read(), ); obj.deserialize(context); return obj; diff --git a/packages/enhanced/src/lib/sharing/ProvideSharedModuleFactory.ts b/packages/enhanced/src/lib/sharing/ProvideSharedModuleFactory.ts index ac9cb5959f9..ca3e22db14c 100644 --- a/packages/enhanced/src/lib/sharing/ProvideSharedModuleFactory.ts +++ b/packages/enhanced/src/lib/sharing/ProvideSharedModuleFactory.ts @@ -39,6 +39,7 @@ class ProvideSharedModuleFactory extends ModuleFactory { dep.requiredVersion, dep.strictVersion, dep.singleton, + dep.layer, ), }); } diff --git a/packages/enhanced/src/lib/sharing/ProvideSharedPlugin.ts b/packages/enhanced/src/lib/sharing/ProvideSharedPlugin.ts index e66ebae2fe9..a814c6d8cd5 100644 --- a/packages/enhanced/src/lib/sharing/ProvideSharedPlugin.ts +++ b/packages/enhanced/src/lib/sharing/ProvideSharedPlugin.ts @@ -32,24 +32,19 @@ const WebpackError = require( normalizeWebpackPath('webpack/lib/WebpackError'), ) as typeof import('webpack/lib/WebpackError'); -export type ProvideOptions = ProvidesConfig; export type ResolvedProvideMap = Map< string, { - config: ProvideOptions; + config: ProvidesConfig; version: string | undefined | false; + resource?: string; } >; -const validate = createSchemaValidation( - //eslint-disable-next-line - checkOptions, - () => schema, - { - name: 'Provide Shared Plugin', - baseDataPath: 'options', - }, -); +const validate = createSchemaValidation(checkOptions, () => schema, { + name: 'Provide Shared Plugin', + baseDataPath: 'options', +}); /** * @typedef {Object} ProvideOptions @@ -57,26 +52,37 @@ const validate = createSchemaValidation( * @property {string} shareScope * @property {string | undefined | false} version * @property {boolean} eager + * @property {string} [request] The actual request to use for importing the module */ /** @typedef {Map} ResolvedProvideMap */ +// Helper function to create composite key +function createLookupKey( + request: string, + config: { layer?: string | null }, +): string { + if (config.layer) { + return `(${config.layer})${request}`; + } + return request; +} + class ProvideSharedPlugin { - private _provides: [string, ProvideOptions][]; + private _provides: [string, ProvidesConfig][]; /** * @param {ProvideSharedPluginOptions} options options */ constructor(options: ProvideSharedPluginOptions) { validate(options); - //@ts-ignore this._provides = parseOptions( options.provides, (item) => { if (Array.isArray(item)) throw new Error('Unexpected array of provides'); - /** @type {ProvideOptions} */ - const result: ProvideOptions = { + /** @type {ProvidesConfig} */ + const result: ProvidesConfig = { shareKey: item, version: undefined, shareScope: options.shareScope || 'default', @@ -84,18 +90,27 @@ class ProvideSharedPlugin { requiredVersion: false, strictVersion: false, singleton: false, + layer: undefined, + request: item, }; return result; }, - (item) => ({ - shareKey: item.shareKey, - version: item.version, - shareScope: item.shareScope || options.shareScope || 'default', - eager: !!item.eager, - requiredVersion: item.requiredVersion || false, - strictVersion: item.strictVersion || false, - singleton: item.singleton || false, - }), + (item, key) => { + const request = item.request || key; + return { + shareScope: item.shareScope || options.shareScope || 'default', + shareKey: item.layer + ? `(${item.layer})${item.shareKey || request}` + : item.shareKey || request, + version: item.version, + eager: !!item.eager, + requiredVersion: item.requiredVersion, + strictVersion: item.strictVersion, + singleton: !!item.singleton, + layer: item.layer, + request, + }; + }, ); this._provides.sort(([a], [b]) => { if (a < b) return -1; @@ -121,33 +136,36 @@ class ProvideSharedPlugin { 'ProvideSharedPlugin', (compilation: Compilation, { normalModuleFactory }) => { const resolvedProvideMap: ResolvedProvideMap = new Map(); - const matchProvides: Map = new Map(); - const prefixMatchProvides: Map = new Map(); + const matchProvides: Map = new Map(); + const prefixMatchProvides: Map = new Map(); for (const [request, config] of this._provides) { - if (/^(\/|[A-Za-z]:\\|\\\\|\.\.?(\/|$))/.test(request)) { + const actualRequest = config.request || request; + const lookupKey = createLookupKey(actualRequest, config); + if (/^(\/|[A-Za-z]:\\|\\\\|\.\.?(\/|$))/.test(actualRequest)) { // relative request - resolvedProvideMap.set(request, { + resolvedProvideMap.set(lookupKey, { config, version: config.version, }); - } else if (/^(\/|[A-Za-z]:\\|\\\\)/.test(request)) { + } else if (/^(\/|[A-Za-z]:\\|\\\\)/.test(actualRequest)) { // absolute path - resolvedProvideMap.set(request, { + resolvedProvideMap.set(lookupKey, { config, version: config.version, }); - } else if (request.endsWith('/')) { + } else if (actualRequest.endsWith('/')) { // module request prefix - prefixMatchProvides.set(request, config); + prefixMatchProvides.set(lookupKey, config); } else { // module request - matchProvides.set(request, config); + matchProvides.set(lookupKey, config); } } + compilationData.set(compilation, resolvedProvideMap); const provideSharedModule = ( key: string, - config: ProvideOptions, + config: ProvidesConfig, resource: string, resourceResolveData: any, ) => { @@ -173,24 +191,33 @@ class ProvideSharedPlugin { `No version specified and unable to automatically determine one. ${details}`, ); error.file = `shared module ${key} -> ${resource}`; - // @ts-ignore compilation.warnings.push(error); } } - resolvedProvideMap.set(resource, { + const lookupKey = createLookupKey(resource, config); + resolvedProvideMap.set(lookupKey, { config, version, + resource, }); }; normalModuleFactory.hooks.module.tap( 'ProvideSharedPlugin', (module, { resource, resourceResolveData }, resolveData) => { - if (resource && resolvedProvideMap.has(resource)) { + const moduleLayer = module.layer; + const lookupKey = createLookupKey(resource || '', { + layer: moduleLayer || undefined, + }); + + if (resource && resolvedProvideMap.has(lookupKey)) { return module; } const { request } = resolveData; { - const config = matchProvides.get(request); + const requestKey = createLookupKey(request, { + layer: moduleLayer || undefined, + }); + const config = matchProvides.get(requestKey); if (config !== undefined && resource) { provideSharedModule( request, @@ -202,8 +229,10 @@ class ProvideSharedPlugin { } } for (const [prefix, config] of prefixMatchProvides) { - if (request.startsWith(prefix) && resource) { - const remainder = request.slice(prefix.length); + const lookup = config.request || prefix; + if (request.startsWith(lookup) && resource) { + const remainder = request.slice(lookup.length); + debugger; provideSharedModule( resource, { @@ -226,33 +255,37 @@ class ProvideSharedPlugin { async (compilation: Compilation) => { const resolvedProvideMap = compilationData.get(compilation); if (!resolvedProvideMap) return; + await Promise.all( Array.from( resolvedProvideMap, - ([resource, { config, version }]) => - new Promise((resolve, reject) => { + ([resourceKey, { config, version, resource }]) => { + return new Promise((resolve, reject) => { compilation.addInclude( compiler.context, - //@ts-ignore new ProvideSharedDependency( config.shareScope!, config.shareKey!, version || false, - resource, + resource || resourceKey, config.eager!, config.requiredVersion!, config.strictVersion!, config.singleton!, + config.layer, ), { name: undefined, }, (err?: WebpackErrorType | null | undefined) => { - if (err) return reject(err); + if (err) { + return reject(err); + } resolve(); }, ); - }), + }); + }, ), ); }, @@ -268,7 +301,6 @@ class ProvideSharedPlugin { compilation.dependencyFactories.set( ProvideSharedDependency, - //@ts-ignore new ProvideSharedModuleFactory(), ); }, diff --git a/packages/enhanced/src/lib/sharing/SharePlugin.ts b/packages/enhanced/src/lib/sharing/SharePlugin.ts index 1eb4860165a..9b5e436d69d 100644 --- a/packages/enhanced/src/lib/sharing/SharePlugin.ts +++ b/packages/enhanced/src/lib/sharing/SharePlugin.ts @@ -52,6 +52,9 @@ class SharePlugin { singleton: options.singleton, packageName: options.packageName, eager: options.eager, + issuerLayer: options.issuerLayer, + layer: options.layer, + request: options.request || key, }, }), ); @@ -66,6 +69,8 @@ class SharePlugin { requiredVersion: options.requiredVersion, strictVersion: options.strictVersion, singleton: options.singleton, + layer: options.layer, + request: options.request || options.import || key, }, })); //@ts-ignore @@ -75,11 +80,10 @@ class SharePlugin { } /** - * Apply the plugin - * @param {Compiler} compiler the compiler instance - * @returns {void} + * Applies the plugin to the webpack compiler instance + * @param compiler - The webpack compiler instance */ - apply(compiler: Compiler) { + apply(compiler: Compiler): void { process.env['FEDERATION_WEBPACK_PATH'] = process.env['FEDERATION_WEBPACK_PATH'] || getWebpackPath(compiler); diff --git a/packages/enhanced/src/lib/sharing/ShareRuntimeModule.ts b/packages/enhanced/src/lib/sharing/ShareRuntimeModule.ts index b7bf110e13b..510b8dfd4f4 100644 --- a/packages/enhanced/src/lib/sharing/ShareRuntimeModule.ts +++ b/packages/enhanced/src/lib/sharing/ShareRuntimeModule.ts @@ -74,10 +74,14 @@ class ShareRuntimeModule extends RuntimeModule { if (sharedOption) { sharedInitOptions[sharedOption.name] = sharedInitOptions[sharedOption.name] || []; - const isSameVersion = sharedInitOptions[sharedOption.name].find( - (s) => s.version === sharedOption.version, + const isSameVersionAndLayer = sharedInitOptions[ + sharedOption.name + ].find( + (s) => + s.version === sharedOption.version && + s.shareConfig?.layer === sharedOption.shareConfig?.layer, ); - if (!isSameVersion) { + if (!isSameVersionAndLayer) { sharedInitOptions[sharedOption.name].push(sharedOption); } } @@ -88,18 +92,19 @@ class ShareRuntimeModule extends RuntimeModule { (sum, sharedName) => { const sharedOptions = sharedInitOptions[sharedName]; let str = ''; - sharedOptions.forEach((sharedOption) => { + + // Ensure all options are included without filtering + sharedOptions.forEach((option) => { str += `{${Template.indent([ - `version: ${sharedOption.version},`, - `get: ${sharedOption.getter},`, - `scope: ${JSON.stringify(sharedOption.shareScope)},`, - `shareConfig: ${JSON.stringify(sharedOption.shareConfig)}`, + `version: ${option.version},`, + `get: ${option.getter},`, + `scope: ${JSON.stringify(option.shareScope)},`, + `shareConfig: ${JSON.stringify(option.shareConfig)}`, ])}},`; }); - str = `[${str}]`; + str = `[${str}]`; sum += `${Template.indent([`"${sharedName}": ${str},`])}`; - return sum; }, '', @@ -108,6 +113,42 @@ class ShareRuntimeModule extends RuntimeModule { const federationGlobal = getFederationGlobalScope( RuntimeGlobals || ({} as typeof RuntimeGlobals), ); + + // Group shared modules by scope and layer + const scopedModules = new Map< + string, + Map> + >(); + for (const [scopeName, stages] of initCodePerScope) { + const layeredModules = new Map>(); + scopedModules.set(scopeName, layeredModules); + + for (const [, inits] of stages) { + for (const init of inits) { + const layer = init.match(/layer:\s*["']([^"']+)["']/)?.[1]; + let moduleSet = layeredModules.get(layer); + if (!moduleSet) { + moduleSet = new Set(); + layeredModules.set(layer, moduleSet); + } + moduleSet.add(init); + } + } + } + + // Generate the registration code + const registrationCode = Array.from(scopedModules.entries()) + .map(([scopeName, layeredModules]) => { + const cases = Array.from(layeredModules.entries()) + .map(([layer, inits]) => { + const initCode = Array.from(inits).join('\n'); + return `case "${scopeName}": {\n${Template.indent(initCode)}\n}`; + }) + .join('\nbreak;\n'); + return cases; + }) + .join('\n'); + return Template.asString([ `${getFederationGlobalScope( RuntimeGlobals, diff --git a/packages/enhanced/src/lib/sharing/resolveMatchedConfigs.ts b/packages/enhanced/src/lib/sharing/resolveMatchedConfigs.ts index 228bb95b676..7779277bf6a 100644 --- a/packages/enhanced/src/lib/sharing/resolveMatchedConfigs.ts +++ b/packages/enhanced/src/lib/sharing/resolveMatchedConfigs.ts @@ -5,6 +5,7 @@ import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; import type { Compilation } from 'webpack'; import type { ResolveOptionsWithDependencyType } from 'webpack/lib/ResolverFactory'; +import type { ConsumeOptions } from '../../declarations/plugins/sharing/ConsumeSharedModule'; const ModuleNotFoundError = require( normalizeWebpackPath('webpack/lib/ModuleNotFoundError'), @@ -13,6 +14,9 @@ const LazySet = require( normalizeWebpackPath('webpack/lib/util/LazySet'), ) as typeof import('webpack/lib/util/LazySet'); +const RELATIVE_REQUEST_REGEX = /^\.\.?(\/|$)/; +const ABSOLUTE_PATH_REGEX = /^(\/|[A-Za-z]:\\|\\\\)/; + interface MatchedConfigs { resolved: Map; unresolved: Map; @@ -23,7 +27,19 @@ const RESOLVE_OPTIONS: ResolveOptionsWithDependencyType = { dependencyType: 'esm', }; -export async function resolveMatchedConfigs( +function createCompositeKey(request: string, config: ConsumeOptions): string { + if (config.issuerLayer) { + return `(${config.issuerLayer})${request}`; + // layer unlikely to be used, issuerLayer is what factorize provides + // which is what we need to create a matching key for + } else if (config.layer) { + return `(${config.layer})${request}`; + } else { + return request; + } +} +// TODO: look at passing dedicated request key instead of infer from object key +export async function resolveMatchedConfigs( compilation: Compilation, configs: [string, T][], ): Promise> { @@ -35,28 +51,26 @@ export async function resolveMatchedConfigs( contextDependencies: new LazySet(), missingDependencies: new LazySet(), }; - // @ts-ignore const resolver = compilation.resolverFactory.get('normal', RESOLVE_OPTIONS); const context = compilation.compiler.context; await Promise.all( - //@ts-ignore configs.map(([request, config]) => { - if (/^\.\.?(\/|$)/.test(request)) { + const resolveRequest = config.request || request; + if (RELATIVE_REQUEST_REGEX.test(resolveRequest)) { // relative request return new Promise((resolve) => { resolver.resolve( {}, context, - request, + resolveRequest, resolveContext, (err, result) => { if (err || result === false) { - err = err || new Error(`Can't resolve ${request}`); + err = err || new Error(`Can't resolve ${resolveRequest}`); compilation.errors.push( - // @ts-ignore new ModuleNotFoundError(null, err, { - name: `shared module ${request}`, + name: `shared module ${resolveRequest}`, }), ); return resolve(); @@ -66,15 +80,20 @@ export async function resolveMatchedConfigs( }, ); }); - } else if (/^(\/|[A-Za-z]:\\|\\\\)/.test(request)) { + } else if (ABSOLUTE_PATH_REGEX.test(resolveRequest)) { // absolute path - resolved.set(request, config); - } else if (request.endsWith('/')) { + resolved.set(resolveRequest, config); + return undefined; + } else if (resolveRequest.endsWith('/')) { // module request prefix - prefixed.set(request, config); + const key = createCompositeKey(resolveRequest, config); + prefixed.set(key, config); + return undefined; } else { // module request - unresolved.set(request, config); + const key = createCompositeKey(resolveRequest, config); + unresolved.set(key, config); + return undefined; } }), ); diff --git a/packages/enhanced/src/lib/sharing/utils.ts b/packages/enhanced/src/lib/sharing/utils.ts index 2c433224599..129b6130697 100644 --- a/packages/enhanced/src/lib/sharing/utils.ts +++ b/packages/enhanced/src/lib/sharing/utils.ts @@ -4,7 +4,7 @@ */ import { isRequiredVersion } from '@module-federation/sdk'; -import type { ConsumeOptions } from 'webpack/lib/sharing/ConsumeSharedModule'; +import type { ConsumeOptions } from '../../declarations/plugins/sharing/ConsumeSharedModule'; import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; import type { InputFileSystem } from 'webpack/lib/util/fs'; const { join, dirname, readJson } = require( @@ -459,6 +459,7 @@ export function normalizeConsumeShareOptions(consumeOptions: ConsumeOptions) { eager, shareKey, shareScope, + layer, } = consumeOptions; return { shareConfig: { @@ -467,6 +468,7 @@ export function normalizeConsumeShareOptions(consumeOptions: ConsumeOptions) { strictVersion, singleton, eager, + layer, }, shareScope, shareKey, diff --git a/packages/enhanced/src/schemas/sharing/ConsumeSharedPlugin.check.ts b/packages/enhanced/src/schemas/sharing/ConsumeSharedPlugin.check.ts new file mode 100644 index 00000000000..a117cfb4c7f --- /dev/null +++ b/packages/enhanced/src/schemas/sharing/ConsumeSharedPlugin.check.ts @@ -0,0 +1,398 @@ +/* eslint-disable */ +//@ts-nocheck +/* + * This file was automatically generated. + * DO NOT MODIFY BY HAND. + * Run `yarn special-lint-fix` to update + */ +'use strict'; + +function r( + e, + { + instancePath: t = '', + parentData: n, + parentDataProperty: s, + rootData: a = e, + } = {}, +) { + let o = null, + i = 0; + if (0 === i) { + if (!e || 'object' != typeof e || Array.isArray(e)) + return (r.errors = [{ params: { type: 'object' } }]), !1; + { + const t = i; + for (const t in e) + if ( + 'eager' !== t && + 'import' !== t && + 'packageName' !== t && + 'requiredVersion' !== t && + 'shareKey' !== t && + 'shareScope' !== t && + 'singleton' !== t && + 'strictVersion' !== t && + 'issuerLayer' !== t && + 'request' !== t && + 'layer' !== t + ) + return (r.errors = [{ params: { additionalProperty: t } }]), !1; + if (t === i) { + if (void 0 !== e.eager) { + const t = i; + if ('boolean' != typeof e.eager) + return (r.errors = [{ params: { type: 'boolean' } }]), !1; + var l = t === i; + } else l = !0; + if (l) { + if (void 0 !== e.import) { + let t = e.import; + const n = i, + s = i; + let a = !1; + const f = i; + if (!1 !== t) { + const r = { params: {} }; + null === o ? (o = [r]) : o.push(r), i++; + } + var p = f === i; + if (((a = a || p), !a)) { + const r = i; + if (i == i) + if ('string' == typeof t) { + if (t.length < 1) { + const r = { params: {} }; + null === o ? (o = [r]) : o.push(r), i++; + } + } else { + const r = { params: { type: 'string' } }; + null === o ? (o = [r]) : o.push(r), i++; + } + (p = r === i), (a = a || p); + } + if (!a) { + const e = { params: {} }; + return ( + null === o ? (o = [e]) : o.push(e), i++, (r.errors = o), !1 + ); + } + (i = s), + null !== o && (s ? (o.length = s) : (o = null)), + (l = n === i); + } else l = !0; + if (l) { + if (void 0 !== e.packageName) { + let t = e.packageName; + const n = i; + if (i === n) { + if ('string' != typeof t) + return (r.errors = [{ params: { type: 'string' } }]), !1; + if (t.length < 1) return (r.errors = [{ params: {} }]), !1; + } + l = n === i; + } else l = !0; + if (l) { + if (void 0 !== e.requiredVersion) { + let t = e.requiredVersion; + const n = i, + s = i; + let a = !1; + const p = i; + if (!1 !== t) { + const r = { params: {} }; + null === o ? (o = [r]) : o.push(r), i++; + } + var f = p === i; + if (((a = a || f), !a)) { + const r = i; + if ('string' != typeof t) { + const r = { params: { type: 'string' } }; + null === o ? (o = [r]) : o.push(r), i++; + } + (f = r === i), (a = a || f); + } + if (!a) { + const e = { params: {} }; + return ( + null === o ? (o = [e]) : o.push(e), i++, (r.errors = o), !1 + ); + } + (i = s), + null !== o && (s ? (o.length = s) : (o = null)), + (l = n === i); + } else l = !0; + if (l) { + if (void 0 !== e.shareKey) { + let t = e.shareKey; + const n = i; + if (i === n) { + if ('string' != typeof t) + return (r.errors = [{ params: { type: 'string' } }]), !1; + if (t.length < 1) return (r.errors = [{ params: {} }]), !1; + } + l = n === i; + } else l = !0; + if (l) { + if (void 0 !== e.shareScope) { + let t = e.shareScope; + const n = i; + if (i === n) { + if ('string' != typeof t) + return ( + (r.errors = [{ params: { type: 'string' } }]), !1 + ); + if (t.length < 1) + return (r.errors = [{ params: {} }]), !1; + } + l = n === i; + } else l = !0; + if (l) { + if (void 0 !== e.singleton) { + const t = i; + if ('boolean' != typeof e.singleton) + return ( + (r.errors = [{ params: { type: 'boolean' } }]), !1 + ); + l = t === i; + } else l = !0; + if (l) + if (void 0 !== e.strictVersion) { + const t = i; + if ('boolean' != typeof e.strictVersion) + return ( + (r.errors = [{ params: { type: 'boolean' } }]), !1 + ); + l = t === i; + } else l = !0; + if (l) { + if (void 0 !== e.issuerLayer) { + let t = e.issuerLayer; + const n = i; + if (i === n) { + if ('string' != typeof t) + return ( + (r.errors = [{ params: { type: 'string' } }]), !1 + ); + if (t.length < 1) + return (r.errors = [{ params: {} }]), !1; + } + l = n === i; + } else l = !0; + if (l) { + if (void 0 !== e.layer) { + let t = e.layer; + const n = i; + if (i === n) { + if ('string' != typeof t) + return ( + (r.errors = [{ params: { type: 'string' } }]), + !1 + ); + if (t.length < 1) + return (r.errors = [{ params: {} }]), !1; + } + l = n === i; + } else l = !0; + } + } + } + } + } + } + } + } + } + } + } + return (r.errors = o), 0 === i; +} + +function e( + t, + { + instancePath: n = '', + parentData: s, + parentDataProperty: a, + rootData: o = t, + } = {}, +) { + let i = null, + l = 0; + if (0 === l) { + if (!t || 'object' != typeof t || Array.isArray(t)) + return (e.errors = [{ params: { type: 'object' } }]), !1; + for (const s in t) { + let a = t[s]; + const f = l, + c = l; + let u = !1; + const y = l; + r(a, { + instancePath: n + '/' + s.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: t, + parentDataProperty: s, + rootData: o, + }) || ((i = null === i ? r.errors : i.concat(r.errors)), (l = i.length)); + var p = y === l; + if (((u = u || p), !u)) { + const r = l; + if (l == l) + if ('string' == typeof a) { + if (a.length < 1) { + const r = { params: {} }; + null === i ? (i = [r]) : i.push(r), l++; + } + } else { + const r = { params: { type: 'string' } }; + null === i ? (i = [r]) : i.push(r), l++; + } + (p = r === l), (u = u || p); + } + if (!u) { + const r = { params: {} }; + return null === i ? (i = [r]) : i.push(r), l++, (e.errors = i), !1; + } + if (((l = c), null !== i && (c ? (i.length = c) : (i = null)), f !== l)) + break; + } + } + return (e.errors = i), 0 === l; +} + +function t( + r, + { + instancePath: n = '', + parentData: s, + parentDataProperty: a, + rootData: o = r, + } = {}, +) { + let i = null, + l = 0; + const p = l; + let f = !1; + const c = l; + if (l === c) + if (Array.isArray(r)) { + const t = r.length; + for (let s = 0; s < t; s++) { + let t = r[s]; + const a = l, + p = l; + let f = !1; + const c = l; + if (l == l) + if ('string' == typeof t) { + if (t.length < 1) { + const r = { params: {} }; + null === i ? (i = [r]) : i.push(r), l++; + } + } else { + const r = { params: { type: 'string' } }; + null === i ? (i = [r]) : i.push(r), l++; + } + var u = c === l; + if (((f = f || u), !f)) { + const a = l; + e(t, { + instancePath: n + '/' + s, + parentData: r, + parentDataProperty: s, + rootData: o, + }) || + ((i = null === i ? e.errors : i.concat(e.errors)), (l = i.length)), + (u = a === l), + (f = f || u); + } + if (f) (l = p), null !== i && (p ? (i.length = p) : (i = null)); + else { + const r = { params: {} }; + null === i ? (i = [r]) : i.push(r), l++; + } + if (a !== l) break; + } + } else { + const r = { params: { type: 'array' } }; + null === i ? (i = [r]) : i.push(r), l++; + } + var y = c === l; + if (((f = f || y), !f)) { + const t = l; + e(r, { + instancePath: n, + parentData: s, + parentDataProperty: a, + rootData: o, + }) || ((i = null === i ? e.errors : i.concat(e.errors)), (l = i.length)), + (y = t === l), + (f = f || y); + } + if (!f) { + const r = { params: {} }; + return null === i ? (i = [r]) : i.push(r), l++, (t.errors = i), !1; + } + return ( + (l = p), + null !== i && (p ? (i.length = p) : (i = null)), + (t.errors = i), + 0 === l + ); +} + +function n( + r, + { + instancePath: e = '', + parentData: s, + parentDataProperty: a, + rootData: o = r, + } = {}, +) { + let i = null, + l = 0; + if (0 === l) { + if (!r || 'object' != typeof r || Array.isArray(r)) + return (n.errors = [{ params: { type: 'object' } }]), !1; + { + let s; + if (void 0 === r.consumes && (s = 'consumes')) + return (n.errors = [{ params: { missingProperty: s } }]), !1; + { + const s = l; + for (const e in r) + if ('consumes' !== e && 'shareScope' !== e) + return (n.errors = [{ params: { additionalProperty: e } }]), !1; + if (s === l) { + if (void 0 !== r.consumes) { + const n = l; + t(r.consumes, { + instancePath: e + '/consumes', + parentData: r, + parentDataProperty: 'consumes', + rootData: o, + }) || + ((i = null === i ? t.errors : i.concat(t.errors)), + (l = i.length)); + var p = n === l; + } else p = !0; + if (p) + if (void 0 !== r.shareScope) { + let e = r.shareScope; + const t = l; + if (l === t) { + if ('string' != typeof e) + return (n.errors = [{ params: { type: 'string' } }]), !1; + if (e.length < 1) return (n.errors = [{ params: {} }]), !1; + } + p = t === l; + } else p = !0; + } + } + } + } + return (n.errors = i), 0 === l; +} + +(module.exports = n), (module.exports.default = n); diff --git a/packages/enhanced/src/schemas/sharing/ConsumeSharedPlugin.ts b/packages/enhanced/src/schemas/sharing/ConsumeSharedPlugin.ts new file mode 100644 index 00000000000..1761bdaf354 --- /dev/null +++ b/packages/enhanced/src/schemas/sharing/ConsumeSharedPlugin.ts @@ -0,0 +1,147 @@ +export default { + definitions: { + Consumes: { + description: + 'Modules that should be consumed from share scope. When provided, property names are used to match requested modules in this compilation.', + anyOf: [ + { + type: 'array', + items: { + description: 'Modules that should be consumed from share scope.', + anyOf: [ + { + $ref: '#/definitions/ConsumesItem', + }, + { + $ref: '#/definitions/ConsumesObject', + }, + ], + }, + }, + { + $ref: '#/definitions/ConsumesObject', + }, + ], + }, + ConsumesConfig: { + description: + 'Advanced configuration for modules that should be consumed from share scope.', + type: 'object', + additionalProperties: false, + properties: { + eager: { + description: + 'Include the fallback module directly instead behind an async request. This allows to use fallback module in initial load too. All possible shared modules need to be eager too.', + type: 'boolean', + }, + import: { + description: + 'Fallback module if no shared module is found in share scope. Defaults to the property name.', + anyOf: [ + { + description: 'No fallback module.', + enum: [false], + }, + { + $ref: '#/definitions/ConsumesItem', + }, + ], + }, + packageName: { + description: + "Package name to determine required version from description file. This is only needed when package name can't be automatically determined from request.", + type: 'string', + minLength: 1, + }, + requiredVersion: { + description: 'Version requirement from module in share scope.', + anyOf: [ + { + description: 'No version requirement check.', + enum: [false], + }, + { + description: + "Version as string. Can be prefixed with '^' or '~' for minimum matches. Each part of the version should be separated by a dot '.'.", + type: 'string', + }, + ], + }, + shareKey: { + description: + 'Module is looked up under this key from the share scope.', + type: 'string', + minLength: 1, + }, + shareScope: { + description: 'Share scope name.', + type: 'string', + minLength: 1, + }, + singleton: { + description: + 'Allow only a single version of the shared module in share scope (disabled by default).', + type: 'boolean', + }, + strictVersion: { + description: + 'Do not accept shared module if version is not valid (defaults to yes, if local fallback module is available and shared module is not a singleton, otherwise no, has no effect if there is no required version specified).', + type: 'boolean', + }, + issuerLayer: { + description: 'Layer in which the issuer should be.', + type: 'string', + minLength: 1, + }, + layer: { + description: 'Layer for the shared module.', + type: 'string', + minLength: 1, + }, + request: { + description: + 'The actual request to use for importing the module. If not specified, the property name/key will be used.', + type: 'string', + minLength: 1, + }, + }, + }, + ConsumesItem: { + description: 'A module that should be consumed from share scope.', + type: 'string', + minLength: 1, + }, + ConsumesObject: { + description: + 'Modules that should be consumed from share scope. Property names are used to match requested modules in this compilation. Relative requests are resolved, module requests are matched unresolved, absolute paths will match resolved requests. A trailing slash will match all requests with this prefix. In this case shareKey must also have a trailing slash.', + type: 'object', + additionalProperties: { + description: 'Modules that should be consumed from share scope.', + anyOf: [ + { + $ref: '#/definitions/ConsumesConfig', + }, + { + $ref: '#/definitions/ConsumesItem', + }, + ], + }, + }, + }, + title: 'ConsumeSharedPluginOptions', + description: 'Options for consuming shared modules.', + type: 'object', + additionalProperties: false, + properties: { + consumes: { + $ref: '#/definitions/Consumes', + }, + shareScope: { + description: + "Share scope name used for all consumed modules (defaults to 'default').", + type: 'string', + minLength: 1, + }, + }, + required: ['consumes'], +}; diff --git a/packages/enhanced/src/schemas/sharing/ProviderSharedPlugin.check.ts b/packages/enhanced/src/schemas/sharing/ProviderSharedPlugin.check.ts index a0f7152e356..52b5c238c02 100644 --- a/packages/enhanced/src/schemas/sharing/ProviderSharedPlugin.check.ts +++ b/packages/enhanced/src/schemas/sharing/ProviderSharedPlugin.check.ts @@ -48,7 +48,9 @@ function r( 'shareScope' !== r && 'singleton' !== r && 'strictVersion' !== r && - 'version' !== r + 'version' !== r && + 'layer' !== r && + 'request' !== r ) { const e = { params: { @@ -59,66 +61,57 @@ function r( break; } if (r === l) { - if (void 0 !== s.eager) { - const r = l; - if ('boolean' != typeof s.eager) { - const r = { - params: { - type: 'boolean', - }, - }; - null === a ? (a = [r]) : a.push(r), l++; - } - var i = r === l; - } else i = !0; - if (i) { - if (void 0 !== s.requiredVersion) { - let r = s.requiredVersion; - const e = l, - t = l; - let n = !1; - const o = l; - if (!1 !== r) { - const r = { - params: {}, - }; - null === a ? (a = [r]) : a.push(r), l++; - } - var p = o === l; - if (((n = n || p), !n)) { - const e = l; - if ('string' != typeof r) { + if (void 0 !== s.request) { + let r = s.request; + const e = l; + if (l === e) + if ('string' == typeof r) { + if (r.length < 1) { const r = { - params: { - type: 'string', - }, + params: {}, }; null === a ? (a = [r]) : a.push(r), l++; } - (p = e === l), (n = n || p); + } else { + const r = { + params: { + type: 'string', + }, + }; + null === a ? (a = [r]) : a.push(r), l++; } - if (n) (l = t), null !== a && (t ? (a.length = t) : (a = null)); - else { + i = e === l; + } else i = !0; + if (i) { + if (void 0 !== s.eager) { + const r = l; + if ('boolean' != typeof s.eager) { const r = { - params: {}, + params: { + type: 'boolean', + }, }; null === a ? (a = [r]) : a.push(r), l++; } - i = e === l; + var i = r === l; } else i = !0; if (i) { - if (void 0 !== s.shareKey) { - let r = s.shareKey; - const e = l; - if (l === e) - if ('string' == typeof r) { - if (r.length < 1) { - const r = { - params: {}, - }; - null === a ? (a = [r]) : a.push(r), l++; - } - } else { + if (void 0 !== s.requiredVersion) { + let r = s.requiredVersion; + const e = l, + t = l; + let n = !1; + const o = l; + if (!1 !== r) { + const r = { + params: {}, + }; + null === a ? (a = [r]) : a.push(r), l++; + } + var p = o === l; + if (((n = n || p), !n)) { + const e = l; + if ('string' != typeof r) { const r = { params: { type: 'string', @@ -126,11 +119,21 @@ function r( }; null === a ? (a = [r]) : a.push(r), l++; } + (p = e === l), (n = n || p); + } + if (n) + (l = t), null !== a && (t ? (a.length = t) : (a = null)); + else { + const r = { + params: {}, + }; + null === a ? (a = [r]) : a.push(r), l++; + } i = e === l; } else i = !0; if (i) { - if (void 0 !== s.shareScope) { - let r = s.shareScope; + if (void 0 !== s.shareKey) { + let r = s.shareKey; const e = l; if (l === e) if ('string' == typeof r) { @@ -151,22 +154,31 @@ function r( i = e === l; } else i = !0; if (i) { - if (void 0 !== s.singleton) { - const r = l; - if ('boolean' != typeof s.singleton) { - const r = { - params: { - type: 'boolean', - }, - }; - null === a ? (a = [r]) : a.push(r), l++; - } - i = r === l; + if (void 0 !== s.shareScope) { + let r = s.shareScope; + const e = l; + if (l === e) + if ('string' == typeof r) { + if (r.length < 1) { + const r = { + params: {}, + }; + null === a ? (a = [r]) : a.push(r), l++; + } + } else { + const r = { + params: { + type: 'string', + }, + }; + null === a ? (a = [r]) : a.push(r), l++; + } + i = e === l; } else i = !0; if (i) { - if (void 0 !== s.strictVersion) { + if (void 0 !== s.singleton) { const r = l; - if ('boolean' != typeof s.strictVersion) { + if ('boolean' != typeof s.singleton) { const r = { params: { type: 'boolean', @@ -176,43 +188,80 @@ function r( } i = r === l; } else i = !0; - if (i) - if (void 0 !== s.version) { - let r = s.version; - const e = l, - t = l; - let n = !1; - const o = l; - if (!1 !== r) { + if (i) { + if (void 0 !== s.strictVersion) { + const r = l; + if ('boolean' != typeof s.strictVersion) { const r = { - params: {}, + params: { + type: 'boolean', + }, }; null === a ? (a = [r]) : a.push(r), l++; } - var f = o === l; - if (((n = n || f), !n)) { - const e = l; - if ('string' != typeof r) { + i = r === l; + } else i = !0; + if (i) + if (void 0 !== s.version) { + let r = s.version; + const e = l, + t = l; + let n = !1; + const o = l; + if (!1 !== r) { const r = { - params: { - type: 'string', - }, + params: {}, }; null === a ? (a = [r]) : a.push(r), l++; } - (f = e === l), (n = n || f); - } - if (n) - (l = t), - null !== a && (t ? (a.length = t) : (a = null)); - else { - const r = { - params: {}, - }; - null === a ? (a = [r]) : a.push(r), l++; - } - i = e === l; - } else i = !0; + var f = o === l; + if (((n = n || f), !n)) { + const e = l; + if ('string' != typeof r) { + const r = { + params: { + type: 'string', + }, + }; + null === a ? (a = [r]) : a.push(r), l++; + } + (f = e === l), (n = n || f); + } + if (n) + (l = t), + null !== a && (t ? (a.length = t) : (a = null)); + else { + const r = { + params: {}, + }; + null === a ? (a = [r]) : a.push(r), l++; + } + i = e === l; + } else i = !0; + if (i) { + if (void 0 !== s.layer) { + let r = s.layer; + const e = l; + if (l === e) + if ('string' == typeof r) { + if (r.length < 1) { + const r = { + params: {}, + }; + null === a ? (a = [r]) : a.push(r), l++; + } + } else { + const r = { + params: { + type: 'string', + }, + }; + null === a ? (a = [r]) : a.push(r), l++; + } + i = e === l; + } else i = !0; + } + } } } } diff --git a/packages/enhanced/src/schemas/sharing/ProviderSharedPlugin.ts b/packages/enhanced/src/schemas/sharing/ProviderSharedPlugin.ts index b2edd1b2676..6d4c687f9e5 100644 --- a/packages/enhanced/src/schemas/sharing/ProviderSharedPlugin.ts +++ b/packages/enhanced/src/schemas/sharing/ProviderSharedPlugin.ts @@ -1,4 +1,3 @@ -//@ts-nocheck export default { definitions: { Provides: { @@ -86,6 +85,17 @@ export default { }, ], }, + layer: { + description: 'Layer for the shared module.', + type: 'string', + minLength: 1, + }, + request: { + description: + 'The actual request to use for importing the module. If not specified, the property name/key will be used.', + type: 'string', + minLength: 1, + }, }, }, ProvidesItem: { diff --git a/packages/enhanced/test/configCases/layers/1-layers-full/App.js b/packages/enhanced/test/configCases/layers/1-layers-full/App.js new file mode 100644 index 00000000000..586ff1e77f1 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/1-layers-full/App.js @@ -0,0 +1,9 @@ +import React, { layeredComponentsReact } from 'react'; +import ComponentA from 'containerA/ComponentA'; +import ComponentALayers from 'containerA/ComponentALayers'; +import LocalComponentALayers from './ComponentALayers'; +import LocalComponentA from './ComponentA'; + +export default () => { + return `App rendered with [${React()}] ${layeredComponentsReact()}, ${LocalComponentALayers()}, ${LocalComponentA()}, [${ComponentA()}] and [${ComponentALayers()}]`; +}; diff --git a/packages/enhanced/test/configCases/layers/1-layers-full/ComponentA.js b/packages/enhanced/test/configCases/layers/1-layers-full/ComponentA.js new file mode 100644 index 00000000000..901d49caffa --- /dev/null +++ b/packages/enhanced/test/configCases/layers/1-layers-full/ComponentA.js @@ -0,0 +1,5 @@ +import React, { layeredComponentsReact } from 'react'; + +export default () => { + return `ComponentA rendered with [${React()}]${layeredComponentsReact()}`; +}; diff --git a/packages/enhanced/test/configCases/layers/1-layers-full/ComponentALayers.js b/packages/enhanced/test/configCases/layers/1-layers-full/ComponentALayers.js new file mode 100644 index 00000000000..01020a3b79d --- /dev/null +++ b/packages/enhanced/test/configCases/layers/1-layers-full/ComponentALayers.js @@ -0,0 +1,6 @@ +import React, { layeredComponentsReact } from 'react'; + +export default () => { + return `ComponentALayers ${React()} rendered with [${layeredComponentsReact()}]`; +}; +export { React }; diff --git a/packages/enhanced/test/configCases/layers/1-layers-full/index.js b/packages/enhanced/test/configCases/layers/1-layers-full/index.js new file mode 100644 index 00000000000..ce88b718c04 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/1-layers-full/index.js @@ -0,0 +1,8 @@ +it('should load the component from container', () => { + return import('./App').then(({ default: App }) => { + const rendered = App(); + expect(rendered).toBe( + 'App rendered with [This is react 0.1.2] No Layer (1-layers-full), ComponentALayers This is react 0.1.2 rendered with [This is layered react (1-layers-full)], ComponentA rendered with [This is react 0.1.2]No Layer (1-layers-full), [ComponentA rendered with [This is react 0.1.2]No Layer (1-layers-full)] and [ComponentALayers This is react 0.1.2 rendered with [This is layered react (1-layers-full)]]', + ); + }); +}); diff --git a/packages/enhanced/test/configCases/layers/1-layers-full/layered-react-loader.js b/packages/enhanced/test/configCases/layers/1-layers-full/layered-react-loader.js new file mode 100644 index 00000000000..852bdbd3858 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/1-layers-full/layered-react-loader.js @@ -0,0 +1,4 @@ +// DO NOT EDIT +module.exports = function (source) { + return source.replace('No Layer', 'This is layered react'); +}; diff --git a/packages/enhanced/test/configCases/layers/1-layers-full/layered-upgrade-react.js b/packages/enhanced/test/configCases/layers/1-layers-full/layered-upgrade-react.js new file mode 100644 index 00000000000..8ae169d2e45 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/1-layers-full/layered-upgrade-react.js @@ -0,0 +1,10 @@ +import React from 'react'; + +// This file will be processed by the layered loader +export default function initializeLayeredReactVersion() { + // Set the layered React version + React.setVersion('1.2.3'); +} + +// Initialize version immediately +initializeLayeredReactVersion(); diff --git a/packages/enhanced/test/configCases/layers/1-layers-full/node_modules/react.js b/packages/enhanced/test/configCases/layers/1-layers-full/node_modules/react.js new file mode 100644 index 00000000000..4b536eeef07 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/1-layers-full/node_modules/react.js @@ -0,0 +1,4 @@ +let version = "0.1.2"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } +export const layeredComponentsReact = () => "No Layer (1-layers-full)"; diff --git a/packages/enhanced/test/configCases/layers/1-layers-full/test.config.js b/packages/enhanced/test/configCases/layers/1-layers-full/test.config.js new file mode 100644 index 00000000000..861157bc4ed --- /dev/null +++ b/packages/enhanced/test/configCases/layers/1-layers-full/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle: function (i, options) { + return i === 0 ? './main.js' : './module/main.mjs'; + }, +}; diff --git a/packages/enhanced/test/configCases/layers/1-layers-full/webpack.config.js b/packages/enhanced/test/configCases/layers/1-layers-full/webpack.config.js new file mode 100644 index 00000000000..50e91f770bd --- /dev/null +++ b/packages/enhanced/test/configCases/layers/1-layers-full/webpack.config.js @@ -0,0 +1,104 @@ +const { ModuleFederationPlugin } = require('../../../../dist/src'); +const path = require('path'); + +const common = { + name: 'layer_container', + exposes: { + './ComponentA': { + import: './ComponentA', + }, + './ComponentALayers': { + import: './ComponentALayers', + }, + }, + shared: { + react: { + version: '18.0.0', + requiredVersion: '^18.0.0', + singleton: true, + }, + 'layered-react': { + request: 'react', + import: 'react', + shareKey: 'react', + version: '16.0.0', + requiredVersion: '^16.0.0', + singleton: true, + layer: 'layered-components', + issuerLayer: 'layered-components', + }, + }, +}; + +const commonConfig = { + devtool: false, + experiments: { + layers: true, + }, + entry: './index.js', + mode: 'development', + module: { + rules: [ + { + test: /ComponentALayers\.js$/, + layer: 'layered-components', + }, + { + test: /react\.js$/, + issuerLayer: 'layered-components', + layer: 'layered-components', + use: [ + { + loader: path.resolve(__dirname, './layered-react-loader.js'), + }, + ], + }, + ], + }, +}; + +module.exports = [ + { + ...commonConfig, + output: { + filename: '[name].js', + uniqueName: '1-layers-full', + }, + plugins: [ + new ModuleFederationPlugin({ + library: { type: 'commonjs-module' }, + filename: 'container.js', + remotes: { + containerA: { + external: './container.js', + }, + }, + ...common, + }), + ], + }, + { + ...commonConfig, + experiments: { + ...commonConfig.experiments, + outputModule: true, + }, + output: { + filename: 'module/[name].mjs', + uniqueName: '1-layers-full-mjs', + }, + plugins: [ + new ModuleFederationPlugin({ + library: { type: 'module' }, + filename: 'module/container.mjs', + remotes: { + containerA: { + external: './container.mjs', + }, + }, + ...common, + }), + ], + target: 'node14', + }, +]; diff --git a/packages/enhanced/test/configCases/layers/2-layers-full/App.js b/packages/enhanced/test/configCases/layers/2-layers-full/App.js new file mode 100644 index 00000000000..9ff7833b665 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/2-layers-full/App.js @@ -0,0 +1,10 @@ +import React, { layeredComponentsReact } from 'react'; +import ComponentA from 'containerA/ComponentA'; +import ComponentB from 'containerB/ComponentB'; +import ComponentALayers from 'containerB/ComponentALayers'; +import LocalComponentB from './ComponentB'; +import LocalComponentALayers from './ComponentALayers'; + +export default () => { + return `App rendered with [${React()}] ${layeredComponentsReact()} and ${ComponentALayers()} and ${LocalComponentALayers()} and [${ComponentA()}] and [${ComponentB()}] and ${LocalComponentB()}`; +}; diff --git a/packages/enhanced/test/configCases/layers/2-layers-full/ComponentALayers.js b/packages/enhanced/test/configCases/layers/2-layers-full/ComponentALayers.js new file mode 100644 index 00000000000..ffa31ab54d0 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/2-layers-full/ComponentALayers.js @@ -0,0 +1,5 @@ +import React, { layeredComponentsReact } from 'react'; + +export default function ComponentALayers() { + return `LocalComponentALayers ${React()} (Layered React: ${layeredComponentsReact()})`; +} diff --git a/packages/enhanced/test/configCases/layers/2-layers-full/ComponentB.js b/packages/enhanced/test/configCases/layers/2-layers-full/ComponentB.js new file mode 100644 index 00000000000..8d129ac0cdf --- /dev/null +++ b/packages/enhanced/test/configCases/layers/2-layers-full/ComponentB.js @@ -0,0 +1,5 @@ +import React, { layeredComponentsReact } from 'react'; + +export default () => { + return `LocalComponentB rendered with [${React()}] ${layeredComponentsReact()}`; +}; diff --git a/packages/enhanced/test/configCases/layers/2-layers-full/ComponentC.js b/packages/enhanced/test/configCases/layers/2-layers-full/ComponentC.js new file mode 100644 index 00000000000..8cf6fcf3fa8 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/2-layers-full/ComponentC.js @@ -0,0 +1,7 @@ +import React, { layeredComponentsReact } from 'react'; +import ComponentA from 'containerA/ComponentA'; +import ComponentB from 'containerB/ComponentB'; + +export default () => { + return `LocalComponentC rendered with [${React()}] ${layeredComponentsReact()} and [${ComponentA()}] and [${ComponentB()}]`; +}; diff --git a/packages/enhanced/test/configCases/layers/2-layers-full/index.js b/packages/enhanced/test/configCases/layers/2-layers-full/index.js new file mode 100644 index 00000000000..e550127f55c --- /dev/null +++ b/packages/enhanced/test/configCases/layers/2-layers-full/index.js @@ -0,0 +1,41 @@ +it('should load the component from container and verify correct layer sources', () => { + return import('./App').then(({ default: App }) => { + const rendered = App(); + + // Verify that content comes from 2-layers-full + expect(rendered).toContain('This is react 2.1.0'); + expect(rendered).toContain('This is layered react (2-layers-full)'); + + // Verify that no content comes from 1-layers-full + expect(rendered).not.toContain('This is react 1.1.0'); + expect(rendered).not.toContain('This is layered react (1-layers-full)'); + + // Full string verification for complete assurance + expect(rendered).toBe( + 'App rendered with [This is react 0.1.2] No Layer (1-layers-full) and LocalComponentALayers This is react 2.1.0 (Layered React: This is layered react (2-layers-full)) and LocalComponentALayers This is react 2.1.0 (Layered React: This is layered react (2-layers-full)) and [ComponentA rendered with [This is react 0.1.2]No Layer (1-layers-full)] and [LocalComponentB rendered with [This is react 0.1.2] No Layer (1-layers-full)] and LocalComponentB rendered with [This is react 0.1.2] No Layer (1-layers-full)', + ); + }); +}); + +it('should update React version after upgrade', async () => { + const { default: App } = await import('./App'); + const initialRendered = App(); + + // Import and execute the upgrade + await import('./layered-upgrade-react'); + + const upgradedRendered = App(); + + // Verify that layered components got upgraded to 1.2.3 + expect(upgradedRendered).toContain('This is react 1.2.3'); + expect(upgradedRendered).toContain('This is layered react (2-layers-full)'); + + // Verify that non-layered components still use original version + expect(upgradedRendered).toContain('[This is react 0.1.2] No Layer'); + expect(upgradedRendered).not.toContain('[This is react 1.2.3]'); + + // Full string verification for complete assurance + expect(upgradedRendered).toBe( + 'App rendered with [This is react 0.1.2] No Layer (1-layers-full) and LocalComponentALayers This is react 1.2.3 (Layered React: This is layered react (2-layers-full)) and LocalComponentALayers This is react 1.2.3 (Layered React: This is layered react (2-layers-full)) and [ComponentA rendered with [This is react 0.1.2]No Layer (1-layers-full)] and [LocalComponentB rendered with [This is react 0.1.2] No Layer (1-layers-full)] and LocalComponentB rendered with [This is react 0.1.2] No Layer (1-layers-full)', + ); +}); diff --git a/packages/enhanced/test/configCases/layers/2-layers-full/layered-react-loader.js b/packages/enhanced/test/configCases/layers/2-layers-full/layered-react-loader.js new file mode 100644 index 00000000000..12fcb27cc3c --- /dev/null +++ b/packages/enhanced/test/configCases/layers/2-layers-full/layered-react-loader.js @@ -0,0 +1,4 @@ +module.exports = function (source) { + const transformed = source.replace('No Layer', 'This is layered react'); + return transformed; +}; diff --git a/packages/enhanced/test/configCases/layers/2-layers-full/layered-upgrade-react.js b/packages/enhanced/test/configCases/layers/2-layers-full/layered-upgrade-react.js new file mode 100644 index 00000000000..8ad36bf2dc6 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/2-layers-full/layered-upgrade-react.js @@ -0,0 +1,10 @@ +import React, { setVersion } from 'react'; + +// This file will be processed by the layered loader +export default function initializeLayeredReactVersion() { + // Set the layered React version + setVersion('1.2.3'); +} + +// Initialize version immediately +initializeLayeredReactVersion(); diff --git a/packages/enhanced/test/configCases/layers/2-layers-full/node_modules/react.js b/packages/enhanced/test/configCases/layers/2-layers-full/node_modules/react.js new file mode 100644 index 00000000000..f526a4d3939 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/2-layers-full/node_modules/react.js @@ -0,0 +1,4 @@ +let version = "2.1.0"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } +export const layeredComponentsReact = () => "No Layer (2-layers-full)"; diff --git a/packages/enhanced/test/configCases/layers/2-layers-full/test.config.js b/packages/enhanced/test/configCases/layers/2-layers-full/test.config.js new file mode 100644 index 00000000000..861157bc4ed --- /dev/null +++ b/packages/enhanced/test/configCases/layers/2-layers-full/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle: function (i, options) { + return i === 0 ? './main.js' : './module/main.mjs'; + }, +}; diff --git a/packages/enhanced/test/configCases/layers/2-layers-full/webpack.config.js b/packages/enhanced/test/configCases/layers/2-layers-full/webpack.config.js new file mode 100644 index 00000000000..4d30ff6aa24 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/2-layers-full/webpack.config.js @@ -0,0 +1,114 @@ +const { ModuleFederationPlugin } = require('../../../../dist/src'); +const path = require('path'); + +const common = { + entry: { + main: './index.js', + }, + // optimization: { + // runtimeChunk: 'single', + // }, +}; + +const commonMF = { + runtime: false, + exposes: { + './ComponentB': './ComponentB', + './ComponentC': './ComponentC', + './ComponentALayers': './ComponentALayers', + }, + shared: { + react: { + version: '17.0.0', + requiredVersion: '^17.0.0', + singleton: true, + }, + 'layered-react': { + request: 'react', + import: 'react', + shareKey: 'react', + version: '17.0.0', + requiredVersion: '^17.0.0', + singleton: true, + layer: 'layered-components', + issuerLayer: 'layered-components', + }, + }, +}; + +const commonConfig = { + ...common, + devtool: false, + experiments: { + layers: true, + }, + module: { + rules: [ + { + test: /ComponentALayers\.js$/, + layer: 'layered-components', + }, + { + test: /layered-upgrade-react\.js$/, + layer: 'layered-components', + }, + { + test: /react\.js$/, + issuerLayer: 'layered-components', + layer: 'layered-components', + use: [ + { + loader: path.resolve(__dirname, './layered-react-loader.js'), + }, + ], + }, + ], + }, +}; + +/** @type {import("../../../../").Configuration[]} */ +module.exports = [ + { + ...commonConfig, + output: { + filename: '[name].js', + uniqueName: '2-layers-full', + }, + plugins: [ + new ModuleFederationPlugin({ + name: 'layers_container_2', + library: { type: 'commonjs-module' }, + filename: 'container.js', + remotes: { + containerA: '../1-layers-full/container.js', + containerB: './container.js', + }, + ...commonMF, + }), + ], + }, + { + ...commonConfig, + experiments: { + ...commonConfig.experiments, + outputModule: true, + }, + output: { + filename: 'module/[name].mjs', + uniqueName: '2-layers-full-mjs', + }, + plugins: [ + new ModuleFederationPlugin({ + name: 'layers_container_2', + library: { type: 'module' }, + filename: 'module/container.mjs', + remotes: { + containerA: '../../1-layers-full/module/container.mjs', + containerB: './container.mjs', + }, + ...commonMF, + }), + ], + target: 'node14', + }, +]; diff --git a/packages/enhanced/test/configCases/layers/3-layers-full/App.js b/packages/enhanced/test/configCases/layers/3-layers-full/App.js new file mode 100644 index 00000000000..945e6682942 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/3-layers-full/App.js @@ -0,0 +1,5 @@ +import React from 'react'; + +export default function App() { + return `App rendered with React version: [${React()}]`; +} diff --git a/packages/enhanced/test/configCases/layers/3-layers-full/ComponentA.js b/packages/enhanced/test/configCases/layers/3-layers-full/ComponentA.js new file mode 100644 index 00000000000..8f29fee8d0d --- /dev/null +++ b/packages/enhanced/test/configCases/layers/3-layers-full/ComponentA.js @@ -0,0 +1,5 @@ +import React from 'react'; + +export default function ComponentA() { + return `ComponentA rendered with React version: [${React()}]`; +} diff --git a/packages/enhanced/test/configCases/layers/3-layers-full/index.js b/packages/enhanced/test/configCases/layers/3-layers-full/index.js new file mode 100644 index 00000000000..14a7d9498c8 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/3-layers-full/index.js @@ -0,0 +1,6 @@ +it('should load App with React', () => { + return import('./App').then(({ default: App }) => { + const rendered = App(); + expect(rendered).toContain('App rendered with React version:'); + }); +}); diff --git a/packages/enhanced/test/configCases/layers/3-layers-full/node_modules/react.js b/packages/enhanced/test/configCases/layers/3-layers-full/node_modules/react.js new file mode 100644 index 00000000000..6e63243a6eb --- /dev/null +++ b/packages/enhanced/test/configCases/layers/3-layers-full/node_modules/react.js @@ -0,0 +1,4 @@ +let version = "0.1.2"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } +export const layeredComponentsReact = () => "__PLACEHOLDER__"; diff --git a/packages/enhanced/test/configCases/layers/3-layers-full/package.json b/packages/enhanced/test/configCases/layers/3-layers-full/package.json new file mode 100644 index 00000000000..4e44b5b102f --- /dev/null +++ b/packages/enhanced/test/configCases/layers/3-layers-full/package.json @@ -0,0 +1,11 @@ +{ + "name": "3-layers-full", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "webpack --config=webpack.config.js" + }, + "dependencies": { + "react": "1.0.0" + } +} diff --git a/packages/enhanced/test/configCases/layers/3-layers-full/test.config.js b/packages/enhanced/test/configCases/layers/3-layers-full/test.config.js new file mode 100644 index 00000000000..861157bc4ed --- /dev/null +++ b/packages/enhanced/test/configCases/layers/3-layers-full/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle: function (i, options) { + return i === 0 ? './main.js' : './module/main.mjs'; + }, +}; diff --git a/packages/enhanced/test/configCases/layers/3-layers-full/webpack.config.js b/packages/enhanced/test/configCases/layers/3-layers-full/webpack.config.js new file mode 100644 index 00000000000..d784a8d550e --- /dev/null +++ b/packages/enhanced/test/configCases/layers/3-layers-full/webpack.config.js @@ -0,0 +1,56 @@ +const { ModuleFederationPlugin } = require('../../../../dist/src'); + +const common = { + name: 'container_a', + filename: 'container.js', + exposes: { + './ComponentA': './ComponentA', + }, + shared: { + react: { + singleton: true, + requiredVersion: false, + version: false, + }, + }, +}; + +const commonConfig = { + entry: './index.js', + mode: 'development', + devtool: false, +}; + +module.exports = [ + { + ...commonConfig, + output: { + filename: '[name].js', + uniqueName: '3-layers-full', + }, + plugins: [ + new ModuleFederationPlugin({ + library: { type: 'commonjs-module' }, + ...common, + }), + ], + }, + { + ...commonConfig, + experiments: { + outputModule: true, + }, + output: { + filename: 'module/[name].mjs', + uniqueName: '3-layers-full-mjs', + }, + plugins: [ + new ModuleFederationPlugin({ + ...common, + library: { type: 'module' }, + filename: 'module/container.mjs', + }), + ], + target: 'node14', + }, +]; diff --git a/packages/enhanced/test/configCases/layers/4-layers-full/App.js b/packages/enhanced/test/configCases/layers/4-layers-full/App.js new file mode 100644 index 00000000000..4bf075846f3 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/4-layers-full/App.js @@ -0,0 +1,6 @@ +import React from 'react'; +import ComponentA from 'containerA/ComponentA'; + +export default function App() { + return `App rendered with React version: [${React()}]\nand remote component: [${ComponentA()}]`; +} diff --git a/packages/enhanced/test/configCases/layers/4-layers-full/ComponentA.js b/packages/enhanced/test/configCases/layers/4-layers-full/ComponentA.js new file mode 100644 index 00000000000..6061e699763 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/4-layers-full/ComponentA.js @@ -0,0 +1,5 @@ +import React from 'react'; + +export default function ComponentA() { + return `ComponentA (Regular React: ${React()})`; +} diff --git a/packages/enhanced/test/configCases/layers/4-layers-full/index.js b/packages/enhanced/test/configCases/layers/4-layers-full/index.js new file mode 100644 index 00000000000..7e469d81022 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/4-layers-full/index.js @@ -0,0 +1,9 @@ +it('should load App with React and remote component', async () => { + const App = (await import('./App')).default; + const upgrade = (await import('./upgrade-react')).default; + upgrade(); + const rendered = App(); + expect(rendered).toBe( + 'App rendered with React version: [This is react 1.2.3]\nand remote component: [ComponentA rendered with React version: [This is react 1.2.3]]', + ); +}); diff --git a/packages/enhanced/test/configCases/layers/4-layers-full/node_modules/react.js b/packages/enhanced/test/configCases/layers/4-layers-full/node_modules/react.js new file mode 100644 index 00000000000..6e63243a6eb --- /dev/null +++ b/packages/enhanced/test/configCases/layers/4-layers-full/node_modules/react.js @@ -0,0 +1,4 @@ +let version = "0.1.2"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } +export const layeredComponentsReact = () => "__PLACEHOLDER__"; diff --git a/packages/enhanced/test/configCases/layers/4-layers-full/package.json b/packages/enhanced/test/configCases/layers/4-layers-full/package.json new file mode 100644 index 00000000000..be6238fec84 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/4-layers-full/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "engines": { + "node": ">=10.13.0" + }, + "dependencies": { + "react": "*" + } +} diff --git a/packages/enhanced/test/configCases/layers/4-layers-full/test.config.js b/packages/enhanced/test/configCases/layers/4-layers-full/test.config.js new file mode 100644 index 00000000000..861157bc4ed --- /dev/null +++ b/packages/enhanced/test/configCases/layers/4-layers-full/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle: function (i, options) { + return i === 0 ? './main.js' : './module/main.mjs'; + }, +}; diff --git a/packages/enhanced/test/configCases/layers/4-layers-full/upgrade-react.js b/packages/enhanced/test/configCases/layers/4-layers-full/upgrade-react.js new file mode 100644 index 00000000000..5bf08a67d5a --- /dev/null +++ b/packages/enhanced/test/configCases/layers/4-layers-full/upgrade-react.js @@ -0,0 +1,5 @@ +import { setVersion } from 'react'; + +export default function upgrade() { + setVersion('1.2.3'); +} diff --git a/packages/enhanced/test/configCases/layers/4-layers-full/webpack.config.js b/packages/enhanced/test/configCases/layers/4-layers-full/webpack.config.js new file mode 100644 index 00000000000..1872fc88e02 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/4-layers-full/webpack.config.js @@ -0,0 +1,60 @@ +const { ModuleFederationPlugin } = require('../../../../dist/src'); + +const common = { + name: 'container_b', + filename: 'container.js', + shared: { + react: { + singleton: true, + requiredVersion: false, + version: false, + import: false, + }, + }, +}; + +const commonConfig = { + entry: './index.js', + mode: 'development', + devtool: false, +}; + +module.exports = [ + { + ...commonConfig, + output: { + filename: '[name].js', + uniqueName: '4-layers-full', + }, + plugins: [ + new ModuleFederationPlugin({ + ...common, + library: { type: 'commonjs-module' }, + remotes: { + containerA: '../3-layers-full/container.js', + }, + }), + ], + }, + { + ...commonConfig, + experiments: { + outputModule: true, + }, + output: { + filename: 'module/[name].mjs', + uniqueName: '4-layers-full-mjs', + }, + plugins: [ + new ModuleFederationPlugin({ + ...common, + library: { type: 'module' }, + filename: 'module/container.mjs', + remotes: { + containerA: '../../3-layers-full/module/container.mjs', + }, + }), + ], + target: 'node14', + }, +]; diff --git a/packages/enhanced/test/configCases/layers/5-layers-full/App.js b/packages/enhanced/test/configCases/layers/5-layers-full/App.js new file mode 100644 index 00000000000..8a119b3f7d3 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/5-layers-full/App.js @@ -0,0 +1,5 @@ +import React, { layeredComponentsReact } from 'react'; +import ComponentA from './ComponentA'; +export default function App() { + return `App rendered with React version: [${React()}] with layer [${layeredComponentsReact()}] ${ComponentA()}`; +} diff --git a/packages/enhanced/test/configCases/layers/5-layers-full/ComponentA.js b/packages/enhanced/test/configCases/layers/5-layers-full/ComponentA.js new file mode 100644 index 00000000000..5b79dff5d58 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/5-layers-full/ComponentA.js @@ -0,0 +1,5 @@ +import React, { layeredComponentsReact } from 'react'; + +export default function ComponentA() { + return `ComponentA rendered with React version: [${React()}] with layer [${layeredComponentsReact()}]`; +} diff --git a/packages/enhanced/test/configCases/layers/5-layers-full/index.js b/packages/enhanced/test/configCases/layers/5-layers-full/index.js new file mode 100644 index 00000000000..981a06554f0 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/5-layers-full/index.js @@ -0,0 +1,8 @@ +it('should load App with React', () => { + return import('./App').then(({ default: App }) => { + const rendered = App(); + expect(rendered).toBe( + 'App rendered with React version: [This is react 0.1.2] with layer [This is layered react] ComponentA rendered with React version: [This is react 0.1.2] with layer [This is layered react]', + ); + }); +}); diff --git a/packages/enhanced/test/configCases/layers/5-layers-full/layered-react-loader.js b/packages/enhanced/test/configCases/layers/5-layers-full/layered-react-loader.js new file mode 100644 index 00000000000..da3314523b7 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/5-layers-full/layered-react-loader.js @@ -0,0 +1,3 @@ +module.exports = function (source) { + return source.replace('__PLACEHOLDER__', 'This is layered react'); +}; diff --git a/packages/enhanced/test/configCases/layers/5-layers-full/node_modules/react.js b/packages/enhanced/test/configCases/layers/5-layers-full/node_modules/react.js new file mode 100644 index 00000000000..6e63243a6eb --- /dev/null +++ b/packages/enhanced/test/configCases/layers/5-layers-full/node_modules/react.js @@ -0,0 +1,4 @@ +let version = "0.1.2"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } +export const layeredComponentsReact = () => "__PLACEHOLDER__"; diff --git a/packages/enhanced/test/configCases/layers/5-layers-full/package.json b/packages/enhanced/test/configCases/layers/5-layers-full/package.json new file mode 100644 index 00000000000..4e44b5b102f --- /dev/null +++ b/packages/enhanced/test/configCases/layers/5-layers-full/package.json @@ -0,0 +1,11 @@ +{ + "name": "3-layers-full", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "webpack --config=webpack.config.js" + }, + "dependencies": { + "react": "1.0.0" + } +} diff --git a/packages/enhanced/test/configCases/layers/5-layers-full/test.config.js b/packages/enhanced/test/configCases/layers/5-layers-full/test.config.js new file mode 100644 index 00000000000..861157bc4ed --- /dev/null +++ b/packages/enhanced/test/configCases/layers/5-layers-full/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle: function (i, options) { + return i === 0 ? './main.js' : './module/main.mjs'; + }, +}; diff --git a/packages/enhanced/test/configCases/layers/5-layers-full/webpack.config.js b/packages/enhanced/test/configCases/layers/5-layers-full/webpack.config.js new file mode 100644 index 00000000000..5f785355ded --- /dev/null +++ b/packages/enhanced/test/configCases/layers/5-layers-full/webpack.config.js @@ -0,0 +1,74 @@ +const { ModuleFederationPlugin } = require('../../../../dist/src'); + +const common = { + name: 'container_5', + filename: 'container.js', + exposes: { + './ComponentA': './ComponentA', + }, + shared: { + react: { + singleton: true, + requiredVersion: false, + layer: 'react-layer', + issuerLayer: 'react-layer', + }, + }, +}; + +const commonConfig = { + entry: './index.js', + mode: 'development', + devtool: false, + experiments: { + layers: true, + }, + module: { + rules: [ + { + test: /\.js$/, + layer: 'react-layer', + }, + { + test: /react\.js$/, + issuerLayer: 'react-layer', + loader: require.resolve('./layered-react-loader'), + }, + ], + }, +}; + +module.exports = [ + { + ...commonConfig, + output: { + filename: '[name].js', + uniqueName: '5-layers-full', + }, + plugins: [ + new ModuleFederationPlugin({ + ...common, + library: { type: 'commonjs-module' }, + }), + ], + }, + { + ...commonConfig, + experiments: { + ...commonConfig.experiments, + outputModule: true, + }, + output: { + filename: 'module/[name].mjs', + uniqueName: '5-layers-full-mjs', + }, + plugins: [ + new ModuleFederationPlugin({ + ...common, + library: { type: 'module' }, + filename: 'module/container.mjs', + }), + ], + target: 'node14', + }, +]; diff --git a/packages/enhanced/test/configCases/layers/6-layers-full/App.js b/packages/enhanced/test/configCases/layers/6-layers-full/App.js new file mode 100644 index 00000000000..7de9a37e079 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/6-layers-full/App.js @@ -0,0 +1,7 @@ +import React from 'react'; +import ComponentA from 'containerA/ComponentA'; +import LocalComponentA from './ComponentA'; + +export default function App() { + return `App rendered with React version: [${React()}]\nand remote component: [${ComponentA()}]\n and local component: [${LocalComponentA()}]`; +} diff --git a/packages/enhanced/test/configCases/layers/6-layers-full/ComponentA.js b/packages/enhanced/test/configCases/layers/6-layers-full/ComponentA.js new file mode 100644 index 00000000000..afbe0b90b43 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/6-layers-full/ComponentA.js @@ -0,0 +1,5 @@ +import React, { layeredComponentsReact } from 'react'; + +export default function ComponentA() { + return `ComponentA with React: ${React()} layered with ${layeredComponentsReact()}`; +} diff --git a/packages/enhanced/test/configCases/layers/6-layers-full/index.js b/packages/enhanced/test/configCases/layers/6-layers-full/index.js new file mode 100644 index 00000000000..caa03f691d3 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/6-layers-full/index.js @@ -0,0 +1,8 @@ +it('should load App with React and remote component', () => { + return import('./App').then(({ default: App }) => { + const rendered = App(); + expect(rendered).toBe( + 'App rendered with React version: [This is react 0.1.2]\nand remote component: [ComponentA rendered with React version: [This is react 0.1.2] with layer [This is layered react]]\n and local component: [ComponentA with React: This is react 0.1.2 layered with This is layered react]', + ); + }); +}); diff --git a/packages/enhanced/test/configCases/layers/6-layers-full/node_modules/react.js b/packages/enhanced/test/configCases/layers/6-layers-full/node_modules/react.js new file mode 100644 index 00000000000..6e63243a6eb --- /dev/null +++ b/packages/enhanced/test/configCases/layers/6-layers-full/node_modules/react.js @@ -0,0 +1,4 @@ +let version = "0.1.2"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } +export const layeredComponentsReact = () => "__PLACEHOLDER__"; diff --git a/packages/enhanced/test/configCases/layers/6-layers-full/package.json b/packages/enhanced/test/configCases/layers/6-layers-full/package.json new file mode 100644 index 00000000000..be6238fec84 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/6-layers-full/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "engines": { + "node": ">=10.13.0" + }, + "dependencies": { + "react": "*" + } +} diff --git a/packages/enhanced/test/configCases/layers/6-layers-full/test.config.js b/packages/enhanced/test/configCases/layers/6-layers-full/test.config.js new file mode 100644 index 00000000000..861157bc4ed --- /dev/null +++ b/packages/enhanced/test/configCases/layers/6-layers-full/test.config.js @@ -0,0 +1,5 @@ +module.exports = { + findBundle: function (i, options) { + return i === 0 ? './main.js' : './module/main.mjs'; + }, +}; diff --git a/packages/enhanced/test/configCases/layers/6-layers-full/webpack.config.js b/packages/enhanced/test/configCases/layers/6-layers-full/webpack.config.js new file mode 100644 index 00000000000..fa992342c17 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/6-layers-full/webpack.config.js @@ -0,0 +1,79 @@ +const { ModuleFederationPlugin } = require('../../../../dist/src'); + +const common = { + name: 'container_6', + filename: 'container.js', + remotes: { + containerA: { + external: '../5-layers-full/container.js', + }, + }, + shared: { + react: { + request: 'react', + import: false, + shareKey: 'react', + singleton: true, + requiredVersion: false, + layer: 'react-layer', + issuerLayer: 'react-layer', + }, + }, +}; + +const commonConfig = { + entry: './index.js', + mode: 'development', + devtool: false, + experiments: { + layers: true, + }, + module: { + rules: [ + { + test: /\.js$/, + layer: 'react-layer', + }, + ], + }, +}; + +module.exports = [ + { + ...commonConfig, + output: { + filename: '[name].js', + uniqueName: '6-layers-full', + }, + plugins: [ + new ModuleFederationPlugin({ + ...common, + library: { type: 'commonjs-module' }, + }), + ], + }, + { + ...commonConfig, + experiments: { + ...commonConfig.experiments, + outputModule: true, + }, + output: { + filename: 'module/[name].mjs', + uniqueName: '6-layers-full-mjs', + }, + plugins: [ + new ModuleFederationPlugin({ + ...common, + library: { type: 'module' }, + filename: 'module/container.mjs', + remotes: { + containerA: { + external: '../../5-layers-full/module/container.mjs', + }, + }, + }), + ], + target: 'node14', + }, +]; diff --git a/packages/enhanced/test/configCases/layers/7-layers-full/App.js b/packages/enhanced/test/configCases/layers/7-layers-full/App.js new file mode 100644 index 00000000000..2169084c924 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/7-layers-full/App.js @@ -0,0 +1,5 @@ +import React, { layeredComponentsReact } from 'react'; +import ComponentA from './ComponentA'; +export default function App() { + return `App (no layer) rendered with React version: [${React()}] with non-layered React value: [${layeredComponentsReact()}] and imported: ${ComponentA()}`; +} diff --git a/packages/enhanced/test/configCases/layers/7-layers-full/ComponentA.js b/packages/enhanced/test/configCases/layers/7-layers-full/ComponentA.js new file mode 100644 index 00000000000..a621da4a98c --- /dev/null +++ b/packages/enhanced/test/configCases/layers/7-layers-full/ComponentA.js @@ -0,0 +1,5 @@ +import React, { layeredComponentsReact } from 'react'; + +export default function ComponentA() { + return `ComponentA (in react-layer) rendered with React version: [${React()}] with layered React value: [${layeredComponentsReact()}]`; +} diff --git a/packages/enhanced/test/configCases/layers/7-layers-full/emptyComponent.js b/packages/enhanced/test/configCases/layers/7-layers-full/emptyComponent.js new file mode 100644 index 00000000000..d4e3ba505f0 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/7-layers-full/emptyComponent.js @@ -0,0 +1 @@ +export default 'testnoop'; diff --git a/packages/enhanced/test/configCases/layers/7-layers-full/index.js b/packages/enhanced/test/configCases/layers/7-layers-full/index.js new file mode 100644 index 00000000000..a5de13957d7 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/7-layers-full/index.js @@ -0,0 +1,8 @@ +it('should load App with React', () => { + return import('./App').then(({ default: App }) => { + const rendered = App(); + expect(rendered).toBe( + 'App (no layer) rendered with React version: [This is react 0.1.2] with non-layered React value: [No Layer] and imported: ComponentA (in react-layer) rendered with React version: [This is react 0.1.2] with layered React value: [react-layer]', + ); + }); +}); diff --git a/packages/enhanced/test/configCases/layers/7-layers-full/layered-react-loader.js b/packages/enhanced/test/configCases/layers/7-layers-full/layered-react-loader.js new file mode 100644 index 00000000000..68bfa9fa599 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/7-layers-full/layered-react-loader.js @@ -0,0 +1,4 @@ +module.exports = function (source) { + const issuerLayer = this._module?.layer; + return source.replace('No Layer', `${issuerLayer}`); +}; diff --git a/packages/enhanced/test/configCases/layers/7-layers-full/node_modules/react.js b/packages/enhanced/test/configCases/layers/7-layers-full/node_modules/react.js new file mode 100644 index 00000000000..39f158129c9 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/7-layers-full/node_modules/react.js @@ -0,0 +1,4 @@ +let version = "0.1.2"; +export default () => `This is react ${version}`; +export function setVersion(v) { version = v; } +export const layeredComponentsReact = () => "No Layer"; diff --git a/packages/enhanced/test/configCases/layers/7-layers-full/package.json b/packages/enhanced/test/configCases/layers/7-layers-full/package.json new file mode 100644 index 00000000000..4e44b5b102f --- /dev/null +++ b/packages/enhanced/test/configCases/layers/7-layers-full/package.json @@ -0,0 +1,11 @@ +{ + "name": "3-layers-full", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "webpack --config=webpack.config.js" + }, + "dependencies": { + "react": "1.0.0" + } +} diff --git a/packages/enhanced/test/configCases/layers/7-layers-full/test.config.js b/packages/enhanced/test/configCases/layers/7-layers-full/test.config.js new file mode 100644 index 00000000000..1ca0b7cf737 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/7-layers-full/test.config.js @@ -0,0 +1,6 @@ +module.exports = { + findBundle: function (i, options) { + return './main.js'; + return i === 0 ? './main.js' : './module/main.mjs'; + }, +}; diff --git a/packages/enhanced/test/configCases/layers/7-layers-full/webpack.config.js b/packages/enhanced/test/configCases/layers/7-layers-full/webpack.config.js new file mode 100644 index 00000000000..b1c5e646cf6 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/7-layers-full/webpack.config.js @@ -0,0 +1,89 @@ +const { ModuleFederationPlugin } = require('../../../../dist/src'); +const path = require('path'); + +const common = { + name: 'container_7', + filename: 'container.js', + exposes: { + './ComponentA': './ComponentA', + './App': './App', + './noop': './emptyComponent', + }, + shared: { + react: { + singleton: true, + requiredVersion: false, + }, + randomvalue: { + request: 'react', + import: 'react', + shareKey: 'react', + singleton: true, + requiredVersion: false, + layer: 'react-layer', + issuerLayer: 'react-layer', + }, + }, +}; + +const commonConfig = { + entry: './index.js', + mode: 'development', + devtool: false, + experiments: { + layers: true, + }, + module: { + rules: [ + { + test: /ComponentA\.js$/, + layer: 'react-layer', + }, + { + test: /react\.js$/, + issuerLayer: 'react-layer', + layer: 'react-layer', + use: [ + { + loader: path.resolve(__dirname, './layered-react-loader.js'), + }, + ], + }, + ], + }, +}; + +module.exports = [ + { + ...commonConfig, + output: { + filename: '[name].js', + uniqueName: '7-layers-full', + }, + plugins: [ + new ModuleFederationPlugin({ + ...common, + library: { type: 'commonjs-module' }, + }), + ], + }, + { + ...commonConfig, + experiments: { + ...commonConfig.experiments, + outputModule: true, + }, + output: { + filename: 'module/[name].mjs', + uniqueName: '7-layers-full-mjs', + }, + plugins: [ + new ModuleFederationPlugin({ + ...common, + library: { type: 'module' }, + filename: 'module/container.mjs', + }), + ], + target: 'node14', + }, +]; diff --git a/packages/enhanced/test/configCases/layers/8-layers-full/App.js b/packages/enhanced/test/configCases/layers/8-layers-full/App.js new file mode 100644 index 00000000000..b87db611351 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/8-layers-full/App.js @@ -0,0 +1,11 @@ +import React, { layeredComponentsReact } from 'react'; +import ComponentA from 'containerA/ComponentA'; +import RemoteApp from 'containerA/App'; +import LocalComponentA from './ComponentA'; + +export default function App() { + return `App (no layer) rendered with React version: [${React()}] with non-layered React value: [${layeredComponentsReact()}] +Local Component: ${LocalComponentA()} +Remote Component from container7: ${ComponentA()} +Remote App from container7: ${RemoteApp()}`; +} diff --git a/packages/enhanced/test/configCases/layers/8-layers-full/ComponentA.js b/packages/enhanced/test/configCases/layers/8-layers-full/ComponentA.js new file mode 100644 index 00000000000..6e1accf7b1a --- /dev/null +++ b/packages/enhanced/test/configCases/layers/8-layers-full/ComponentA.js @@ -0,0 +1,5 @@ +import React, { layeredComponentsReact } from 'react'; + +export default function ComponentA() { + return `LocalComponentA (in react-layer) rendered with React version: [${React()}], layered React value: [${layeredComponentsReact()}]`; +} diff --git a/packages/enhanced/test/configCases/layers/8-layers-full/index.js b/packages/enhanced/test/configCases/layers/8-layers-full/index.js new file mode 100644 index 00000000000..cb947d335bc --- /dev/null +++ b/packages/enhanced/test/configCases/layers/8-layers-full/index.js @@ -0,0 +1,12 @@ +it('should load App with React and both types of remote components', () => { + return import('containerA/noop').then((m) => { + return import('./App').then(({ default: App }) => { + const rendered = App(); + expect(rendered) + .toBe(`App (no layer) rendered with React version: [This is react 0.1.2] with non-layered React value: [No Layer] +Local Component: LocalComponentA (in react-layer) rendered with React version: [This is react 0.1.2], layered React value: [react-layer] +Remote Component from container7: ComponentA (in react-layer) rendered with React version: [This is react 0.1.2] with layered React value: [react-layer] +Remote App from container7: App (no layer) rendered with React version: [This is react 0.1.2] with non-layered React value: [No Layer] and imported: ComponentA (in react-layer) rendered with React version: [This is react 0.1.2] with layered React value: [react-layer]`); + }); + }); +}); diff --git a/packages/enhanced/test/configCases/layers/8-layers-full/layerImport.js b/packages/enhanced/test/configCases/layers/8-layers-full/layerImport.js new file mode 100644 index 00000000000..361f3ac025d --- /dev/null +++ b/packages/enhanced/test/configCases/layers/8-layers-full/layerImport.js @@ -0,0 +1,3 @@ +import LocalComponentA from './ComponentA'; + +export default LocalComponentA; diff --git a/packages/enhanced/test/configCases/layers/8-layers-full/node_modules/package.json b/packages/enhanced/test/configCases/layers/8-layers-full/node_modules/package.json new file mode 100644 index 00000000000..87032da008a --- /dev/null +++ b/packages/enhanced/test/configCases/layers/8-layers-full/node_modules/package.json @@ -0,0 +1,3 @@ +{ + "version": "2.1.0" +} diff --git a/packages/enhanced/test/configCases/layers/8-layers-full/node_modules/react.js b/packages/enhanced/test/configCases/layers/8-layers-full/node_modules/react.js new file mode 100644 index 00000000000..17f75306c17 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/8-layers-full/node_modules/react.js @@ -0,0 +1,4 @@ +let version = "2.1.0"; +export function setVersion(v) { version = v; } +export const layeredComponentsReact = () => "FEDERATION IS BROKEN, THIS VERION SHOULD NOT BE LOADED"; +export default () => `${version}`; diff --git a/packages/enhanced/test/configCases/layers/8-layers-full/package.json b/packages/enhanced/test/configCases/layers/8-layers-full/package.json new file mode 100644 index 00000000000..9db5aa360a3 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/8-layers-full/package.json @@ -0,0 +1,12 @@ +{ + "private": true, + "engines": { + "node": ">=10.13.0" + }, + "scripts": { + "build": "webpack --config=webpack.config.js" + }, + "dependencies": { + "react": "*" + } +} diff --git a/packages/enhanced/test/configCases/layers/8-layers-full/test.config.js b/packages/enhanced/test/configCases/layers/8-layers-full/test.config.js new file mode 100644 index 00000000000..1ca0b7cf737 --- /dev/null +++ b/packages/enhanced/test/configCases/layers/8-layers-full/test.config.js @@ -0,0 +1,6 @@ +module.exports = { + findBundle: function (i, options) { + return './main.js'; + return i === 0 ? './main.js' : './module/main.mjs'; + }, +}; diff --git a/packages/enhanced/test/configCases/layers/8-layers-full/webpack.config.js b/packages/enhanced/test/configCases/layers/8-layers-full/webpack.config.js new file mode 100644 index 00000000000..0c1a48987de --- /dev/null +++ b/packages/enhanced/test/configCases/layers/8-layers-full/webpack.config.js @@ -0,0 +1,89 @@ +const { ModuleFederationPlugin } = require('../../../../dist/src'); + +const common = { + name: 'container_8', + filename: 'container.js', + remotes: { + containerA: { + external: '../7-layers-full/container.js', + }, + }, + shared: { + react: { + singleton: true, + requiredVersion: false, + import: false, + }, + randomvalue: { + request: 'react', + import: false, + shareKey: 'react', + singleton: true, + requiredVersion: false, + layer: 'react-layer', + issuerLayer: 'react-layer', + }, + }, +}; + +const commonConfig = { + entry: './index.js', + mode: 'development', + devtool: false, + experiments: { + layers: true, + }, + module: { + rules: [ + { + layer: 'react-layer', + test: /ComponentA\.js$/, + }, + { + test: /react\.js$/, + issuerLayer: 'react-layer', + layer: 'react-layer', + }, + ], + }, +}; + +module.exports = [ + { + ...commonConfig, + output: { + filename: '[name].js', + uniqueName: '8-layers-full', + }, + plugins: [ + new ModuleFederationPlugin({ + ...common, + library: { type: 'commonjs-module' }, + }), + ], + }, + { + ...commonConfig, + experiments: { + ...commonConfig.experiments, + outputModule: true, + }, + output: { + filename: 'module/[name].mjs', + uniqueName: '8-layers-full-mjs', + }, + plugins: [ + new ModuleFederationPlugin({ + ...common, + library: { type: 'module' }, + filename: 'module/container.mjs', + remotes: { + containerA: { + external: '../../7-layers-full/module/container.mjs', + }, + }, + }), + ], + target: 'node14', + }, +]; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-entry/.gitignore b/packages/enhanced/test/configCases/sharing/layers-consume-entry/.gitignore new file mode 100644 index 00000000000..724b33e3e68 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-entry/.gitignore @@ -0,0 +1,2 @@ +node_modules/.federation +dist diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-entry/async-boundary.js b/packages/enhanced/test/configCases/sharing/layers-consume-entry/async-boundary.js new file mode 100644 index 00000000000..33145c331ad --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-entry/async-boundary.js @@ -0,0 +1 @@ +export * from 'react'; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-entry/index-test.js b/packages/enhanced/test/configCases/sharing/layers-consume-entry/index-test.js new file mode 100644 index 00000000000..9a2597f644f --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-entry/index-test.js @@ -0,0 +1,5 @@ +it('should load module with correct layer from entry layer', async () => { + const { version, layer } = await import('./async-boundary'); + expect(version).toBe('1.0.0'); + expect(layer).toBe('module-layer'); +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-entry/index.js b/packages/enhanced/test/configCases/sharing/layers-consume-entry/index.js new file mode 100644 index 00000000000..18f91c06afb --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-entry/index.js @@ -0,0 +1 @@ +import './index-test'; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-entry/layer-exporter.js b/packages/enhanced/test/configCases/sharing/layers-consume-entry/layer-exporter.js new file mode 100644 index 00000000000..3fcd00e9f45 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-entry/layer-exporter.js @@ -0,0 +1,4 @@ +module.exports = function layerLoader(source) { + // Inject the layer name as an export + return [source, 'export const layer = "module-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-entry/node_modules/react/index.js b/packages/enhanced/test/configCases/sharing/layers-consume-entry/node_modules/react/index.js new file mode 100644 index 00000000000..17f0c46768c --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-entry/node_modules/react/index.js @@ -0,0 +1,2 @@ +import { dix } from './index2'; +export const version = "1.0.0"; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-entry/node_modules/react/index2.js b/packages/enhanced/test/configCases/sharing/layers-consume-entry/node_modules/react/index2.js new file mode 100644 index 00000000000..6aa19f3b6b2 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-entry/node_modules/react/index2.js @@ -0,0 +1 @@ +export const dix = "1.0.0"; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-entry/package.json b/packages/enhanced/test/configCases/sharing/layers-consume-entry/package.json new file mode 100644 index 00000000000..630a229094f --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-entry/package.json @@ -0,0 +1,11 @@ +{ + "name": "layered-react-test", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "webpack --config=webpack.config.js" + }, + "dependencies": { + "react": "1.0.0" + } +} diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-entry/test.config.js b/packages/enhanced/test/configCases/sharing/layers-consume-entry/test.config.js new file mode 100644 index 00000000000..e2c700f2805 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-entry/test.config.js @@ -0,0 +1,6 @@ +module.exports = { + layers: true, + findBundle: function () { + return ['bundle0.js']; + }, +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-entry/webpack.config.js b/packages/enhanced/test/configCases/sharing/layers-consume-entry/webpack.config.js new file mode 100644 index 00000000000..30e05dbfbeb --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-entry/webpack.config.js @@ -0,0 +1,39 @@ +const { ConsumeSharedPlugin } = require('../../../../dist/src'); +const path = require('path'); + +module.exports = { + mode: 'development', + devtool: false, + entry: { + main: { + import: './index.js', + layer: 'entry-layer', + }, + }, + experiments: { + layers: true, + }, + module: { + rules: [ + { + test: /async-boundary\.js$/, + issuerLayer: 'entry-layer', + use: [ + { + loader: path.resolve(__dirname, './layer-exporter.js'), + }, + ], + }, + ], + }, + plugins: [ + new ConsumeSharedPlugin({ + consumes: { + react: { + singleton: true, + shareKey: 'react', + }, + }, + }), + ], +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/.gitignore b/packages/enhanced/test/configCases/sharing/layers-consume-loader/.gitignore new file mode 100644 index 00000000000..724b33e3e68 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/.gitignore @@ -0,0 +1,2 @@ +node_modules/.federation +dist diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/different-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/different-layer-loader.js new file mode 100644 index 00000000000..d86f06af1fa --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/different-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects a different layer name as an export + */ +module.exports = function differentLayerLoader(source) { + return [source, 'export const layer = "differing-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/explicit-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/explicit-layer-loader.js new file mode 100644 index 00000000000..a61ba257f08 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/explicit-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects an explicit layer name as an export + */ +module.exports = function explicitLayerLoader(source) { + return [source, 'export const layer = "explicit-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/multi-pkg-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/multi-pkg-layer-loader.js new file mode 100644 index 00000000000..ad5672f9cd7 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/multi-pkg-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects the multi-pkg layer name as an export + */ +module.exports = function multiPkgLayerLoader(source) { + return [source, 'export const layer = "multi-pkg-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/react-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/react-layer-loader.js new file mode 100644 index 00000000000..d4b57f171fc --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/loaders/react-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects the React layer name as an export + */ +module.exports = function reactLayerLoader(source) { + return [source, 'export const layer = "react-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/lib2/index.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/lib2/index.js new file mode 100644 index 00000000000..ec16f09935f --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/lib2/index.js @@ -0,0 +1,2 @@ +export default "lib2"; +export const version = '1.3.4'; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/multi-pkg/thing1.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/multi-pkg/thing1.js new file mode 100644 index 00000000000..b0162214559 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/multi-pkg/thing1.js @@ -0,0 +1 @@ +export const version = '2.0.0' diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/multi-pkg/thing2.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/multi-pkg/thing2.js new file mode 100644 index 00000000000..b0162214559 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/multi-pkg/thing2.js @@ -0,0 +1 @@ +export const version = '2.0.0' diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/react/index.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/react/index.js new file mode 100644 index 00000000000..17f0c46768c --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/react/index.js @@ -0,0 +1,2 @@ +import { dix } from './index2'; +export const version = "1.0.0"; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/react/index2.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/react/index2.js new file mode 100644 index 00000000000..6aa19f3b6b2 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/node_modules/react/index2.js @@ -0,0 +1 @@ +export const dix = "1.0.0"; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/package.json b/packages/enhanced/test/configCases/sharing/layers-consume-loader/package.json new file mode 100644 index 00000000000..630a229094f --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/package.json @@ -0,0 +1,11 @@ +{ + "name": "layered-react-test", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "webpack --config=webpack.config.js" + }, + "dependencies": { + "react": "1.0.0" + } +} diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/shared/react-boundary.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/shared/react-boundary.js new file mode 100644 index 00000000000..84ef823acb4 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/shared/react-boundary.js @@ -0,0 +1,4 @@ +/** + * Boundary file for React exports + */ +export * from 'react'; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/src/index.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/src/index.js new file mode 100644 index 00000000000..1137086d600 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/src/index.js @@ -0,0 +1,7 @@ +/** + * Main test entry point + */ +import '../tests/unlayered-share.test'; +import '../tests/different-layers.test'; +import '../tests/lib-two.test'; +import '../tests/prefixed-share.test'; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/test.config.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/test.config.js new file mode 100644 index 00000000000..e2c700f2805 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/test.config.js @@ -0,0 +1,6 @@ +module.exports = { + layers: true, + findBundle: function () { + return ['bundle0.js']; + }, +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/different-layers.test.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/different-layers.test.js new file mode 100644 index 00000000000..3aa10ede79c --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/different-layers.test.js @@ -0,0 +1,14 @@ +/** + * Tests for different layer configurations in shared module consumption + */ +it('should consume shared React module from differing-layer when test is in differing-layer', async () => { + const { version, layer } = await import('react'); + expect(version).toBe('1.0.0'); + expect(layer).toBe('differing-layer'); +}); + +it('should consume React with explicit-layer override when importing index2 from differing-layer', async () => { + const { dix, layer } = await import('react/index2'); + expect(dix).toBe('1.0.0'); + expect(layer).toBe('explicit-layer'); +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/lib-two.test.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/lib-two.test.js new file mode 100644 index 00000000000..baec0317805 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/lib-two.test.js @@ -0,0 +1,15 @@ +/** + * Tests for lib-two module sharing with lib-two-required-layer configurations + */ + +it('should consume lib-two v1.3.4 from lib-two-required-layer with eager loading', async () => { + const { version, layer } = await import('lib-two'); + expect(version).toBe('1.3.4'); + expect(layer).toBe('differing-layer'); // Using the layer from different-layer-loader +}); + +it('should consume lib-two-layered v1.3.4 from lib-two-required-layer with eager loading', async () => { + const { version, layer } = await import('lib-two-layered'); + expect(version).toBe('1.3.4'); + expect(layer).toBe('differing-layer'); // Using the layer from different-layer-loader +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/prefixed-share.test.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/prefixed-share.test.js new file mode 100644 index 00000000000..813d9e909ce --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/prefixed-share.test.js @@ -0,0 +1,14 @@ +/** + * Tests for prefixed module sharing with different layers + */ +it('should consume thing1 from multi-pkg with multi-pkg-layer', async () => { + const { version, layer } = await import('multi-pkg/thing1'); + expect(version).toBe('2.0.0'); + expect(layer).toBe('multi-pkg-layer'); +}); + +it('should consume thing2 from multi-pkg with multi-pkg-layer', async () => { + const { version, layer } = await import('multi-pkg/thing2'); + expect(version).toBe('2.0.0'); + expect(layer).toBe('multi-pkg-layer'); +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/unlayered-share.test.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/unlayered-share.test.js new file mode 100644 index 00000000000..7aa4013c756 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/tests/unlayered-share.test.js @@ -0,0 +1,26 @@ +/** + * Tests for unlayered module consumption using default share configurations + */ +it('should consume React boundary module using default share configuration without layers', async () => { + const { version, layer } = await import('../shared/react-boundary'); + expect(version).toBe('1.0.0'); + expect(layer).toBeUndefined(); +}); + +it('should consume lib-two v1.3.4 using default non-eager share configuration', async () => { + const { version, layer } = await import('lib-two'); + expect(version).toBe('1.3.4'); + expect(layer).toBe(undefined); +}); + +it('should consume thing1 from multi-pkg', async () => { + const { version, layer } = await import('multi-pkg/thing1'); + expect(version).toBe('2.0.0'); + expect(layer).toBeUndefined(); +}); + +it('should consume thing2 from multi-pkg', async () => { + const { version, layer } = await import('multi-pkg/thing2'); + expect(version).toBe('2.0.0'); + expect(layer).toBeUndefined(); +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-consume-loader/webpack.config.js b/packages/enhanced/test/configCases/sharing/layers-consume-loader/webpack.config.js new file mode 100644 index 00000000000..865256305dd --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-consume-loader/webpack.config.js @@ -0,0 +1,143 @@ +const { ConsumeSharedPlugin } = require('../../../../dist/src'); +const WConsumeSharedPlugin = require('webpack/lib/sharing/ConsumeSharedPlugin'); +const path = require('path'); + +module.exports = { + mode: 'development', + devtool: false, + entry: { + main: { + import: './src/index.js', + }, + }, + experiments: { + layers: true, + }, + module: { + rules: [ + { + test: /tests\/different-layers\.test\.js$/, + layer: 'differing-layer', + }, + { + test: /tests\/prefixed-share\.test\.js$/, + layer: 'prefixed-layer', + }, + { + layer: 'multi-pkg-layer', + issuerLayer: 'prefixed-layer', + use: [ + { + loader: path.resolve( + __dirname, + './loaders/multi-pkg-layer-loader.js', + ), + }, + ], + }, + { + layer: 'required-layer', + issuerLayer: 'differing-layer', + exclude: /react\/index2\.js$/, + use: [ + { + loader: path.resolve( + __dirname, + './loaders/different-layer-loader.js', + ), + }, + ], + }, + { + test: /react\/index2\.js$/, + layer: 'explicit-layer', + use: [ + { + loader: path.resolve( + __dirname, + './loaders/explicit-layer-loader.js', + ), + }, + ], + }, + { + test: /tests\/lib-two\.test\.js$/, + layer: 'lib-two-layer', + }, + { + test: /lib2\/index\.js$/, + layer: 'lib-two-required-layer', + issuerLayer: 'lib-two-layer', + use: [ + { + loader: path.resolve( + __dirname, + './loaders/different-layer-loader.js', + ), + }, + ], + }, + ], + }, + plugins: [ + new ConsumeSharedPlugin({ + consumes: { + react: { + singleton: true, + }, + 'explicit-layer-react': { + request: 'react/index2', + import: 'react/index2', + shareKey: 'react', + singleton: true, + issuerLayer: 'differing-layer', + layer: 'explicit-layer', + }, + 'differing-layer-react': { + request: 'react', + import: 'react', + shareKey: 'react', + singleton: true, + issuerLayer: 'differing-layer', + layer: 'differing-layer', + }, + 'lib-two': { + request: 'lib-two', + import: 'lib2', + requiredVersion: '^1.0.0', + version: '1.3.4', + strictVersion: true, + eager: false, + }, + nonsense: { + request: 'lib-two', + import: 'lib2', + shareKey: 'lib-two', + requiredVersion: '^1.0.0', + version: '1.3.4', + strictVersion: true, + eager: true, + issuerLayer: 'lib-two-layer', + layer: 'differing-layer', + }, + 'lib-two-layered': { + import: 'lib2', + shareKey: 'lib-two', + requiredVersion: '^1.0.0', + version: '1.3.4', + strictVersion: true, + eager: true, + issuerLayer: 'lib-two-layer', + layer: 'differing-layer', + }, + multi: { + request: 'multi-pkg/', + requiredVersion: '^2.0.0', + version: '2.0.0', + strictVersion: true, + eager: true, + }, + }, + }), + ], +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/.gitignore b/packages/enhanced/test/configCases/sharing/layers-provides-loader/.gitignore new file mode 100644 index 00000000000..724b33e3e68 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/.gitignore @@ -0,0 +1,2 @@ +node_modules/.federation +dist diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/different-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/different-layer-loader.js new file mode 100644 index 00000000000..d86f06af1fa --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/different-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects a different layer name as an export + */ +module.exports = function differentLayerLoader(source) { + return [source, 'export const layer = "differing-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/explicit-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/explicit-layer-loader.js new file mode 100644 index 00000000000..a61ba257f08 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/explicit-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects an explicit layer name as an export + */ +module.exports = function explicitLayerLoader(source) { + return [source, 'export const layer = "explicit-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/multi-pkg-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/multi-pkg-layer-loader.js new file mode 100644 index 00000000000..ad5672f9cd7 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/multi-pkg-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects the multi-pkg layer name as an export + */ +module.exports = function multiPkgLayerLoader(source) { + return [source, 'export const layer = "multi-pkg-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/react-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/react-layer-loader.js new file mode 100644 index 00000000000..d4b57f171fc --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/loaders/react-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects the React layer name as an export + */ +module.exports = function reactLayerLoader(source) { + return [source, 'export const layer = "react-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/lib2/index.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/lib2/index.js new file mode 100644 index 00000000000..ec16f09935f --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/lib2/index.js @@ -0,0 +1,2 @@ +export default "lib2"; +export const version = '1.3.4'; diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/multi-pkg/thing1.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/multi-pkg/thing1.js new file mode 100644 index 00000000000..b0162214559 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/multi-pkg/thing1.js @@ -0,0 +1 @@ +export const version = '2.0.0' diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/multi-pkg/thing2.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/multi-pkg/thing2.js new file mode 100644 index 00000000000..b0162214559 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/multi-pkg/thing2.js @@ -0,0 +1 @@ +export const version = '2.0.0' diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/react/index.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/react/index.js new file mode 100644 index 00000000000..5957b07261c --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/react/index.js @@ -0,0 +1 @@ +export const version = "1.0.0"; diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/react/index2.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/react/index2.js new file mode 100644 index 00000000000..6aa19f3b6b2 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/node_modules/react/index2.js @@ -0,0 +1 @@ +export const dix = "1.0.0"; diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/package.json b/packages/enhanced/test/configCases/sharing/layers-provides-loader/package.json new file mode 100644 index 00000000000..630a229094f --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/package.json @@ -0,0 +1,11 @@ +{ + "name": "layered-react-test", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "webpack --config=webpack.config.js" + }, + "dependencies": { + "react": "1.0.0" + } +} diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/shared/react-boundary.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/shared/react-boundary.js new file mode 100644 index 00000000000..84ef823acb4 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/shared/react-boundary.js @@ -0,0 +1,4 @@ +/** + * Boundary file for React exports + */ +export * from 'react'; diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/src/index.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/src/index.js new file mode 100644 index 00000000000..1137086d600 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/src/index.js @@ -0,0 +1,7 @@ +/** + * Main test entry point + */ +import '../tests/unlayered-share.test'; +import '../tests/different-layers.test'; +import '../tests/lib-two.test'; +import '../tests/prefixed-share.test'; diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/test.config.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/test.config.js new file mode 100644 index 00000000000..e2c700f2805 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/test.config.js @@ -0,0 +1,6 @@ +module.exports = { + layers: true, + findBundle: function () { + return ['bundle0.js']; + }, +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/different-layers.test.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/different-layers.test.js new file mode 100644 index 00000000000..3aa10ede79c --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/different-layers.test.js @@ -0,0 +1,14 @@ +/** + * Tests for different layer configurations in shared module consumption + */ +it('should consume shared React module from differing-layer when test is in differing-layer', async () => { + const { version, layer } = await import('react'); + expect(version).toBe('1.0.0'); + expect(layer).toBe('differing-layer'); +}); + +it('should consume React with explicit-layer override when importing index2 from differing-layer', async () => { + const { dix, layer } = await import('react/index2'); + expect(dix).toBe('1.0.0'); + expect(layer).toBe('explicit-layer'); +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/lib-two.test.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/lib-two.test.js new file mode 100644 index 00000000000..30296c15791 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/lib-two.test.js @@ -0,0 +1,9 @@ +/** + * Tests for lib-two module sharing with lib-two-required-layer configurations + */ + +it('should consume lib-two v1.3.4 from lib-two-required-layer with eager loading', async () => { + const { version, layer } = await import('lib2'); + expect(version).toBe('1.3.4'); + expect(layer).toBe('differing-layer'); // Using the layer from different-layer-loader +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/prefixed-share.test.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/prefixed-share.test.js new file mode 100644 index 00000000000..813d9e909ce --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/prefixed-share.test.js @@ -0,0 +1,14 @@ +/** + * Tests for prefixed module sharing with different layers + */ +it('should consume thing1 from multi-pkg with multi-pkg-layer', async () => { + const { version, layer } = await import('multi-pkg/thing1'); + expect(version).toBe('2.0.0'); + expect(layer).toBe('multi-pkg-layer'); +}); + +it('should consume thing2 from multi-pkg with multi-pkg-layer', async () => { + const { version, layer } = await import('multi-pkg/thing2'); + expect(version).toBe('2.0.0'); + expect(layer).toBe('multi-pkg-layer'); +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/unlayered-share.test.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/unlayered-share.test.js new file mode 100644 index 00000000000..f160357501c --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/tests/unlayered-share.test.js @@ -0,0 +1,26 @@ +/** + * Tests for unlayered module consumption using default share configurations + */ +it('should consume React boundary module using default share configuration without layers', async () => { + const { version, layer } = await import('../shared/react-boundary'); + expect(version).toBe('1.0.0'); + expect(layer).toBeUndefined(); +}); + +it('should consume lib-two v1.3.4 using default non-eager share configuration', async () => { + const { version, layer } = await import('lib2'); + expect(version).toBe('1.3.4'); + expect(layer).toBe(undefined); +}); + +it('should consume thing1 from multi-pkg', async () => { + const { version, layer } = await import('multi-pkg/thing1'); + expect(version).toBe('2.0.0'); + expect(layer).toBeUndefined(); +}); + +it('should consume thing2 from multi-pkg', async () => { + const { version, layer } = await import('multi-pkg/thing2'); + expect(version).toBe('2.0.0'); + expect(layer).toBeUndefined(); +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-provides-loader/webpack.config.js b/packages/enhanced/test/configCases/sharing/layers-provides-loader/webpack.config.js new file mode 100644 index 00000000000..bd6b2ca5208 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-provides-loader/webpack.config.js @@ -0,0 +1,154 @@ +const { ProvideSharedPlugin } = require('../../../../dist/src'); +const path = require('path'); + +module.exports = { + mode: 'development', + devtool: false, + entry: { + main: { + import: './src/index.js', + }, + }, + experiments: { + layers: true, + }, + module: { + rules: [ + { + test: /tests\/different-layers\.test\.js$/, + layer: 'differing-layer', + }, + { + test: /tests\/prefixed-share\.test\.js$/, + layer: 'prefixed-layer', + }, + { + layer: 'multi-pkg-layer', + issuerLayer: 'prefixed-layer', + use: [ + { + loader: path.resolve( + __dirname, + './loaders/multi-pkg-layer-loader.js', + ), + }, + ], + }, + { + layer: 'required-layer', + issuerLayer: 'differing-layer', + exclude: /react\/index2\.js$/, + use: [ + { + loader: path.resolve( + __dirname, + './loaders/different-layer-loader.js', + ), + }, + ], + }, + { + test: /react\/index2\.js$/, + layer: 'explicit-layer', + use: [ + { + loader: path.resolve( + __dirname, + './loaders/explicit-layer-loader.js', + ), + }, + ], + }, + { + test: /tests\/lib-two\.test\.js$/, + layer: 'lib-two-layer', + }, + { + test: /lib2\/index\.js$/, + layer: 'lib-two-required-layer', + issuerLayer: 'lib-two-layer', + use: [ + { + loader: path.resolve( + __dirname, + './loaders/different-layer-loader.js', + ), + }, + ], + }, + ], + }, + plugins: [ + new ProvideSharedPlugin({ + shareScope: 'default', + provides: { + react: { + shareKey: 'react', + version: '17.0.2', + singleton: true, + }, + 'explicit-layer-react': { + request: 'react/index2', + shareKey: 'react', + version: '17.0.2', + singleton: true, + layer: 'explicit-layer', + }, + 'differing-layer-react': { + request: 'react', + shareKey: 'react', + version: '17.0.2', + singleton: true, + layer: 'differing-layer', + }, + 'required-layer-react': { + request: 'react', + shareKey: 'react', + version: '17.0.2', + singleton: true, + layer: 'required-layer', + }, + 'lib-two': { + shareKey: 'lib-two', + request: 'lib2', + version: '1.3.4', + requiredVersion: '^1.0.0', + strictVersion: true, + eager: false, + }, + 'lib-two-layered': { + request: 'lib2', + shareKey: 'lib-two', + version: '1.3.4', + requiredVersion: '^1.0.0', + strictVersion: true, + eager: true, + layer: 'lib-two-layer', + }, + 'lib-two-required': { + request: 'lib2', + shareKey: 'lib-two', + version: '1.3.4', + requiredVersion: '^1.0.0', + strictVersion: true, + eager: true, + layer: 'lib-two-required-layer', + }, + 'multi-pkg/': { + version: '2.0.0', + requiredVersion: '^2.0.0', + strictVersion: true, + eager: true, + }, + 'multi-layered': { + request: 'multi-pkg/', + version: '2.0.0', + requiredVersion: '^2.0.0', + strictVersion: true, + eager: true, + layer: 'multi-pkg-layer', + }, + }, + }), + ], +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/.gitignore b/packages/enhanced/test/configCases/sharing/layers-share-plugin/.gitignore new file mode 100644 index 00000000000..724b33e3e68 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/.gitignore @@ -0,0 +1,2 @@ +node_modules/.federation +dist diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/different-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/different-layer-loader.js new file mode 100644 index 00000000000..d86f06af1fa --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/different-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects a different layer name as an export + */ +module.exports = function differentLayerLoader(source) { + return [source, 'export const layer = "differing-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/explicit-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/explicit-layer-loader.js new file mode 100644 index 00000000000..a61ba257f08 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/explicit-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects an explicit layer name as an export + */ +module.exports = function explicitLayerLoader(source) { + return [source, 'export const layer = "explicit-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/multi-pkg-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/multi-pkg-layer-loader.js new file mode 100644 index 00000000000..ad5672f9cd7 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/multi-pkg-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects the multi-pkg layer name as an export + */ +module.exports = function multiPkgLayerLoader(source) { + return [source, 'export const layer = "multi-pkg-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/react-layer-loader.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/react-layer-loader.js new file mode 100644 index 00000000000..d4b57f171fc --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/loaders/react-layer-loader.js @@ -0,0 +1,6 @@ +/** + * Loader that injects the React layer name as an export + */ +module.exports = function reactLayerLoader(source) { + return [source, 'export const layer = "react-layer";'].join('\n'); +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/lib2/index.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/lib2/index.js new file mode 100644 index 00000000000..ec16f09935f --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/lib2/index.js @@ -0,0 +1,2 @@ +export default "lib2"; +export const version = '1.3.4'; diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/multi-pkg/thing1.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/multi-pkg/thing1.js new file mode 100644 index 00000000000..b0162214559 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/multi-pkg/thing1.js @@ -0,0 +1 @@ +export const version = '2.0.0' diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/multi-pkg/thing2.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/multi-pkg/thing2.js new file mode 100644 index 00000000000..b0162214559 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/multi-pkg/thing2.js @@ -0,0 +1 @@ +export const version = '2.0.0' diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/react/index.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/react/index.js new file mode 100644 index 00000000000..17f0c46768c --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/react/index.js @@ -0,0 +1,2 @@ +import { dix } from './index2'; +export const version = "1.0.0"; diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/react/index2.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/react/index2.js new file mode 100644 index 00000000000..6aa19f3b6b2 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/node_modules/react/index2.js @@ -0,0 +1 @@ +export const dix = "1.0.0"; diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/package.json b/packages/enhanced/test/configCases/sharing/layers-share-plugin/package.json new file mode 100644 index 00000000000..630a229094f --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/package.json @@ -0,0 +1,11 @@ +{ + "name": "layered-react-test", + "version": "1.0.0", + "private": true, + "scripts": { + "build": "webpack --config=webpack.config.js" + }, + "dependencies": { + "react": "1.0.0" + } +} diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/shared/react-boundary.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/shared/react-boundary.js new file mode 100644 index 00000000000..84ef823acb4 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/shared/react-boundary.js @@ -0,0 +1,4 @@ +/** + * Boundary file for React exports + */ +export * from 'react'; diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/src/index.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/src/index.js new file mode 100644 index 00000000000..c2ff0f9769f --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/src/index.js @@ -0,0 +1,7 @@ +/** + * Main test entry point + */ +import '../tests/unlayered-share.test'; +// import '../tests/different-layers.test'; +// import '../tests/lib-two.test'; +// import '../tests/prefixed-share.test'; diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/test.config.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/test.config.js new file mode 100644 index 00000000000..e2c700f2805 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/test.config.js @@ -0,0 +1,6 @@ +module.exports = { + layers: true, + findBundle: function () { + return ['bundle0.js']; + }, +}; diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/different-layers.test.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/different-layers.test.js new file mode 100644 index 00000000000..3aa10ede79c --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/different-layers.test.js @@ -0,0 +1,14 @@ +/** + * Tests for different layer configurations in shared module consumption + */ +it('should consume shared React module from differing-layer when test is in differing-layer', async () => { + const { version, layer } = await import('react'); + expect(version).toBe('1.0.0'); + expect(layer).toBe('differing-layer'); +}); + +it('should consume React with explicit-layer override when importing index2 from differing-layer', async () => { + const { dix, layer } = await import('react/index2'); + expect(dix).toBe('1.0.0'); + expect(layer).toBe('explicit-layer'); +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/lib-two.test.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/lib-two.test.js new file mode 100644 index 00000000000..baec0317805 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/lib-two.test.js @@ -0,0 +1,15 @@ +/** + * Tests for lib-two module sharing with lib-two-required-layer configurations + */ + +it('should consume lib-two v1.3.4 from lib-two-required-layer with eager loading', async () => { + const { version, layer } = await import('lib-two'); + expect(version).toBe('1.3.4'); + expect(layer).toBe('differing-layer'); // Using the layer from different-layer-loader +}); + +it('should consume lib-two-layered v1.3.4 from lib-two-required-layer with eager loading', async () => { + const { version, layer } = await import('lib-two-layered'); + expect(version).toBe('1.3.4'); + expect(layer).toBe('differing-layer'); // Using the layer from different-layer-loader +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/prefixed-share.test.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/prefixed-share.test.js new file mode 100644 index 00000000000..813d9e909ce --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/prefixed-share.test.js @@ -0,0 +1,14 @@ +/** + * Tests for prefixed module sharing with different layers + */ +it('should consume thing1 from multi-pkg with multi-pkg-layer', async () => { + const { version, layer } = await import('multi-pkg/thing1'); + expect(version).toBe('2.0.0'); + expect(layer).toBe('multi-pkg-layer'); +}); + +it('should consume thing2 from multi-pkg with multi-pkg-layer', async () => { + const { version, layer } = await import('multi-pkg/thing2'); + expect(version).toBe('2.0.0'); + expect(layer).toBe('multi-pkg-layer'); +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/unlayered-share.test.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/unlayered-share.test.js new file mode 100644 index 00000000000..7aa4013c756 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/tests/unlayered-share.test.js @@ -0,0 +1,26 @@ +/** + * Tests for unlayered module consumption using default share configurations + */ +it('should consume React boundary module using default share configuration without layers', async () => { + const { version, layer } = await import('../shared/react-boundary'); + expect(version).toBe('1.0.0'); + expect(layer).toBeUndefined(); +}); + +it('should consume lib-two v1.3.4 using default non-eager share configuration', async () => { + const { version, layer } = await import('lib-two'); + expect(version).toBe('1.3.4'); + expect(layer).toBe(undefined); +}); + +it('should consume thing1 from multi-pkg', async () => { + const { version, layer } = await import('multi-pkg/thing1'); + expect(version).toBe('2.0.0'); + expect(layer).toBeUndefined(); +}); + +it('should consume thing2 from multi-pkg', async () => { + const { version, layer } = await import('multi-pkg/thing2'); + expect(version).toBe('2.0.0'); + expect(layer).toBeUndefined(); +}); diff --git a/packages/enhanced/test/configCases/sharing/layers-share-plugin/webpack.config.js b/packages/enhanced/test/configCases/sharing/layers-share-plugin/webpack.config.js new file mode 100644 index 00000000000..cd69301d7a8 --- /dev/null +++ b/packages/enhanced/test/configCases/sharing/layers-share-plugin/webpack.config.js @@ -0,0 +1,143 @@ +const { SharePlugin } = require('../../../../dist/src'); +const path = require('path'); + +module.exports = { + mode: 'development', + devtool: false, + entry: { + main: { + import: './src/index.js', + }, + }, + experiments: { + layers: true, + }, + module: { + rules: [ + { + test: /tests\/different-layers\.test\.js$/, + layer: 'differing-layer', + }, + { + test: /tests\/prefixed-share\.test\.js$/, + layer: 'prefixed-layer', + }, + { + layer: 'multi-pkg-layer', + issuerLayer: 'prefixed-layer', + use: [ + { + loader: path.resolve( + __dirname, + './loaders/multi-pkg-layer-loader.js', + ), + }, + ], + }, + { + layer: 'required-layer', + issuerLayer: 'differing-layer', + exclude: /react\/index2\.js$/, + use: [ + { + loader: path.resolve( + __dirname, + './loaders/different-layer-loader.js', + ), + }, + ], + }, + { + test: /react\/index2\.js$/, + layer: 'explicit-layer', + use: [ + { + loader: path.resolve( + __dirname, + './loaders/explicit-layer-loader.js', + ), + }, + ], + }, + { + test: /tests\/lib-two\.test\.js$/, + layer: 'lib-two-layer', + }, + { + test: /lib2\/index\.js$/, + layer: 'lib-two-required-layer', + issuerLayer: 'lib-two-layer', + use: [ + { + loader: path.resolve( + __dirname, + './loaders/different-layer-loader.js', + ), + }, + ], + }, + ], + }, + plugins: [ + new SharePlugin({ + shareScope: 'default', + shared: { + react: { + singleton: true, + }, + 'explicit-layer-react': { + request: 'react/index2', + import: 'react/index2', + shareKey: 'react', + singleton: true, + issuerLayer: 'differing-layer', + layer: 'explicit-layer', + }, + 'differing-layer-react': { + request: 'react', + import: 'react', + shareKey: 'react', + singleton: true, + issuerLayer: 'differing-layer', + layer: 'differing-layer', + }, + 'lib-two': { + request: 'lib-two', + import: 'lib2', + requiredVersion: '^1.0.0', + version: '1.3.4', + strictVersion: true, + eager: false, + }, + nonsense: { + request: 'lib-two', + import: 'lib2', + shareKey: 'lib-two', + requiredVersion: '^1.0.0', + version: '1.3.4', + strictVersion: true, + eager: true, + issuerLayer: 'lib-two-layer', + layer: 'differing-layer', + }, + 'lib-two-layered': { + import: 'lib2', + shareKey: 'lib-two', + requiredVersion: '^1.0.0', + version: '1.3.4', + strictVersion: true, + eager: true, + issuerLayer: 'lib-two-layer', + layer: 'differing-layer', + }, + multi: { + request: 'multi-pkg/', + requiredVersion: '^2.0.0', + version: '2.0.0', + strictVersion: true, + eager: true, + }, + }, + }), + ], +}; diff --git a/packages/nextjs-mf/package.json b/packages/nextjs-mf/package.json index 6e2ffe317d4..fd71b3b90e8 100644 --- a/packages/nextjs-mf/package.json +++ b/packages/nextjs-mf/package.json @@ -8,7 +8,7 @@ "description": "Module Federation helper for NextJS", "repository": { "type": "git", - "url": "https://github.com/module-federation/core/", + "url": "git+https://github.com/module-federation/core.git", "directory": "packages/nextjs-mf" }, "author": "Zack Jackson ", @@ -48,6 +48,9 @@ "@module-federation/node": "workspace:*", "@module-federation/webpack-bundler-runtime": "workspace:*" }, + "devDependencies": { + "@types/btoa": "^1.2.5" + }, "peerDependencies": { "webpack": "^5.40.0", "next": "^12 || ^13 || ^14 || ^15", diff --git a/packages/nextjs-mf/project.json b/packages/nextjs-mf/project.json index 58233861134..1d6a85b97b8 100644 --- a/packages/nextjs-mf/project.json +++ b/packages/nextjs-mf/project.json @@ -5,7 +5,7 @@ "projectType": "library", "tags": ["type:pkg"], "targets": { - "build": { + "build-tsc": { "executor": "@nx/js:tsc", "outputs": ["{options.outputPath}"], "options": { @@ -21,6 +21,35 @@ } ] }, + "build": { + "executor": "nx:run-commands", + "options": { + "parallel": false, + "commands": [ + { + "command": "nx run nextjs-mf:build-tsc", + "forwardAllArgs": false + }, + { + "command": "nx run nextjs-mf:rename-dist-files", + "forwardAllArgs": false + } + ] + } + }, + "rename-dist-files": { + "executor": "nx:run-commands", + "options": { + "commands": [ + { + "command": "mv packages/nextjs-mf/dist/src/federation-noop.js packages/nextjs-mf/dist/src/federation-noop.cjs" + }, + { + "command": "mv packages/nextjs-mf/dist/src/plugins/container/runtimePlugin.js packages/nextjs-mf/dist/src/plugins/container/runtimePlugin.cjs" + } + ] + } + }, "lint": { "executor": "@nx/eslint:lint", "outputs": ["{options.outputFile}"], diff --git a/packages/nextjs-mf/src/internal.ts b/packages/nextjs-mf/src/internal.ts index 8b16d21566a..dd631ad0995 100644 --- a/packages/nextjs-mf/src/internal.ts +++ b/packages/nextjs-mf/src/internal.ts @@ -1,5 +1,101 @@ import type { sharePlugin } from '@module-federation/sdk'; +// Extend the SharedConfig type to include layer properties +type ExtendedSharedConfig = sharePlugin.SharedConfig & { + layer?: string; + issuerLayer?: string | string[]; + request?: string; + shareKey?: string; +}; + +const WEBPACK_LAYERS_NAMES = { + /** + * The layer for the shared code between the client and server bundles. + */ + shared: 'shared', + /** + * The layer for server-only runtime and picking up `react-server` export conditions. + * Including app router RSC pages and app router custom routes and metadata routes. + */ + reactServerComponents: 'rsc', + /** + * Server Side Rendering layer for app (ssr). + */ + serverSideRendering: 'ssr', + /** + * The browser client bundle layer for actions. + */ + actionBrowser: 'action-browser', + /** + * The layer for the API routes. + */ + api: 'api', + /** + * The layer for the middleware code. + */ + middleware: 'middleware', + /** + * The layer for the instrumentation hooks. + */ + instrument: 'instrument', + /** + * The layer for assets on the edge. + */ + edgeAsset: 'edge-asset', + /** + * The browser client bundle layer for App directory. + */ + appPagesBrowser: 'app-pages-browser', +} as const; + +const createSharedConfig = ( + name: string, + layers: (string | undefined)[], + options: { request?: string; import?: false | undefined } = {}, +) => { + return layers.reduce( + (acc, layer) => { + const key = layer ? `${name}-${layer}` : name; + acc[key] = { + singleton: true, + requiredVersion: false, + import: layer ? undefined : (options.import ?? false), + shareKey: options.request ?? name, + request: options.request ?? name, + layer, + issuerLayer: layer, + }; + return acc; + }, + {} as Record, + ); +}; + +const defaultLayers = [ + WEBPACK_LAYERS_NAMES.reactServerComponents, + WEBPACK_LAYERS_NAMES.serverSideRendering, + undefined, +]; + +const navigationLayers = [ + WEBPACK_LAYERS_NAMES.reactServerComponents, + WEBPACK_LAYERS_NAMES.serverSideRendering, +]; + +const reactShares = createSharedConfig('react', defaultLayers); +const reactDomShares = createSharedConfig('react', defaultLayers, { + request: 'react-dom', +}); +const jsxRuntimeShares = createSharedConfig('react/', navigationLayers, { + request: 'react/', + import: undefined, +}); +const nextNavigationShares = createSharedConfig( + 'next-navigation', + navigationLayers, + { request: 'next/navigation' }, +); + /** * @typedef SharedObject * @type {object} @@ -8,8 +104,14 @@ import type { sharePlugin } from '@module-federation/sdk'; * @property {boolean} key.requiredVersion - Whether a specific version of the shared object is required. * @property {boolean} key.eager - Whether the shared object should be eagerly loaded. * @property {boolean} key.import - Whether the shared object should be imported or not. + * @property {string} key.layer - The webpack layer this shared module belongs to. + * @property {string|string[]} key.issuerLayer - The webpack layer that can import this shared module. */ export const DEFAULT_SHARE_SCOPE: sharePlugin.SharedObject = { + ...reactShares, + ...reactDomShares, + ...nextNavigationShares, + ...jsxRuntimeShares, 'next/dynamic': { requiredVersion: undefined, singleton: true, diff --git a/packages/nextjs-mf/src/plugins/NextFederationPlugin/index.ts b/packages/nextjs-mf/src/plugins/NextFederationPlugin/index.ts index 8aaa2e66f32..5348bc89ede 100644 --- a/packages/nextjs-mf/src/plugins/NextFederationPlugin/index.ts +++ b/packages/nextjs-mf/src/plugins/NextFederationPlugin/index.ts @@ -116,14 +116,14 @@ export class NextFederationPlugin { p?.constructor?.name === 'BuildManifestPlugin', ); - if (manifestPlugin) { - //@ts-ignore - if (manifestPlugin?.appDirEnabled) { - throw new Error( - 'App Directory is not supported by nextjs-mf. Use only pages directory, do not open git issues about this', - ); - } - } + // if (manifestPlugin) { + // //@ts-ignore + // if (manifestPlugin?.appDirEnabled) { + // throw new Error( + // 'App Directory is not supported by nextjs-mf. Use only pages directory, do not open git issues about this', + // ); + // } + // } const compilerValid = validateCompilerOptions(compiler); const pluginValid = validatePluginOptions(this._options); @@ -155,6 +155,27 @@ export class NextFederationPlugin { asyncFunction: true, }; + // Add layer rules for resource queries + if (!compiler.options.module.rules) { + compiler.options.module.rules = []; + } + + // Add layer rules for RSC, client and SSR + compiler.options.module.rules.push({ + resourceQuery: /\?rsc/, + layer: 'rsc', + }); + + compiler.options.module.rules.push({ + resourceQuery: /\?client/, + layer: 'client', + }); + + compiler.options.module.rules.push({ + resourceQuery: /\?ssr/, + layer: 'ssr', + }); + applyPathFixes(compiler, this._options, this._extraOptions); if (this._extraOptions.debug) { compiler.options.devtool = false; @@ -189,7 +210,7 @@ export class NextFederationPlugin { ...(isServer ? [require.resolve('@module-federation/node/runtimePlugin')] : []), - require.resolve(path.join(__dirname, '../container/runtimePlugin')), + require.resolve(path.join(__dirname, '../container/runtimePlugin.cjs')), ...(this._options.runtimePlugins || []), ].map((plugin) => plugin + '?runtimePlugin'), //@ts-ignore @@ -219,13 +240,7 @@ export class NextFederationPlugin { } private getNoopPath(): string { - let noop; - try { - noop = require.resolve('../../federation-noop'); - } catch (e) { - noop = require.resolve('../../federation-noop.cjs'); - } - return noop; + return require.resolve('../../federation-noop.cjs'); } } diff --git a/packages/nextjs-mf/src/plugins/container/InvertedContainerRuntimeModule.ts b/packages/nextjs-mf/src/plugins/container/InvertedContainerRuntimeModule.ts index b87d149bd55..283fd3cc160 100644 --- a/packages/nextjs-mf/src/plugins/container/InvertedContainerRuntimeModule.ts +++ b/packages/nextjs-mf/src/plugins/container/InvertedContainerRuntimeModule.ts @@ -1,6 +1,4 @@ import { normalizeWebpackPath } from '@module-federation/sdk/normalize-webpack-path'; -import type { Module } from 'webpack'; -import { container } from '@module-federation/enhanced'; import type ContainerEntryModule from '@module-federation/enhanced/src/lib/container/ContainerEntryModule'; const { RuntimeModule, Template, RuntimeGlobals } = require( normalizeWebpackPath('webpack'), diff --git a/packages/nextjs-mf/src/types/btoa.d.ts b/packages/nextjs-mf/src/types/btoa.d.ts new file mode 100644 index 00000000000..8aebed8e393 --- /dev/null +++ b/packages/nextjs-mf/src/types/btoa.d.ts @@ -0,0 +1,4 @@ +declare module 'btoa' { + function btoa(str: string): string; + export = btoa; +} diff --git a/packages/runtime-core/src/core.md b/packages/runtime-core/src/core.md deleted file mode 100644 index 63efa42eea5..00000000000 --- a/packages/runtime-core/src/core.md +++ /dev/null @@ -1,147 +0,0 @@ -# FederationHost Class - -## Overview -`FederationHost` orchestrates module federation, managing remote modules and shared dependencies. It utilizes a sophisticated plugin architecture and lifecycle hooks for comprehensive control and flexibility. - -## Constructor -```typescript -constructor(userOptions: UserOptions) -``` -Initializes `FederationHost` with user-defined options. - -### Parameters -- `userOptions: UserOptions`: Configuration for the FederationHost. - - **Properties**: - - `name`: `string` - Name of the host. - - `plugins`: `Array` - List of plugins. - - `remotes`: `Array` - List of remote modules. - - `shared`: `Record` - Configuration for shared modules. - - `inBrowser`: `boolean` - Flag to indicate if running in a browser environment. - -## Properties -- **options: Options** - - Configuration settings of FederationHost. - - **Properties**: - - `id`: `string` - Unique identifier for the host. - - `name`: `string` - Name of the host. - - `plugins`: `Array` - List of plugins. - - `remotes`: `Array` - List of remote modules. - - `shared`: `Record` - Configuration for shared modules. - - `inBrowser`: `boolean` - Flag to indicate if running in a browser environment. -- **hooks: PluginSystem** - - Lifecycle hooks for FederationHost interaction. -- **version: string** - - Version of FederationHost. -- **name: string** - - Name identifier for FederationHost. -- **moduleCache: Map** - - Cache for stored modules. -- **snapshotHandler: SnapshotHandler** - - Manages snapshots in federation process. -- **loaderHook: PluginSystem** - - Plugin system for module loading operations. - -## Methods - -### `initOptions` -```typescript -initOptions(userOptions: UserOptions): Options -``` -Initializes or updates FederationHost options. - -### `loadShare` -```typescript -async loadShare(pkgName: string, customShareInfo?: Partial): Promise T | undefined)> -``` -Loads a shared module asynchronously. - -### `loadShareSync` -```typescript -loadShareSync(pkgName: string): () => T | never -``` -Synchronously loads a shared module. - -### `loadRemote` -```typescript -async loadRemote(id: string, options?: { loadFactory?: boolean }): Promise -``` -Loads a remote module asynchronously. - -### `preloadRemote` -```typescript -async preloadRemote(preloadOptions: Array): Promise -``` -Preloads remote modules based on configurations. - -### `initializeSharing` -```typescript -initializeSharing(shareScopeName?: string): boolean | Promise -``` -Initializes sharing sequences for shared scopes. - -### `registerRemotes` -```typescript -registerRemotes(remotes: Remote[], options?: { force?: boolean }): void -``` -Register remotes after init. - -## Hooks -`FederationHost` offers various lifecycle hooks for interacting at different stages of the module federation process. These hooks include: - -- **`beforeInit`**: `SyncWaterfallHook<{ userOptions: UserOptions; options: Options; origin: FederationHost; shareInfo: ShareInfos; }>` - - Updates Federation Host configurations before the initialization process of remote containers. -- **`init`**: `SyncHook<[{ options: Options; origin: FederationHost; }], void>` - - Called during the initialization of remote containers. -- **`beforeRequest`**: `AsyncWaterfallHook<{ id: string; options: Options; origin: FederationHost; }>` - - Invoked before resolving a remote container, useful for injecting the container or updating something ahead of the lookup. -- **`afterResolve`**: `AsyncWaterfallHook` - - Called after resolving a container, allowing redirection or modification of resolved information. -- **`beforeInitContainer`**: `AsyncWaterfallHook<{shareScope: ShareScopeMap[string];initScope: InitScope;remoteEntryInitOptions: RemoteEntryInitOptions;origin: FederationHost;}>` - - Get the init parameters and use them before the remote container init method is called. -- **`initContainer`**: `AsyncWaterfallHook<{shareScope: ShareScopeMap[string];initScope: InitScope;remoteEntryInitOptions: RemoteEntryInitOptions;remoteEntryExports: RemoteEntryExports;origin: FederationHost;}>` - - Invoked after container.init is called -- **`onLoad`**: `AsyncHook<[{ id: string; expose: string; pkgNameOrAlias: string; remote: Remote; options: ModuleOptions; origin: FederationHost; exposeModule: any; exposeModuleFactory: any; moduleInstance: Module; }], void>` - - Triggered once a federated module is loaded, allowing access and modification to the exports of the loaded file. -- **`handlePreloadModule`**: `SyncHook<{ id: string; name: string; remoteSnapshot: ModuleInfo; preloadConfig: PreloadRemoteArgs; }, void>` - - Handles preloading logic for federated modules. -- **`errorLoadRemote`**: `AsyncHook<[{ id: string; error: unknown; }], void | unknown>` - - Invoked if loading a federated module fails, enabling custom error handling. -- **`beforeLoadShare`**: `AsyncWaterfallHook<{ pkgName: string; shareInfo?: Shared; - - shared: Options['shared']; origin: FederationHost; }>` - - Called before attempting to load or negotiate shared modules between federated apps. -- **`loadShare`**: `AsyncHook<[FederationHost, string, ShareInfos]>` - - Similar to `onLoad`, but for shared modules. -- **`resolveShare`**: `SyncHook<[{ shareScopeMap: ShareScopeMap; scope: string; pkgName: string; version: string; GlobalFederation: Federation; resolver: () => Shared; }], void>` - - Allows manual resolution of shared module requests. -- **`beforePreloadRemote`**: `AsyncHook<{ preloadOps: Array; options: Options; origin: FederationHost; }>` - - Invoked before any preload logic is executed by the preload handler. -- **`generatePreloadAssets`**: `AsyncHook<[{ origin: FederationHost; preloadOptions: PreloadOptions[number]; remote: Remote; remoteInfo: RemoteInfo; remoteSnapshot: ModuleInfo; globalSnapshot: GlobalModuleInfo; }], Promise>` - - Called for generating preload assets based on configurations. -- **`afterPreloadRemote`**: `AsyncHook<{ preloadOps: Array; options: Options; origin: FederationHost; }>` - - Invoked after the remote modules are preloaded. - -## Plugin System Integration -`FederationHost` utilizes `PluginSystem` for extended capabilities and custom behavior integration, using `FederationRuntimePlugin`. - -## Types and Options - -### `FederationRuntimePlugin` -- **Properties**: - - `name`: `string` - Name of the plugin. - - `version?`: `string` - Optional version of the plugin. - - `CoreLifeCyclePartial`, `SnapshotLifeCycleCyclePartial`, `ModuleLifeCycleCyclePartial`: Partial lifecycle hooks for `FederationHost`, `SnapshotHandler`, and `Module`. - -### `RemoteInfoOptionalVersion` -- **Properties**: - - `name`: `string` - Name of the remote. - - `version?`: `string` - Optional version of the remote. - -### `PreloadRemoteArgs` -- **Properties**: - - `nameOrAlias`: `string` - Name or alias of the remote. - - `exposes?`: `Array` - List of exposed modules. - - `resourceCategory?`: `'all' | 'sync'` - Category of resources. - - `share?`: `boolean` - Flag to share the module. - - `depsRemote?`: `boolean | Array` - Dependencies of the remote. - - `filter?`: `(assetUrl: string) => boolean` - Filter function for assets. diff --git a/packages/runtime-core/src/type/config.ts b/packages/runtime-core/src/type/config.ts index 8e7355a6452..80770dc9c99 100644 --- a/packages/runtime-core/src/type/config.ts +++ b/packages/runtime-core/src/type/config.ts @@ -50,6 +50,7 @@ export interface SharedConfig { requiredVersion: false | string; eager?: boolean; strictVersion?: boolean; + layer?: string | null; } type SharedBaseArgs = { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index faa01cc23b7..c5b8f914c6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -81,7 +81,7 @@ importers: version: 2.2.1 tsup: specifier: 7.2.0 - version: 7.2.0(@swc/core@1.7.26)(postcss@8.4.47)(typescript@5.5.2) + version: 7.2.0(@swc/core@1.7.26)(postcss@8.4.38)(typescript@5.5.2) typedoc: specifier: 0.25.8 version: 0.25.8(typescript@5.5.2) @@ -151,7 +151,7 @@ importers: version: 20.1.4(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(nx@20.1.4)(typescript@5.5.2)(verdaccio@5.29.2) '@nx/next': specifier: 20.1.4 - version: 20.1.4(@babel/core@7.25.2)(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(esbuild@0.24.0)(eslint@8.57.1)(html-webpack-plugin@5.6.2)(next@14.2.16)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack@5.93.0) + version: 20.1.4(@babel/core@7.25.2)(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(esbuild@0.24.0)(eslint@8.57.1)(html-webpack-plugin@5.6.2)(next@14.2.16)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack-cli@5.1.4)(webpack@5.93.0) '@nx/node': specifier: 20.1.4 version: 20.1.4(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(eslint@8.57.1)(nx@20.1.4)(typescript@5.5.2)(verdaccio@5.29.2) @@ -163,7 +163,7 @@ importers: version: 20.1.4(@babel/core@7.25.2)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(nx@20.1.4)(typescript@5.5.2)(verdaccio@5.29.2) '@nx/rspack': specifier: 20.1.4 - version: 20.1.4(@module-federation/enhanced@0.6.11)(@module-federation/node@2.5.21)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@swc/helpers@0.5.13)(@types/express@4.17.21)(@types/node@18.16.9)(html-webpack-plugin@5.6.2)(less@4.2.0)(nx@20.1.4)(react-refresh@0.14.2)(typescript@5.5.2)(verdaccio@5.29.2)(webpack@5.93.0) + version: 20.1.4(@module-federation/enhanced@0.6.11)(@module-federation/node@2.5.21)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@swc/helpers@0.5.13)(@types/express@4.17.21)(@types/node@18.16.9)(html-webpack-plugin@5.6.2)(less@4.2.0)(nx@20.1.4)(react-refresh@0.14.2)(typescript@5.5.2)(verdaccio@5.29.2)(webpack-cli@5.1.4)(webpack@5.93.0) '@nx/storybook': specifier: 20.1.4 version: 20.1.4(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(cypress@13.15.0)(eslint@8.57.1)(nx@20.1.4)(typescript@5.5.2)(verdaccio@5.29.2) @@ -175,7 +175,7 @@ importers: version: 20.1.4(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(nx@20.1.4)(typescript@5.5.2)(verdaccio@5.29.2) '@nx/webpack': specifier: 20.1.4 - version: 20.1.4(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(esbuild@0.24.0)(html-webpack-plugin@5.6.2)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6) + version: 20.1.4(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(esbuild@0.24.0)(html-webpack-plugin@5.6.2)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack-cli@5.1.4) '@pmmmwh/react-refresh-webpack-plugin': specifier: 0.5.15 version: 0.5.15(react-refresh@0.14.2)(webpack@5.93.0) @@ -190,7 +190,7 @@ importers: version: 1.0.8(@swc/helpers@0.5.13) '@rspack/dev-server': specifier: ^1.0.9 - version: 1.0.9(@rspack/core@1.0.8)(@types/express@4.17.21)(webpack@5.93.0) + version: 1.0.9(@rspack/core@1.0.8)(@types/express@4.17.21)(webpack-cli@5.1.4)(webpack@5.93.0) '@semantic-release/changelog': specifier: ^6.0.3 version: 6.0.3(semantic-release@24.1.2) @@ -217,7 +217,7 @@ importers: version: 8.3.5(storybook@8.3.5) '@storybook/nextjs': specifier: ^8.3.5 - version: 8.3.5(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.24.0)(next@14.2.16)(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5)(typescript@5.5.2)(webpack@5.93.0) + version: 8.3.5(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.24.0)(next@14.2.16)(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5)(typescript@5.5.2)(webpack-cli@5.1.4)(webpack@5.93.0) '@storybook/node-logger': specifier: 8.1.11 version: 8.1.11 @@ -310,7 +310,7 @@ importers: version: 1.6.0(vitest@1.6.0) autoprefixer: specifier: 10.4.20 - version: 10.4.20(postcss@8.4.47) + version: 10.4.20(postcss@8.4.38) babel-jest: specifier: 29.7.0 version: 29.7.0(@babel/core@7.25.2) @@ -415,16 +415,16 @@ importers: version: 10.1.0 postcss-calc: specifier: 9.0.1 - version: 9.0.1(postcss@8.4.47) + version: 9.0.1(postcss@8.4.38) postcss-custom-properties: specifier: 13.3.12 - version: 13.3.12(postcss@8.4.47) + version: 13.3.12(postcss@8.4.38) postcss-import: specifier: 15.1.0 - version: 15.1.0(postcss@8.4.47) + version: 15.1.0(postcss@8.4.38) postcss-url: specifier: 10.1.3 - version: 10.1.3(postcss@8.4.47) + version: 10.1.3(postcss@8.4.38) prettier: specifier: 3.3.3 version: 3.3.3 @@ -490,7 +490,10 @@ importers: version: 7.2.0 webpack: specifier: 5.93.0 - version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack-cli: + specifier: ^5.1.4 + version: 5.1.4(webpack@5.93.0) webpack-virtual-modules: specifier: 0.6.2 version: 0.6.2 @@ -770,7 +773,7 @@ importers: version: 2.59.0(typescript@5.0.4) '@modern-js/app-tools': specifier: 2.60.6 - version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4) + version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@5.0.4) @@ -828,7 +831,7 @@ importers: version: 2.59.0(typescript@5.0.4) '@modern-js/app-tools': specifier: 2.60.6 - version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4) + version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@5.0.4) @@ -886,7 +889,7 @@ importers: version: 2.59.0(typescript@5.0.4) '@modern-js/app-tools': specifier: 2.60.6 - version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4) + version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@5.0.4) @@ -944,7 +947,7 @@ importers: version: 2.59.0(typescript@5.0.4) '@modern-js/app-tools': specifier: 2.60.6 - version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4) + version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@5.0.4) @@ -1002,7 +1005,7 @@ importers: version: 2.59.0(typescript@5.0.4) '@modern-js/app-tools': specifier: 2.60.6 - version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4) + version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@5.0.4) @@ -1060,7 +1063,7 @@ importers: version: 2.59.0(typescript@5.0.4) '@modern-js/app-tools': specifier: 2.60.6 - version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4) + version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@5.0.4) @@ -1118,7 +1121,7 @@ importers: version: 2.59.0(typescript@5.0.4) '@modern-js/app-tools': specifier: 2.60.6 - version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4) + version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@5.0.4) @@ -1176,7 +1179,7 @@ importers: version: 2.59.0(typescript@5.0.4) '@modern-js/app-tools': specifier: 2.60.6 - version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4) + version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@5.0.4) @@ -1208,6 +1211,188 @@ importers: specifier: ~5.0.4 version: 5.0.4 + apps/next-app-router-4000: + dependencies: + '@heroicons/react': + specifier: 2.1.3 + version: 2.1.3(react@19.0.0-rc-cd22717c-20241013) + '@module-federation/nextjs-mf': + specifier: workspace:* + version: link:../../packages/nextjs-mf + clsx: + specifier: 2.1.1 + version: 2.1.1 + date-fns: + specifier: 3.6.0 + version: 3.6.0 + dinero.js: + specifier: 2.0.0-alpha.10 + version: 2.0.0-alpha.10 + ms: + specifier: 3.0.0-canary.1 + version: 3.0.0-canary.1 + next: + specifier: 15.0.0-canary.193 + version: 15.0.0-canary.193(@babel/core@7.25.2)(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013) + react: + specifier: 19.0.0-rc-cd22717c-20241013 + version: 19.0.0-rc-cd22717c-20241013 + react-dom: + specifier: 19.0.0-rc-cd22717c-20241013 + version: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013) + server-only: + specifier: 0.0.1 + version: 0.0.1 + styled-components: + specifier: 6.1.8 + version: 6.1.8(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013) + use-count-up: + specifier: 3.0.1 + version: 3.0.1(react@19.0.0-rc-cd22717c-20241013) + vercel: + specifier: 34.0.0 + version: 34.0.0(@swc/core@1.7.26)(encoding@0.1.13) + devDependencies: + '@tailwindcss/forms': + specifier: 0.5.7 + version: 0.5.7(tailwindcss@3.4.3) + '@tailwindcss/typography': + specifier: 0.5.12 + version: 0.5.12(tailwindcss@3.4.3) + '@types/ms': + specifier: 0.7.34 + version: 0.7.34 + '@types/node': + specifier: 20.12.7 + version: 20.12.7 + '@types/react': + specifier: npm:types-react@19.0.0-rc.1 + version: /types-react@19.0.0-rc.1 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.1 + version: /types-react-dom@19.0.0-rc.1 + '@vercel/git-hooks': + specifier: 1.0.0 + version: 1.0.0 + autoprefixer: + specifier: 10.4.19 + version: 10.4.19(postcss@8.4.38) + eslint: + specifier: 9.0.0 + version: 9.0.0 + eslint-config-next: + specifier: 14.2.2 + version: 14.2.2(eslint@9.0.0)(typescript@5.4.5) + lint-staged: + specifier: 15.2.2 + version: 15.2.2 + postcss: + specifier: 8.4.38 + version: 8.4.38 + prettier: + specifier: 3.2.5 + version: 3.2.5 + prettier-plugin-tailwindcss: + specifier: 0.5.14 + version: 0.5.14(prettier@3.2.5) + tailwindcss: + specifier: 3.4.3 + version: 3.4.3 + typescript: + specifier: 5.4.5 + version: 5.4.5 + + apps/next-app-router-4001: + dependencies: + '@heroicons/react': + specifier: 2.1.3 + version: 2.1.3(react@19.0.0-rc-cd22717c-20241013) + '@module-federation/nextjs-mf': + specifier: workspace:* + version: link:../../packages/nextjs-mf + clsx: + specifier: 2.1.1 + version: 2.1.1 + date-fns: + specifier: 3.6.0 + version: 3.6.0 + dinero.js: + specifier: 2.0.0-alpha.10 + version: 2.0.0-alpha.10 + ms: + specifier: 3.0.0-canary.1 + version: 3.0.0-canary.1 + next: + specifier: 15.0.0-canary.193 + version: 15.0.0-canary.193(@babel/core@7.25.2)(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013) + react: + specifier: 19.0.0-rc-cd22717c-20241013 + version: 19.0.0-rc-cd22717c-20241013 + react-dom: + specifier: 19.0.0-rc-cd22717c-20241013 + version: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013) + server-only: + specifier: 0.0.1 + version: 0.0.1 + styled-components: + specifier: 6.1.8 + version: 6.1.8(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013) + use-count-up: + specifier: 3.0.1 + version: 3.0.1(react@19.0.0-rc-cd22717c-20241013) + vercel: + specifier: 34.0.0 + version: 34.0.0(@swc/core@1.7.26)(encoding@0.1.13) + devDependencies: + '@tailwindcss/forms': + specifier: 0.5.7 + version: 0.5.7(tailwindcss@3.4.3) + '@tailwindcss/typography': + specifier: 0.5.12 + version: 0.5.12(tailwindcss@3.4.3) + '@types/ms': + specifier: 0.7.34 + version: 0.7.34 + '@types/node': + specifier: 20.12.7 + version: 20.12.7 + '@types/react': + specifier: npm:types-react@19.0.0-rc.1 + version: /types-react@19.0.0-rc.1 + '@types/react-dom': + specifier: npm:types-react-dom@19.0.0-rc.1 + version: /types-react-dom@19.0.0-rc.1 + '@vercel/git-hooks': + specifier: 1.0.0 + version: 1.0.0 + autoprefixer: + specifier: 10.4.19 + version: 10.4.19(postcss@8.4.38) + eslint: + specifier: 9.0.0 + version: 9.0.0 + eslint-config-next: + specifier: 14.2.2 + version: 14.2.2(eslint@9.0.0)(typescript@5.4.5) + lint-staged: + specifier: 15.2.2 + version: 15.2.2 + postcss: + specifier: 8.4.38 + version: 8.4.38 + prettier: + specifier: 3.2.5 + version: 3.2.5 + prettier-plugin-tailwindcss: + specifier: 0.5.14 + version: 0.5.14(prettier@3.2.5) + tailwindcss: + specifier: 3.4.3 + version: 3.4.3 + typescript: + specifier: 5.4.5 + version: 5.4.5 + apps/node-dynamic-remote: dependencies: '@module-federation/node': @@ -1440,7 +1625,7 @@ importers: version: 1.0.19 '@rsbuild/plugin-vue': specifier: ^1.0.3 - version: 1.0.3(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.24.0)(vue@3.5.10) + version: 1.0.3(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.24.0)(vue@3.5.10)(webpack-cli@5.1.4) tailwindcss: specifier: ^3.4.3 version: 3.4.3 @@ -1554,7 +1739,7 @@ importers: version: 1.0.19 '@rsbuild/plugin-vue': specifier: ^1.0.3 - version: 1.0.3(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.24.0)(vue@3.5.10) + version: 1.0.3(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.24.0)(vue@3.5.10)(webpack-cli@5.1.4) '@vue/tsconfig': specifier: ^0.5.1 version: 0.5.1 @@ -1645,7 +1830,7 @@ importers: version: 0.1.4(@rsbuild/core@1.1.12)(@rslib/core@0.2.0)(storybook-builder-rsbuild@0.1.5)(typescript@5.5.2) storybook-react-rsbuild: specifier: ^0.1.5 - version: 0.1.5(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(rollup@4.24.0)(storybook@8.4.2)(typescript@5.5.2)(webpack@5.93.0) + version: 0.1.5(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(rollup@4.24.0)(storybook@8.4.2)(typescript@5.5.2)(webpack-cli@5.1.4)(webpack@5.93.0) apps/runtime-demo/3005-runtime-host: dependencies: @@ -1975,10 +2160,10 @@ importers: version: 2.54.6(@swc/helpers@0.5.13)(typescript@5.0.4) '@modern-js/app-tools': specifier: 2.60.6 - version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4) + version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/builder-webpack-provider': specifier: 2.46.1 - version: 2.46.1(@rsbuild/core@0.3.11)(@swc/core@1.7.26)(@types/express@4.17.21)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4) + version: 2.46.1(@rsbuild/core@0.3.11)(@swc/core@1.7.26)(@types/express@4.17.21)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/eslint-config': specifier: 2.59.0 version: 2.59.0(typescript@5.0.4) @@ -1987,7 +2172,7 @@ importers: version: 2.60.6(typescript@5.0.4) '@modern-js/storybook': specifier: 2.60.6 - version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(@types/react-dom@18.3.0)(@types/react@18.2.79)(encoding@0.1.13)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4)(webpack@5.93.0) + version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(@types/react-dom@18.3.0)(@types/react@18.2.79)(encoding@0.1.13)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4)(webpack@5.93.0) '@modern-js/tsconfig': specifier: 2.60.6 version: 2.60.6 @@ -2038,7 +2223,7 @@ importers: dependencies: webpack: specifier: ^5.40.0 - version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) packages/data-prefetch: dependencies: @@ -2093,7 +2278,7 @@ importers: version: 29.0.1(@babel/core@7.26.0)(babel-jest@29.7.0)(esbuild@0.24.0)(jest@29.7.0)(typescript@5.5.2) webpack: specifier: 5.75.0 - version: 5.75.0(@swc/core@1.7.26)(esbuild@0.24.0) + version: 5.75.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) packages/dts-plugin: dependencies: @@ -2217,7 +2402,7 @@ importers: version: 2.1.6(typescript@5.5.2) webpack: specifier: ^5.0.0 - version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) devDependencies: '@module-federation/webpack-bundler-runtime': specifier: workspace:* @@ -2290,7 +2475,7 @@ importers: devDependencies: webpack: specifier: 5.93.0 - version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) packages/manifest: dependencies: @@ -2357,7 +2542,7 @@ importers: devDependencies: '@modern-js/app-tools': specifier: 2.60.6 - version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.5.2) + version: 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.5.2)(webpack-cli@5.1.4) '@modern-js/core': specifier: 2.60.6 version: 2.60.6 @@ -2393,7 +2578,7 @@ importers: version: 9.3.0 tsup: specifier: ^8.1.0 - version: 8.3.0(@swc/core@1.7.26)(postcss@8.4.47)(typescript@5.5.2) + version: 8.3.0(@swc/core@1.7.26)(postcss@8.4.38)(typescript@5.5.2) unplugin: specifier: ^1.10.1 version: 1.14.1 @@ -2460,7 +2645,11 @@ importers: version: 5.1.6(@babel/core@7.25.2)(react@18.3.1) webpack: specifier: ^5.40.0 - version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) + devDependencies: + '@types/btoa': + specifier: ^1.2.5 + version: 1.2.5 packages/node: dependencies: @@ -2493,7 +2682,7 @@ importers: version: 18.3.1(react@18.3.1) webpack: specifier: ^5.40.0 - version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) packages/retry-plugin: dependencies: @@ -2604,10 +2793,10 @@ importers: version: link:../sdk '@nx/react': specifier: '>= 16.0.0' - version: 20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(eslint@8.57.1)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack@5.93.0) + version: 20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(eslint@9.0.0)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack@5.93.0) '@nx/webpack': specifier: '>= 16.0.0' - version: 20.1.1(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(esbuild@0.18.20)(html-webpack-plugin@5.6.2)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6) + version: 20.1.1(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(esbuild@0.18.20)(html-webpack-plugin@5.6.2)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack-cli@5.1.4) devDependencies: '@module-federation/utilities': specifier: workspace:* @@ -2626,7 +2815,7 @@ importers: version: 0.0.9(jest-environment-jsdom@29.7.0) webpack: specifier: 5.93.0 - version: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + version: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) webpack-virtual-modules: specifier: 0.6.2 version: 0.6.2 @@ -2668,7 +2857,7 @@ importers: version: 1.8.27(typescript@5.5.2) webpack: specifier: ^5.75.0 - version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) packages/utilities: dependencies: @@ -2680,7 +2869,7 @@ importers: version: 18.3.1(react@18.3.1) webpack: specifier: ^5.40.0 - version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + version: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) devDependencies: react: specifier: 18.3.1 @@ -2969,10 +3158,10 @@ packages: '@babel/helpers': 7.26.0 '@babel/parser': 7.26.2 '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 1.9.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.3 lodash: 4.17.21 @@ -2998,7 +3187,7 @@ packages: '@babel/traverse': 7.25.7 '@babel/types': 7.25.7 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -3017,10 +3206,10 @@ packages: '@babel/helpers': 7.26.0 '@babel/parser': 7.26.2 '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -3040,10 +3229,10 @@ packages: '@babel/helpers': 7.26.0 '@babel/parser': 7.26.2 '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -3063,10 +3252,10 @@ packages: '@babel/helpers': 7.26.0 '@babel/parser': 7.26.2 '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 convert-source-map: 2.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -3154,7 +3343,7 @@ packages: resolution: {integrity: sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -3191,7 +3380,7 @@ packages: '@babel/helper-optimise-call-expression': 7.25.7 '@babel/helper-replace-supers': 7.25.7(@babel/core@7.25.2) '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3209,7 +3398,7 @@ packages: '@babel/helper-optimise-call-expression': 7.25.7 '@babel/helper-replace-supers': 7.25.7(@babel/core@7.25.7) '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3227,7 +3416,7 @@ packages: '@babel/helper-optimise-call-expression': 7.25.7 '@babel/helper-replace-supers': 7.25.7(@babel/core@7.26.0) '@babel/helper-skip-transparent-expression-wrappers': 7.25.7 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3244,7 +3433,7 @@ packages: '@babel/helper-optimise-call-expression': 7.25.9 '@babel/helper-replace-supers': 7.25.9(@babel/core@7.25.7) '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3262,7 +3451,7 @@ packages: '@babel/helper-optimise-call-expression': 7.25.9 '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -3321,7 +3510,7 @@ packages: '@babel/core': 7.25.7 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -3336,7 +3525,7 @@ packages: '@babel/core': 7.26.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -3346,7 +3535,7 @@ packages: resolution: {integrity: sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -3355,7 +3544,7 @@ packages: resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -3364,7 +3553,16 @@ packages: resolution: {integrity: sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + /@babel/helper-module-imports@7.25.9: + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -3388,7 +3586,7 @@ packages: '@babel/helper-module-imports': 7.25.7 '@babel/helper-simple-access': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -3399,9 +3597,9 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.12.9 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -3413,9 +3611,9 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.25.7 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -3427,9 +3625,9 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.25.8 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -3441,9 +3639,9 @@ packages: '@babel/core': ^7.0.0 dependencies: '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -3476,7 +3674,7 @@ packages: '@babel/core': 7.25.7 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -3490,7 +3688,7 @@ packages: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -3503,7 +3701,7 @@ packages: '@babel/core': 7.25.2 '@babel/helper-member-expression-to-functions': 7.25.7 '@babel/helper-optimise-call-expression': 7.25.7 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -3517,7 +3715,7 @@ packages: '@babel/core': 7.25.7 '@babel/helper-member-expression-to-functions': 7.25.7 '@babel/helper-optimise-call-expression': 7.25.7 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -3531,7 +3729,7 @@ packages: '@babel/core': 7.26.0 '@babel/helper-member-expression-to-functions': 7.25.7 '@babel/helper-optimise-call-expression': 7.25.7 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -3544,7 +3742,7 @@ packages: '@babel/core': 7.25.7 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -3558,7 +3756,7 @@ packages: '@babel/core': 7.26.0 '@babel/helper-member-expression-to-functions': 7.25.9 '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -3566,7 +3764,7 @@ packages: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -3575,7 +3773,7 @@ packages: resolution: {integrity: sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -3585,7 +3783,7 @@ packages: resolution: {integrity: sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -3594,7 +3792,7 @@ packages: resolution: {integrity: sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -3603,7 +3801,7 @@ packages: resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -3641,7 +3839,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 transitivePeerDependencies: - supports-color @@ -3708,7 +3906,7 @@ packages: dependencies: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -3721,7 +3919,7 @@ packages: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -3798,7 +3996,7 @@ packages: dependencies: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -3811,7 +4009,7 @@ packages: dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -4547,7 +4745,7 @@ packages: '@babel/core': 7.25.7 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.25.7) - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -4561,7 +4759,7 @@ packages: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -4572,7 +4770,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.25.7 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.25.7) transitivePeerDependencies: @@ -4586,7 +4784,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) transitivePeerDependencies: @@ -4704,7 +4902,7 @@ packages: '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-replace-supers': 7.25.9(@babel/core@7.25.7) - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -4721,7 +4919,7 @@ packages: '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-replace-supers': 7.25.9(@babel/core@7.26.0) - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -4946,7 +5144,7 @@ packages: '@babel/core': 7.25.7 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -4960,7 +5158,7 @@ packages: '@babel/core': 7.26.0 '@babel/helper-compilation-targets': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -5116,7 +5314,7 @@ packages: '@babel/helper-module-transforms': 7.26.0(@babel/core@7.25.7) '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -5131,7 +5329,7 @@ packages: '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) '@babel/helper-plugin-utils': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -5623,7 +5821,7 @@ packages: dependencies: '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.25.2) '@babel/types': 7.26.0 @@ -5639,7 +5837,7 @@ packages: dependencies: '@babel/core': 7.25.7 '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.25.7) '@babel/types': 7.26.0 @@ -5655,7 +5853,7 @@ packages: dependencies: '@babel/core': 7.25.8 '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.25.8) '@babel/types': 7.26.0 @@ -5671,7 +5869,7 @@ packages: dependencies: '@babel/core': 7.26.0 '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) '@babel/types': 7.26.0 @@ -5789,7 +5987,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.25.7 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.7) babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.7) @@ -5806,7 +6004,7 @@ packages: '@babel/core': ^7.0.0-0 dependencies: '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.26.0) babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) @@ -6400,7 +6598,21 @@ packages: '@babel/parser': 7.26.2 '@babel/template': 7.25.9 '@babel/types': 7.26.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + /@babel/traverse@7.25.9: + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7(supports-color@9.3.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6946,13 +7158,13 @@ packages: postcss-selector-parser: 6.1.2 dev: true - /@csstools/utilities@1.0.0(postcss@8.4.47): + /@csstools/utilities@1.0.0(postcss@8.4.38): resolution: {integrity: sha512-tAgvZQe/t2mlvpNosA4+CkMiZ2azISW5WPAcdSalZlEjQvUfghHxfQcrCiK/7/CrfAWVxyM88kGFYO82heIGDg==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 dev: true /@ctrl/tinycolor@3.6.1: @@ -7016,10 +7228,52 @@ packages: - supports-color dev: true + /@dinero.js/calculator-number@2.0.0-alpha.10: + resolution: {integrity: sha512-EdKG0yykukigfdq+TsxZ9r0Wrg5flYAncKWSfr2snWDXurFsg8JE0oazVraCBA3Vb5LN4vGuFEpTFTH+dIrRCg==} + dependencies: + '@dinero.js/core': 2.0.0-alpha.10 + dev: false + + /@dinero.js/core@2.0.0-alpha.10: + resolution: {integrity: sha512-vjeGXQbNvDXlXK54zaWDydEXyFAvLDj6LCfwO4CTZJIqn3+PaXakaEd5S0AXC6hluPatxnQa5J63x3WQ/Imrjw==} + dependencies: + '@dinero.js/currencies': 2.0.0-alpha.10 + dev: false + + /@dinero.js/currencies@2.0.0-alpha.10: + resolution: {integrity: sha512-IDKaAh0YcJh700uLCrvWtIRCl5sItc3S2rk4IfVJBbms3j+NBDOlVFJnwru+UrMh7VpqU9GlZRsHcHf0NxYE9A==} + dev: false + /@discoveryjs/json-ext@0.5.7: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} - dev: true + + /@edge-runtime/format@2.2.1: + resolution: {integrity: sha512-JQTRVuiusQLNNLe2W9tnzBlV/GvSVcozLl4XZHk5swnRZ/v6jp8TqR8P7sqmJsQqblDZ3EztcWmLDbhRje/+8g==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/node-utils@2.3.0: + resolution: {integrity: sha512-uUtx8BFoO1hNxtHjp3eqVPC/mWImGb2exOfGjMLUoipuWgjej+f4o/VP4bUI8U40gu7Teogd5VTeZUkGvJSPOQ==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/ponyfill@2.4.2: + resolution: {integrity: sha512-oN17GjFr69chu6sDLvXxdhg0Qe8EZviGSuqzR9qOiKh4MhFYGdBBcqRNzdmYeAdeRzOW2mM9yil4RftUQ7sUOA==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/primitives@4.1.0: + resolution: {integrity: sha512-Vw0lbJ2lvRUqc7/soqygUX216Xb8T3WBZ987oywz6aJqRxcwSVWwr9e+Nqo2m9bxobA9mdbWNNoRY6S9eko1EQ==} + engines: {node: '>=16'} + dev: false + + /@edge-runtime/vm@3.2.0: + resolution: {integrity: sha512-0dEVyRLM/lG4gp1R/Ik5bfPl/1wX00xFwd5KcNH602tzBa09oF7pbTKETEhR1GjZ75K6OJnYFu8II2dyMhONMw==} + engines: {node: '>=16'} + dependencies: + '@edge-runtime/primitives': 4.1.0 + dev: false /@emnapi/core@1.3.0: resolution: {integrity: sha512-9hRqVlhwqBqCoToZ3hFcNVqL+uyHV06Y47ax4UB8L6XgVRqYz7MFnfessojo6+5TK89pKwJnpophwjTMOeKI9Q==} @@ -7043,7 +7297,7 @@ packages: /@emotion/babel-plugin@11.12.0: resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} dependencies: - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/runtime': 7.26.0 '@emotion/hash': 0.9.2 '@emotion/memoize': 0.9.0 @@ -7083,11 +7337,10 @@ packages: dev: false optional: true - /@emotion/is-prop-valid@1.2.2: - resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} + /@emotion/is-prop-valid@1.2.1: + resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==} dependencies: '@emotion/memoize': 0.8.1 - dev: true /@emotion/is-prop-valid@1.3.1: resolution: {integrity: sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==} @@ -7102,7 +7355,6 @@ packages: /@emotion/memoize@0.8.1: resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} - dev: true /@emotion/memoize@0.9.0: resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} @@ -7177,9 +7429,8 @@ packages: /@emotion/unitless@0.7.5: resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==} - /@emotion/unitless@0.8.1: - resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} - dev: true + /@emotion/unitless@0.8.0: + resolution: {integrity: sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==} /@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1): resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} @@ -8579,6 +8830,16 @@ packages: dependencies: eslint: 8.57.1 eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/eslint-utils@4.4.0(eslint@9.0.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 9.0.0 + eslint-visitor-keys: 3.4.3 /@eslint-community/regexpp@4.11.1: resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} @@ -8589,7 +8850,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -8599,10 +8860,32 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + dev: true + + /@eslint/eslintrc@3.2.0: + resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.7(supports-color@9.3.1) + espree: 10.3.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color /@eslint/js@8.57.1: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@eslint/js@9.0.0: + resolution: {integrity: sha512-RThY/MnKrhubF6+s1JflwUjPEsnCEmYCWwqa/aRISKWNXGZ9epUwft4bUMM35SdKF9xvBrLydAM1RDHd1Z//ZQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} /@fal-works/esbuild-plugin-global-externals@2.1.2: resolution: {integrity: sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==} @@ -8659,16 +8942,36 @@ packages: '@hapi/hoek': 9.3.0 dev: true + /@heroicons/react@2.1.3(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-fEcPfo4oN345SoqdlCDdSa4ivjaKbk0jTd+oubcgNxnNgAfzysfwWfQUr+51wigiWHQQRiZNd1Ao0M5Y3M2EGg==} + peerDependencies: + react: '>= 16' + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + dev: false + + /@humanwhocodes/config-array@0.12.3: + resolution: {integrity: sha512-jsNnTBlMWuTpDkeE3on7+dWJi0D6fdDfeANj/w7MpS8ztROCoLvIO2nG0CcFj+E4k8j4QrSTh4Oryi3i2G669g==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.7(supports-color@9.3.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + /@humanwhocodes/config-array@0.13.0: resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: true /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} @@ -9253,7 +9556,6 @@ packages: transitivePeerDependencies: - encoding - supports-color - dev: true /@mdx-js/loader@2.3.0(webpack@5.93.0): resolution: {integrity: sha512-IqsscXh7Q3Rzb+f5DXYk0HU71PK+WuFsEhf+mSV3fOhpLcEpgsHvTQ2h0T6TlZ5gHOaBeFjkXwB52by7ypMyNg==} @@ -9262,7 +9564,7 @@ packages: dependencies: '@mdx-js/mdx': 2.3.0 source-map: 0.7.4 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color dev: false @@ -9582,7 +9884,7 @@ packages: '@swc/helpers': 0.5.1 redux: 4.2.1 - /@modern-js/app-tools@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4): + /@modern-js/app-tools@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4): resolution: {integrity: sha512-vbU4XmjlT7rSiotI1zF+esT8NrGt7DSTL4jDRMZeBS7mDOfWNL/DTQMVlgzUw6qZujxCJbtlkPAxLCrnM0jimg==} engines: {node: '>=14.17.6'} hasBin: true @@ -9604,12 +9906,12 @@ packages: '@modern-js/plugin-data-loader': 2.60.6(react-dom@18.3.1)(react@18.3.1) '@modern-js/plugin-i18n': 2.60.6 '@modern-js/prod-server': 2.60.6(react-dom@18.3.1)(react@18.3.1) - '@modern-js/rsbuild-plugin-esbuild': 2.60.6(@swc/core@1.7.26) + '@modern-js/rsbuild-plugin-esbuild': 2.60.6(@swc/core@1.7.26)(webpack-cli@5.1.4) '@modern-js/server': 2.60.6(@babel/traverse@7.25.7)(@rsbuild/core@1.0.19)(react-dom@18.3.1)(react@18.3.1) '@modern-js/server-core': 2.60.6(react-dom@18.3.1)(react@18.3.1) '@modern-js/server-utils': 2.60.6(@babel/traverse@7.25.7)(@rsbuild/core@1.0.19) '@modern-js/types': 2.60.6 - '@modern-js/uni-builder': 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.17.19)(styled-components@6.1.13)(typescript@5.0.4) + '@modern-js/uni-builder': 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.17.19)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/utils': 2.60.6 '@rsbuild/core': 1.0.19 '@rsbuild/plugin-node-polyfill': 1.2.0(@rsbuild/core@1.0.19) @@ -9650,7 +9952,7 @@ packages: - webpack-plugin-serve dev: true - /@modern-js/app-tools@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.5.2): + /@modern-js/app-tools@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.5.2)(webpack-cli@5.1.4): resolution: {integrity: sha512-vbU4XmjlT7rSiotI1zF+esT8NrGt7DSTL4jDRMZeBS7mDOfWNL/DTQMVlgzUw6qZujxCJbtlkPAxLCrnM0jimg==} engines: {node: '>=14.17.6'} hasBin: true @@ -9672,12 +9974,12 @@ packages: '@modern-js/plugin-data-loader': 2.60.6(react-dom@18.3.1)(react@18.3.1) '@modern-js/plugin-i18n': 2.60.6 '@modern-js/prod-server': 2.60.6(react-dom@18.3.1)(react@18.3.1) - '@modern-js/rsbuild-plugin-esbuild': 2.60.6(@swc/core@1.7.26) + '@modern-js/rsbuild-plugin-esbuild': 2.60.6(@swc/core@1.7.26)(webpack-cli@5.1.4) '@modern-js/server': 2.60.6(@babel/traverse@7.25.7)(@rsbuild/core@1.0.19)(react-dom@18.3.1)(react@18.3.1) '@modern-js/server-core': 2.60.6(react-dom@18.3.1)(react@18.3.1) '@modern-js/server-utils': 2.60.6(@babel/traverse@7.25.7)(@rsbuild/core@1.0.19) '@modern-js/types': 2.60.6 - '@modern-js/uni-builder': 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.17.19)(styled-components@6.1.13)(typescript@5.5.2) + '@modern-js/uni-builder': 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.17.19)(styled-components@6.1.8)(typescript@5.5.2)(webpack-cli@5.1.4) '@modern-js/utils': 2.60.6 '@rsbuild/core': 1.0.19 '@rsbuild/plugin-node-polyfill': 1.2.0(@rsbuild/core@1.0.19) @@ -9804,7 +10106,7 @@ packages: - supports-color dev: true - /@modern-js/builder-shared@2.46.1(@rsbuild/core@0.3.11)(@swc/core@1.7.26)(@types/express@4.17.21)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(typescript@5.0.4): + /@modern-js/builder-shared@2.46.1(@rsbuild/core@0.3.11)(@swc/core@1.7.26)(@types/express@4.17.21)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(typescript@5.0.4)(webpack-cli@5.1.4): resolution: {integrity: sha512-nlniPnfeP+rofd1LX2BBX7Vy2pZkxnBnxK7u8rfT/9XUJzHAbjvPxVPyB8IbBIoL9RnLWWQtvTDpAAbz/jRo+Q==} engines: {node: '>=14.0.0'} dependencies: @@ -9825,7 +10127,7 @@ packages: line-diff: 2.1.1 postcss: 8.4.31 source-map: 0.7.4 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) webpack-sources: 3.2.3 zod: 3.23.8 zod-validation-error: 1.2.0(zod@3.23.8) @@ -9854,13 +10156,13 @@ packages: - webpack-cli dev: true - /@modern-js/builder-webpack-provider@2.46.1(@rsbuild/core@0.3.11)(@swc/core@1.7.26)(@types/express@4.17.21)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4): + /@modern-js/builder-webpack-provider@2.46.1(@rsbuild/core@0.3.11)(@swc/core@1.7.26)(@types/express@4.17.21)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4): resolution: {integrity: sha512-a891A2kBN/m7YBrddqanjhD2Im9y/58QrGg9zxDzoAZ8DnKf6AM716FR9K8ZS5kWMndiY7247AG2X1sTQtzQ3w==} engines: {node: '>=14.0.0'} dependencies: '@babel/core': 7.25.8 '@babel/preset-react': 7.25.7(@babel/core@7.25.8) - '@modern-js/builder-shared': 2.46.1(@rsbuild/core@0.3.11)(@swc/core@1.7.26)(@types/express@4.17.21)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(typescript@5.0.4) + '@modern-js/builder-shared': 2.46.1(@rsbuild/core@0.3.11)(@swc/core@1.7.26)(@types/express@4.17.21)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/inspector-webpack-plugin': 1.0.6 '@modern-js/server': 2.46.1(@rsbuild/core@0.3.11)(@types/express@4.17.21)(react-dom@18.3.1)(react@18.3.1) '@modern-js/types': 2.46.1 @@ -9869,7 +10171,7 @@ packages: '@rsbuild/babel-preset': 0.3.4(@rsbuild/core@0.3.11)(@swc/helpers@0.5.3) '@swc/helpers': 0.5.3 babel-plugin-import: 1.13.5 - babel-plugin-styled-components: 1.13.3(styled-components@6.1.13) + babel-plugin-styled-components: 1.13.3(styled-components@6.1.8) caniuse-lite: 1.0.30001668 html-webpack-plugin: 5.5.3(webpack@5.95.0) lodash: 4.17.21 @@ -9880,7 +10182,7 @@ packages: terser-webpack-plugin: 5.3.9(@swc/core@1.7.26)(esbuild@0.18.20)(webpack@5.95.0) ts-loader: 9.4.4(typescript@5.0.4)(webpack@5.95.0) tsconfig-paths-webpack-plugin: 4.1.0 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.5.3)(webpack@5.95.0) transitivePeerDependencies: - '@babel/traverse' @@ -10120,12 +10422,12 @@ packages: - react-dom dev: true - /@modern-js/rsbuild-plugin-esbuild@2.60.6(@swc/core@1.7.26): + /@modern-js/rsbuild-plugin-esbuild@2.60.6(@swc/core@1.7.26)(webpack-cli@5.1.4): resolution: {integrity: sha512-o65skhuvIfg5Pbis4PJSdYJ+mQyXs6MRLxDS0V5/6rWlQ7esRz8wna9iJvBkAwEMeXEHgiuv/qtyxRHmH8nO5g==} dependencies: '@swc/helpers': 0.5.13 esbuild: 0.17.19 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - uglify-js @@ -10406,13 +10708,13 @@ packages: - utf-8-validate dev: true - /@modern-js/storybook-builder@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(@types/react-dom@18.3.0)(@types/react@18.2.79)(encoding@0.1.13)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4)(webpack@5.93.0): + /@modern-js/storybook-builder@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(@types/react-dom@18.3.0)(@types/react@18.2.79)(encoding@0.1.13)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4)(webpack@5.93.0): resolution: {integrity: sha512-aptCg9RbeEvazw4K7m3+nNsrlxHjwHUONgNRdDe97W6mbrlMu/ADdlfegHWh1qya8ktIvg43uylViP9YXx3YNw==} engines: {node: '>=16.0.0'} dependencies: '@modern-js/core': 2.60.6 '@modern-js/runtime': 2.60.6(@types/react-dom@18.3.0)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1) - '@modern-js/uni-builder': 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.18.20)(styled-components@6.1.13)(typescript@5.0.4) + '@modern-js/uni-builder': 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.18.20)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4) '@modern-js/utils': 2.60.6 '@rsbuild/core': 1.0.19 '@storybook/components': 7.6.20(@types/react-dom@18.3.0)(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1) @@ -10462,12 +10764,12 @@ packages: - webpack-sources dev: true - /@modern-js/storybook@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(@types/react-dom@18.3.0)(@types/react@18.2.79)(encoding@0.1.13)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4)(webpack@5.93.0): + /@modern-js/storybook@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(@types/react-dom@18.3.0)(@types/react@18.2.79)(encoding@0.1.13)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4)(webpack@5.93.0): resolution: {integrity: sha512-GeRaKxXyuAArnIe2YY5B6VG/WISPxrVY+Rlq+D1GZR868EcBKQ/FNpA0wJDRZRsvRxLWmOyBFHnU13WOegdEpg==} engines: {node: '>=16.0.0'} hasBin: true dependencies: - '@modern-js/storybook-builder': 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(@types/react-dom@18.3.0)(@types/react@18.2.79)(encoding@0.1.13)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.13)(typescript@5.0.4)(webpack@5.93.0) + '@modern-js/storybook-builder': 2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(@types/react-dom@18.3.0)(@types/react@18.2.79)(encoding@0.1.13)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4)(webpack@5.93.0) '@modern-js/utils': 2.60.6 '@storybook/react': 7.6.20(encoding@0.1.13)(react-dom@18.3.1)(react@18.3.1)(typescript@5.0.4) storybook: 7.6.20(encoding@0.1.13) @@ -10606,7 +10908,7 @@ packages: /@modern-js/types@2.60.6: resolution: {integrity: sha512-Tjh03D6lW34BmbKm5CV7SgtjSnOIjFQhRh+pExCMpSQUgJOWSooboEVsZQ2f8zdyxijI1MSSGEIt4ak30Vsvng==} - /@modern-js/uni-builder@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.17.19)(styled-components@6.1.13)(typescript@5.0.4): + /@modern-js/uni-builder@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.17.19)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4): resolution: {integrity: sha512-ObkfQcMkAdbohurL+UILJd23Z5B9v9as935tNa2lScx8aOj6EmViOcbLb5kZXnH0EQMrX9FcEOxAy6gp7jS/3g==} dependencies: '@babel/core': 7.26.0 @@ -10629,37 +10931,37 @@ packages: '@rsbuild/plugin-styled-components': 1.0.1(@rsbuild/core@1.0.19) '@rsbuild/plugin-svgr': 1.0.4(@rsbuild/core@1.0.19)(typescript@5.0.4) '@rsbuild/plugin-toml': 1.0.1(@rsbuild/core@1.0.19) - '@rsbuild/plugin-type-check': 1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19)(typescript@5.0.4) + '@rsbuild/plugin-type-check': 1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19)(typescript@5.0.4)(webpack-cli@5.1.4) '@rsbuild/plugin-typed-css-modules': 1.0.2(@rsbuild/core@1.0.19) '@rsbuild/plugin-yaml': 1.0.2(@rsbuild/core@1.0.19) - '@rsbuild/webpack': 1.0.11(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19) + '@rsbuild/webpack': 1.0.11(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) '@swc/helpers': 0.5.13 - autoprefixer: 10.4.20(postcss@8.4.47) + autoprefixer: 10.4.20(postcss@8.4.38) babel-loader: 9.1.3(@babel/core@7.26.0)(webpack@5.95.0) babel-plugin-import: 1.13.8 - babel-plugin-styled-components: 1.13.3(styled-components@6.1.13) + babel-plugin-styled-components: 1.13.3(styled-components@6.1.8) babel-plugin-transform-react-remove-prop-types: 0.4.24 browserslist: 4.23.1 - cssnano: 6.0.1(postcss@8.4.47) + cssnano: 6.0.1(postcss@8.4.38) glob: 9.3.5 html-minifier-terser: 7.2.0 html-webpack-plugin: 5.6.3(@rspack/core@1.0.8)(webpack@5.95.0) lodash: 4.17.21 picocolors: 1.1.1 - postcss: 8.4.47 - postcss-custom-properties: 13.1.5(postcss@8.4.47) - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.47) - postcss-font-variant: 5.0.0(postcss@8.4.47) - postcss-initial: 4.0.1(postcss@8.4.47) - postcss-media-minmax: 5.0.0(postcss@8.4.47) - postcss-nesting: 12.0.1(postcss@8.4.47) - postcss-page-break: 3.0.4(postcss@8.4.47) + postcss: 8.4.38 + postcss-custom-properties: 13.1.5(postcss@8.4.38) + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.38) + postcss-font-variant: 5.0.0(postcss@8.4.38) + postcss-initial: 4.0.1(postcss@8.4.38) + postcss-media-minmax: 5.0.0(postcss@8.4.38) + postcss-nesting: 12.0.1(postcss@8.4.38) + postcss-page-break: 3.0.4(postcss@8.4.38) react-refresh: 0.14.2 rspack-manifest-plugin: 5.0.1(@rspack/core@1.0.8) terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(esbuild@0.17.19)(webpack@5.95.0) ts-deepmerge: 7.0.1 ts-loader: 9.4.4(typescript@5.0.4)(webpack@5.95.0) - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.3)(webpack@5.95.0) transitivePeerDependencies: - '@parcel/css' @@ -10683,7 +10985,7 @@ packages: - webpack-plugin-serve dev: true - /@modern-js/uni-builder@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.17.19)(styled-components@6.1.13)(typescript@5.5.2): + /@modern-js/uni-builder@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.17.19)(styled-components@6.1.8)(typescript@5.5.2)(webpack-cli@5.1.4): resolution: {integrity: sha512-ObkfQcMkAdbohurL+UILJd23Z5B9v9as935tNa2lScx8aOj6EmViOcbLb5kZXnH0EQMrX9FcEOxAy6gp7jS/3g==} dependencies: '@babel/core': 7.26.0 @@ -10706,37 +11008,37 @@ packages: '@rsbuild/plugin-styled-components': 1.0.1(@rsbuild/core@1.0.19) '@rsbuild/plugin-svgr': 1.0.4(@rsbuild/core@1.0.19)(typescript@5.5.2) '@rsbuild/plugin-toml': 1.0.1(@rsbuild/core@1.0.19) - '@rsbuild/plugin-type-check': 1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19)(typescript@5.5.2) + '@rsbuild/plugin-type-check': 1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19)(typescript@5.5.2)(webpack-cli@5.1.4) '@rsbuild/plugin-typed-css-modules': 1.0.2(@rsbuild/core@1.0.19) '@rsbuild/plugin-yaml': 1.0.2(@rsbuild/core@1.0.19) - '@rsbuild/webpack': 1.0.11(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19) + '@rsbuild/webpack': 1.0.11(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) '@swc/helpers': 0.5.13 - autoprefixer: 10.4.20(postcss@8.4.47) + autoprefixer: 10.4.20(postcss@8.4.38) babel-loader: 9.1.3(@babel/core@7.26.0)(webpack@5.95.0) babel-plugin-import: 1.13.8 - babel-plugin-styled-components: 1.13.3(styled-components@6.1.13) + babel-plugin-styled-components: 1.13.3(styled-components@6.1.8) babel-plugin-transform-react-remove-prop-types: 0.4.24 browserslist: 4.23.1 - cssnano: 6.0.1(postcss@8.4.47) + cssnano: 6.0.1(postcss@8.4.38) glob: 9.3.5 html-minifier-terser: 7.2.0 html-webpack-plugin: 5.6.3(@rspack/core@1.0.8)(webpack@5.95.0) lodash: 4.17.21 picocolors: 1.1.1 - postcss: 8.4.47 - postcss-custom-properties: 13.1.5(postcss@8.4.47) - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.47) - postcss-font-variant: 5.0.0(postcss@8.4.47) - postcss-initial: 4.0.1(postcss@8.4.47) - postcss-media-minmax: 5.0.0(postcss@8.4.47) - postcss-nesting: 12.0.1(postcss@8.4.47) - postcss-page-break: 3.0.4(postcss@8.4.47) + postcss: 8.4.38 + postcss-custom-properties: 13.1.5(postcss@8.4.38) + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.38) + postcss-font-variant: 5.0.0(postcss@8.4.38) + postcss-initial: 4.0.1(postcss@8.4.38) + postcss-media-minmax: 5.0.0(postcss@8.4.38) + postcss-nesting: 12.0.1(postcss@8.4.38) + postcss-page-break: 3.0.4(postcss@8.4.38) react-refresh: 0.14.2 rspack-manifest-plugin: 5.0.1(@rspack/core@1.0.8) terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(esbuild@0.17.19)(webpack@5.95.0) ts-deepmerge: 7.0.1 ts-loader: 9.4.4(typescript@5.5.2)(webpack@5.95.0) - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.3)(webpack@5.95.0) transitivePeerDependencies: - '@parcel/css' @@ -10760,7 +11062,7 @@ packages: - webpack-plugin-serve dev: true - /@modern-js/uni-builder@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.18.20)(styled-components@6.1.13)(typescript@5.0.4): + /@modern-js/uni-builder@2.60.6(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.18.20)(styled-components@6.1.8)(typescript@5.0.4)(webpack-cli@5.1.4): resolution: {integrity: sha512-ObkfQcMkAdbohurL+UILJd23Z5B9v9as935tNa2lScx8aOj6EmViOcbLb5kZXnH0EQMrX9FcEOxAy6gp7jS/3g==} dependencies: '@babel/core': 7.26.0 @@ -10783,37 +11085,37 @@ packages: '@rsbuild/plugin-styled-components': 1.0.1(@rsbuild/core@1.0.19) '@rsbuild/plugin-svgr': 1.0.4(@rsbuild/core@1.0.19)(typescript@5.0.4) '@rsbuild/plugin-toml': 1.0.1(@rsbuild/core@1.0.19) - '@rsbuild/plugin-type-check': 1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.18.20)(typescript@5.0.4) + '@rsbuild/plugin-type-check': 1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.18.20)(typescript@5.0.4)(webpack-cli@5.1.4) '@rsbuild/plugin-typed-css-modules': 1.0.2(@rsbuild/core@1.0.19) '@rsbuild/plugin-yaml': 1.0.2(@rsbuild/core@1.0.19) - '@rsbuild/webpack': 1.0.11(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.18.20) + '@rsbuild/webpack': 1.0.11(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) '@swc/helpers': 0.5.13 - autoprefixer: 10.4.20(postcss@8.4.47) + autoprefixer: 10.4.20(postcss@8.4.38) babel-loader: 9.1.3(@babel/core@7.26.0)(webpack@5.95.0) babel-plugin-import: 1.13.8 - babel-plugin-styled-components: 1.13.3(styled-components@6.1.13) + babel-plugin-styled-components: 1.13.3(styled-components@6.1.8) babel-plugin-transform-react-remove-prop-types: 0.4.24 browserslist: 4.23.1 - cssnano: 6.0.1(postcss@8.4.47) + cssnano: 6.0.1(postcss@8.4.38) glob: 9.3.5 html-minifier-terser: 7.2.0 html-webpack-plugin: 5.6.3(@rspack/core@1.0.8)(webpack@5.95.0) lodash: 4.17.21 picocolors: 1.1.1 - postcss: 8.4.47 - postcss-custom-properties: 13.1.5(postcss@8.4.47) - postcss-flexbugs-fixes: 5.0.2(postcss@8.4.47) - postcss-font-variant: 5.0.0(postcss@8.4.47) - postcss-initial: 4.0.1(postcss@8.4.47) - postcss-media-minmax: 5.0.0(postcss@8.4.47) - postcss-nesting: 12.0.1(postcss@8.4.47) - postcss-page-break: 3.0.4(postcss@8.4.47) + postcss: 8.4.38 + postcss-custom-properties: 13.1.5(postcss@8.4.38) + postcss-flexbugs-fixes: 5.0.2(postcss@8.4.38) + postcss-font-variant: 5.0.0(postcss@8.4.38) + postcss-initial: 4.0.1(postcss@8.4.38) + postcss-media-minmax: 5.0.0(postcss@8.4.38) + postcss-nesting: 12.0.1(postcss@8.4.38) + postcss-page-break: 3.0.4(postcss@8.4.38) react-refresh: 0.14.2 rspack-manifest-plugin: 5.0.1(@rspack/core@1.0.8) terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(esbuild@0.18.20)(webpack@5.95.0) ts-deepmerge: 7.0.1 ts-loader: 9.4.4(typescript@5.0.4)(webpack@5.95.0) - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.3)(webpack@5.95.0) transitivePeerDependencies: - '@parcel/css' @@ -11104,7 +11406,7 @@ packages: typescript: 5.5.2 upath: 2.0.1 vue-tsc: 2.1.6(typescript@5.5.2) - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug @@ -11139,7 +11441,7 @@ packages: typescript: 5.5.2 upath: 2.0.1 vue-tsc: 2.1.6(typescript@5.5.2) - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug @@ -11175,7 +11477,7 @@ packages: typescript: 5.5.2 upath: 2.0.1 vue-tsc: 2.1.6(typescript@5.5.2) - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug @@ -11211,7 +11513,7 @@ packages: typescript: 5.5.2 upath: 2.0.1 vue-tsc: 2.1.6(typescript@5.5.2) - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug @@ -11352,7 +11654,7 @@ packages: node-fetch: 2.7.0(encoding@0.1.13) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) transitivePeerDependencies: - bufferutil - debug @@ -11634,7 +11936,7 @@ packages: next: 14.2.16(@babel/core@7.25.2)(react-dom@18.3.1)(react@18.3.1) react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /@module-federation/webpack-bundler-runtime@0.0.8: @@ -11713,7 +12015,7 @@ packages: '@open-draft/until': 1.0.3 '@types/debug': 4.1.12 '@xmldom/xmldom': 0.8.10 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) headers-polyfill: 3.2.5 outvariant: 1.4.3 strict-event-emitter: 0.2.8 @@ -11925,12 +12227,22 @@ packages: /@next/env@14.2.16: resolution: {integrity: sha512-fLrX5TfJzHCbnZ9YUSnGW63tMV3L4nSfhgOQ0iCcX21Pt+VSTDuaLsSuL8J/2XAiVA5AnzvXDpf6pMs60QxOag==} + /@next/env@15.0.0-canary.193: + resolution: {integrity: sha512-GBCLGuoPKHF6H/bmtALmKEV/+IsIToVelkM8eZpVDGfWtL03KueC6mUZdhF1trBZenGW3Ly1j0N872koPUcAlw==} + dev: false + /@next/eslint-plugin-next@14.2.15: resolution: {integrity: sha512-pKU0iqKRBlFB/ocOI1Ip2CkKePZpYpnw5bEItEkuZ/Nr9FQP1+p7VDWr4VfOdff4i9bFmrOaeaU1bFEyAcxiMQ==} dependencies: glob: 10.3.10 dev: true + /@next/eslint-plugin-next@14.2.2: + resolution: {integrity: sha512-q+Ec2648JtBpKiu/FSJm8HAsFXlNvioHeBCbTP12T1SGcHYwhqHULSfQgFkPgHDu3kzNp2Kem4J54bK4rPQ5SQ==} + dependencies: + glob: 10.3.10 + dev: true + /@next/swc-darwin-arm64@14.2.10: resolution: {integrity: sha512-V3z10NV+cvMAfxQUMhKgfQnPbjw+Ew3cnr64b0lr8MDiBJs3eLnM6RpGC46nhfMZsiXgQngCJKWGTC/yDcgrDQ==} engines: {node: '>= 10'} @@ -11957,6 +12269,15 @@ packages: requiresBuild: true optional: true + /@next/swc-darwin-arm64@15.0.0-canary.193: + resolution: {integrity: sha512-CRq2GfI7r5CcAY1ITTb4FZpK8UTGLrNdYelTuv9zcSe4EhuNb7Qp14XfGGL9LV39ZkP5ypcVHYhkrNbfiL3VuQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-darwin-x64@14.2.10: resolution: {integrity: sha512-Y0TC+FXbFUQ2MQgimJ/7Ina2mXIKhE7F+GUe1SgnzRmwFY3hX2z8nyVCxE82I2RicspdkZnSWMn4oTjIKz4uzA==} engines: {node: '>= 10'} @@ -11983,6 +12304,15 @@ packages: requiresBuild: true optional: true + /@next/swc-darwin-x64@15.0.0-canary.193: + resolution: {integrity: sha512-+0W+NW4JhdcCDwuy8qd/p/zQ7TlfGJ6qSYzamq7nZ+KFWWSJqmBDzTzNfKPxPgdtfHaVyQIN1ThSEJtrah3+dA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-gnu@14.2.10: resolution: {integrity: sha512-ZfQ7yOy5zyskSj9rFpa0Yd7gkrBnJTkYVSya95hX3zeBG9E55Z6OTNPn1j2BTFWvOVVj65C3T+qsjOyVI9DQpA==} engines: {node: '>= 10'} @@ -12009,6 +12339,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-arm64-gnu@15.0.0-canary.193: + resolution: {integrity: sha512-5RawIR+D7KPI/trRdKudCWPYu98eF6f2js00tctF8jOUvpGs5M06RKvp+DKzgPLxaZIxAq+YIycS/F9E88LECA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-arm64-musl@14.2.10: resolution: {integrity: sha512-n2i5o3y2jpBfXFRxDREr342BGIQCJbdAUi/K4q6Env3aSx8erM9VuKXHw5KNROK9ejFSPf0LhoSkU/ZiNdacpQ==} engines: {node: '>= 10'} @@ -12035,6 +12374,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-arm64-musl@15.0.0-canary.193: + resolution: {integrity: sha512-IdHsXwzkmyMfOE2Ff0C3qeivgnP00l6t+kzoDymv1ldXd9f03T+XgtUtcTWKnVDEKqyBVuKgZHpAm/0JtRvhWg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-gnu@14.2.10: resolution: {integrity: sha512-GXvajAWh2woTT0GKEDlkVhFNxhJS/XdDmrVHrPOA83pLzlGPQnixqxD8u3bBB9oATBKB//5e4vpACnx5Vaxdqg==} engines: {node: '>= 10'} @@ -12061,6 +12409,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-x64-gnu@15.0.0-canary.193: + resolution: {integrity: sha512-sOvYkCYNUiR/nq5bQuCc/zXqx6jqmRhL8+PxcOTmIQ9YdSsd9oT/ENZzJ4Bf0MiKGyLC7YpjE6ybTUl5TjlvJA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-linux-x64-musl@14.2.10: resolution: {integrity: sha512-opFFN5B0SnO+HTz4Wq4HaylXGFV+iHrVxd3YvREUX9K+xfc4ePbRrxqOuPOFjtSuiVouwe6uLeDtabjEIbkmDA==} engines: {node: '>= 10'} @@ -12087,6 +12444,15 @@ packages: requiresBuild: true optional: true + /@next/swc-linux-x64-musl@15.0.0-canary.193: + resolution: {integrity: sha512-tHNzv1CRFP7fVNsQWyhvoVhnLIn6W8OqtUPS9k33X7WRYCRp+bGJQjefPV4Ht+mBNN3oM51uMtKn7EJ6wizrjw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-arm64-msvc@14.2.10: resolution: {integrity: sha512-9NUzZuR8WiXTvv+EiU/MXdcQ1XUvFixbLIMNQiVHuzs7ZIFrJDLJDaOF1KaqttoTujpcxljM/RNAOmw1GhPPQQ==} engines: {node: '>= 10'} @@ -12113,6 +12479,15 @@ packages: requiresBuild: true optional: true + /@next/swc-win32-arm64-msvc@15.0.0-canary.193: + resolution: {integrity: sha512-RwXjqOXKMF4oiXbQfcTcRfoYUaTl+3xpK6Phz8BnWTeFn0PNUdDZnvUswq4RTZZEAaCw479R35KcnR8SJh/OWw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@next/swc-win32-ia32-msvc@14.2.10: resolution: {integrity: sha512-fr3aEbSd1GeW3YUMBkWAu4hcdjZ6g4NBl1uku4gAn661tcxd1bHs1THWYzdsbTRLcCKLjrDZlNp6j2HTfrw+Bg==} engines: {node: '>= 10'} @@ -12165,6 +12540,15 @@ packages: requiresBuild: true optional: true + /@next/swc-win32-x64-msvc@15.0.0-canary.193: + resolution: {integrity: sha512-Ib3U2QIzdVOxWa4ChBIbjaEJjg2xDgA71g7/kEMwRTXds8EuKRu9HVwErb+23nxiKiRFEKx9GKTGHURHEKvlJw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} dependencies: @@ -12236,7 +12620,7 @@ packages: nx: 20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26) semver: 7.6.3 tmp: 0.2.3 - tslib: 2.6.3 + tslib: 2.8.1 yargs-parser: 21.1.1 dev: false @@ -12252,7 +12636,7 @@ packages: nx: 20.1.4(@swc-node/register@1.10.9)(@swc/core@1.7.26) semver: 7.6.3 tmp: 0.2.3 - tslib: 2.6.3 + tslib: 2.8.1 yargs-parser: 21.1.1 dev: false @@ -12335,7 +12719,7 @@ packages: - verdaccio dev: true - /@nx/eslint@20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(eslint@8.57.1)(nx@20.1.4)(verdaccio@5.29.2): + /@nx/eslint@20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(eslint@9.0.0)(nx@20.1.4)(verdaccio@5.29.2): resolution: {integrity: sha512-y3Xze6zt2qejqxOZGFbpY1mOG+pakc5Z/ljfI19nGX6voBhsd7+YnHRrcCPieOZ1OetcPn+WdL4HFrSOMb2dcQ==} peerDependencies: '@zkochan/js-yaml': 0.0.7 @@ -12346,9 +12730,9 @@ packages: dependencies: '@nx/devkit': 20.1.1(nx@20.1.4) '@nx/js': 20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(nx@20.1.4)(typescript@5.4.5)(verdaccio@5.29.2) - eslint: 8.57.1 + eslint: 9.0.0 semver: 7.6.3 - tslib: 2.6.3 + tslib: 2.8.1 typescript: 5.4.5 transitivePeerDependencies: - '@babel/traverse' @@ -12491,7 +12875,7 @@ packages: source-map-support: 0.5.19 ts-node: 10.9.1(@swc/core@1.7.26)(@types/node@20.12.14)(typescript@5.4.5) tsconfig-paths: 4.2.0 - tslib: 2.6.3 + tslib: 2.8.1 verdaccio: 5.29.2(encoding@0.1.13)(typanion@3.14.0) transitivePeerDependencies: - '@babel/traverse' @@ -12542,7 +12926,7 @@ packages: source-map-support: 0.5.19 ts-node: 10.9.1(@swc/core@1.7.26)(@types/node@20.12.14)(typescript@5.5.2) tsconfig-paths: 4.2.0 - tslib: 2.6.3 + tslib: 2.8.1 verdaccio: 5.29.2(encoding@0.1.13)(typanion@3.14.0) transitivePeerDependencies: - '@babel/traverse' @@ -12658,7 +13042,7 @@ packages: - typescript dev: true - /@nx/next@20.1.4(@babel/core@7.25.2)(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(esbuild@0.24.0)(eslint@8.57.1)(html-webpack-plugin@5.6.2)(next@14.2.16)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack@5.93.0): + /@nx/next@20.1.4(@babel/core@7.25.2)(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(esbuild@0.24.0)(eslint@8.57.1)(html-webpack-plugin@5.6.2)(next@14.2.16)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack-cli@5.1.4)(webpack@5.93.0): resolution: {integrity: sha512-wayIUtGgMNIt3zZZ6rCitLOpMB1f1IOr9eW9hIwJwf/AquOgcELM30beE6K5kHqtGHYwPNo+HRMVhxR5RrylSA==} peerDependencies: next: '>=14.0.0' @@ -12669,7 +13053,7 @@ packages: '@nx/js': 20.1.4(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(nx@20.1.4)(typescript@5.5.2)(verdaccio@5.29.2) '@nx/react': 20.1.4(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(eslint@8.57.1)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack@5.93.0) '@nx/web': 20.1.4(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(nx@20.1.4)(typescript@5.5.2)(verdaccio@5.29.2) - '@nx/webpack': 20.1.4(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(esbuild@0.24.0)(html-webpack-plugin@5.6.2)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6) + '@nx/webpack': 20.1.4(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(esbuild@0.24.0)(html-webpack-plugin@5.6.2)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack-cli@5.1.4) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.5.2) '@svgr/webpack': 8.1.0(typescript@5.5.2) copy-webpack-plugin: 10.2.4(webpack@5.93.0) @@ -12911,12 +13295,12 @@ packages: requiresBuild: true optional: true - /@nx/react@20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(eslint@8.57.1)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack@5.93.0): + /@nx/react@20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(eslint@9.0.0)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack@5.93.0): resolution: {integrity: sha512-1oXMAgedERHn8LV5FQ4IE3PxmqZLq0fkJXiDjUmL6Lv0alJVDtUWPa+Fr/KIfx9OOw1oGu3ZPPWYGipcSwGeIQ==} dependencies: '@module-federation/enhanced': 0.6.9(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(vue-tsc@2.1.6)(webpack@5.93.0) '@nx/devkit': 20.1.1(nx@20.1.4) - '@nx/eslint': 20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(eslint@8.57.1)(nx@20.1.4)(verdaccio@5.29.2) + '@nx/eslint': 20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(eslint@9.0.0)(nx@20.1.4)(verdaccio@5.29.2) '@nx/js': 20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(nx@20.1.4)(typescript@5.5.2)(verdaccio@5.29.2) '@nx/web': 20.1.1(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(nx@20.1.4)(typescript@5.5.2)(verdaccio@5.29.2) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.5.2) @@ -13020,7 +13404,7 @@ packages: - verdaccio dev: true - /@nx/rspack@20.1.4(@module-federation/enhanced@0.6.11)(@module-federation/node@2.5.21)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@swc/helpers@0.5.13)(@types/express@4.17.21)(@types/node@18.16.9)(html-webpack-plugin@5.6.2)(less@4.2.0)(nx@20.1.4)(react-refresh@0.14.2)(typescript@5.5.2)(verdaccio@5.29.2)(webpack@5.93.0): + /@nx/rspack@20.1.4(@module-federation/enhanced@0.6.11)(@module-federation/node@2.5.21)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@swc/helpers@0.5.13)(@types/express@4.17.21)(@types/node@18.16.9)(html-webpack-plugin@5.6.2)(less@4.2.0)(nx@20.1.4)(react-refresh@0.14.2)(typescript@5.5.2)(verdaccio@5.29.2)(webpack-cli@5.1.4)(webpack@5.93.0): resolution: {integrity: sha512-s1CJLfAsR6Z47LIqBNkL8/SL8VaDBqdUZF0u6WGJkS2IacpSh2IXadEXxh5wGVA+19sukwWw/IROkVXwLCf1yw==} peerDependencies: '@module-federation/enhanced': ~0.6.0 @@ -13033,7 +13417,7 @@ packages: '@nx/web': 20.1.4(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(nx@20.1.4)(typescript@5.5.2)(verdaccio@5.29.2) '@phenomnomnominal/tsquery': 5.0.1(typescript@5.5.2) '@rspack/core': 1.1.1(@swc/helpers@0.5.13) - '@rspack/dev-server': 1.0.9(@rspack/core@1.1.1)(@types/express@4.17.21)(webpack@5.93.0) + '@rspack/dev-server': 1.0.9(@rspack/core@1.1.1)(@types/express@4.17.21)(webpack-cli@5.1.4)(webpack@5.93.0) '@rspack/plugin-react-refresh': 1.0.0(react-refresh@0.14.2) autoprefixer: 10.4.20(postcss@8.4.47) chalk: 4.1.2 @@ -13140,7 +13524,7 @@ packages: detect-port: 1.6.1 http-server: 14.1.1 picocolors: 1.1.1 - tslib: 2.6.3 + tslib: 2.8.1 transitivePeerDependencies: - '@babel/traverse' - '@swc-node/register' @@ -13176,7 +13560,7 @@ packages: - verdaccio dev: true - /@nx/webpack@20.1.1(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(esbuild@0.18.20)(html-webpack-plugin@5.6.2)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6): + /@nx/webpack@20.1.1(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@20.12.14)(esbuild@0.18.20)(html-webpack-plugin@5.6.2)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack-cli@5.1.4): resolution: {integrity: sha512-ucxJn9q/KboQ4ywtODmOYD9ac9FczdLd/1WDAPctxERuq71bfkwGmZGUzH3fDqolinek0kAIhn6ci3ww2/Qs1A==} dependencies: '@babel/core': 7.26.0 @@ -13216,8 +13600,8 @@ packages: ts-loader: 9.5.1(typescript@5.5.2)(webpack@5.93.0) tsconfig-paths-webpack-plugin: 4.0.0 tslib: 2.6.3 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) - webpack-dev-server: 5.1.0(webpack@5.93.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack-dev-server: 5.1.0(webpack-cli@5.1.4)(webpack@5.93.0) webpack-node-externals: 3.0.0 webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.2)(webpack@5.93.0) transitivePeerDependencies: @@ -13252,7 +13636,7 @@ packages: - webpack-cli dev: false - /@nx/webpack@20.1.4(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(esbuild@0.24.0)(html-webpack-plugin@5.6.2)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6): + /@nx/webpack@20.1.4(@rspack/core@1.0.8)(@swc-node/register@1.10.9)(@swc/core@1.7.26)(@types/node@18.16.9)(esbuild@0.24.0)(html-webpack-plugin@5.6.2)(nx@20.1.4)(react-dom@18.3.1)(react@18.3.1)(typescript@5.5.2)(verdaccio@5.29.2)(vue-tsc@2.1.6)(webpack-cli@5.1.4): resolution: {integrity: sha512-Gl3bQlyCKU/T8pPSrdGzi7jNVC9pasPLVhEDfdOWMbAWBg0pTM20uDyVBPqfCZMZLHQBV1y5eHJx4CGMStX7hw==} dependencies: '@babel/core': 7.26.0 @@ -13292,8 +13676,8 @@ packages: ts-loader: 9.5.1(typescript@5.5.2)(webpack@5.93.0) tsconfig-paths-webpack-plugin: 4.0.0 tslib: 2.6.3 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) - webpack-dev-server: 5.1.0(webpack@5.93.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack-dev-server: 5.1.0(webpack-cli@5.1.4)(webpack@5.93.0) webpack-node-externals: 3.0.0 webpack-subresource-integrity: 5.1.0(html-webpack-plugin@5.6.2)(webpack@5.93.0) transitivePeerDependencies: @@ -13350,7 +13734,7 @@ packages: chalk: 4.1.2 enquirer: 2.3.6 nx: 20.1.4(@swc-node/register@1.10.9)(@swc/core@1.7.26) - tslib: 2.6.3 + tslib: 2.8.1 yargs-parser: 21.1.1 transitivePeerDependencies: - '@swc-node/register' @@ -13605,7 +13989,7 @@ packages: react-refresh: 0.14.2 schema-utils: 3.3.0 source-map: 0.7.4 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true /@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.14.2)(webpack@5.93.0): @@ -13642,7 +14026,7 @@ packages: react-refresh: 0.14.2 schema-utils: 4.2.0 source-map: 0.7.4 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.14.2)(webpack@5.95.0): @@ -13679,7 +14063,7 @@ packages: react-refresh: 0.14.2 schema-utils: 4.2.0 source-map: 0.7.4 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) dev: true /@pnpm/config.env-replace@1.1.0: @@ -14762,7 +15146,7 @@ packages: optional: true dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@rollup/pluginutils': 5.1.3(rollup@4.24.0) rollup: 4.24.0 transitivePeerDependencies: @@ -14938,7 +15322,6 @@ packages: dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 - dev: true /@rollup/pluginutils@5.1.2(rollup@4.24.0): resolution: {integrity: sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==} @@ -15268,7 +15651,7 @@ packages: '@swc/helpers': 0.5.3 core-js: 3.32.2 html-webpack-plugin: /html-rspack-plugin@5.5.7 - postcss: 8.4.47 + postcss: 8.4.38 dev: true /@rsbuild/core@0.7.10: @@ -15281,7 +15664,7 @@ packages: '@swc/helpers': 0.5.3 core-js: 3.36.1 html-webpack-plugin: /html-rspack-plugin@5.7.2(@rspack/core@0.7.5) - postcss: 8.4.47 + postcss: 8.4.38 dev: true /@rsbuild/core@1.0.1-rc.4: @@ -15409,7 +15792,7 @@ packages: optional: true dependencies: '@rsbuild/core': 1.0.19 - acorn: 8.12.1 + acorn: 8.14.0 browserslist-to-es-version: 1.0.0 htmlparser2: 9.1.0 picocolors: 1.1.1 @@ -15667,7 +16050,7 @@ packages: toml: 3.0.0 dev: true - /@rsbuild/plugin-type-check@1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19)(typescript@5.0.4): + /@rsbuild/plugin-type-check@1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19)(typescript@5.0.4)(webpack-cli@5.1.4): resolution: {integrity: sha512-BahXAJNq4kWtL2dINUlrOL9UCN1t8c/qf5RW8JXx2HSSasfKPJGJ1BVfieMcIaFa/t8/QdafcwoxY1WKPTlSMg==} peerDependencies: '@rsbuild/core': 1.x || ^1.0.1-beta.0 @@ -15680,7 +16063,7 @@ packages: fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.0.4)(webpack@5.95.0) json5: 2.2.3 reduce-configs: 1.0.0 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -15689,7 +16072,7 @@ packages: - webpack-cli dev: true - /@rsbuild/plugin-type-check@1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19)(typescript@5.5.2): + /@rsbuild/plugin-type-check@1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19)(typescript@5.5.2)(webpack-cli@5.1.4): resolution: {integrity: sha512-BahXAJNq4kWtL2dINUlrOL9UCN1t8c/qf5RW8JXx2HSSasfKPJGJ1BVfieMcIaFa/t8/QdafcwoxY1WKPTlSMg==} peerDependencies: '@rsbuild/core': 1.x || ^1.0.1-beta.0 @@ -15702,7 +16085,7 @@ packages: fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.5.2)(webpack@5.95.0) json5: 2.2.3 reduce-configs: 1.0.0 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -15711,7 +16094,7 @@ packages: - webpack-cli dev: true - /@rsbuild/plugin-type-check@1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.18.20)(typescript@5.0.4): + /@rsbuild/plugin-type-check@1.0.1(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.18.20)(typescript@5.0.4)(webpack-cli@5.1.4): resolution: {integrity: sha512-BahXAJNq4kWtL2dINUlrOL9UCN1t8c/qf5RW8JXx2HSSasfKPJGJ1BVfieMcIaFa/t8/QdafcwoxY1WKPTlSMg==} peerDependencies: '@rsbuild/core': 1.x || ^1.0.1-beta.0 @@ -15724,7 +16107,7 @@ packages: fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.0.4)(webpack@5.95.0) json5: 2.2.3 reduce-configs: 1.0.0 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -15733,7 +16116,7 @@ packages: - webpack-cli dev: true - /@rsbuild/plugin-type-check@1.0.1(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(typescript@5.5.2): + /@rsbuild/plugin-type-check@1.0.1(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(typescript@5.5.2)(webpack-cli@5.1.4): resolution: {integrity: sha512-BahXAJNq4kWtL2dINUlrOL9UCN1t8c/qf5RW8JXx2HSSasfKPJGJ1BVfieMcIaFa/t8/QdafcwoxY1WKPTlSMg==} peerDependencies: '@rsbuild/core': 1.x || ^1.0.1-beta.0 @@ -15746,7 +16129,7 @@ packages: fork-ts-checker-webpack-plugin: 9.0.2(typescript@5.5.2)(webpack@5.95.0) json5: 2.2.3 reduce-configs: 1.0.0 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -15766,14 +16149,14 @@ packages: '@rsbuild/core': 1.0.19 dev: true - /@rsbuild/plugin-vue@1.0.3(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.24.0)(vue@3.5.10): + /@rsbuild/plugin-vue@1.0.3(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.24.0)(vue@3.5.10)(webpack-cli@5.1.4): resolution: {integrity: sha512-+g6PaZUQDNBDhM5lx1YuXqNHDdZGBnPwIi1DLMqNLwqKeG4wdAggT4oOj2LjXXyMIvlMrWz0No5J8QroZ3WkEA==} peerDependencies: '@rsbuild/core': 1.x dependencies: '@rsbuild/core': 1.0.19 vue-loader: 17.4.2(vue@3.5.10)(webpack@5.95.0) - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - '@vue/compiler-sfc' @@ -15800,7 +16183,7 @@ packages: '@rspack/core': 0.5.3(@swc/helpers@0.5.3) caniuse-lite: 1.0.30001668 lodash: 4.17.21 - postcss: 8.4.47 + postcss: 8.4.38 transitivePeerDependencies: - '@swc/helpers' dev: true @@ -15811,7 +16194,7 @@ packages: '@rspack/core': 0.5.0(@swc/helpers@0.5.3) caniuse-lite: 1.0.30001668 lodash: 4.17.21 - postcss: 8.4.47 + postcss: 8.4.38 transitivePeerDependencies: - '@swc/helpers' dev: true @@ -15833,16 +16216,16 @@ packages: resolution: {integrity: sha512-FwTm11DP7KxQKT2mWLvwe80O5KpikgMSlqnw9CQhBaIHSYEypdJU9ZotbNsXsHdML3xcqg+S9ae3bpovC7KlwQ==} dependencies: '@rspack/core': 0.7.5(@swc/helpers@0.5.3) - caniuse-lite: 1.0.30001667 + caniuse-lite: 1.0.30001668 html-webpack-plugin: /html-rspack-plugin@5.7.2(@rspack/core@0.7.5) - postcss: 8.4.47 + postcss: 8.4.38 optionalDependencies: fsevents: 2.3.3 transitivePeerDependencies: - '@swc/helpers' dev: true - /@rsbuild/webpack@1.0.11(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19): + /@rsbuild/webpack@1.0.11(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4): resolution: {integrity: sha512-2x/QqNUEKEt7eao8FnYwlrwQUYSbuM9ihiI1RpSuKbi/ZZuHxrFA3fwnO7k1v/Xbs5mCQR+ni+da5dakypFktg==} peerDependencies: '@rsbuild/core': 1.x @@ -15853,7 +16236,7 @@ packages: picocolors: 1.1.1 reduce-configs: 1.0.0 tsconfig-paths-webpack-plugin: 4.1.0 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -15861,7 +16244,7 @@ packages: - webpack-cli dev: true - /@rsbuild/webpack@1.0.11(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.18.20): + /@rsbuild/webpack@1.0.11(@rsbuild/core@1.0.19)(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4): resolution: {integrity: sha512-2x/QqNUEKEt7eao8FnYwlrwQUYSbuM9ihiI1RpSuKbi/ZZuHxrFA3fwnO7k1v/Xbs5mCQR+ni+da5dakypFktg==} peerDependencies: '@rsbuild/core': 1.x @@ -15872,7 +16255,7 @@ packages: picocolors: 1.1.1 reduce-configs: 1.0.0 tsconfig-paths-webpack-plugin: 4.1.0 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) transitivePeerDependencies: - '@swc/core' - esbuild @@ -16628,7 +17011,7 @@ packages: caniuse-lite: 1.0.30001668 dev: true - /@rspack/dev-server@1.0.9(@rspack/core@1.0.8)(@types/express@4.17.21)(webpack@5.93.0): + /@rspack/dev-server@1.0.9(@rspack/core@1.0.8)(@types/express@4.17.21)(webpack-cli@5.1.4)(webpack@5.93.0): resolution: {integrity: sha512-VF+apLFfl5LWIhVbfkJ5ccU0Atl5mi+sGTkx+XtE1tbUmMJkde0nm/4+eaQCud7oGl+ZCzt4kW14uuzLSiEGDw==} peerDependencies: '@rspack/core': '*' @@ -16641,7 +17024,7 @@ packages: mime-types: 2.1.35 p-retry: 4.6.2 webpack-dev-middleware: 7.4.2(webpack@5.93.0) - webpack-dev-server: 5.0.4(webpack@5.93.0) + webpack-dev-server: 5.0.4(webpack-cli@5.1.4)(webpack@5.93.0) ws: 8.18.0 transitivePeerDependencies: - '@types/express' @@ -16653,7 +17036,7 @@ packages: - webpack-cli dev: true - /@rspack/dev-server@1.0.9(@rspack/core@1.1.1)(@types/express@4.17.21)(webpack@5.93.0): + /@rspack/dev-server@1.0.9(@rspack/core@1.1.1)(@types/express@4.17.21)(webpack-cli@5.1.4)(webpack@5.93.0): resolution: {integrity: sha512-VF+apLFfl5LWIhVbfkJ5ccU0Atl5mi+sGTkx+XtE1tbUmMJkde0nm/4+eaQCud7oGl+ZCzt4kW14uuzLSiEGDw==} peerDependencies: '@rspack/core': '*' @@ -16666,7 +17049,7 @@ packages: mime-types: 2.1.35 p-retry: 4.6.2 webpack-dev-middleware: 7.4.2(webpack@5.93.0) - webpack-dev-server: 5.0.4(webpack@5.93.0) + webpack-dev-server: 5.0.4(webpack-cli@5.1.4)(webpack@5.93.0) ws: 8.18.0 transitivePeerDependencies: - '@types/express' @@ -17062,7 +17445,7 @@ packages: conventional-changelog-writer: 8.0.0 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) import-from-esm: 1.3.4 lodash-es: 4.17.21 micromatch: 4.0.8 @@ -17089,7 +17472,7 @@ packages: dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) execa: 5.1.1 lodash: 4.17.21 parse-json: 5.2.0 @@ -17106,7 +17489,7 @@ packages: dependencies: '@semantic-release/error': 3.0.0 aggregate-error: 3.1.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) dir-glob: 3.0.1 execa: 5.1.1 lodash: 4.17.21 @@ -17129,7 +17512,7 @@ packages: '@octokit/plugin-throttling': 9.3.1(@octokit/core@6.1.2) '@semantic-release/error': 4.0.0 aggregate-error: 5.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) dir-glob: 3.0.1 globby: 14.0.2 http-proxy-agent: 7.0.2 @@ -17198,7 +17581,7 @@ packages: conventional-changelog-writer: 8.0.0 conventional-commits-filter: 5.0.0 conventional-commits-parser: 6.0.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) get-stream: 7.0.1 import-from-esm: 1.3.4 into-stream: 7.0.0 @@ -17223,6 +17606,10 @@ packages: resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} dev: true + /@sinclair/typebox@0.25.24: + resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==} + dev: false + /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -17653,7 +18040,7 @@ packages: - supports-color dev: true - /@storybook/builder-webpack5@8.3.5(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.24.0)(storybook@8.3.5)(typescript@5.5.2): + /@storybook/builder-webpack5@8.3.5(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.24.0)(storybook@8.3.5)(typescript@5.5.2)(webpack-cli@5.1.4): resolution: {integrity: sha512-rhmfdiSlDn3Arki7IMYk11PO29rYuYM4LZ8GlNqREU7VUl/8Vngo/jFIa4pKaIns3ql1RrwzO1wm9JvuL/4ydA==} peerDependencies: storybook: ^8.3.5 @@ -17687,7 +18074,7 @@ packages: url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) webpack-dev-middleware: 6.1.3(webpack@5.93.0) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 @@ -18137,7 +18524,7 @@ packages: dependencies: '@babel/generator': 7.26.2 '@babel/parser': 7.26.2 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 '@storybook/csf': 0.1.11 '@storybook/types': 7.6.20 @@ -18153,7 +18540,7 @@ packages: dependencies: '@babel/generator': 7.26.2 '@babel/parser': 7.26.2 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 '@storybook/csf': 0.1.11 '@storybook/types': 8.1.11 @@ -18258,7 +18645,7 @@ packages: resolution: {integrity: sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw==} dev: true - /@storybook/nextjs@8.3.5(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.24.0)(next@14.2.16)(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5)(typescript@5.5.2)(webpack@5.93.0): + /@storybook/nextjs@8.3.5(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.24.0)(next@14.2.16)(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5)(typescript@5.5.2)(webpack-cli@5.1.4)(webpack@5.93.0): resolution: {integrity: sha512-YMjDSVd7BHIvj6oLMEFMKRvfZ83INxZinxtrx4ZZXGe+5iP8j7rcV7D67lxKQKWNy36d9Foj4pjT85yYj5s+ZQ==} engines: {node: '>=18.0.0'} peerDependencies: @@ -18288,8 +18675,8 @@ packages: '@babel/preset-typescript': 7.26.0(@babel/core@7.25.7) '@babel/runtime': 7.25.7 '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.14.2)(webpack@5.93.0) - '@storybook/builder-webpack5': 8.3.5(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.24.0)(storybook@8.3.5)(typescript@5.5.2) - '@storybook/preset-react-webpack': 8.3.5(@storybook/test@8.3.5)(@swc/core@1.7.26)(esbuild@0.24.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5)(typescript@5.5.2) + '@storybook/builder-webpack5': 8.3.5(@rspack/core@1.0.8)(@swc/core@1.7.26)(esbuild@0.24.0)(storybook@8.3.5)(typescript@5.5.2)(webpack-cli@5.1.4) + '@storybook/preset-react-webpack': 8.3.5(@storybook/test@8.3.5)(@swc/core@1.7.26)(esbuild@0.24.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5)(typescript@5.5.2)(webpack-cli@5.1.4) '@storybook/react': 8.3.5(@storybook/test@8.3.5)(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5)(typescript@5.5.2) '@storybook/test': 8.3.5(storybook@8.3.5) '@types/node': 22.7.4 @@ -18318,7 +18705,7 @@ packages: tsconfig-paths: 4.2.0 tsconfig-paths-webpack-plugin: 4.1.0 typescript: 5.5.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) optionalDependencies: sharp: 0.33.5 transitivePeerDependencies: @@ -18349,7 +18736,7 @@ packages: resolution: {integrity: sha512-wdzFo7B2naGhS52L3n1qBkt5BfvQjs8uax6B741yKRpiGgeAN8nz8+qelkD25MbSukxvbPgDot7WJvsMU/iCzg==} dev: true - /@storybook/preset-react-webpack@8.3.5(@storybook/test@8.3.5)(@swc/core@1.7.26)(esbuild@0.24.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5)(typescript@5.5.2): + /@storybook/preset-react-webpack@8.3.5(@storybook/test@8.3.5)(@swc/core@1.7.26)(esbuild@0.24.0)(react-dom@18.3.1)(react@18.3.1)(storybook@8.3.5)(typescript@5.5.2)(webpack-cli@5.1.4): resolution: {integrity: sha512-laS9CiZrZ4CSnBTBfkBba3hmlDhzcjIfCvx8/rk3SZ+zh93NpqXixzRt6m0UH2po63dpdu21nXrsW5Cfs88Ypw==} engines: {node: '>=18.0.0'} peerDependencies: @@ -18377,7 +18764,7 @@ packages: storybook: 8.3.5 tsconfig-paths: 4.2.0 typescript: 5.5.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) transitivePeerDependencies: - '@storybook/test' - '@swc/core' @@ -18432,7 +18819,7 @@ packages: typescript: '>= 3.x' webpack: '>= 4' dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -18440,7 +18827,7 @@ packages: react-docgen-typescript: 2.2.2(typescript@5.5.2) tslib: 2.6.3 typescript: 5.5.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color dev: true @@ -18451,7 +18838,7 @@ packages: typescript: '>= 4.x' webpack: '>= 4' dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -18459,7 +18846,7 @@ packages: react-docgen-typescript: 2.2.2(typescript@5.0.4) tslib: 2.8.1 typescript: 5.0.4 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color dev: true @@ -18470,7 +18857,7 @@ packages: typescript: '>= 4.x' webpack: '>= 4' dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) endent: 2.1.0 find-cache-dir: 3.3.2 flat-cache: 3.2.0 @@ -18478,7 +18865,7 @@ packages: react-docgen-typescript: 2.2.2(typescript@5.5.2) tslib: 2.8.1 typescript: 5.5.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) transitivePeerDependencies: - supports-color dev: true @@ -18948,7 +19335,7 @@ packages: '@swc-node/sourcemap-support': 0.5.1 '@swc/core': 1.7.26(@swc/helpers@0.5.13) colorette: 2.0.20 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) oxc-resolver: 1.12.0 pirates: 4.0.6 tslib: 2.6.3 @@ -18961,7 +19348,7 @@ packages: resolution: {integrity: sha512-JxIvIo/Hrpv0JCHSyRpetAdQ6lB27oFYhv0PKCNf1g2gUXOjpeR1exrXccRxLMuAV5WAmGFBwRnNOJqN38+qtg==} dependencies: source-map-support: 0.5.21 - tslib: 2.6.3 + tslib: 2.8.1 /@swc/cli@0.5.0(@swc/core@1.7.26): resolution: {integrity: sha512-eFsrNt85SbHTeX6svpBNcA5DQLP/wrSyCs3KVZjbuEHWD7JGpajZOIwH74lVhyrmrXOcGxgbnxXEbDIfRlLcSw==} @@ -19113,14 +19500,14 @@ packages: /@swc/helpers@0.5.3: resolution: {integrity: sha512-FaruWX6KdudYloq1AHD/4nU+UsMTdNE8CKyrseXWEcgjDAbvkwJg2QGPAnfIJLIWsjZOSPLOAykK6fuYp4vp4A==} dependencies: - tslib: 2.6.3 + tslib: 2.8.1 dev: true /@swc/helpers@0.5.5: resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} dependencies: '@swc/counter': 0.1.3 - tslib: 2.6.3 + tslib: 2.8.1 /@swc/jest@0.2.36(@swc/core@1.7.26): resolution: {integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==} @@ -19152,6 +19539,15 @@ packages: defer-to-connect: 2.0.1 dev: true + /@tailwindcss/forms@0.5.7(tailwindcss@3.4.3): + resolution: {integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==} + peerDependencies: + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' + dependencies: + mini-svg-data-uri: 1.4.4 + tailwindcss: 3.4.3 + dev: true + /@tailwindcss/forms@0.5.9(tailwindcss@3.4.13): resolution: {integrity: sha512-tM4XVr2+UVTxXJzey9Twx48c1gcxFStqn1pQz0tRsX8o3DvxhN5oY5pvyAbUx7VTaZxpej4Zzvc6h+1RJBzpIg==} peerDependencies: @@ -19161,6 +19557,18 @@ packages: tailwindcss: 3.4.13 dev: true + /@tailwindcss/typography@0.5.12(tailwindcss@3.4.3): + resolution: {integrity: sha512-CNwpBpconcP7ppxmuq3qvaCxiRWnbhANpY/ruH4L5qs2GCiVDJXde/pjj2HWPV1+Q4G9+V/etrwUYopdcjAlyg==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.3 + dev: true + /@testing-library/dom@10.4.0: resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==} engines: {node: '>=18'} @@ -19263,12 +19671,20 @@ packages: /@tootallnate/once@2.0.0: resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} engines: {node: '>= 10'} - dev: true /@trysound/sax@0.2.0: resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} engines: {node: '>=10.13.0'} + /@ts-morph/common@0.11.1: + resolution: {integrity: sha512-7hWZS0NRpEsNV8vWJzg7FEz6V8MaLNeJOmwmghqUXTpzk16V1LLZhdo+4QvE/+zv4cVci0OviuJFnqhEfoV3+g==} + dependencies: + fast-glob: 3.3.2 + minimatch: 3.1.2 + mkdirp: 1.0.4 + path-browserify: 1.0.1 + dev: false + /@tsconfig/node10@1.0.11: resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} @@ -19940,6 +20356,10 @@ packages: /@types/node@12.20.55: resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + /@types/node@14.18.33: + resolution: {integrity: sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg==} + dev: false + /@types/node@16.11.68: resolution: {integrity: sha512-JkRpuVz3xCNCWaeQ5EHLR/6woMbHZz/jZ7Kmc63AkU+1HxnoUugzSWMck7dsR4DvNYX8jp9wTi9K7WvnxOIQZQ==} dev: true @@ -19956,6 +20376,12 @@ packages: dependencies: undici-types: 5.26.5 + /@types/node@20.12.7: + resolution: {integrity: sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==} + dependencies: + undici-types: 5.26.5 + dev: true + /@types/node@22.7.4: resolution: {integrity: sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==} dependencies: @@ -20128,9 +20554,8 @@ packages: '@types/react': 18.3.11 csstype: 3.1.3 - /@types/stylis@4.2.5: - resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} - dev: true + /@types/stylis@4.2.0: + resolution: {integrity: sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw==} /@types/tough-cookie@4.0.5: resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} @@ -20191,7 +20616,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.57.1)(typescript@5.0.4) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.0.4) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 @@ -20243,7 +20668,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.0.4) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) eslint: 8.57.1 typescript: 5.0.4 transitivePeerDependencies: @@ -20264,13 +20689,34 @@ packages: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.5.2) '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) eslint: 8.57.1 typescript: 5.5.2 transitivePeerDependencies: - supports-color dev: true + /@typescript-eslint/parser@6.21.0(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.7(supports-color@9.3.1) + eslint: 9.0.0 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.5.2): resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} engines: {node: ^18.18.0 || >=20.0.0} @@ -20285,7 +20731,7 @@ packages: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.2) '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) eslint: 8.57.1 typescript: 5.5.2 transitivePeerDependencies: @@ -20344,7 +20790,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.0.4) '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.0.4) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) eslint: 8.57.1 tsutils: 3.21.0(typescript@5.0.4) typescript: 5.0.4 @@ -20364,7 +20810,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.5.2) '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.5.2) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) eslint: 8.57.1 ts-api-utils: 1.3.0(typescript@5.5.2) typescript: 5.5.2 @@ -20383,7 +20829,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 8.8.0(typescript@5.5.2) '@typescript-eslint/utils': 8.8.0(eslint@8.57.1)(typescript@5.5.2) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) ts-api-utils: 1.3.0(typescript@5.5.2) typescript: 5.5.2 transitivePeerDependencies: @@ -20427,7 +20873,7 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.3 @@ -20437,6 +20883,28 @@ packages: - supports-color dev: true + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5): + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.7(supports-color@9.3.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.3 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.5.2): resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} @@ -20448,7 +20916,7 @@ packages: dependencies: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 @@ -20470,7 +20938,7 @@ packages: dependencies: '@typescript-eslint/types': 7.18.0 '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 @@ -20492,7 +20960,7 @@ packages: dependencies: '@typescript-eslint/types': 8.14.0 '@typescript-eslint/visitor-keys': 8.14.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -20514,7 +20982,7 @@ packages: dependencies: '@typescript-eslint/types': 8.8.0 '@typescript-eslint/visitor-keys': 8.8.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -20635,6 +21103,108 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /@vercel/build-utils@7.11.0: + resolution: {integrity: sha512-UFrx1hNIjNJJkd0NZrYfaOrmcWhQmrVsbKe9o3L9jX9J1iufG685wIZ9tFCKKC0Fa2HWbNDNzNxrE5SCAS2lyA==} + dev: false + + /@vercel/error-utils@2.0.2: + resolution: {integrity: sha512-Sj0LFafGpYr6pfCqrQ82X6ukRl5qpmVrHM/191kNYFqkkB9YkjlMAj6QcEsvCG259x4QZ7Tya++0AB85NDPbKQ==} + dev: false + + /@vercel/fun@1.1.0(encoding@0.1.13): + resolution: {integrity: sha512-SpuPAo+MlAYMtcMcC0plx7Tv4Mp7SQhJJj1iIENlOnABL24kxHpL09XLQMGzZIzIW7upR8c3edwgfpRtp+dhVw==} + engines: {node: '>= 10'} + dependencies: + '@tootallnate/once': 2.0.0 + async-listen: 1.2.0 + debug: 4.1.1 + execa: 3.2.0 + fs-extra: 8.1.0 + generic-pool: 3.4.2 + micro: 9.3.5-canary.3 + ms: 2.1.1 + node-fetch: 2.6.7(encoding@0.1.13) + path-match: 1.2.4 + promisepipe: 3.0.0 + semver: 7.3.5 + stat-mode: 0.3.0 + stream-to-promise: 2.2.0 + tar: 4.4.18 + tree-kill: 1.2.2 + uid-promise: 1.0.0 + uuid: 3.3.2 + xdg-app-paths: 5.1.0 + yauzl-promise: 2.1.3 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/gatsby-plugin-vercel-analytics@1.0.11: + resolution: {integrity: sha512-iTEA0vY6RBPuEzkwUTVzSHDATo1aF6bdLLspI68mQ/BTbi5UQEGjpjyzdKOVcSYApDtFU6M6vypZ1t4vIEnHvw==} + dependencies: + web-vitals: 0.2.4 + dev: false + + /@vercel/gatsby-plugin-vercel-builder@2.0.24: + resolution: {integrity: sha512-b02ifu8WCmz4ARjkC9AyuOxpXa0Tmh0uIbDDYvyvDRpvohQY53eC3sXKVOejnmQbi9KojkaJsQRvMTBRh9BUHA==} + dependencies: + '@sinclair/typebox': 0.25.24 + '@vercel/build-utils': 7.11.0 + '@vercel/routing-utils': 3.1.0 + esbuild: 0.14.47 + etag: 1.8.1 + fs-extra: 11.1.0 + dev: false + + /@vercel/git-hooks@1.0.0: + resolution: {integrity: sha512-OxDFAAdyiJ/H0b8zR9rFCu3BIb78LekBXOphOYG3snV4ULhKFX387pBPpqZ9HLiRTejBWBxYEahkw79tuIgdAA==} + requiresBuild: true + dev: true + + /@vercel/go@3.1.1: + resolution: {integrity: sha512-mrzomNYltxkjvtUmaYry5YEyvwTz6c/QQHE5Gr/pPGRIniUiP6T6OFOJ49RBN7e6pRXaNzHPVuidiuBhvHh5+Q==} + dev: false + + /@vercel/hydrogen@1.0.2: + resolution: {integrity: sha512-/Q2MKk1GfOuZAnkE9jQexjtUQqanbY65R+xtJWd9yKIgwcfRI1hxiNH3uXyVM5AvLoY+fxxULkSuxDtUKpkJpQ==} + dependencies: + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + dev: false + + /@vercel/next@4.2.0(encoding@0.1.13): + resolution: {integrity: sha512-2KSXdPHpfPWaf0tKTBxOWvdc8e9TPNARjmqtgYUsrl1TVaBNFsZ0GV0kWaVLEw4o7CWfREt8ZY064sNVb1BcAQ==} + dependencies: + '@vercel/nft': 0.26.4(encoding@0.1.13) + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/nft@0.26.4(encoding@0.1.13): + resolution: {integrity: sha512-j4jCOOXke2t8cHZCIxu1dzKLHLcFmYzC3yqAK6MfZznOL1QIJKd0xcFsXK3zcqzU7ScsE2zWkiMMNHGMHgp+FA==} + engines: {node: '>=16'} + hasBin: true + dependencies: + '@mapbox/node-pre-gyp': 1.0.11(encoding@0.1.13) + '@rollup/pluginutils': 4.2.1 + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + micromatch: 4.0.8 + node-gyp-build: 4.8.2 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false /@vercel/nft@0.26.5(encoding@0.1.13): resolution: {integrity: sha512-NHxohEqad6Ra/r4lGknO52uc/GrWILXAMs1BB4401GTqww0fw1bAqzpG1XHuDO+dprg4GvsD9ZLLSsdo78p9hQ==} @@ -20658,6 +21228,92 @@ packages: - supports-color dev: true + /@vercel/node@3.0.26(@swc/core@1.7.26)(encoding@0.1.13): + resolution: {integrity: sha512-PoyacnoylwpE3+7RFUVHJlbPqtneTCEJVXXx4n8g9ARgUDSRSCwFpJOhiFQon2sS2YtfCzsJa29Z9dAZQedDcQ==} + dependencies: + '@edge-runtime/node-utils': 2.3.0 + '@edge-runtime/primitives': 4.1.0 + '@edge-runtime/vm': 3.2.0 + '@types/node': 14.18.33 + '@vercel/build-utils': 7.11.0 + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4(encoding@0.1.13) + '@vercel/static-config': 3.0.0 + async-listen: 3.0.0 + cjs-module-lexer: 1.2.3 + edge-runtime: 2.5.9 + es-module-lexer: 1.4.1 + esbuild: 0.14.47 + etag: 1.8.1 + node-fetch: 2.6.9(encoding@0.1.13) + path-to-regexp: 6.2.1 + ts-morph: 12.0.0 + ts-node: 10.9.1(@swc/core@1.7.26)(@types/node@14.18.33)(typescript@4.9.5) + typescript: 4.9.5 + undici: 5.26.5 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color + dev: false + + /@vercel/python@4.1.1: + resolution: {integrity: sha512-EbAdKOZ0hPd5b59tLt7R3RQK1azNvuZTrCFRAVHNjqcIHNCmrSvjag5zBGn7Memkk8qWb3+CgBw9K/3LJKei0w==} + dev: false + + /@vercel/redwood@2.0.8(encoding@0.1.13): + resolution: {integrity: sha512-hAu7SYXDt+W7kscjtQ5NsuNflXH+QB5/xAdA6FRSS/e41lG6Xq6pqLMDobqq4BR7E2PpppVDw2DUx9KzPNoeEw==} + dependencies: + '@vercel/nft': 0.26.4(encoding@0.1.13) + '@vercel/routing-utils': 3.1.0 + semver: 6.3.1 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/remix-builder@2.1.5(encoding@0.1.13): + resolution: {integrity: sha512-VaDhsNg/1lZ7h6GJnaykActeZTRtFQz45qDNwKrHM+Nw5/ocwTun9sCJZY/ziECUNuQEJv95z3wUDhNweG+/9w==} + dependencies: + '@vercel/error-utils': 2.0.2 + '@vercel/nft': 0.26.4(encoding@0.1.13) + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + transitivePeerDependencies: + - encoding + - supports-color + dev: false + + /@vercel/routing-utils@3.1.0: + resolution: {integrity: sha512-Ci5xTjVTJY/JLZXpCXpLehMft97i9fH34nu9PGav6DtwkVUF6TOPX86U0W0niQjMZ5n6/ZP0BwcJK2LOozKaGw==} + dependencies: + path-to-regexp: 6.1.0 + optionalDependencies: + ajv: 6.12.6 + dev: false + + /@vercel/ruby@2.0.5: + resolution: {integrity: sha512-Gfm8HDech41vf+EPleRzgoJUnDTJerKgckMm4KX0JT860gV9XBMSOWYH7eMWHmMza104+HRCWL7wT6OlpftF2Q==} + dev: false + + /@vercel/static-build@2.4.6: + resolution: {integrity: sha512-LCmEBXRse7Bt46fo4OUzkq6RL1Q26oMWvmbFsW5uKi6bkT8asU1U5/zw9PQTeFQjGRL2vkUi22fGXF6XHuuqsA==} + dependencies: + '@vercel/gatsby-plugin-vercel-analytics': 1.0.11 + '@vercel/gatsby-plugin-vercel-builder': 2.0.24 + '@vercel/static-config': 3.0.0 + ts-morph: 12.0.0 + dev: false + + /@vercel/static-config@3.0.0: + resolution: {integrity: sha512-2qtvcBJ1bGY0dYGYh3iM7yGKkk971FujLEDXzuW5wcZsPr1GSEjO/w2iSr3qve6nDDtBImsGoDEnus5FI4+fIw==} + dependencies: + ajv: 8.6.3 + json-schema-to-ts: 1.6.4 + ts-morph: 12.0.0 + dev: false + /@verdaccio/commons-api@10.2.0: resolution: {integrity: sha512-F/YZANu4DmpcEV0jronzI7v2fGVWkQ5Mwi+bVmV+ACJ+EzR0c9Jbhtbe5QyLUuzR97t8R5E/Xe53O0cc2LukdQ==} engines: {node: '>=8'} @@ -20864,7 +21520,7 @@ packages: peerDependencies: vitest: 1.6.0 dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) istanbul-lib-coverage: 3.2.2 istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 @@ -20885,7 +21541,7 @@ packages: dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 0.2.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 @@ -21079,11 +21735,11 @@ packages: optional: true dependencies: '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-jsx': 7.25.7(@babel/core@7.25.2) '@babel/template': 7.25.9 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 '@vue/babel-helper-vue-transform-on': 1.2.5 '@vue/babel-plugin-resolve-type': 1.2.5(@babel/core@7.25.2) @@ -21100,7 +21756,7 @@ packages: dependencies: '@babel/code-frame': 7.26.2 '@babel/core': 7.25.2 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 '@babel/helper-plugin-utils': 7.25.9 '@babel/parser': 7.26.2 '@vue/compiler-sfc': 3.5.10 @@ -21470,6 +22126,40 @@ packages: '@webassemblyjs/ast': 1.12.1 '@xtuc/long': 4.2.2 + /@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.93.0): + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.93.0) + + /@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.93.0): + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + dependencies: + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.93.0) + + /@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.93.0): + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + dependencies: + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.93.0) + /@xmldom/xmldom@0.8.10: resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} engines: {node: '>=10.0.0'} @@ -21543,7 +22233,6 @@ packages: /abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} - dev: true /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} @@ -21579,6 +22268,14 @@ packages: acorn: ^8 dependencies: acorn: 8.12.1 + dev: true + + /acorn-import-attributes@1.9.5(acorn@8.14.0): + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.14.0 /acorn-jsx@5.3.2(acorn@7.4.1): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -21594,6 +22291,14 @@ packages: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.12.1 + dev: true + + /acorn-jsx@5.3.2(acorn@8.14.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.14.0 /acorn-walk@7.2.0: resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} @@ -21617,6 +22322,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + /acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + /address@1.2.2: resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} @@ -21647,7 +22357,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) transitivePeerDependencies: - supports-color @@ -21655,7 +22365,7 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -21781,6 +22491,15 @@ packages: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + /ajv@8.6.3: + resolution: {integrity: sha512-SMJOdDP6LqTkD0Uq8qLi+gMwSt0imXLSV080qFVwJCpH9U6Mb+SUGHAXM0KNbcBPguytWyvFxcHgMLe2D2XSpw==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + dev: false + /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} @@ -22068,7 +22787,6 @@ packages: dependencies: delegates: 1.0.0 readable-stream: 3.6.2 - dev: true /are-we-there-yet@4.0.2: resolution: {integrity: sha512-ncSWAawFhKMJDTdoAeOV+jyW1VCMj5QIAwULIBV0SSR7B/RLPPEQiknKcg/RIIZlUQrxELpsxMiTUoAQ4sIUyg==} @@ -22076,6 +22794,10 @@ packages: deprecated: This package is no longer supported. dev: false + /arg@4.1.0: + resolution: {integrity: sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==} + dev: false + /arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -22331,9 +23053,22 @@ packages: resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==} dev: true + /async-listen@1.2.0: + resolution: {integrity: sha512-CcEtRh/oc9Jc4uWeUwdpG/+Mb2YUHKmdaTf0gUr7Wa+bfp4xx70HOb3RuSTJMvqKNB1TkdTfjLdrcz2X4rkkZA==} + dev: false + + /async-listen@3.0.0: + resolution: {integrity: sha512-V+SsTpDqkrWTimiotsyl33ePSjA5/KrithwupuvJ6ztsqPvGv6ge4OredFhPffVXiLN/QUWvE0XcqJaYgt6fOg==} + engines: {node: '>= 14'} + dev: false + + /async-listen@3.0.1: + resolution: {integrity: sha512-cWMaNwUJnf37C/S5TfCkk/15MwbPRwVYALA2jtjkbHjCmAPiDXyNJy2q3p1KAZzDLHAWyarUWSujUoHR4pEgrA==} + engines: {node: '>= 14'} + dev: false + /async-sema@3.1.1: resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} - dev: true /async-validator@4.2.5: resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} @@ -22370,6 +23105,38 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + /autoprefixer@10.4.19(postcss@8.4.38): + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.24.0 + caniuse-lite: 1.0.30001668 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: true + + /autoprefixer@10.4.20(postcss@8.4.38): + resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.24.0 + caniuse-lite: 1.0.30001668 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.1.1 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: true + /autoprefixer@10.4.20(postcss@8.4.47): resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} engines: {node: ^10 || ^12 || >=14} @@ -22478,7 +23245,7 @@ packages: '@babel/core': 7.26.0 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) dev: true /babel-loader@9.2.1(@babel/core@7.25.2)(webpack@5.93.0): @@ -22491,7 +23258,7 @@ packages: '@babel/core': 7.25.2 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /babel-loader@9.2.1(@babel/core@7.25.7)(webpack@5.93.0): @@ -22504,7 +23271,7 @@ packages: '@babel/core': 7.25.7 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.93.0): @@ -22517,7 +23284,7 @@ packages: '@babel/core': 7.26.0 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /babel-plugin-apply-mdx-type-prop@1.6.22(@babel/core@7.12.9): resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==} @@ -22537,7 +23304,7 @@ packages: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.25.9 '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 transitivePeerDependencies: - supports-color @@ -22556,7 +23323,7 @@ packages: /babel-plugin-import@1.13.5: resolution: {integrity: sha512-IkqnoV+ov1hdJVofly9pXRJmeDm9EtROfrc5i6eII0Hix2xMs5FEm8FG3ExMvazbnZBbgHIt6qdO8And6lCloQ==} dependencies: - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -22564,7 +23331,7 @@ packages: /babel-plugin-import@1.13.8: resolution: {integrity: sha512-36babpjra5m3gca44V6tSTomeBlPA7cHUynrE2WiQIm3rEGD9xy28MKsx5IdO45EbnpJY7Jrgd00C6Dwt/l/2Q==} dependencies: - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 transitivePeerDependencies: - supports-color dev: true @@ -22677,16 +23444,16 @@ packages: transitivePeerDependencies: - supports-color - /babel-plugin-styled-components@1.13.3(styled-components@6.1.13): + /babel-plugin-styled-components@1.13.3(styled-components@6.1.8): resolution: {integrity: sha512-meGStRGv+VuKA/q0/jXxrPNWEm4LPfYIqxooDTdmh8kFsP/Ph7jJG5rUPwUPX3QHUvggwdbgdGpo88P/rRYsVw==} peerDependencies: styled-components: '>= 2' dependencies: '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9(supports-color@5.5.0) + '@babel/helper-module-imports': 7.25.9 babel-plugin-syntax-jsx: 6.18.0 lodash: 4.17.21 - styled-components: 6.1.13(react-dom@18.3.1)(react@18.3.1) + styled-components: 6.1.8(react-dom@18.3.1)(react@18.3.1) transitivePeerDependencies: - supports-color dev: true @@ -22908,7 +23675,6 @@ packages: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} dependencies: file-uri-to-path: 1.0.0 - dev: true /bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -23152,7 +23918,6 @@ packages: /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - dev: true /buffer-equal-constant-time@1.0.1: resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} @@ -23221,6 +23986,11 @@ packages: resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} engines: {node: '>= 0.8'} + /bytes@3.1.0: + resolution: {integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==} + engines: {node: '>= 0.8'} + dev: false + /bytes@3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -23508,6 +24278,21 @@ packages: - supports-color dev: true + /chokidar@3.3.1: + resolution: {integrity: sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.3.0 + optionalDependencies: + fsevents: 2.1.3 + dev: false + /chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -23530,12 +24315,10 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} engines: {node: '>=10'} - dev: true /chromatic@11.11.0: resolution: {integrity: sha512-mwmYsNMsZlRLtlfFUEtac5zhoVRhc+O/lsuMdOpwkiDQiKX6WdSNIhic+dkLenfuzao2r18s50nphcOgFoatBg==} @@ -23571,6 +24354,10 @@ packages: consola: 3.2.3 dev: true + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + dev: false + /cjs-module-lexer@1.4.1: resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} @@ -23615,6 +24402,13 @@ packages: dependencies: restore-cursor: 3.1.0 + /cli-cursor@5.0.0: + resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} + engines: {node: '>=18'} + dependencies: + restore-cursor: 5.1.0 + dev: true + /cli-highlight@2.1.11: resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} engines: {node: '>=8.0.0', npm: '>=5.0.0'} @@ -23661,6 +24455,14 @@ packages: string-width: 5.1.2 dev: true + /cli-truncate@4.0.0: + resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} + engines: {node: '>=18'} + dependencies: + slice-ansi: 5.0.0 + string-width: 7.2.0 + dev: true + /cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} @@ -23715,7 +24517,6 @@ packages: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - dev: true /clone-response@1.0.3: resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} @@ -23727,10 +24528,19 @@ packages: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + dev: false + /co@4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + /code-block-writer@10.1.1: + resolution: {integrity: sha512-67ueh2IRGst/51p0n6FvPrnRjAGHY5F8xdjkgrYE7DDzpJe6qA07RYQ9VcoUeo5ATOjSOiWpSL3SWBRRbempMw==} + dev: false + /collapse-white-space@1.0.6: resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==} dev: true @@ -23849,6 +24659,10 @@ packages: /commander@10.0.1: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} dev: true /commander@2.20.3: @@ -24045,6 +24859,11 @@ packages: dependencies: safe-buffer: 5.2.1 + /content-type@1.0.4: + resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==} + engines: {node: '>= 0.6'} + dev: false + /content-type@1.0.5: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} @@ -24110,6 +24929,11 @@ packages: meow: 13.2.0 dev: true + /convert-hrtime@3.0.0: + resolution: {integrity: sha512-7V+KqSvMiHp8yWDuwfww06XleMWVVB9b9tURBx+G7UTADuo5hYPuowKloz4OzOqbPezxgo+fdQ1522WzPG4OeA==} + engines: {node: '>=8'} + dev: false + /convert-hrtime@5.0.0: resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} engines: {node: '>=12'} @@ -24182,7 +25006,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /copy-webpack-plugin@11.0.0(webpack@5.93.0): resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} @@ -24196,7 +25020,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /copy-webpack-plugin@11.0.0(webpack@5.95.0): @@ -24211,7 +25035,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) dev: true /core-js-compat@3.38.1: @@ -24498,13 +25322,13 @@ packages: postcss: 8.4.31 dev: true - /css-declaration-sorter@7.2.0(postcss@8.4.47): + /css-declaration-sorter@7.2.0(postcss@8.4.38): resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.0.9 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 /css-loader@6.11.0(@rspack/core@1.0.8)(webpack@5.93.0): resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} @@ -24519,15 +25343,15 @@ packages: optional: true dependencies: '@rspack/core': 1.0.8(@swc/helpers@0.5.13) - icss-utils: 5.1.0(postcss@8.4.47) - postcss: 8.4.47 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.47) - postcss-modules-local-by-default: 4.0.5(postcss@8.4.47) - postcss-modules-scope: 3.2.0(postcss@8.4.47) - postcss-modules-values: 4.0.0(postcss@8.4.47) + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) + postcss-modules-scope: 3.2.0(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 semver: 7.6.3 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /css-loader@6.11.0(@rspack/core@1.1.1)(webpack@5.93.0): resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} @@ -24542,15 +25366,15 @@ packages: optional: true dependencies: '@rspack/core': 1.1.1(@swc/helpers@0.5.13) - icss-utils: 5.1.0(postcss@8.4.47) - postcss: 8.4.47 - postcss-modules-extract-imports: 3.1.0(postcss@8.4.47) - postcss-modules-local-by-default: 4.0.5(postcss@8.4.47) - postcss-modules-scope: 3.2.0(postcss@8.4.47) - postcss-modules-values: 4.0.0(postcss@8.4.47) + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) + postcss-modules-scope: 3.2.0(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 semver: 7.6.3 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /css-minimizer-webpack-plugin@5.0.1(esbuild@0.17.19)(webpack@5.95.0): @@ -24579,13 +25403,13 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.25 - cssnano: 6.1.2(postcss@8.4.47) + cssnano: 6.1.2(postcss@8.4.38) esbuild: 0.17.19 jest-worker: 29.7.0 - postcss: 8.4.47 + postcss: 8.4.38 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) dev: true /css-minimizer-webpack-plugin@5.0.1(esbuild@0.18.20)(webpack@5.93.0): @@ -24614,13 +25438,13 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.25 - cssnano: 6.1.2(postcss@8.4.47) + cssnano: 6.1.2(postcss@8.4.38) esbuild: 0.18.20 jest-worker: 29.7.0 - postcss: 8.4.47 + postcss: 8.4.38 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /css-minimizer-webpack-plugin@5.0.1(esbuild@0.18.20)(webpack@5.95.0): resolution: {integrity: sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==} @@ -24648,13 +25472,13 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.25 - cssnano: 6.1.2(postcss@8.4.47) + cssnano: 6.1.2(postcss@8.4.38) esbuild: 0.18.20 jest-worker: 29.7.0 - postcss: 8.4.47 + postcss: 8.4.38 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true /css-minimizer-webpack-plugin@5.0.1(esbuild@0.24.0)(webpack@5.93.0): @@ -24683,13 +25507,13 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.25 - cssnano: 6.1.2(postcss@8.4.47) + cssnano: 6.1.2(postcss@8.4.38) esbuild: 0.24.0 jest-worker: 29.7.0 - postcss: 8.4.47 + postcss: 8.4.38 schema-utils: 4.2.0 serialize-javascript: 6.0.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /css-select@4.3.0: @@ -24828,43 +25652,43 @@ packages: postcss-unique-selectors: 6.0.4(postcss@8.4.31) dev: true - /cssnano-preset-default@6.1.2(postcss@8.4.47): + /cssnano-preset-default@6.1.2(postcss@8.4.38): resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.24.0 - css-declaration-sorter: 7.2.0(postcss@8.4.47) - cssnano-utils: 4.0.2(postcss@8.4.47) - postcss: 8.4.47 - postcss-calc: 9.0.1(postcss@8.4.47) - postcss-colormin: 6.1.0(postcss@8.4.47) - postcss-convert-values: 6.1.0(postcss@8.4.47) - postcss-discard-comments: 6.0.2(postcss@8.4.47) - postcss-discard-duplicates: 6.0.3(postcss@8.4.47) - postcss-discard-empty: 6.0.3(postcss@8.4.47) - postcss-discard-overridden: 6.0.2(postcss@8.4.47) - postcss-merge-longhand: 6.0.5(postcss@8.4.47) - postcss-merge-rules: 6.1.1(postcss@8.4.47) - postcss-minify-font-values: 6.1.0(postcss@8.4.47) - postcss-minify-gradients: 6.0.3(postcss@8.4.47) - postcss-minify-params: 6.1.0(postcss@8.4.47) - postcss-minify-selectors: 6.0.4(postcss@8.4.47) - postcss-normalize-charset: 6.0.2(postcss@8.4.47) - postcss-normalize-display-values: 6.0.2(postcss@8.4.47) - postcss-normalize-positions: 6.0.2(postcss@8.4.47) - postcss-normalize-repeat-style: 6.0.2(postcss@8.4.47) - postcss-normalize-string: 6.0.2(postcss@8.4.47) - postcss-normalize-timing-functions: 6.0.2(postcss@8.4.47) - postcss-normalize-unicode: 6.1.0(postcss@8.4.47) - postcss-normalize-url: 6.0.2(postcss@8.4.47) - postcss-normalize-whitespace: 6.0.2(postcss@8.4.47) - postcss-ordered-values: 6.0.2(postcss@8.4.47) - postcss-reduce-initial: 6.1.0(postcss@8.4.47) - postcss-reduce-transforms: 6.0.2(postcss@8.4.47) - postcss-svgo: 6.0.3(postcss@8.4.47) - postcss-unique-selectors: 6.0.4(postcss@8.4.47) + css-declaration-sorter: 7.2.0(postcss@8.4.38) + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-calc: 9.0.1(postcss@8.4.38) + postcss-colormin: 6.1.0(postcss@8.4.38) + postcss-convert-values: 6.1.0(postcss@8.4.38) + postcss-discard-comments: 6.0.2(postcss@8.4.38) + postcss-discard-duplicates: 6.0.3(postcss@8.4.38) + postcss-discard-empty: 6.0.3(postcss@8.4.38) + postcss-discard-overridden: 6.0.2(postcss@8.4.38) + postcss-merge-longhand: 6.0.5(postcss@8.4.38) + postcss-merge-rules: 6.1.1(postcss@8.4.38) + postcss-minify-font-values: 6.1.0(postcss@8.4.38) + postcss-minify-gradients: 6.0.3(postcss@8.4.38) + postcss-minify-params: 6.1.0(postcss@8.4.38) + postcss-minify-selectors: 6.0.4(postcss@8.4.38) + postcss-normalize-charset: 6.0.2(postcss@8.4.38) + postcss-normalize-display-values: 6.0.2(postcss@8.4.38) + postcss-normalize-positions: 6.0.2(postcss@8.4.38) + postcss-normalize-repeat-style: 6.0.2(postcss@8.4.38) + postcss-normalize-string: 6.0.2(postcss@8.4.38) + postcss-normalize-timing-functions: 6.0.2(postcss@8.4.38) + postcss-normalize-unicode: 6.1.0(postcss@8.4.38) + postcss-normalize-url: 6.0.2(postcss@8.4.38) + postcss-normalize-whitespace: 6.0.2(postcss@8.4.38) + postcss-ordered-values: 6.0.2(postcss@8.4.38) + postcss-reduce-initial: 6.1.0(postcss@8.4.38) + postcss-reduce-transforms: 6.0.2(postcss@8.4.38) + postcss-svgo: 6.0.3(postcss@8.4.38) + postcss-unique-selectors: 6.0.4(postcss@8.4.38) /cssnano-utils@3.1.0(postcss@8.4.47): resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==} @@ -24884,13 +25708,13 @@ packages: postcss: 8.4.31 dev: true - /cssnano-utils@4.0.2(postcss@8.4.47): + /cssnano-utils@4.0.2(postcss@8.4.38): resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 /cssnano@5.1.15(postcss@8.4.47): resolution: {integrity: sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==} @@ -24915,26 +25739,26 @@ packages: postcss: 8.4.31 dev: true - /cssnano@6.0.1(postcss@8.4.47): + /cssnano@6.0.1(postcss@8.4.38): resolution: {integrity: sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.2.15 dependencies: - cssnano-preset-default: 6.1.2(postcss@8.4.47) + cssnano-preset-default: 6.1.2(postcss@8.4.38) lilconfig: 2.1.0 - postcss: 8.4.47 + postcss: 8.4.38 dev: true - /cssnano@6.1.2(postcss@8.4.47): + /cssnano@6.1.2(postcss@8.4.38): resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - cssnano-preset-default: 6.1.2(postcss@8.4.47) + cssnano-preset-default: 6.1.2(postcss@8.4.38) lilconfig: 3.1.2 - postcss: 8.4.47 + postcss: 8.4.38 /csso@4.2.0: resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} @@ -24971,6 +25795,9 @@ packages: rrweb-cssom: 0.7.1 dev: true + /csstype@3.1.2: + resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==} + /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -25209,6 +26036,10 @@ packages: dependencies: '@babel/runtime': 7.26.0 + /date-fns@3.6.0: + resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + dev: false + /date-format@4.0.14: resolution: {integrity: sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==} engines: {node: '>=4.0'} @@ -25243,6 +26074,18 @@ packages: ms: 2.1.3 supports-color: 8.1.1 + /debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + /debug@4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -25290,7 +26133,6 @@ packages: dependencies: ms: 2.1.3 supports-color: 9.3.1 - dev: true /decimal.js@10.4.3: resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} @@ -25537,7 +26379,7 @@ packages: hasBin: true dependencies: address: 1.2.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) transitivePeerDependencies: - supports-color @@ -25571,6 +26413,14 @@ packages: randombytes: 2.1.0 dev: true + /dinero.js@2.0.0-alpha.10: + resolution: {integrity: sha512-EDiOZanmJBJnFfiz5cUL/I2UI7EXQ0jXf18srqgO7sQhChyBbN39b5sf6T4fq4Oj3f4/6x2L96YPUbMRcUmd/A==} + dependencies: + '@dinero.js/calculator-number': 2.0.0-alpha.10 + '@dinero.js/core': 2.0.0-alpha.10 + '@dinero.js/currencies': 2.0.0-alpha.10 + dev: false + /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -25607,6 +26457,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 + dev: true /doctypes@1.1.0: resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} @@ -25768,6 +26619,22 @@ packages: dependencies: safe-buffer: 5.2.1 + /edge-runtime@2.5.9: + resolution: {integrity: sha512-pk+k0oK0PVXdlT4oRp4lwh+unuKB7Ng4iZ2HB+EZ7QCEQizX360Rp/F4aRpgpRgdP2ufB35N+1KppHmYjqIGSg==} + engines: {node: '>=16'} + hasBin: true + dependencies: + '@edge-runtime/format': 2.2.1 + '@edge-runtime/ponyfill': 2.4.2 + '@edge-runtime/vm': 3.2.0 + async-listen: 3.0.1 + mri: 1.2.0 + picocolors: 1.0.0 + pretty-ms: 7.0.1 + signal-exit: 4.0.2 + time-span: 4.0.0 + dev: false + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} @@ -25798,6 +26665,10 @@ packages: engines: {node: '>=12'} dev: true + /emoji-regex@10.4.0: + resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + dev: true + /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -25825,6 +26696,12 @@ packages: dependencies: iconv-lite: 0.6.3 + /end-of-stream@1.1.0: + resolution: {integrity: sha512-EoulkdKF/1xa92q25PbjuDcgJ9RDHYU2Rs3SCIvs2/dSQ3BpmxneNHmA/M7fe60M3PrV7nNGTTNbkK62l6vXiQ==} + dependencies: + once: 1.3.3 + dev: false + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -25896,7 +26773,6 @@ packages: resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} engines: {node: '>=4'} hasBin: true - dev: true /environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} @@ -26008,6 +26884,10 @@ packages: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} dev: true + /es-module-lexer@1.4.1: + resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} + dev: false + /es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} @@ -26069,6 +26949,15 @@ packages: ext: 1.7.0 dev: false + /esbuild-android-64@0.14.47: + resolution: {integrity: sha512-R13Bd9+tqLVFndncMHssZrPWe6/0Kpv2/dt4aA69soX4PRxlzsVpCvoJeFE8sOEoeVEiBkI0myjlkDodXlHa0g==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + /esbuild-android-64@0.15.18: resolution: {integrity: sha512-wnpt3OXRhcjfIDSZu9bnzT4/TNTDsOUvip0foZOUBG7QbSt//w3QV4FInVJxNhKc/ErhUxc5z4QjHtMi7/TbgA==} engines: {node: '>=12'} @@ -26078,6 +26967,15 @@ packages: dev: true optional: true + /esbuild-android-arm64@0.14.47: + resolution: {integrity: sha512-OkwOjj7ts4lBp/TL6hdd8HftIzOy/pdtbrNA4+0oVWgGG64HrdVzAF5gxtJufAPOsEjkyh1oIYvKAUinKKQRSQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + /esbuild-android-arm64@0.15.18: resolution: {integrity: sha512-G4xu89B8FCzav9XU8EjsXacCKSG2FT7wW9J6hOc18soEHJdtWu03L3TQDGf0geNxfLTtxENKBzMSq9LlbjS8OQ==} engines: {node: '>=12'} @@ -26087,6 +26985,15 @@ packages: dev: true optional: true + /esbuild-darwin-64@0.14.47: + resolution: {integrity: sha512-R6oaW0y5/u6Eccti/TS6c/2c1xYTb1izwK3gajJwi4vIfNs1s8B1dQzI1UiC9T61YovOQVuePDcfqHLT3mUZJA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /esbuild-darwin-64@0.15.18: resolution: {integrity: sha512-2WAvs95uPnVJPuYKP0Eqx+Dl/jaYseZEUUT1sjg97TJa4oBtbAKnPnl3b5M9l51/nbx7+QAEtuummJZW0sBEmg==} engines: {node: '>=12'} @@ -26096,6 +27003,15 @@ packages: dev: true optional: true + /esbuild-darwin-arm64@0.14.47: + resolution: {integrity: sha512-seCmearlQyvdvM/noz1L9+qblC5vcBrhUaOoLEDDoLInF/VQ9IkobGiLlyTPYP5dW1YD4LXhtBgOyevoIHGGnw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + /esbuild-darwin-arm64@0.15.18: resolution: {integrity: sha512-tKPSxcTJ5OmNb1btVikATJ8NftlyNlc8BVNtyT/UAr62JFOhwHlnoPrhYWz09akBLHI9nElFVfWSTSRsrZiDUA==} engines: {node: '>=12'} @@ -26105,6 +27021,15 @@ packages: dev: true optional: true + /esbuild-freebsd-64@0.14.47: + resolution: {integrity: sha512-ZH8K2Q8/Ux5kXXvQMDsJcxvkIwut69KVrYQhza/ptkW50DC089bCVrJZZ3sKzIoOx+YPTrmsZvqeZERjyYrlvQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /esbuild-freebsd-64@0.15.18: resolution: {integrity: sha512-TT3uBUxkteAjR1QbsmvSsjpKjOX6UkCstr8nMr+q7zi3NuZ1oIpa8U41Y8I8dJH2fJgdC3Dj3CXO5biLQpfdZA==} engines: {node: '>=12'} @@ -26114,6 +27039,15 @@ packages: dev: true optional: true + /esbuild-freebsd-arm64@0.14.47: + resolution: {integrity: sha512-ZJMQAJQsIOhn3XTm7MPQfCzEu5b9STNC+s90zMWe2afy9EwnHV7Ov7ohEMv2lyWlc2pjqLW8QJnz2r0KZmeAEQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + /esbuild-freebsd-arm64@0.15.18: resolution: {integrity: sha512-R/oVr+X3Tkh+S0+tL41wRMbdWtpWB8hEAMsOXDumSSa6qJR89U0S/PpLXrGF7Wk/JykfpWNokERUpCeHDl47wA==} engines: {node: '>=12'} @@ -26123,6 +27057,15 @@ packages: dev: true optional: true + /esbuild-linux-32@0.14.47: + resolution: {integrity: sha512-FxZOCKoEDPRYvq300lsWCTv1kcHgiiZfNrPtEhFAiqD7QZaXrad8LxyJ8fXGcWzIFzRiYZVtB3ttvITBvAFhKw==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-32@0.15.18: resolution: {integrity: sha512-lphF3HiCSYtaa9p1DtXndiQEeQDKPl9eN/XNoBf2amEghugNuqXNZA/ZovthNE2aa4EN43WroO0B85xVSjYkbg==} engines: {node: '>=12'} @@ -26132,6 +27075,15 @@ packages: dev: true optional: true + /esbuild-linux-64@0.14.47: + resolution: {integrity: sha512-nFNOk9vWVfvWYF9YNYksZptgQAdstnDCMtR6m42l5Wfugbzu11VpMCY9XrD4yFxvPo9zmzcoUL/88y0lfJZJJw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-64@0.15.18: resolution: {integrity: sha512-hNSeP97IviD7oxLKFuii5sDPJ+QHeiFTFLoLm7NZQligur8poNOWGIgpQ7Qf8Balb69hptMZzyOBIPtY09GZYw==} engines: {node: '>=12'} @@ -26141,6 +27093,15 @@ packages: dev: true optional: true + /esbuild-linux-arm64@0.14.47: + resolution: {integrity: sha512-ywfme6HVrhWcevzmsufjd4iT3PxTfCX9HOdxA7Hd+/ZM23Y9nXeb+vG6AyA6jgq/JovkcqRHcL9XwRNpWG6XRw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-arm64@0.15.18: resolution: {integrity: sha512-54qr8kg/6ilcxd+0V3h9rjT4qmjc0CccMVWrjOEM/pEcUzt8X62HfBSeZfT2ECpM7104mk4yfQXkosY8Quptug==} engines: {node: '>=12'} @@ -26150,6 +27111,15 @@ packages: dev: true optional: true + /esbuild-linux-arm@0.14.47: + resolution: {integrity: sha512-ZGE1Bqg/gPRXrBpgpvH81tQHpiaGxa8c9Rx/XOylkIl2ypLuOcawXEAo8ls+5DFCcRGt/o3sV+PzpAFZobOsmA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-arm@0.15.18: resolution: {integrity: sha512-UH779gstRblS4aoS2qpMl3wjg7U0j+ygu3GjIeTonCcN79ZvpPee12Qun3vcdxX+37O5LFxz39XeW2I9bybMVA==} engines: {node: '>=12'} @@ -26159,6 +27129,15 @@ packages: dev: true optional: true + /esbuild-linux-mips64le@0.14.47: + resolution: {integrity: sha512-mg3D8YndZ1LvUiEdDYR3OsmeyAew4MA/dvaEJxvyygahWmpv1SlEEnhEZlhPokjsUMfRagzsEF/d/2XF+kTQGg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-mips64le@0.15.18: resolution: {integrity: sha512-Mk6Ppwzzz3YbMl/ZZL2P0q1tnYqh/trYZ1VfNP47C31yT0K8t9s7Z077QrDA/guU60tGNp2GOwCQnp+DYv7bxQ==} engines: {node: '>=12'} @@ -26168,6 +27147,15 @@ packages: dev: true optional: true + /esbuild-linux-ppc64le@0.14.47: + resolution: {integrity: sha512-WER+f3+szmnZiWoK6AsrTKGoJoErG2LlauSmk73LEZFQ/iWC+KhhDsOkn1xBUpzXWsxN9THmQFltLoaFEH8F8w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-ppc64le@0.15.18: resolution: {integrity: sha512-b0XkN4pL9WUulPTa/VKHx2wLCgvIAbgwABGnKMY19WhKZPT+8BxhZdqz6EgkqCLld7X5qiCY2F/bfpUUlnFZ9w==} engines: {node: '>=12'} @@ -26177,6 +27165,15 @@ packages: dev: true optional: true + /esbuild-linux-riscv64@0.14.47: + resolution: {integrity: sha512-1fI6bP3A3rvI9BsaaXbMoaOjLE3lVkJtLxsgLHqlBhLlBVY7UqffWBvkrX/9zfPhhVMd9ZRFiaqXnB1T7BsL2g==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-riscv64@0.15.18: resolution: {integrity: sha512-ba2COaoF5wL6VLZWn04k+ACZjZ6NYniMSQStodFKH/Pu6RxzQqzsmjR1t9QC89VYJxBeyVPTaHuBMCejl3O/xg==} engines: {node: '>=12'} @@ -26186,6 +27183,15 @@ packages: dev: true optional: true + /esbuild-linux-s390x@0.14.47: + resolution: {integrity: sha512-eZrWzy0xFAhki1CWRGnhsHVz7IlSKX6yT2tj2Eg8lhAwlRE5E96Hsb0M1mPSE1dHGpt1QVwwVivXIAacF/G6mw==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + /esbuild-linux-s390x@0.15.18: resolution: {integrity: sha512-VbpGuXEl5FCs1wDVp93O8UIzl3ZrglgnSQ+Hu79g7hZu6te6/YHgVJxCM2SqfIila0J3k0csfnf8VD2W7u2kzQ==} engines: {node: '>=12'} @@ -26195,6 +27201,15 @@ packages: dev: true optional: true + /esbuild-netbsd-64@0.14.47: + resolution: {integrity: sha512-Qjdjr+KQQVH5Q2Q1r6HBYswFTToPpss3gqCiSw2Fpq/ua8+eXSQyAMG+UvULPqXceOwpnPo4smyZyHdlkcPppQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + /esbuild-netbsd-64@0.15.18: resolution: {integrity: sha512-98ukeCdvdX7wr1vUYQzKo4kQ0N2p27H7I11maINv73fVEXt2kyh4K4m9f35U1K43Xc2QGXlzAw0K9yoU7JUjOg==} engines: {node: '>=12'} @@ -26204,6 +27219,15 @@ packages: dev: true optional: true + /esbuild-openbsd-64@0.14.47: + resolution: {integrity: sha512-QpgN8ofL7B9z8g5zZqJE+eFvD1LehRlxr25PBkjyyasakm4599iroUpaj96rdqRlO2ShuyqwJdr+oNqWwTUmQw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + /esbuild-openbsd-64@0.15.18: resolution: {integrity: sha512-yK5NCcH31Uae076AyQAXeJzt/vxIo9+omZRKj1pauhk3ITuADzuOx5N2fdHrAKPxN+zH3w96uFKlY7yIn490xQ==} engines: {node: '>=12'} @@ -26222,7 +27246,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) esbuild: 0.17.19 transitivePeerDependencies: - supports-color @@ -26233,7 +27257,7 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) esbuild: 0.18.20 transitivePeerDependencies: - supports-color @@ -26244,11 +27268,20 @@ packages: peerDependencies: esbuild: '>=0.12 <1' dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) esbuild: 0.23.1 transitivePeerDependencies: - supports-color + /esbuild-sunos-64@0.14.47: + resolution: {integrity: sha512-uOeSgLUwukLioAJOiGYm3kNl+1wJjgJA8R671GYgcPgCx7QR73zfvYqXFFcIO93/nBdIbt5hd8RItqbbf3HtAQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + /esbuild-sunos-64@0.15.18: resolution: {integrity: sha512-On22LLFlBeLNj/YF3FT+cXcyKPEI263nflYlAhz5crxtp3yRG1Ugfr7ITyxmCmjm4vbN/dGrb/B7w7U8yJR9yw==} engines: {node: '>=12'} @@ -26258,6 +27291,15 @@ packages: dev: true optional: true + /esbuild-windows-32@0.14.47: + resolution: {integrity: sha512-H0fWsLTp2WBfKLBgwYT4OTfFly4Im/8B5f3ojDv1Kx//kiubVY0IQunP2Koc/fr/0wI7hj3IiBDbSrmKlrNgLQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + /esbuild-windows-32@0.15.18: resolution: {integrity: sha512-o+eyLu2MjVny/nt+E0uPnBxYuJHBvho8vWsC2lV61A7wwTWC3jkN2w36jtA+yv1UgYkHRihPuQsL23hsCYGcOQ==} engines: {node: '>=12'} @@ -26267,6 +27309,15 @@ packages: dev: true optional: true + /esbuild-windows-64@0.14.47: + resolution: {integrity: sha512-/Pk5jIEH34T68r8PweKRi77W49KwanZ8X6lr3vDAtOlH5EumPE4pBHqkCUdELanvsT14yMXLQ/C/8XPi1pAtkQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /esbuild-windows-64@0.15.18: resolution: {integrity: sha512-qinug1iTTaIIrCorAUjR0fcBk24fjzEedFYhhispP8Oc7SFvs+XeW3YpAKiKp8dRpizl4YYAhxMjlftAMJiaUw==} engines: {node: '>=12'} @@ -26276,6 +27327,15 @@ packages: dev: true optional: true + /esbuild-windows-arm64@0.14.47: + resolution: {integrity: sha512-HFSW2lnp62fl86/qPQlqw6asIwCnEsEoNIL1h2uVMgakddf+vUuMcCbtUY1i8sst7KkgHrVKCJQB33YhhOweCQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + /esbuild-windows-arm64@0.15.18: resolution: {integrity: sha512-q9bsYzegpZcLziq0zgUi5KqGVtfhjxGbnksaBFYmWLxeV/S1fK4OLdq2DFYnXcLMjlZw2L0jLsk1eGoB522WXQ==} engines: {node: '>=12'} @@ -26285,6 +27345,34 @@ packages: dev: true optional: true + /esbuild@0.14.47: + resolution: {integrity: sha512-wI4ZiIfFxpkuxB8ju4MHrGwGLyp1+awEHAHVpx6w7a+1pmYIq8T9FGEVVwFo0iFierDoMj++Xq69GXWYn2EiwA==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + esbuild-android-64: 0.14.47 + esbuild-android-arm64: 0.14.47 + esbuild-darwin-64: 0.14.47 + esbuild-darwin-arm64: 0.14.47 + esbuild-freebsd-64: 0.14.47 + esbuild-freebsd-arm64: 0.14.47 + esbuild-linux-32: 0.14.47 + esbuild-linux-64: 0.14.47 + esbuild-linux-arm: 0.14.47 + esbuild-linux-arm64: 0.14.47 + esbuild-linux-mips64le: 0.14.47 + esbuild-linux-ppc64le: 0.14.47 + esbuild-linux-riscv64: 0.14.47 + esbuild-linux-s390x: 0.14.47 + esbuild-netbsd-64: 0.14.47 + esbuild-openbsd-64: 0.14.47 + esbuild-sunos-64: 0.14.47 + esbuild-windows-32: 0.14.47 + esbuild-windows-64: 0.14.47 + esbuild-windows-arm64: 0.14.47 + dev: false + /esbuild@0.15.18: resolution: {integrity: sha512-x/R72SmW3sSFRm5zrrIjAhCeQSAWoni3CmHEqfQrZIQTM3lVCdehdwuIqaOtfC2slvpdlLa62GYoN8SxT23m6Q==} engines: {node: '>=12'} @@ -26591,6 +27679,32 @@ packages: - supports-color dev: true + /eslint-config-next@14.2.2(eslint@9.0.0)(typescript@5.4.5): + resolution: {integrity: sha512-12/uFc0KX+wUs7EDpOUGKMXBXZJiBVGdK5/m/QgXOCg2mQ0bQWoKSWNrCeOg7Vum6Kw1d1TW453W6xh+GbHquw==} + peerDependencies: + eslint: ^7.23.0 || ^8.0.0 + typescript: '>=3.3.1' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@next/eslint-plugin-next': 14.2.2 + '@rushstack/eslint-patch': 1.10.4 + '@typescript-eslint/parser': 6.21.0(eslint@9.0.0)(typescript@5.4.5) + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.0.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.3)(eslint@9.0.0) + eslint-plugin-jsx-a11y: 6.10.1(eslint@9.0.0) + eslint-plugin-react: 7.37.2(eslint@9.0.0) + eslint-plugin-react-hooks: 4.6.2(eslint@9.0.0) + typescript: 5.4.5 + transitivePeerDependencies: + - eslint-import-resolver-webpack + - eslint-plugin-import-x + - supports-color + dev: true + /eslint-config-prettier@8.10.0(eslint@8.57.1): resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true @@ -26619,6 +27733,36 @@ packages: - supports-color dev: true + /eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.0.0): + resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + eslint-plugin-import-x: '*' + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + dependencies: + '@nolyfill/is-core-module': 1.0.39 + debug: 4.3.7(supports-color@9.3.1) + enhanced-resolve: 5.17.1 + eslint: 9.0.0 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.0.0) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.3)(eslint@9.0.0) + fast-glob: 3.3.2 + get-tsconfig: 4.8.1 + is-bun-module: 1.2.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1): resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==} engines: {node: ^14.18.0 || >=16.0.0} @@ -26633,7 +27777,7 @@ packages: optional: true dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) enhanced-resolve: 5.17.1 eslint: 8.57.1 eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) @@ -26678,6 +27822,36 @@ packages: - supports-color dev: true + /eslint-module-utils@2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.0.0): + resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 6.21.0(eslint@9.0.0)(typescript@5.4.5) + debug: 3.2.7(supports-color@8.1.1) + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.0.0) + transitivePeerDependencies: + - supports-color + dev: true + /eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): resolution: {integrity: sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==} engines: {node: '>=4'} @@ -26788,6 +27962,43 @@ packages: - supports-color dev: true + /eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.3)(eslint@9.0.0): + resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@rtsao/scc': 1.1.0 + '@typescript-eslint/parser': 6.21.0(eslint@9.0.0)(typescript@5.4.5) + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7(supports-color@8.1.1) + doctrine: 2.1.0 + eslint: 9.0.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.0.0) + hasown: 2.0.2 + is-core-module: 2.15.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + string.prototype.trimend: 1.0.8 + tsconfig-paths: 3.15.0 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.18.0)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} @@ -26850,6 +28061,31 @@ packages: string.prototype.includes: 2.0.1 dev: true + /eslint-plugin-jsx-a11y@6.10.1(eslint@9.0.0): + resolution: {integrity: sha512-zHByM9WTUMnfsDTafGXRiqxp6lFtNoSOWBY6FonVRn3A+BUwN1L/tdBXT40BcBJi0cZjOGTXZ0eD/rTG9fEJ0g==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + dependencies: + aria-query: 5.3.2 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.10.0 + axobject-query: 4.1.0 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.2.0 + eslint: 9.0.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + safe-regex-test: 1.0.3 + string.prototype.includes: 2.0.1 + dev: true + /eslint-plugin-node@11.1.0(eslint@8.57.1): resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} engines: {node: '>=8.10.0'} @@ -26936,6 +28172,15 @@ packages: eslint: 8.57.1 dev: true + /eslint-plugin-react-hooks@4.6.2(eslint@9.0.0): + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + dependencies: + eslint: 9.0.0 + dev: true + /eslint-plugin-react-hooks@5.0.0(eslint@8.57.1): resolution: {integrity: sha512-hIOwI+5hYGpJEc4uPRmz2ulCjAGD/N13Lukkh8cLV0i2IRk/bdZDYjgLVHj+U9Z704kLIdIO6iueGvxNur0sgw==} engines: {node: '>=10'} @@ -26999,6 +28244,33 @@ packages: string.prototype.repeat: 1.0.0 dev: true + /eslint-plugin-react@7.37.2(eslint@9.0.0): + resolution: {integrity: sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.tosorted: 1.1.4 + doctrine: 2.1.0 + es-iterator-helpers: 1.2.0 + eslint: 9.0.0 + estraverse: 5.3.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + string.prototype.repeat: 1.0.0 + dev: true + /eslint-plugin-simple-import-sort@12.1.1(eslint@8.57.1): resolution: {integrity: sha512-6nuzu4xwQtE3332Uz0to+TxDQYRLTKRESSc2hefVT48Zc8JthmN23Gx9lnYhu0FtkRSL1oxny3kJ2aveVhmOVA==} peerDependencies: @@ -27025,6 +28297,14 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + dev: true + + /eslint-scope@8.2.0: + resolution: {integrity: sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} @@ -27047,6 +28327,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + /eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -27063,7 +28347,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -27092,6 +28376,49 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: true + + /eslint@9.0.0: + resolution: {integrity: sha512-IMryZ5SudxzQvuod6rUdIUz29qFItWx281VhtFVc2Psy/ZhlCeD/5DT6lBIJ4H3G+iamGJoTln1v+QSuPw0p7Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.0.0) + '@eslint-community/regexpp': 4.11.1 + '@eslint/eslintrc': 3.2.0 + '@eslint/js': 9.0.0 + '@humanwhocodes/config-array': 0.12.3 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.7(supports-color@9.3.1) + escape-string-regexp: 4.0.0 + eslint-scope: 8.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color /esniff@2.0.1: resolution: {integrity: sha512-kTUIGKQ/mDPFoJ0oVfcmyJn4iBDRptjNVIzwIFR7tqWXdVI9xfA2RMwY/gbSpJG3lkdWNEjLap/NqVHZiJsdfg==} @@ -27103,6 +28430,14 @@ packages: type: 2.7.3 dev: false + /espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + dependencies: + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 + /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -27110,6 +28445,7 @@ packages: acorn: 8.12.1 acorn-jsx: 5.3.2(acorn@8.12.1) eslint-visitor-keys: 3.4.3 + dev: true /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} @@ -27140,7 +28476,7 @@ packages: resolution: {integrity: sha512-YNF+mZ/Wu2FU/gvmzuWtYc8rloubL7wfXCTgouFrnjGVXPA/EeYYA7pupXWrb3Iv1cTBeSSxxJIbK23l4MRNqg==} engines: {node: '>=8.3.0'} dependencies: - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 c8: 7.14.0 transitivePeerDependencies: @@ -27234,6 +28570,14 @@ packages: /eventemitter3@4.0.7: resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: true + + /events-intercept@2.0.0: + resolution: {integrity: sha512-blk1va0zol9QOrdZt0rFXo5KMkNPVSp92Eju/Qz8THwKWKRKeE0T8Br/1aW6+Edkyq9xHYgYxn2QtOnUKPUp+Q==} + dev: false + /events@3.3.0: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} @@ -27258,6 +28602,22 @@ packages: strip-eof: 1.0.0 dev: true + /execa@3.2.0: + resolution: {integrity: sha512-kJJfVbI/lZE1PZYDI5VPxp8zXPO9rtxOkhpZ0jMKha56AI9y2gGVC6bkukStQf0ka5Rh15BA5m7cCCH4jmHqkw==} + engines: {node: ^8.12.0 || >=9.7.0} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: false + /execa@4.1.0: resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} engines: {node: '>=10'} @@ -27605,6 +28965,10 @@ packages: /fast-uri@3.0.2: resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==} + /fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + /fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: @@ -27632,7 +28996,6 @@ packages: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} dependencies: pend: 1.2.0 - dev: true /fdir@6.4.0(picomatch@2.3.1): resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} @@ -27707,6 +29070,13 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.2.0 + dev: true + + /file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + dependencies: + flat-cache: 4.0.1 /file-loader@6.2.0(webpack@5.93.0): resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} @@ -27716,7 +29086,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) /file-system-cache@2.3.0: resolution: {integrity: sha512-l4DMNdsIPsVnKrgEXbJwDJsA5mB8rGwHYERMgqQx/xAUtChPJMre1bXBzDEqqVbWv9AIbFezXMxeEkZDSrXUOQ==} @@ -27737,7 +29107,6 @@ packages: /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} requiresBuild: true - dev: true /filelist@1.0.4: resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} @@ -27962,6 +29331,14 @@ packages: flatted: 3.3.1 keyv: 4.5.4 rimraf: 3.0.2 + dev: true + + /flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} @@ -27995,7 +29372,7 @@ packages: debug: optional: true dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -28061,7 +29438,7 @@ packages: semver: 7.6.3 tapable: 2.2.1 typescript: 5.5.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.0.4)(webpack@5.93.0): resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==} @@ -28083,7 +29460,7 @@ packages: semver: 7.6.3 tapable: 2.2.1 typescript: 5.0.4 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.5.2)(webpack@5.93.0): @@ -28106,7 +29483,7 @@ packages: semver: 7.6.3 tapable: 2.2.1 typescript: 5.5.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.0.4)(webpack@5.95.0): @@ -28129,7 +29506,7 @@ packages: semver: 7.6.3 tapable: 2.2.1 typescript: 5.0.4 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) dev: true /fork-ts-checker-webpack-plugin@9.0.2(typescript@5.5.2)(webpack@5.95.0): @@ -28152,7 +29529,7 @@ packages: semver: 7.6.3 tapable: 2.2.1 typescript: 5.5.2 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true /form-data-encoder@1.7.2: @@ -28275,6 +29652,15 @@ packages: jsonfile: 6.1.0 universalify: 2.0.1 + /fs-extra@11.1.0: + resolution: {integrity: sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + /fs-extra@11.1.1: resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} engines: {node: '>=14.14'} @@ -28318,12 +29704,17 @@ packages: jsonfile: 6.1.0 universalify: 2.0.1 + /fs-minipass@1.2.7: + resolution: {integrity: sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==} + dependencies: + minipass: 2.9.0 + dev: false + /fs-minipass@2.1.0: resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} engines: {node: '>= 8'} dependencies: minipass: 3.3.6 - dev: true /fs-monkey@1.0.6: resolution: {integrity: sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==} @@ -28343,6 +29734,14 @@ packages: dev: true optional: true + /fsevents@2.1.3: + resolution: {integrity: sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -28394,7 +29793,6 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wide-align: 1.1.5 - dev: true /gauge@5.0.2: resolution: {integrity: sha512-pMaFftXPtiGIHCJHdcUUx9Rby/rFT/Kkt3fIIGCs+9PMDIljSyRiqraTlxNtBReJRDfUefpa263RQ3vnp5G/LQ==} @@ -28417,6 +29815,11 @@ packages: loader-utils: 3.3.1 dev: true + /generic-pool@3.4.2: + resolution: {integrity: sha512-H7cUpwCQSiJmAHM4c/aFu6fUfrhWXW1ncyh8ftxEPMu6AiYkHw9K8br720TGPZJbk5eOH2bynjZD1yPvdDAmag==} + engines: {node: '>= 4'} + dev: false + /gensync@1.0.0-beta.2: resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} engines: {node: '>=6.9.0'} @@ -28425,6 +29828,11 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + /get-east-asian-width@1.3.0: + resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} + engines: {node: '>=18'} + dev: true + /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} @@ -28468,7 +29876,6 @@ packages: engines: {node: '>=8'} dependencies: pump: 3.0.2 - dev: true /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} @@ -28737,6 +30144,11 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: true + + /globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} /globals@15.10.0: resolution: {integrity: sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ==} @@ -29413,7 +30825,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true /html-webpack-plugin@5.6.2(@rspack/core@1.0.8)(webpack@5.93.0): @@ -29434,7 +30846,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) /html-webpack-plugin@5.6.3(@rspack/core@1.0.8)(webpack@5.95.0): resolution: {integrity: sha512-QSf1yjtSAsmf7rYBV7XX86uua4W/vkhIt0xNXKbsi2foEeW7vjJQz4bhnpL3xH+l1ryl1680uNv968Z+X6jSYg==} @@ -29454,7 +30866,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) dev: true /htmlparser2@6.1.0: @@ -29531,6 +30943,14 @@ packages: /http-deceiver@1.2.7: resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} + /http-errors@1.4.0: + resolution: {integrity: sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==} + engines: {node: '>= 0.6'} + dependencies: + inherits: 2.0.1 + statuses: 1.5.0 + dev: false + /http-errors@1.6.3: resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} engines: {node: '>= 0.6'} @@ -29540,6 +30960,17 @@ packages: setprototypeof: 1.1.0 statuses: 1.5.0 + /http-errors@1.7.3: + resolution: {integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==} + engines: {node: '>= 0.6'} + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.1.1 + statuses: 1.5.0 + toidentifier: 1.0.0 + dev: false + /http-errors@1.8.1: resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} engines: {node: '>= 0.6'} @@ -29569,7 +31000,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -29579,7 +31010,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -29607,7 +31038,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@types/http-proxy': 1.17.15 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) http-proxy: 1.18.1(debug@4.3.7) is-glob: 4.0.3 is-plain-object: 5.0.0 @@ -29687,7 +31118,7 @@ packages: engines: {node: '>= 6.0.0'} dependencies: agent-base: 5.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -29697,7 +31128,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) transitivePeerDependencies: - supports-color @@ -29706,7 +31137,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) transitivePeerDependencies: - supports-color dev: true @@ -29718,7 +31149,6 @@ packages: /human-signals@1.1.1: resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} engines: {node: '>=8.12.0'} - dev: true /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} @@ -29775,6 +31205,14 @@ packages: resolution: {integrity: sha512-chIaY3Vh2mh2Q3RGXttaDIzeiPvaVXJ+C4DAh/w3c37SKZ/U6PGMmuicR2EQQp9bKG8zLMCl7I+PtIoOOPp8Gg==} dev: true + /icss-utils@5.1.0(postcss@8.4.38): + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.38 + /icss-utils@5.1.0(postcss@8.4.47): resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} engines: {node: ^10 || ^12 || >= 14} @@ -29782,6 +31220,7 @@ packages: postcss: ^8.1.0 dependencies: postcss: 8.4.47 + dev: true /identity-obj-proxy@3.0.0: resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==} @@ -29853,7 +31292,7 @@ packages: resolution: {integrity: sha512-7EyUlPFC0HOlBDpUFGfYstsU7XHxZJKAAMzCT8wZ0hMW7b+hG51LIKTDcsgtz8Pu6YC0HqRVbX+rVUtsGMUKvg==} engines: {node: '>=16.20'} dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) import-meta-resolve: 4.1.0 transitivePeerDependencies: - supports-color @@ -29878,7 +31317,6 @@ packages: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - dev: true /import-meta-resolve@4.1.0: resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} @@ -29909,6 +31347,10 @@ packages: once: 1.4.0 wrappy: 1.0.2 + /inherits@2.0.1: + resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==} + dev: false + /inherits@2.0.3: resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} @@ -30000,6 +31442,10 @@ packages: side-channel: 1.0.6 dev: true + /interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + /intersection-observer@0.12.2: resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==} dev: false @@ -30247,6 +31693,13 @@ packages: engines: {node: '>=12'} dev: true + /is-fullwidth-code-point@5.0.0: + resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==} + engines: {node: '>=18'} + dependencies: + get-east-asian-width: 1.3.0 + dev: true + /is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} @@ -30400,7 +31853,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 - dev: true /is-plain-object@3.0.1: resolution: {integrity: sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==} @@ -30602,7 +32054,6 @@ packages: /isobject@3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - dev: true /isomorphic-rslog@0.0.6: resolution: {integrity: sha512-HM0q6XqQ93psDlqvuViNs/Ea3hAyGDkIdVAHlrEocjjAwGrs1fZ+EdQjS9eUPacnYB7Y8SoDdSY3H8p3ce205A==} @@ -30687,7 +32138,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -30699,7 +32150,7 @@ packages: engines: {node: '>=10'} dependencies: '@jridgewell/trace-mapping': 0.3.25 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color @@ -31546,6 +32997,13 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: true + /json-schema-to-ts@1.6.4: + resolution: {integrity: sha512-pR4yQ9DHz6itqswtHCm26mw45FSNfQ9rEQjosaZErhn5J3J2sIViQiz8rDaezjKAhFGpmsoczYVBgGHzFw/stA==} + dependencies: + '@types/json-schema': 7.0.15 + ts-toolbelt: 6.15.5 + dev: false + /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -31741,7 +33199,7 @@ packages: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.9.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -31820,7 +33278,7 @@ packages: dependencies: klona: 2.0.6 less: 4.1.3 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /less-loader@11.1.0(less@4.2.0)(webpack@5.93.0): resolution: {integrity: sha512-C+uDBV7kS7W5fJlUjq5mPBeBVhYpTIm5gB09APT9o3n/ILeaXVsiSFTbZpTJCJwQ/Crczfn3DmfQFwxYusWFug==} @@ -31831,7 +33289,7 @@ packages: dependencies: klona: 2.0.6 less: 4.2.0 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /less@4.1.3: @@ -31841,7 +33299,7 @@ packages: dependencies: copy-anything: 2.0.6 parse-node-version: 1.0.1 - tslib: 2.6.3 + tslib: 2.8.1 optionalDependencies: errno: 0.1.8 graceful-fs: 4.2.11 @@ -31895,13 +33353,18 @@ packages: webpack-sources: optional: true dependencies: - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) webpack-sources: 3.2.3 /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} + /lilconfig@3.0.0: + resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} + engines: {node: '>=14'} + dev: true + /lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} @@ -31942,6 +33405,25 @@ packages: - enquirer dev: true + /lint-staged@15.2.2: + resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} + engines: {node: '>=18.12.0'} + hasBin: true + dependencies: + chalk: 5.3.0 + commander: 11.1.0 + debug: 4.3.4 + execa: 8.0.1 + lilconfig: 3.0.0 + listr2: 8.0.1 + micromatch: 4.0.5 + pidtree: 0.6.0 + string-argv: 0.3.2 + yaml: 2.3.4 + transitivePeerDependencies: + - supports-color + dev: true + /listr2@3.14.0(enquirer@2.4.1): resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==} engines: {node: '>=10.0.0'} @@ -31981,6 +33463,18 @@ packages: wrap-ansi: 7.0.0 dev: true + /listr2@8.0.1: + resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} + engines: {node: '>=18.0.0'} + dependencies: + cli-truncate: 4.0.0 + colorette: 2.0.20 + eventemitter3: 5.0.1 + log-update: 6.1.0 + rfdc: 1.4.1 + wrap-ansi: 9.0.0 + dev: true + /live-server@1.2.2: resolution: {integrity: sha512-t28HXLjITRGoMSrCOv4eZ88viHaBVIjKjdI5PO92Vxlu+twbk6aE0t7dVIaz6ZWkjPilYFV6OSdMYl9ybN2B4w==} engines: {node: '>=0.10.0'} @@ -32093,6 +33587,10 @@ packages: resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} dev: true + /lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + dev: true + /lodash.clonedeepwith@4.5.0: resolution: {integrity: sha512-QRBRSxhbtsX1nc0baxSkkK5WlVTTm/s48DSukcGcWZwIyI8Zz+lB+kFiELJXtzfH4Aj6kMWQ1VWW4U5uUDgZMA==} @@ -32193,12 +33691,23 @@ packages: wrap-ansi: 6.2.0 dev: true + /log-update@6.1.0: + resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} + engines: {node: '>=18'} + dependencies: + ansi-escapes: 7.0.0 + cli-cursor: 5.0.0 + slice-ansi: 7.1.0 + strip-ansi: 7.1.0 + wrap-ansi: 9.0.0 + dev: true + /log4js@6.9.1: resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==} engines: {node: '>=8.0'} dependencies: date-format: 4.0.14 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) flatted: 3.3.1 rfdc: 1.4.1 streamroller: 3.1.5 @@ -32358,7 +33867,6 @@ packages: engines: {node: '>=8'} dependencies: semver: 6.3.1 - dev: true /make-dir@4.0.0: resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} @@ -32745,6 +34253,16 @@ packages: resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} engines: {node: '>= 0.6'} + /micro@9.3.5-canary.3: + resolution: {integrity: sha512-viYIo9PefV+w9dvoIBh1gI44Mvx1BOk67B4BpC2QK77qdY0xZF0Q+vWLt/BII6cLkIc8rLmSIcJaB/OrXXKe1g==} + engines: {node: '>= 8.0.0'} + hasBin: true + dependencies: + arg: 4.1.0 + content-type: 1.0.4 + raw-body: 2.4.1 + dev: false + /micromark-core-commonmark@1.1.0: resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} dependencies: @@ -32889,8 +34407,8 @@ packages: /micromark-extension-mdxjs@1.0.1: resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) micromark-extension-mdx-expression: 1.0.8 micromark-extension-mdx-jsx: 1.0.5 micromark-extension-mdx-md: 1.0.1 @@ -33059,7 +34577,7 @@ packages: resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} dependencies: '@types/debug': 4.1.12 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -33100,6 +34618,14 @@ packages: - supports-color dev: true + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + dev: true + /micromatch@4.0.8: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} @@ -33165,6 +34691,11 @@ packages: engines: {node: '>=12'} dev: true + /mimic-function@5.0.1: + resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} + engines: {node: '>=18'} + dev: true + /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} @@ -33186,7 +34717,7 @@ packages: webpack: ^5.0.0 dependencies: schema-utils: 4.2.0 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /mini-css-extract-plugin@2.7.6(webpack@5.95.0): resolution: {integrity: sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==} @@ -33195,7 +34726,7 @@ packages: webpack: ^5.0.0 dependencies: schema-utils: 4.2.0 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true /mini-css-extract-plugin@2.9.1(webpack@5.95.0): @@ -33206,7 +34737,7 @@ packages: dependencies: schema-utils: 4.2.0 tapable: 2.2.1 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) dev: true /mini-svg-data-uri@1.4.4: @@ -33277,12 +34808,18 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + /minipass@2.9.0: + resolution: {integrity: sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==} + dependencies: + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: false + /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} engines: {node: '>=8'} dependencies: yallist: 4.0.0 - dev: true /minipass@4.2.8: resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} @@ -33292,19 +34829,23 @@ packages: /minipass@5.0.0: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - dev: true /minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + /minizlib@1.3.3: + resolution: {integrity: sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==} + dependencies: + minipass: 2.9.0 + dev: false + /minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} dependencies: minipass: 3.3.6 yallist: 4.0.0 - dev: true /mixin-deep@1.3.2: resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==} @@ -33380,12 +34921,21 @@ packages: /ms@2.0.0: resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + /ms@2.1.1: + resolution: {integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==} + dev: false + /ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} /ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /ms@3.0.0-canary.1: + resolution: {integrity: sha512-kh8ARjh8rMN7Du2igDRO9QJnqCb2xYTJxyQYK7vJJS4TvLLmsbyhiKpSW+t+y26gyOyMd0riphX0GeWKU3ky5g==} + engines: {node: '>=12.13'} + dev: false + /msw@1.3.4(encoding@0.1.13)(typescript@5.5.2): resolution: {integrity: sha512-XxA/VomMIYLlgpFS00eQanBWIAT9gto4wxrRt9y58WBXJs1I0lQYRIWk7nKcY/7X6DhkKukcDgPcyAvkEc1i7w==} engines: {node: '>=14'} @@ -33654,6 +35204,51 @@ packages: - '@babel/core' - babel-plugin-macros + /next@15.0.0-canary.193(@babel/core@7.25.2)(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-X17zCn32Tl2lpnYoNFcGlTAkDGAyXGNpnsu6HJec/vrTA5ogi+TArSgorGQdXnKCAR+GnwSn/Um3S46VUvcCxw==} + engines: {node: '>=18.18.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-cd22717c-20241013 + react-dom: ^18.2.0 || 19.0.0-rc-cd22717c-20241013 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + dependencies: + '@next/env': 15.0.0-canary.193 + '@swc/counter': 0.1.3 + '@swc/helpers': 0.5.13 + busboy: 1.6.0 + caniuse-lite: 1.0.30001668 + postcss: 8.4.31 + react: 19.0.0-rc-cd22717c-20241013 + react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013) + styled-jsx: 5.1.6(@babel/core@7.25.2)(react@19.0.0-rc-cd22717c-20241013) + optionalDependencies: + '@next/swc-darwin-arm64': 15.0.0-canary.193 + '@next/swc-darwin-x64': 15.0.0-canary.193 + '@next/swc-linux-arm64-gnu': 15.0.0-canary.193 + '@next/swc-linux-arm64-musl': 15.0.0-canary.193 + '@next/swc-linux-x64-gnu': 15.0.0-canary.193 + '@next/swc-linux-x64-musl': 15.0.0-canary.193 + '@next/swc-win32-arm64-msvc': 15.0.0-canary.193 + '@next/swc-win32-x64-msvc': 15.0.0-canary.193 + sharp: 0.33.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + dev: false + /no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} dependencies: @@ -33700,6 +35295,19 @@ packages: encoding: 0.1.13 whatwg-url: 5.0.0 + /node-fetch@2.6.9(encoding@0.1.13): + resolution: {integrity: sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + encoding: 0.1.13 + whatwg-url: 5.0.0 + dev: false + /node-fetch@2.7.0(encoding@0.1.13): resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -33727,7 +35335,6 @@ packages: /node-gyp-build@4.8.2: resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} hasBin: true - dev: true /node-html-parser@6.1.13: resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} @@ -33774,7 +35381,7 @@ packages: url: 0.11.4 util: 0.12.5 vm-browserify: 1.1.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /node-releases@2.0.18: @@ -33794,7 +35401,6 @@ packages: hasBin: true dependencies: abbrev: 1.1.1 - dev: true /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} @@ -34078,7 +35684,6 @@ packages: console-control-strings: 1.1.0 gauge: 3.0.2 set-blocking: 2.0.0 - dev: true /npmlog@7.0.1: resolution: {integrity: sha512-uJ0YFk/mCQpLBt+bxN88AKd+gyqZvZDbtiNxk6Waqcj2aPRyfVx8ITawkyQynxUagInjdYT1+qj4NfA5KJJUxg==} @@ -34370,6 +35975,12 @@ packages: resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} engines: {node: '>= 0.8'} + /once@1.3.3: + resolution: {integrity: sha512-6vaNInhu+CHxtONf3zw3vq4SP2DOQhjBvIa3rNcG0+P7eKWlYH6Peu7rHizSloRU2EwMz6GraLieis9Ac9+p1w==} + dependencies: + wrappy: 1.0.2 + dev: false + /once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -34388,6 +35999,13 @@ packages: mimic-fn: 4.0.0 dev: true + /onetime@7.0.0: + resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} + engines: {node: '>=18'} + dependencies: + mimic-function: 5.0.1 + dev: true + /only@0.0.2: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} @@ -34490,6 +36108,11 @@ packages: arch: 2.2.0 dev: true + /os-paths@4.4.0: + resolution: {integrity: sha512-wrAwOeXp1RRMFfQY8Sy7VaGVmPocaLwSFOYCGKSyo8qmJ+/yaafCl5BCA1IQZWqFSRBrKDYFeR9d/VyQzfH/jg==} + engines: {node: '>= 6.0'} + dev: false + /os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -34551,6 +36174,11 @@ packages: engines: {node: '>=4'} dev: true + /p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + dev: false + /p-is-promise@3.0.0: resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} engines: {node: '>=8'} @@ -34785,6 +36413,11 @@ packages: type-fest: 4.26.1 dev: true + /parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + dev: false + /parse-ms@4.0.0: resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} engines: {node: '>=18'} @@ -34879,6 +36512,13 @@ packages: engines: {node: '>=12'} dev: true + /path-match@1.2.4: + resolution: {integrity: sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==} + dependencies: + http-errors: 1.4.0 + path-to-regexp: 1.9.0 + dev: false + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -34909,6 +36549,14 @@ packages: isarray: 0.0.1 dev: false + /path-to-regexp@6.1.0: + resolution: {integrity: sha512-h9DqehX3zZZDCEm+xbfU0ZmwCGFCAAraPJWMXJ4+v32NjZJilVg3k1TcKsRgIb8IQ/izZSaydDc1OhJCZvs2Dw==} + dev: false + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + /path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -34969,7 +36617,6 @@ packages: /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - dev: true /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -34982,6 +36629,10 @@ packages: is-reference: 3.0.2 dev: false + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: false + /picocolors@1.1.0: resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} @@ -35080,7 +36731,6 @@ packages: engines: {node: '>=8'} dependencies: find-up: 4.1.0 - dev: true /pkg-dir@5.0.0: resolution: {integrity: sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==} @@ -35185,13 +36835,13 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-calc@9.0.1(postcss@8.4.47): + /postcss-calc@9.0.1(postcss@8.4.38): resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.2.2 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 @@ -35221,7 +36871,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-colormin@6.1.0(postcss@8.4.47): + /postcss-colormin@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: @@ -35230,7 +36880,7 @@ packages: browserslist: 4.24.0 caniuse-api: 3.0.0 colord: 2.9.3 - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-convert-values@5.1.3(postcss@8.4.47): @@ -35255,17 +36905,17 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-convert-values@6.1.0(postcss@8.4.47): + /postcss-convert-values@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.24.0 - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 - /postcss-custom-properties@13.1.5(postcss@8.4.47): + /postcss-custom-properties@13.1.5(postcss@8.4.38): resolution: {integrity: sha512-98DXk81zTGqMVkGANysMHbGIg3voH383DYo3/+c+Abzay3nao+vM/f4Jgzsakk9S7BDsEw5DiW7sFy5G4W2wLA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -35274,11 +36924,11 @@ packages: '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1)(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true - /postcss-custom-properties@13.3.12(postcss@8.4.47): + /postcss-custom-properties@13.3.12(postcss@8.4.38): resolution: {integrity: sha512-oPn/OVqONB2ZLNqN185LDyaVByELAA/u3l2CS2TS16x2j2XsmV4kd8U49+TMxmUsEU9d8fB/I10E6U7kB0L1BA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -35287,8 +36937,8 @@ packages: '@csstools/cascade-layer-name-parser': 1.0.13(@csstools/css-parser-algorithms@2.7.1)(@csstools/css-tokenizer@2.4.1) '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 - '@csstools/utilities': 1.0.0(postcss@8.4.47) - postcss: 8.4.47 + '@csstools/utilities': 1.0.0(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 dev: true @@ -35310,13 +36960,13 @@ packages: postcss: 8.4.31 dev: true - /postcss-discard-comments@6.0.2(postcss@8.4.47): + /postcss-discard-comments@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 /postcss-discard-duplicates@5.1.0(postcss@8.4.47): resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} @@ -35336,13 +36986,13 @@ packages: postcss: 8.4.31 dev: true - /postcss-discard-duplicates@6.0.3(postcss@8.4.47): + /postcss-discard-duplicates@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 /postcss-discard-empty@5.1.1(postcss@8.4.47): resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==} @@ -35362,13 +37012,13 @@ packages: postcss: 8.4.31 dev: true - /postcss-discard-empty@6.0.3(postcss@8.4.47): + /postcss-discard-empty@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 /postcss-discard-overridden@5.1.0(postcss@8.4.47): resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==} @@ -35388,28 +37038,28 @@ packages: postcss: 8.4.31 dev: true - /postcss-discard-overridden@6.0.2(postcss@8.4.47): + /postcss-discard-overridden@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 - /postcss-flexbugs-fixes@5.0.2(postcss@8.4.47): + /postcss-flexbugs-fixes@5.0.2(postcss@8.4.38): resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==} peerDependencies: postcss: ^8.1.4 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 dev: true - /postcss-font-variant@5.0.0(postcss@8.4.47): + /postcss-font-variant@5.0.0(postcss@8.4.38): resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 dev: true /postcss-import@14.1.0(postcss@8.4.47): @@ -35423,6 +37073,18 @@ packages: read-cache: 1.0.0 resolve: 1.22.8 + /postcss-import@15.1.0(postcss@8.4.38): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: true + /postcss-import@15.1.0(postcss@8.4.47): resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} engines: {node: '>=14.0.0'} @@ -35434,12 +37096,12 @@ packages: read-cache: 1.0.0 resolve: 1.22.8 - /postcss-initial@4.0.1(postcss@8.4.47): + /postcss-initial@4.0.1(postcss@8.4.38): resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==} peerDependencies: postcss: ^8.0.0 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 dev: true /postcss-js@4.0.1(postcss@8.4.47): @@ -35468,6 +37130,23 @@ packages: yaml: 1.10.2 dev: true + /postcss-load-config@4.0.2(postcss@8.4.38): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.2 + postcss: 8.4.38 + yaml: 2.6.0 + dev: false + /postcss-load-config@4.0.2(postcss@8.4.47): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} engines: {node: '>= 14'} @@ -35482,9 +37161,9 @@ packages: dependencies: lilconfig: 3.1.2 postcss: 8.4.47 - yaml: 2.5.1 + yaml: 2.6.0 - /postcss-load-config@6.0.1(postcss@8.4.47): + /postcss-load-config@6.0.1(postcss@8.4.38): resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} peerDependencies: @@ -35503,7 +37182,7 @@ packages: optional: true dependencies: lilconfig: 3.1.2 - postcss: 8.4.47 + postcss: 8.4.38 dev: false /postcss-loader@6.2.1(postcss@8.4.47)(webpack@5.93.0): @@ -35517,7 +37196,7 @@ packages: klona: 2.0.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /postcss-loader@8.1.1(@rspack/core@1.0.8)(postcss@8.4.47)(typescript@5.5.2)(webpack@5.93.0): resolution: {integrity: sha512-0IeqyAsG6tYiDRCYKQJLAmgQr47DX6N7sFSWvQxt6AcupX8DIdmykuk/o/tx0Lze3ErGHJEp5OSRxrelC6+NdQ==} @@ -35537,7 +37216,7 @@ packages: jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) transitivePeerDependencies: - typescript dev: true @@ -35560,18 +37239,18 @@ packages: jiti: 1.21.6 postcss: 8.4.47 semver: 7.6.3 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) transitivePeerDependencies: - typescript dev: true - /postcss-media-minmax@5.0.0(postcss@8.4.47): + /postcss-media-minmax@5.0.0(postcss@8.4.38): resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==} engines: {node: '>=10.0.0'} peerDependencies: postcss: ^8.1.0 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 dev: true /postcss-merge-longhand@5.1.7(postcss@8.4.47): @@ -35596,15 +37275,15 @@ packages: stylehacks: 6.1.1(postcss@8.4.31) dev: true - /postcss-merge-longhand@6.0.5(postcss@8.4.47): + /postcss-merge-longhand@6.0.5(postcss@8.4.38): resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 - stylehacks: 6.1.1(postcss@8.4.47) + stylehacks: 6.1.1(postcss@8.4.38) /postcss-merge-rules@5.1.4(postcss@8.4.47): resolution: {integrity: sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==} @@ -35632,7 +37311,7 @@ packages: postcss-selector-parser: 6.1.2 dev: true - /postcss-merge-rules@6.1.1(postcss@8.4.47): + /postcss-merge-rules@6.1.1(postcss@8.4.38): resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: @@ -35640,8 +37319,8 @@ packages: dependencies: browserslist: 4.24.0 caniuse-api: 3.0.0 - cssnano-utils: 4.0.2(postcss@8.4.47) - postcss: 8.4.47 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 postcss-selector-parser: 6.1.2 /postcss-minify-font-values@5.1.0(postcss@8.4.47): @@ -35664,13 +37343,13 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-minify-font-values@6.1.0(postcss@8.4.47): + /postcss-minify-font-values@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-minify-gradients@5.1.1(postcss@8.4.47): @@ -35697,15 +37376,15 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-minify-gradients@6.0.3(postcss@8.4.47): + /postcss-minify-gradients@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: colord: 2.9.3 - cssnano-utils: 4.0.2(postcss@8.4.47) - postcss: 8.4.47 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-minify-params@5.1.4(postcss@8.4.47): @@ -35732,15 +37411,15 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-minify-params@6.1.0(postcss@8.4.47): + /postcss-minify-params@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.24.0 - cssnano-utils: 4.0.2(postcss@8.4.47) - postcss: 8.4.47 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-minify-selectors@5.2.1(postcss@8.4.47): @@ -35763,15 +37442,23 @@ packages: postcss-selector-parser: 6.1.2 dev: true - /postcss-minify-selectors@6.0.4(postcss@8.4.47): + /postcss-minify-selectors@6.0.4(postcss@8.4.38): resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-selector-parser: 6.1.2 + /postcss-modules-extract-imports@3.1.0(postcss@8.4.38): + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.38 + /postcss-modules-extract-imports@3.1.0(postcss@8.4.47): resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} engines: {node: ^10 || ^12 || >= 14} @@ -35779,6 +37466,18 @@ packages: postcss: ^8.1.0 dependencies: postcss: 8.4.47 + dev: true + + /postcss-modules-local-by-default@4.0.5(postcss@8.4.38): + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-selector-parser: 6.1.2 + postcss-value-parser: 4.2.0 /postcss-modules-local-by-default@4.0.5(postcss@8.4.47): resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} @@ -35790,6 +37489,16 @@ packages: postcss: 8.4.47 postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 + dev: true + + /postcss-modules-scope@3.2.0(postcss@8.4.38): + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.1.2 /postcss-modules-scope@3.2.0(postcss@8.4.47): resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} @@ -35799,6 +37508,16 @@ packages: dependencies: postcss: 8.4.47 postcss-selector-parser: 6.1.2 + dev: true + + /postcss-modules-values@4.0.0(postcss@8.4.38): + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + dependencies: + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 /postcss-modules-values@4.0.0(postcss@8.4.47): resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} @@ -35808,6 +37527,7 @@ packages: dependencies: icss-utils: 5.1.0(postcss@8.4.47) postcss: 8.4.47 + dev: true /postcss-modules@4.3.1(postcss@8.4.47): resolution: {integrity: sha512-ItUhSUxBBdNamkT3KzIZwYNNRFKmkJrofvC2nWab3CPKhYBQ1f27XXh1PAPE27Psx58jeelPsxWB/+og+KEH0Q==} @@ -35834,14 +37554,14 @@ packages: postcss: 8.4.47 postcss-selector-parser: 6.1.2 - /postcss-nesting@12.0.1(postcss@8.4.47): + /postcss-nesting@12.0.1(postcss@8.4.38): resolution: {integrity: sha512-6LCqCWP9pqwXw/njMvNK0hGY44Fxc4B2EsGbn6xDcxbNRzP8GYoxT7yabVVMLrX3quqOJ9hg2jYMsnkedOf8pA==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss: ^8.4 dependencies: '@csstools/selector-specificity': 3.1.1(postcss-selector-parser@6.1.2) - postcss: 8.4.47 + postcss: 8.4.38 postcss-selector-parser: 6.1.2 dev: true @@ -35863,13 +37583,13 @@ packages: postcss: 8.4.31 dev: true - /postcss-normalize-charset@6.0.2(postcss@8.4.47): + /postcss-normalize-charset@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 /postcss-normalize-display-values@5.1.0(postcss@8.4.47): resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==} @@ -35891,13 +37611,13 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-display-values@6.0.2(postcss@8.4.47): + /postcss-normalize-display-values@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-normalize-positions@5.1.1(postcss@8.4.47): @@ -35920,13 +37640,13 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-positions@6.0.2(postcss@8.4.47): + /postcss-normalize-positions@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-normalize-repeat-style@5.1.1(postcss@8.4.47): @@ -35949,13 +37669,13 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-repeat-style@6.0.2(postcss@8.4.47): + /postcss-normalize-repeat-style@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-normalize-string@5.1.0(postcss@8.4.47): @@ -35978,13 +37698,13 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-string@6.0.2(postcss@8.4.47): + /postcss-normalize-string@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-normalize-timing-functions@5.1.0(postcss@8.4.47): @@ -36007,13 +37727,13 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-timing-functions@6.0.2(postcss@8.4.47): + /postcss-normalize-timing-functions@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-normalize-unicode@5.1.1(postcss@8.4.47): @@ -36038,14 +37758,14 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-unicode@6.1.0(postcss@8.4.47): + /postcss-normalize-unicode@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.24.0 - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-normalize-url@5.1.0(postcss@8.4.47): @@ -36069,13 +37789,13 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-url@6.0.2(postcss@8.4.47): + /postcss-normalize-url@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-normalize-whitespace@5.1.1(postcss@8.4.47): @@ -36098,13 +37818,13 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-normalize-whitespace@6.0.2(postcss@8.4.47): + /postcss-normalize-whitespace@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 /postcss-ordered-values@5.1.3(postcss@8.4.47): @@ -36129,22 +37849,22 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-ordered-values@6.0.2(postcss@8.4.47): + /postcss-ordered-values@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - cssnano-utils: 4.0.2(postcss@8.4.47) - postcss: 8.4.47 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 postcss-value-parser: 4.2.0 - /postcss-page-break@3.0.4(postcss@8.4.47): + /postcss-page-break@3.0.4(postcss@8.4.38): resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} peerDependencies: postcss: ^8 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 dev: true /postcss-reduce-initial@5.1.2(postcss@8.4.47): @@ -36169,7 +37889,7 @@ packages: postcss: 8.4.31 dev: true - /postcss-reduce-initial@6.1.0(postcss@8.4.47): + /postcss-reduce-initial@6.1.0(postcss@8.4.38): resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: @@ -36177,7 +37897,7 @@ packages: dependencies: browserslist: 4.24.0 caniuse-api: 3.0.0 - postcss: 8.4.47 + postcss: 8.4.38 /postcss-reduce-transforms@5.1.0(postcss@8.4.47): resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==} @@ -36199,15 +37919,23 @@ packages: postcss-value-parser: 4.2.0 dev: true - /postcss-reduce-transforms@6.0.2(postcss@8.4.47): + /postcss-reduce-transforms@6.0.2(postcss@8.4.38): resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 + /postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + /postcss-selector-parser@6.1.2: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} @@ -36237,13 +37965,13 @@ packages: svgo: 3.3.2 dev: true - /postcss-svgo@6.0.3(postcss@8.4.47): + /postcss-svgo@6.0.3(postcss@8.4.38): resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} engines: {node: ^14 || ^16 || >= 18} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-value-parser: 4.2.0 svgo: 3.3.2 @@ -36267,16 +37995,16 @@ packages: postcss-selector-parser: 6.1.2 dev: true - /postcss-unique-selectors@6.0.4(postcss@8.4.47): + /postcss-unique-selectors@6.0.4(postcss@8.4.38): resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: - postcss: 8.4.47 + postcss: 8.4.38 postcss-selector-parser: 6.1.2 - /postcss-url@10.1.3(postcss@8.4.47): + /postcss-url@10.1.3(postcss@8.4.38): resolution: {integrity: sha512-FUzyxfI5l2tKmXdYc6VTu3TWZsInayEKPbiyW+P6vmmIrrb4I6CGX0BFoewgYHLK+oIL5FECEK02REYRpBvUCw==} engines: {node: '>=10'} peerDependencies: @@ -36285,7 +38013,7 @@ packages: make-dir: 3.1.0 mime: 2.5.2 minimatch: 3.0.8 - postcss: 8.4.47 + postcss: 8.4.38 xxhashjs: 0.2.2 dev: true @@ -36307,7 +38035,6 @@ packages: nanoid: 3.3.7 picocolors: 1.1.1 source-map-js: 1.2.1 - dev: true /postcss@8.4.47: resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} @@ -36356,12 +38083,73 @@ packages: fast-diff: 1.3.0 dev: true + /prettier-plugin-tailwindcss@0.5.14(prettier@3.2.5): + resolution: {integrity: sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + dependencies: + prettier: 3.2.5 + dev: true + /prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true dev: true + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + dev: true + /prettier@3.3.3: resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} @@ -36400,6 +38188,13 @@ packages: engines: {node: '>= 0.8'} dev: true + /pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + dependencies: + parse-ms: 2.1.0 + dev: false + /pretty-ms@9.1.0: resolution: {integrity: sha512-o1piW0n3tgKIKCwk2vpM/vOV13zjJzvP37Ioze54YlTHE06m4tjEbzg9WsKkvTuyYln2DHjo5pY4qrZGI0otpw==} engines: {node: '>=18'} @@ -36447,6 +38242,10 @@ packages: asap: 2.0.6 dev: true + /promisepipe@3.0.0: + resolution: {integrity: sha512-V6TbZDJ/ZswevgkDNpGt/YqNCiZP9ASfgU+p83uJE6NrGtvSGoOcHLiDCqkMs2+yg7F5qHdLV8d0aS8O26G/KA==} + dev: false + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -36633,7 +38432,6 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true /pumpify@1.5.1: resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} @@ -36656,7 +38454,7 @@ packages: engines: {node: '>=8.16.0'} dependencies: '@types/mime-types': 2.1.4 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) extract-zip: 1.7.0 https-proxy-agent: 4.0.0 mime: 2.6.0 @@ -36745,6 +38543,16 @@ packages: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} engines: {node: '>= 0.6'} + /raw-body@2.4.1: + resolution: {integrity: sha512-9WmIKF6mkvA0SLmA2Knm9+qj89e+j1zqgyn8aXGd7+nAduPoqgI9lO57SAZNn/Byzo5P7JhXTyg9PzaJbH73bA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.0 + http-errors: 1.7.3 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + /raw-body@2.5.1: resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} engines: {node: '>= 0.8'} @@ -37827,7 +39635,7 @@ packages: engines: {node: '>=16.14.0'} dependencies: '@babel/core': 7.26.0 - '@babel/traverse': 7.25.9(supports-color@5.5.0) + '@babel/traverse': 7.25.9 '@babel/types': 7.26.0 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 @@ -37849,6 +39657,15 @@ packages: react: 18.3.1 scheduler: 0.23.2 + /react-dom@19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-NzjTBOXygonUxLRQuUUW5V2QLGkAcyUwJoS8+UWxs089paMvQQfoRD51w65Ovgd2OEQ8Rm3HWx+82fvXiT0czQ==} + peerDependencies: + react: 19.0.0-rc-cd22717c-20241013 + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + scheduler: 0.25.0-rc-cd22717c-20241013 + dev: false + /react-element-to-jsx-string@15.0.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==} peerDependencies: @@ -38220,6 +40037,11 @@ packages: dependencies: loose-envify: 1.4.0 + /react@19.0.0-rc-cd22717c-20241013: + resolution: {integrity: sha512-k28GszmyQ1tX/JmeLGZINq5KXiNy/MmN0fCAtcwF8a9INDyVYG0zATCRGJwaPB9WixmkuwPv1BfB1QBfJC7cNg==} + engines: {node: '>=0.10.0'} + dev: false + /reactflow@11.11.4(@types/react@18.2.79)(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-70FOtJkUWH3BAOsN+LU9lCrKoKbtOPnz2uq0CV2PLdNSwxTXOhCbsZr50GmZ+Rtw3jx8Uv7/vBFtCGixLfd4Og==} peerDependencies: @@ -38339,6 +40161,13 @@ packages: - supports-color dev: true + /readdirp@3.3.0: + resolution: {integrity: sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -38363,6 +40192,12 @@ packages: tiny-invariant: 1.3.3 tslib: 2.8.1 + /rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.8 + /redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -38728,7 +40563,6 @@ packages: engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 - dev: true /resolve-dir@1.0.1: resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} @@ -38760,7 +40594,7 @@ packages: adjust-sourcemap-loader: 4.0.0 convert-source-map: 1.9.0 loader-utils: 2.0.4 - postcss: 8.4.47 + postcss: 8.4.38 source-map: 0.6.1 dev: true @@ -38809,6 +40643,14 @@ packages: onetime: 5.1.2 signal-exit: 3.0.7 + /restore-cursor@5.1.0: + resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} + engines: {node: '>=18'} + dependencies: + onetime: 7.0.0 + signal-exit: 4.1.0 + dev: true + /ret@0.1.15: resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==} engines: {node: '>=0.12'} @@ -38924,7 +40766,7 @@ packages: fs-extra: 10.1.0 rollup: 4.24.0 semver: 7.6.3 - tslib: 2.6.3 + tslib: 2.8.1 typescript: 5.5.2 dev: true @@ -39609,7 +41451,7 @@ packages: klona: 2.0.6 neo-async: 2.6.2 sass: 1.79.4 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /sass-loader@13.3.3(webpack@5.93.0): resolution: {integrity: sha512-mt5YN2F1MOZr3d/wBRcZxeFgwgkH44wVc2zohO2YF6JiOMkiXe4BYRZpSu2sO1g71mo/j16txzUhsKZlqjVGzA==} @@ -39631,7 +41473,7 @@ packages: optional: true dependencies: neo-async: 2.6.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /sass@1.79.4: @@ -39659,6 +41501,10 @@ packages: dependencies: loose-envify: 1.4.0 + /scheduler@0.25.0-rc-cd22717c-20241013: + resolution: {integrity: sha512-MnsFR57bKcrYslnbCUsaUG0qBuAArk92VxE0zu6A2Usz38iIuL2uZLunqKlP1W47MF33GrRGDj1sXdPbFKIZfw==} + dev: false + /schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -39732,7 +41578,7 @@ packages: '@semantic-release/release-notes-generator': 14.0.1(semantic-release@24.1.2) aggregate-error: 5.0.0 cosmiconfig: 9.0.0(typescript@5.5.2) - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) env-ci: 11.1.0 execa: 9.4.0 figures: 6.1.0 @@ -39787,6 +41633,14 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + /semver@7.3.5: + resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} engines: {node: '>=10'} @@ -39843,7 +41697,7 @@ packages: resolution: {integrity: sha512-v67WcEouB5GxbTWL/4NeToqcZiAWEq90N888fczVArY8A79J0L4FD7vj5hm3eUMua5EpoQ59wa/oovY6TLvRUA==} engines: {node: '>= 18'} dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) destroy: 1.2.0 encodeurl: 2.0.0 escape-html: 1.0.3 @@ -39900,6 +41754,10 @@ packages: transitivePeerDependencies: - supports-color + /server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + dev: false + /set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} @@ -39945,6 +41803,10 @@ packages: /setprototypeof@1.1.0: resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} + /setprototypeof@1.1.1: + resolution: {integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==} + dev: false + /setprototypeof@1.2.0: resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} @@ -39971,7 +41833,6 @@ packages: engines: {node: '>=8'} dependencies: kind-of: 6.0.3 - dev: true /shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} @@ -40059,6 +41920,11 @@ packages: /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + /signal-exit@4.0.2: + resolution: {integrity: sha512-MY2/qGx4enyjprQnFaZsHib3Yadh3IXyV2C321GY0pjGfVBu4un0uDJkwgdxqO+Rdx8JMT8IfJIRwbYVz3Ob3Q==} + engines: {node: '>=14'} + dev: false + /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -40136,6 +42002,14 @@ packages: is-fullwidth-code-point: 4.0.0 dev: true + /slice-ansi@7.1.0: + resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + is-fullwidth-code-point: 5.0.0 + dev: true + /snake-case@3.0.4: resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} dependencies: @@ -40220,7 +42094,7 @@ packages: dependencies: iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /source-map-resolve@0.5.3: resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==} @@ -40327,7 +42201,7 @@ packages: /spdy-transport@3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -40340,7 +42214,7 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) handle-thing: 2.0.1 http-deceiver: 1.2.7 select-hose: 2.0.0 @@ -40408,6 +42282,10 @@ packages: /stackframe@1.3.4: resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + /stat-mode@0.3.0: + resolution: {integrity: sha512-QjMLR0A3WwFY2aZdV0okfFEJB5TRjkggXZjxP3A1RsWsNHNu3YPv8btmtc6iCFZ0Rul3FE93OYogvhOUClU+ng==} + dev: false + /state-toggle@1.0.3: resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==} dev: true @@ -40451,11 +42329,11 @@ packages: dependencies: '@rsbuild/core': 1.1.12 '@rslib/core': 0.2.0(typescript@5.5.2) - storybook-builder-rsbuild: 0.1.5(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(storybook@8.4.2)(typescript@5.5.2) + storybook-builder-rsbuild: 0.1.5(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(storybook@8.4.2)(typescript@5.5.2)(webpack-cli@5.1.4) typescript: 5.5.2 dev: true - /storybook-builder-rsbuild@0.1.5(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(storybook@8.4.2)(typescript@5.5.2): + /storybook-builder-rsbuild@0.1.5(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(storybook@8.4.2)(typescript@5.5.2)(webpack-cli@5.1.4): resolution: {integrity: sha512-g8/pVX+2YixHpWt/Q8dQWtkuKpWKxm1i9h+ihTFPO5LQWc3HvlF6PAXccPvedicLizGR2xTaI/RcJkE+2bYXqA==} peerDependencies: '@rsbuild/core': ^1.0.1 @@ -40466,7 +42344,7 @@ packages: optional: true dependencies: '@rsbuild/core': 1.1.12 - '@rsbuild/plugin-type-check': 1.0.1(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(typescript@5.5.2) + '@rsbuild/plugin-type-check': 1.0.1(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(typescript@5.5.2)(webpack-cli@5.1.4) '@storybook/addon-docs': 8.3.5(storybook@8.4.2) '@storybook/core-webpack': 8.3.5(storybook@8.4.2) browser-assert: 1.2.1 @@ -40494,7 +42372,7 @@ packages: - webpack-sources dev: true - /storybook-react-rsbuild@0.1.5(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(rollup@4.24.0)(storybook@8.4.2)(typescript@5.5.2)(webpack@5.93.0): + /storybook-react-rsbuild@0.1.5(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(react-dom@18.3.1)(react@18.3.1)(rollup@4.24.0)(storybook@8.4.2)(typescript@5.5.2)(webpack-cli@5.1.4)(webpack@5.93.0): resolution: {integrity: sha512-Cy7Ms5COLR1FTelGRxS5pE9LVlDSvaJeBsTH2MVi/29ZK8UEE0VH+Mnve2MboB93GbC3fhZFtIcNSF2dy9pjTw==} engines: {node: '>=18.0.0'} peerDependencies: @@ -40519,7 +42397,7 @@ packages: react-dom: 18.3.1(react@18.3.1) resolve: 1.22.8 storybook: 8.4.2(prettier@3.3.3) - storybook-builder-rsbuild: 0.1.5(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(storybook@8.4.2)(typescript@5.5.2) + storybook-builder-rsbuild: 0.1.5(@rsbuild/core@1.1.12)(@swc/core@1.7.26)(esbuild@0.18.20)(storybook@8.4.2)(typescript@5.5.2)(webpack-cli@5.1.4) tsconfig-paths: 4.2.0 typescript: 5.5.2 transitivePeerDependencies: @@ -40605,12 +42483,26 @@ packages: /stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + /stream-to-array@2.3.0: + resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + dependencies: + any-promise: 1.3.0 + dev: false + + /stream-to-promise@2.2.0: + resolution: {integrity: sha512-HAGUASw8NT0k8JvIVutB2Y/9iBk7gpgEyAudXwNJmZERdMITGdajOa4VJfD/kNiA3TppQpTP4J+CtcHwdzKBAw==} + dependencies: + any-promise: 1.3.0 + end-of-stream: 1.1.0 + stream-to-array: 2.3.0 + dev: false + /streamroller@3.1.5: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} engines: {node: '>=8.0'} dependencies: date-format: 4.0.14 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) fs-extra: 8.1.0 transitivePeerDependencies: - supports-color @@ -40666,6 +42558,15 @@ packages: emoji-regex: 9.2.2 strip-ansi: 7.1.0 + /string-width@7.2.0: + resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.4.0 + get-east-asian-width: 1.3.0 + strip-ansi: 7.1.0 + dev: true + /string.prototype.includes@2.0.1: resolution: {integrity: sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==} engines: {node: '>= 0.4'} @@ -40853,7 +42754,7 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true /style-loader@3.3.4(webpack@5.93.0): @@ -40862,7 +42763,7 @@ packages: peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /style-to-object@0.3.0: resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==} @@ -40900,26 +42801,46 @@ packages: transitivePeerDependencies: - '@babel/core' - /styled-components@6.1.13(react-dom@18.3.1)(react@18.3.1): - resolution: {integrity: sha512-M0+N2xSnAtwcVAQeFEsGWFFxXDftHUD7XrKla06QbpUMmbmtFBMMTcKWvFXtWxuD5qQkB8iU5gk6QASlx2ZRMw==} + /styled-components@6.1.8(react-dom@18.3.1)(react@18.3.1): + resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==} engines: {node: '>= 16'} peerDependencies: react: '>= 16.8.0' react-dom: '>= 16.8.0' dependencies: - '@emotion/is-prop-valid': 1.2.2 - '@emotion/unitless': 0.8.1 - '@types/stylis': 4.2.5 + '@emotion/is-prop-valid': 1.2.1 + '@emotion/unitless': 0.8.0 + '@types/stylis': 4.2.0 css-to-react-native: 3.2.0 - csstype: 3.1.3 - postcss: 8.4.38 + csstype: 3.1.2 + postcss: 8.4.31 react: 18.3.1 react-dom: 18.3.1(react@18.3.1) shallowequal: 1.1.0 - stylis: 4.3.2 - tslib: 2.6.2 + stylis: 4.3.1 + tslib: 2.5.0 dev: true + /styled-components@6.1.8(react-dom@19.0.0-rc-cd22717c-20241013)(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-PQ6Dn+QxlWyEGCKDS71NGsXoVLKfE1c3vApkvDYS5KAK+V8fNWGhbSUEo9Gg2iaID2tjLXegEW3bZDUGpofRWw==} + engines: {node: '>= 16'} + peerDependencies: + react: '>= 16.8.0' + react-dom: '>= 16.8.0' + dependencies: + '@emotion/is-prop-valid': 1.2.1 + '@emotion/unitless': 0.8.0 + '@types/stylis': 4.2.0 + css-to-react-native: 3.2.0 + csstype: 3.1.2 + postcss: 8.4.31 + react: 19.0.0-rc-cd22717c-20241013 + react-dom: 19.0.0-rc-cd22717c-20241013(react@19.0.0-rc-cd22717c-20241013) + shallowequal: 1.1.0 + stylis: 4.3.1 + tslib: 2.5.0 + dev: false + /styled-jsx@5.1.1(@babel/core@7.25.2)(react@18.3.1): resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} engines: {node: '>= 12.0.0'} @@ -40955,6 +42876,24 @@ packages: react: 18.3.1 dev: false + /styled-jsx@5.1.6(@babel/core@7.25.2)(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + dependencies: + '@babel/core': 7.25.2 + client-only: 0.0.1 + react: 19.0.0-rc-cd22717c-20241013 + dev: false + /styled-jsx@5.1.6(@babel/core@7.25.7)(react@18.3.1): resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -40995,23 +42934,22 @@ packages: postcss-selector-parser: 6.1.2 dev: true - /stylehacks@6.1.1(postcss@8.4.47): + /stylehacks@6.1.1(postcss@8.4.38): resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} engines: {node: ^14 || ^16 || >=18.0} peerDependencies: postcss: ^8.4.31 dependencies: browserslist: 4.24.0 - postcss: 8.4.47 + postcss: 8.4.38 postcss-selector-parser: 6.1.2 /stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} dev: false - /stylis@4.3.2: - resolution: {integrity: sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==} - dev: true + /stylis@4.3.1: + resolution: {integrity: sha512-EQepAV+wMsIaGVGX1RECzgrcqRRU/0sYOHkeLsZ3fzHaHXZy4DaOOX0vOlGQdlsjkh3mFHAIlVimpwAs4dslyQ==} /stylis@4.3.4: resolution: {integrity: sha512-osIBl6BGUmSfDkyH2mB7EFvCJntXDrLhKjHTRj/rK6xLH0yuPrHULDRQzKokSOD4VoorhtKpfcfW1GAntu8now==} @@ -41026,7 +42964,7 @@ packages: fast-glob: 3.3.2 normalize-path: 3.0.0 stylus: 0.64.0 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /stylus@0.64.0: resolution: {integrity: sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==} @@ -41034,7 +42972,7 @@ packages: hasBin: true dependencies: '@adobe/css-tools': 4.3.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) glob: 10.4.5 sax: 1.4.1 source-map: 0.7.4 @@ -41101,7 +43039,6 @@ packages: /supports-color@9.3.1: resolution: {integrity: sha512-knBY82pjmnIzK3NifMo3RxEIRD9E0kIzV4BKcyTZ9+9kWgLMxd4PrsTSMoFQUabgRBbF8KOLRDCyKgNV+iK44Q==} engines: {node: '>=12'} - dev: true /supports-hyperlinks@2.3.0: resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} @@ -41165,7 +43102,7 @@ packages: dependencies: '@swc/core': 1.7.26(@swc/helpers@0.5.13) '@swc/counter': 0.1.3 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /symbol-tree@3.2.4: @@ -41181,7 +43118,7 @@ packages: engines: {node: ^14.18.0 || >=16.0.0} dependencies: '@pkgr/core': 0.1.1 - tslib: 2.6.3 + tslib: 2.8.1 dev: true /table-layout@1.0.2: @@ -41278,6 +43215,19 @@ packages: inherits: 2.0.4 readable-stream: 3.6.2 + /tar@4.4.18: + resolution: {integrity: sha512-ZuOtqqmkV9RE1+4odd+MhBpibmCxNP6PJhH/h2OqNuotTX7/XHPZQJv2pKvWMplFH9SIZZhitehh6vBH6LO8Pg==} + engines: {node: '>=4.5'} + dependencies: + chownr: 1.1.4 + fs-minipass: 1.2.7 + minipass: 2.9.0 + minizlib: 1.3.3 + mkdirp: 0.5.6 + safe-buffer: 5.2.1 + yallist: 3.1.1 + dev: false + /tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} @@ -41288,7 +43238,6 @@ packages: minizlib: 2.1.2 mkdirp: 1.0.4 yallist: 4.0.0 - dev: true /telejson@7.2.0: resolution: {integrity: sha512-1QTEcJkJEhc8OnStBx/ILRu5J2p0GjvWsBx56bmZRqnrkdBMUe+nX92jxV+p3dB4CP6PZCdJMQJwCggkNBMzkQ==} @@ -41370,7 +43319,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) dev: true /terser-webpack-plugin@5.3.10(@swc/core@1.7.26)(esbuild@0.18.20)(webpack@5.93.0): @@ -41396,7 +43345,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /terser-webpack-plugin@5.3.10(@swc/core@1.7.26)(esbuild@0.18.20)(webpack@5.95.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} @@ -41421,7 +43370,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true /terser-webpack-plugin@5.3.10(@swc/core@1.7.26)(esbuild@0.24.0)(webpack@5.75.0): @@ -41447,7 +43396,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.75.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.75.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /terser-webpack-plugin@5.3.10(@swc/core@1.7.26)(esbuild@0.24.0)(webpack@5.93.0): @@ -41473,7 +43422,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) /terser-webpack-plugin@5.3.10(@swc/core@1.7.26)(esbuild@0.24.0)(webpack@5.95.0): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} @@ -41498,7 +43447,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /terser-webpack-plugin@5.3.9(@swc/core@1.7.26)(esbuild@0.18.20)(webpack@5.95.0): @@ -41524,7 +43473,7 @@ packages: schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.34.1 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true /terser@5.34.1: @@ -41600,6 +43549,13 @@ packages: /thunky@1.1.0: resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} + /time-span@4.0.0: + resolution: {integrity: sha512-MyqZCTGLDZ77u4k+jqg4UlrzPTPZ49NDlaekU6uuFaJLzPIN1woaRXCbGeqOfxwc3Y37ZROGAJ614Rdv7Olt+g==} + engines: {node: '>=10'} + dependencies: + convert-hrtime: 3.0.0 + dev: false + /time-span@5.1.0: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} engines: {node: '>=12'} @@ -41717,6 +43673,11 @@ packages: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} dev: false + /toidentifier@1.0.0: + resolution: {integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==} + engines: {node: '>=0.6'} + dev: false + /toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -41821,6 +43782,15 @@ packages: /trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + /ts-api-utils@1.3.0(typescript@5.4.5): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.4.5 + dev: true + /ts-api-utils@1.3.0(typescript@5.5.2): resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} engines: {node: '>=16'} @@ -41929,7 +43899,7 @@ packages: micromatch: 4.0.8 semver: 7.6.3 typescript: 5.0.4 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true /ts-loader@9.4.4(typescript@5.5.2)(webpack@5.95.0): @@ -41944,7 +43914,7 @@ packages: micromatch: 4.0.8 semver: 7.6.3 typescript: 5.5.2 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) dev: true /ts-loader@9.5.1(typescript@5.5.2)(webpack@5.93.0): @@ -41960,7 +43930,46 @@ packages: semver: 7.6.3 source-map: 0.7.4 typescript: 5.5.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) + + /ts-morph@12.0.0: + resolution: {integrity: sha512-VHC8XgU2fFW7yO1f/b3mxKDje1vmyzFXHWzOYmKEkCEwcLjDtbdLgBQviqj4ZwP4MJkQtRo6Ha2I29lq/B+VxA==} + dependencies: + '@ts-morph/common': 0.11.1 + code-block-writer: 10.1.1 + dev: false + + /ts-node@10.9.1(@swc/core@1.7.26)(@types/node@14.18.33)(typescript@4.9.5): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@swc/core': 1.7.26(@swc/helpers@0.5.13) + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 14.18.33 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: false /ts-node@10.9.1(@swc/core@1.7.26)(@types/node@18.16.9)(typescript@5.4.5): resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} @@ -41983,7 +43992,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 18.16.9 - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -42015,7 +44024,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 18.16.9 - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -42047,7 +44056,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.12.14 - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -42079,7 +44088,7 @@ packages: '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 '@types/node': 20.12.14 - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk: 8.3.4 arg: 4.1.3 create-require: 1.1.1 @@ -42102,6 +44111,10 @@ packages: typescript: 5.5.2 dev: true + /ts-toolbelt@6.15.5: + resolution: {integrity: sha512-FZIXf1ksVyLcfr7M317jbB67XFJhOO1YqdTcuGaq9q5jLUoTikukZ+98TPjKiP2jC5CgmYdWWYs0s2nLSU0/1A==} + dev: false + /tsconfck@2.1.2(typescript@5.5.2): resolution: {integrity: sha512-ghqN1b0puy3MhhviwO2kGF8SeMDNhEbnKxjK7h6+fvY9JAxqvXi8y5NAHSQv687OVboS2uZIByzGd45/YxrRHg==} engines: {node: ^14.13.1 || ^16 || >=18} @@ -42153,9 +44166,8 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: true + /tslib@2.5.0: + resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} /tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} @@ -42167,7 +44179,7 @@ packages: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} - /tsup@7.2.0(@swc/core@1.7.26)(postcss@8.4.47)(typescript@5.5.2): + /tsup@7.2.0(@swc/core@1.7.26)(postcss@8.4.38)(typescript@5.5.2): resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} engines: {node: '>=16.14'} hasBin: true @@ -42187,13 +44199,13 @@ packages: bundle-require: 4.2.1(esbuild@0.18.20) cac: 6.7.14 chokidar: 3.6.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) esbuild: 0.18.20 execa: 5.1.1 globby: 11.1.0 joycon: 3.1.1 - postcss: 8.4.47 - postcss-load-config: 4.0.2(postcss@8.4.47) + postcss: 8.4.38 + postcss-load-config: 4.0.2(postcss@8.4.38) resolve-from: 5.0.0 rollup: 3.29.5 source-map: 0.8.0-beta.0 @@ -42205,7 +44217,7 @@ packages: - ts-node dev: false - /tsup@8.3.0(@swc/core@1.7.26)(postcss@8.4.47)(typescript@5.5.2): + /tsup@8.3.0(@swc/core@1.7.26)(postcss@8.4.38)(typescript@5.5.2): resolution: {integrity: sha512-ALscEeyS03IomcuNdFdc0YWGVIkwH1Ws7nfTbAPuoILvEV2hpGQAY72LIOjglGo4ShWpZfpBqP/jpQVCzqYQag==} engines: {node: '>=18'} hasBin: true @@ -42229,13 +44241,13 @@ packages: cac: 6.7.14 chokidar: 3.6.0 consola: 3.2.3 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) esbuild: 0.23.0 execa: 5.1.1 joycon: 3.1.1 picocolors: 1.1.0 - postcss: 8.4.47 - postcss-load-config: 6.0.1(postcss@8.4.47) + postcss: 8.4.38 + postcss-load-config: 6.0.1(postcss@8.4.38) resolve-from: 5.0.0 rollup: 4.23.0 source-map: 0.8.0-beta.0 @@ -42303,6 +44315,7 @@ packages: /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + dev: true /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} @@ -42409,11 +44422,22 @@ packages: typescript: 5.5.2 dev: false + /types-react-dom@19.0.0-rc.1: + resolution: {integrity: sha512-VSLZJl8VXCD0fAWp7DUTFUDCcZ8DVXOQmjhJMD03odgeFmu14ZQJHCXeETm3BEAhJqfgJaFkLnGkQv88sRx0fQ==} + dependencies: + '@types/react': 18.3.11 + dev: true + + /types-react@19.0.0-rc.1: + resolution: {integrity: sha512-RshndUfqTW6K3STLPis8BtAYCGOkMbtvYsi90gmVNDZBXUyUc5juf2PE9LfS/JmOlUIRO8cWTS/1MTnmhjDqyQ==} + dependencies: + csstype: 3.1.3 + dev: true + /typescript@4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} engines: {node: '>=4.2.0'} hasBin: true - dev: true /typescript@5.0.4: resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} @@ -42458,6 +44482,10 @@ packages: requiresBuild: true optional: true + /uid-promise@1.0.0: + resolution: {integrity: sha512-R8375j0qwXyIu/7R0tjdF06/sElHqbmdmWC9M2qQHpEVbvE4I5+38KJI7LUUmQMp7NVq4tKHiBMkT0NFM453Ig==} + dev: false + /unbox-primitive@1.0.2: resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} dependencies: @@ -42474,6 +44502,13 @@ packages: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} dev: true + /undici@5.26.5: + resolution: {integrity: sha512-cSb4bPFd5qgR7qr2jYAi0hlX9n5YKK2ONKkLFkxl+v/9BvC0sOpZjBHDBSXc5lWAf5ty9oZdRXytBIHzgUcerw==} + engines: {node: '>=14.0'} + dependencies: + '@fastify/busboy': 2.1.1 + dev: false + /undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} @@ -42822,7 +44857,7 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /url-parse@1.5.10: @@ -42853,6 +44888,23 @@ packages: react: 18.3.1 tslib: 2.8.1 + /use-count-up@3.0.1(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-jlVsXJYje6jh+xwQaCEYrwHoB+nRyillNEmr21bhe9kw7tpRzyrSq9jQs9UOlo+8hCFkuOmjUihL3IjEK/piVg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + use-elapsed-time: 3.0.2(react@19.0.0-rc-cd22717c-20241013) + dev: false + + /use-elapsed-time@3.0.2(react@19.0.0-rc-cd22717c-20241013): + resolution: {integrity: sha512-2EY9lJ5DWbAvT8wWiEp6Ztnl46DjXz2j78uhWbXaz/bg3OfpbgVucCAlcN8Bih6hTJfFTdVYX9L6ySMn5py/wQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 19.0.0-rc-cd22717c-20241013 + dev: false + /use-resize-observer@9.1.0(react-dom@18.3.1)(react@18.3.1): resolution: {integrity: sha512-R25VqO9Wb3asSD4eqtcxk8sJalvIOYBqS8MNZlpDSQ4l4xMQxC/J7Id9HoTqPq8FwULIn0PVW+OAqF2dyYbjow==} peerDependencies: @@ -42911,6 +44963,12 @@ packages: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} + /uuid@3.3.2: + resolution: {integrity: sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: false + /uuid@3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -42979,6 +45037,30 @@ packages: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} + /vercel@34.0.0(@swc/core@1.7.26)(encoding@0.1.13): + resolution: {integrity: sha512-0Gewf/gB/UDnkGA/wyAzf3wxXuDqCvPFKFkAcByV3PuoCF5j71MqjV3GpFC0rQREF7CZZflFMhoaQO70a9x/fA==} + engines: {node: '>= 16'} + hasBin: true + dependencies: + '@vercel/build-utils': 7.11.0 + '@vercel/fun': 1.1.0(encoding@0.1.13) + '@vercel/go': 3.1.1 + '@vercel/hydrogen': 1.0.2 + '@vercel/next': 4.2.0(encoding@0.1.13) + '@vercel/node': 3.0.26(@swc/core@1.7.26)(encoding@0.1.13) + '@vercel/python': 4.1.1 + '@vercel/redwood': 2.0.8(encoding@0.1.13) + '@vercel/remix-builder': 2.1.5(encoding@0.1.13) + '@vercel/ruby': 2.0.5 + '@vercel/static-build': 2.4.6 + chokidar: 3.3.1 + transitivePeerDependencies: + - '@swc/core' + - '@swc/wasm' + - encoding + - supports-color + dev: false + /verdaccio-audit@12.0.0-next-7.10(encoding@0.1.13): resolution: {integrity: sha512-inL8J7c4y9BpFIkqLsw9yrdh8/CBKWbBrREiQHQ9ZnD7jLkHxTWsWW8jt4aUt9t2azc6eO5rUIqdo1W6VsYKeA==} engines: {node: '>=12'} @@ -43031,7 +45113,7 @@ packages: compression: 1.7.4 cookies: 0.9.1 cors: 2.8.5 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) envinfo: 7.11.0 express: 4.18.2 express-rate-limit: 5.5.1 @@ -43146,7 +45228,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) pathe: 1.1.2 picocolors: 1.1.1 vite: 5.2.14(@types/node@20.12.14)(less@4.2.0)(stylus@0.64.0) @@ -43167,7 +45249,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) pathe: 1.1.2 picocolors: 1.1.1 vite: 5.2.14(@types/node@18.16.9)(less@4.2.0)(stylus@0.64.0) @@ -43197,7 +45279,7 @@ packages: '@volar/typescript': 2.4.5 '@vue/language-core': 2.1.6(typescript@5.5.2) compare-versions: 6.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) kolorist: 1.8.0 local-pkg: 0.5.0 magic-string: 0.30.12 @@ -43224,7 +45306,7 @@ packages: '@volar/typescript': 2.4.5 '@vue/language-core': 2.1.6(typescript@5.5.2) compare-versions: 6.1.1 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) kolorist: 1.8.0 local-pkg: 0.5.0 magic-string: 0.30.12 @@ -43244,7 +45326,7 @@ packages: vite: optional: true dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) globrex: 0.1.2 tsconfck: 2.1.2(typescript@5.5.2) vite: 5.2.14(@types/node@18.16.9)(less@4.2.0)(stylus@0.64.0) @@ -43284,7 +45366,7 @@ packages: '@types/node': 16.11.68 esbuild: 0.20.2 less: 4.2.0 - postcss: 8.4.47 + postcss: 8.4.38 rollup: 4.24.0 stylus: 0.64.0 optionalDependencies: @@ -43360,7 +45442,7 @@ packages: '@types/node': 20.12.14 esbuild: 0.20.2 less: 4.2.0 - postcss: 8.4.47 + postcss: 8.4.38 rollup: 4.24.0 stylus: 0.64.0 optionalDependencies: @@ -43414,7 +45496,7 @@ packages: acorn-walk: 8.3.4 cac: 6.7.14 chai: 4.5.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.11 @@ -43471,7 +45553,7 @@ packages: '@vitest/utils': 1.6.0 acorn-walk: 8.3.4 chai: 4.5.0 - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) execa: 8.0.1 local-pkg: 0.5.0 magic-string: 0.30.11 @@ -43520,7 +45602,7 @@ packages: peerDependencies: eslint: '>=6.0.0' dependencies: - debug: 4.3.7(supports-color@5.5.0) + debug: 4.3.7(supports-color@9.3.1) eslint: 8.57.1 eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -43548,7 +45630,7 @@ packages: hash-sum: 2.0.0 vue: 3.5.10(typescript@5.5.2) watchpack: 2.4.2 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /vue-router@4.4.5(vue@3.5.10): @@ -43680,6 +45762,10 @@ packages: engines: {node: '>= 14'} dev: false + /web-vitals@0.2.4: + resolution: {integrity: sha512-6BjspCO9VriYy12z356nL6JBS0GYeEcA457YyRzD+dD6XYCQ75NKhcOHUMHentOE7OcVCIXXDvOm0jKFfQG2Gg==} + dev: false + /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -43692,6 +45778,38 @@ packages: engines: {node: '>=12'} dev: true + /webpack-cli@5.1.4(webpack@5.93.0): + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.93.0) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.93.0) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.93.0) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.3 + envinfo: 7.14.0 + fastest-levenshtein: 1.0.16 + import-local: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack-merge: 5.10.0 + /webpack-dev-middleware@6.1.3(webpack@5.93.0): resolution: {integrity: sha512-A4ChP0Qj8oGociTs6UdlRUGANIGrCDL3y+pmQMc+dSsraXHCatFpmMey4mYELA+juqwUqwQsUgJJISXl1KWmiw==} engines: {node: '>= 14.15.0'} @@ -43706,7 +45824,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) dev: true /webpack-dev-middleware@7.4.2(webpack@5.93.0): @@ -43724,9 +45842,9 @@ packages: on-finished: 2.4.1 range-parser: 1.2.1 schema-utils: 4.2.0 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) - /webpack-dev-server@5.0.4(webpack@5.93.0): + /webpack-dev-server@5.0.4(webpack-cli@5.1.4)(webpack@5.93.0): resolution: {integrity: sha512-dljXhUgx3HqKP2d8J/fUMvhxGhzjeNVarDLcbO/EWMSgRizDkxHQDZQaLFL5VJY9tRBj2Gz+rvCEYYvhbqPHNA==} engines: {node: '>= 18.12.0'} hasBin: true @@ -43767,7 +45885,8 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.93.0) webpack-dev-middleware: 7.4.2(webpack@5.93.0) ws: 8.18.0 transitivePeerDependencies: @@ -43777,7 +45896,7 @@ packages: - utf-8-validate dev: true - /webpack-dev-server@5.1.0(webpack@5.93.0): + /webpack-dev-server@5.1.0(webpack-cli@5.1.4)(webpack@5.93.0): resolution: {integrity: sha512-aQpaN81X6tXie1FoOB7xlMfCsN19pSvRAeYUHOdFWOlhpQ/LlbfTqYwwmEDFV0h8GGuqmCmKmT+pxcUV/Nt2gQ==} engines: {node: '>= 18.12.0'} hasBin: true @@ -43816,7 +45935,8 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.93.0) webpack-dev-middleware: 7.4.2(webpack@5.93.0) ws: 8.18.0 transitivePeerDependencies: @@ -43840,7 +45960,6 @@ packages: clone-deep: 4.0.1 flat: 5.0.2 wildcard: 2.0.1 - dev: true /webpack-node-externals@3.0.0: resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} @@ -43862,7 +45981,7 @@ packages: dependencies: html-webpack-plugin: 5.5.3(webpack@5.95.0) typed-assert: 1.0.9 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) dev: true /webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.2)(webpack@5.93.0): @@ -43877,7 +45996,7 @@ packages: dependencies: html-webpack-plugin: 5.6.2(@rspack/core@1.0.8)(webpack@5.93.0) typed-assert: 1.0.9 - webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.24.0) + webpack: 5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4) /webpack-subresource-integrity@5.1.0(html-webpack-plugin@5.6.3)(webpack@5.95.0): resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} @@ -43891,13 +46010,13 @@ packages: dependencies: html-webpack-plugin: 5.6.3(@rspack/core@1.0.8)(webpack@5.95.0) typed-assert: 1.0.9 - webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19) + webpack: 5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4) dev: true /webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} - /webpack@5.75.0(@swc/core@1.7.26)(esbuild@0.24.0): + /webpack@5.75.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4): resolution: {integrity: sha512-piaIaoVJlqMsPtX/+3KTTO6jfvrSYgauFVdt8cr9LTHKmcq/AMd4mhzsiP7ZF/PGRNPGA8336jldh9l2Kt2ogQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -43930,6 +46049,7 @@ packages: tapable: 2.2.1 terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(esbuild@0.24.0)(webpack@5.75.0) watchpack: 2.4.2 + webpack-cli: 5.1.4(webpack@5.93.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -43937,7 +46057,7 @@ packages: - uglify-js dev: true - /webpack@5.93.0(@swc/core@1.7.26)(esbuild@0.18.20): + /webpack@5.93.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4): resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} engines: {node: '>=10.13.0'} hasBin: true @@ -43952,8 +46072,8 @@ packages: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) browserslist: 4.24.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.17.1 @@ -43970,13 +46090,14 @@ packages: tapable: 2.2.1 terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(esbuild@0.18.20)(webpack@5.93.0) watchpack: 2.4.2 + webpack-cli: 5.1.4(webpack@5.93.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - /webpack@5.93.0(@swc/core@1.7.26)(esbuild@0.24.0): + /webpack@5.93.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4): resolution: {integrity: sha512-Y0m5oEY1LRuwly578VqluorkXbvXKh7U3rLoQCEO04M97ScRr44afGVkI0FQFsXzysk5OgFAxjZAb9rsGQVihA==} engines: {node: '>=10.13.0'} hasBin: true @@ -43991,8 +46112,8 @@ packages: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) browserslist: 4.24.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.17.1 @@ -44009,13 +46130,14 @@ packages: tapable: 2.2.1 terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(esbuild@0.24.0)(webpack@5.93.0) watchpack: 2.4.2 + webpack-cli: 5.1.4(webpack@5.93.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' - esbuild - uglify-js - /webpack@5.95.0(@swc/core@1.7.26)(esbuild@0.17.19): + /webpack@5.95.0(@swc/core@1.7.26)(esbuild@0.17.19)(webpack-cli@5.1.4): resolution: {integrity: sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==} engines: {node: '>=10.13.0'} hasBin: true @@ -44047,6 +46169,7 @@ packages: tapable: 2.2.1 terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(esbuild@0.17.19)(webpack@5.95.0) watchpack: 2.4.2 + webpack-cli: 5.1.4(webpack@5.93.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -44054,7 +46177,7 @@ packages: - uglify-js dev: true - /webpack@5.95.0(@swc/core@1.7.26)(esbuild@0.18.20): + /webpack@5.95.0(@swc/core@1.7.26)(esbuild@0.18.20)(webpack-cli@5.1.4): resolution: {integrity: sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==} engines: {node: '>=10.13.0'} hasBin: true @@ -44086,6 +46209,7 @@ packages: tapable: 2.2.1 terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(esbuild@0.18.20)(webpack@5.95.0) watchpack: 2.4.2 + webpack-cli: 5.1.4(webpack@5.93.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -44093,7 +46217,7 @@ packages: - uglify-js dev: true - /webpack@5.95.0(@swc/core@1.7.26)(esbuild@0.24.0): + /webpack@5.95.0(@swc/core@1.7.26)(esbuild@0.24.0)(webpack-cli@5.1.4): resolution: {integrity: sha512-2t3XstrKULz41MNMBF+cJ97TyHdyQ8HCt//pqErqDvNjU9YQBnZxIHa11VXsi7F3mb5/aO2tuDxdeTPdU7xu9Q==} engines: {node: '>=10.13.0'} hasBin: true @@ -44125,6 +46249,7 @@ packages: tapable: 2.2.1 terser-webpack-plugin: 5.3.10(@swc/core@1.7.26)(esbuild@0.24.0)(webpack@5.95.0) watchpack: 2.4.2 + webpack-cli: 5.1.4(webpack@5.93.0) webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -44278,7 +46403,6 @@ packages: /wildcard@2.0.1: resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - dev: true /with@7.0.2: resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} @@ -44330,6 +46454,15 @@ packages: string-width: 5.1.2 strip-ansi: 7.1.0 + /wrap-ansi@9.0.0: + resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} + engines: {node: '>=18'} + dependencies: + ansi-styles: 6.2.1 + string-width: 7.2.0 + strip-ansi: 7.1.0 + dev: true + /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -44388,6 +46521,20 @@ packages: utf-8-validate: optional: true + /xdg-app-paths@5.1.0: + resolution: {integrity: sha512-RAQ3WkPf4KTU1A8RtFx3gWywzVKe00tfOPFfl2NDGqbIFENQO4kqAJp7mhQjNj/33W5x5hiWWUdyfPq/5SU3QA==} + engines: {node: '>=6'} + dependencies: + xdg-portable: 7.3.0 + dev: false + + /xdg-portable@7.3.0: + resolution: {integrity: sha512-sqMMuL1rc0FmMBOzCpd0yuy9trqF2yTTVe+E9ogwCSWQCdDEtQUwrZPT6AxqtsFGRNxycgncbP/xmOOSPw5ZUw==} + engines: {node: '>= 6.0'} + dependencies: + os-paths: 4.4.0 + dev: false + /xgplayer-subtitles@3.0.20(core-js@3.36.1): resolution: {integrity: sha512-I1bjsIY+aKOrhYQspLdneOkYg+Vf4cJVGPnDSFnNebnxXl9Mhz5SEpWGzYizMYxL9UvsQ9pgjeEY0o4hkwM+kQ==} peerDependencies: @@ -44460,16 +46607,21 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + /yaml@2.3.4: + resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} + engines: {node: '>= 14'} + dev: true + /yaml@2.5.1: resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} engines: {node: '>= 14'} hasBin: true + dev: true /yaml@2.6.0: resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} engines: {node: '>= 14'} hasBin: true - dev: true /yargs-parser@20.2.9: resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} @@ -44505,12 +46657,26 @@ packages: y18n: 5.0.8 yargs-parser: 21.1.1 + /yauzl-clone@1.0.4: + resolution: {integrity: sha512-igM2RRCf3k8TvZoxR2oguuw4z1xasOnA31joCqHIyLkeWrvAc2Jgay5ISQ2ZplinkoGaJ6orCz56Ey456c5ESA==} + engines: {node: '>=6'} + dependencies: + events-intercept: 2.0.0 + dev: false + + /yauzl-promise@2.1.3: + resolution: {integrity: sha512-A1pf6fzh6eYkK0L4Qp7g9jzJSDrM6nN0bOn5T0IbY4Yo3w+YkWlHFkJP7mzknMXjqusHFHlKsK2N+4OLsK2MRA==} + engines: {node: '>=6'} + dependencies: + yauzl: 2.10.0 + yauzl-clone: 1.0.4 + dev: false + /yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} dependencies: buffer-crc32: 0.2.13 fd-slicer: 1.1.0 - dev: true /ylru@1.4.0: resolution: {integrity: sha512-2OQsPNEmBCvXuFlIni/a+Rn+R2pHW9INm0BxXJ4hVDA8TirqMj+J/Rp9ItLatT/5pZqWwefVrTQcHpixsxnVlA==}