├── finished ├── .eslintrc.json ├── declarative-routing.config.json ├── src │ ├── app │ │ ├── favicon.ico │ │ ├── page.info.ts │ │ ├── pokemon │ │ │ └── [pokemonId] │ │ │ │ ├── page.info.ts │ │ │ │ └── page.tsx │ │ ├── search │ │ │ ├── page.info.ts │ │ │ ├── page.tsx │ │ │ └── SearchList.tsx │ │ ├── api │ │ │ └── pokemon │ │ │ │ ├── [pokemonId] │ │ │ │ ├── route.info.ts │ │ │ │ └── route.ts │ │ │ │ ├── route.info.ts │ │ │ │ └── route.ts │ │ ├── page.tsx │ │ ├── components │ │ │ ├── PokemonGrid.tsx │ │ │ ├── PokemonCard.tsx │ │ │ ├── SelectableGrid.tsx │ │ │ └── PokemonInfo.tsx │ │ ├── layout.tsx │ │ └── globals.css │ ├── lib │ │ └── utils.ts │ ├── types.ts │ ├── components │ │ └── ui │ │ │ └── input.tsx │ ├── routes │ │ ├── index.ts │ │ └── makeRoute.tsx │ └── pokemon.ts ├── postcss.config.js ├── next.config.mjs ├── revert ├── components.json ├── .gitignore ├── public │ ├── vercel.svg │ └── next.svg ├── tsconfig.json ├── package.json ├── README.md ├── tailwind.config.ts └── DR-README.md ├── starter ├── .eslintrc.json ├── src │ ├── app │ │ ├── favicon.ico │ │ ├── page.tsx │ │ ├── api │ │ │ └── pokemon │ │ │ │ ├── [pokemonId] │ │ │ │ └── route.ts │ │ │ │ └── route.ts │ │ ├── pokemon │ │ │ └── [pokemonId] │ │ │ │ └── page.tsx │ │ ├── components │ │ │ ├── PokemonGrid.tsx │ │ │ ├── PokemonCard.tsx │ │ │ ├── SelectableGrid.tsx │ │ │ └── PokemonInfo.tsx │ │ ├── search │ │ │ ├── page.tsx │ │ │ └── SearchList.tsx │ │ ├── layout.tsx │ │ └── globals.css │ ├── lib │ │ └── utils.ts │ ├── types.ts │ ├── components │ │ └── ui │ │ │ └── input.tsx │ └── pokemon.ts ├── postcss.config.js ├── next.config.mjs ├── revert ├── components.json ├── .gitignore ├── public │ ├── vercel.svg │ └── next.svg ├── tsconfig.json ├── package.json ├── README.md ├── tailwind.config.ts └── pnpm-lock.yaml └── .gitignore /finished/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /starter/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /starter/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jherr/nextjs-declarative-routing/HEAD/starter/src/app/favicon.ico -------------------------------------------------------------------------------- /finished/declarative-routing.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "mode": "nextjs", 3 | "src": "./src/app", 4 | "routes": "./src/routes" 5 | } -------------------------------------------------------------------------------- /finished/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jherr/nextjs-declarative-routing/HEAD/finished/src/app/favicon.ico -------------------------------------------------------------------------------- /finished/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /starter/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | }; 7 | -------------------------------------------------------------------------------- /finished/src/app/page.info.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | export const Route = { 4 | name: "Home", 5 | params: z.object({ 6 | }) 7 | }; 8 | 9 | -------------------------------------------------------------------------------- /finished/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | images: { 4 | domains: ["raw.githubusercontent.com"], 5 | }, 6 | }; 7 | 8 | export default nextConfig; 9 | -------------------------------------------------------------------------------- /finished/revert: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | find . -name "route.info.ts" | xargs rm 3 | find . -name "page.info.ts" | xargs rm 4 | git reset --hard HEAD 5 | rm -fr next-tsr.config.json src/routes/ 6 | rm NEXT-TSR-README.md 7 | -------------------------------------------------------------------------------- /finished/src/app/pokemon/[pokemonId]/page.info.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | export const Route = { 4 | name: "PokemonDetail", 5 | params: z.object({ 6 | pokemonId: z.number(), 7 | }), 8 | }; 9 | -------------------------------------------------------------------------------- /starter/next.config.mjs: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | images: { 4 | domains: ["raw.githubusercontent.com"], 5 | }, 6 | }; 7 | 8 | export default nextConfig; 9 | -------------------------------------------------------------------------------- /starter/revert: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | find . -name "route.info.ts" | xargs rm 3 | find . -name "page.info.ts" | xargs rm 4 | git reset --hard HEAD 5 | rm -fr next-tsr.config.json src/routes/ 6 | rm NEXT-TSR-README.md 7 | -------------------------------------------------------------------------------- /finished/src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /starter/src/lib/utils.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from "clsx" 2 | import { twMerge } from "tailwind-merge" 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)) 6 | } 7 | -------------------------------------------------------------------------------- /finished/src/app/search/page.info.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | export const Route = { 4 | name: "Search", 5 | params: z.object({}), 6 | search: z.object({ 7 | q: z.string().optional(), 8 | }), 9 | }; 10 | -------------------------------------------------------------------------------- /finished/src/app/api/pokemon/[pokemonId]/route.info.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | export const Route = { 4 | name: "ApiPokemonPokemonId", 5 | params: z.object({ 6 | pokemonId: z.string(), 7 | }) 8 | }; 9 | 10 | export const GET = { 11 | result: z.object({}), 12 | }; 13 | -------------------------------------------------------------------------------- /finished/src/types.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | export const PokemonSchema = z.object({ 4 | id: z.number(), 5 | name: z.string(), 6 | species: z.string(), 7 | types: z.string(), 8 | stats: z.string(), 9 | moves: z.string(), 10 | image: z.string(), 11 | }); 12 | 13 | export type Pokemon = z.infer; 14 | -------------------------------------------------------------------------------- /starter/src/types.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | export const PokemonSchema = z.object({ 4 | id: z.number(), 5 | name: z.string(), 6 | species: z.string(), 7 | types: z.string(), 8 | stats: z.string(), 9 | moves: z.string(), 10 | image: z.string(), 11 | }); 12 | 13 | export type Pokemon = z.infer; 14 | -------------------------------------------------------------------------------- /finished/src/app/api/pokemon/route.info.ts: -------------------------------------------------------------------------------- 1 | import { z } from "zod"; 2 | 3 | import { PokemonSchema } from "@/types"; 4 | 5 | export const Route = { 6 | name: "PokemonSearchAPI", 7 | params: z.object({}), 8 | search: z.object({ 9 | q: z.string(), 10 | }), 11 | }; 12 | 13 | export const GET = { 14 | result: z.array(PokemonSchema), 15 | }; 16 | -------------------------------------------------------------------------------- /finished/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | import { getFullPokemon } from "@/pokemon"; 2 | 3 | import { SelectableGrid } from "@/app/components/SelectableGrid"; 4 | 5 | export default async function Home() { 6 | const pokemon = await getFullPokemon(); 7 | 8 | return ( 9 |
10 | 11 |
12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /starter/src/app/page.tsx: -------------------------------------------------------------------------------- 1 | import { getFullPokemon } from "@/pokemon"; 2 | 3 | import { SelectableGrid } from "@/app/components/SelectableGrid"; 4 | 5 | export default async function Home() { 6 | const pokemon = await getFullPokemon(); 7 | 8 | return ( 9 |
10 | 11 |
12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /starter/src/app/api/pokemon/[pokemonId]/route.ts: -------------------------------------------------------------------------------- 1 | import { NextResponse, NextRequest } from "next/server"; 2 | 3 | import { getPokemon } from "@/pokemon"; 4 | 5 | export const dynamic = "force-dynamic"; 6 | 7 | export async function GET( 8 | req: NextRequest, 9 | { params }: { params: { pokemonId: string } } 10 | ) { 11 | return NextResponse.json(await getPokemon(+(params.pokemonId || ""))); 12 | } 13 | -------------------------------------------------------------------------------- /finished/src/app/api/pokemon/[pokemonId]/route.ts: -------------------------------------------------------------------------------- 1 | import { NextResponse, NextRequest } from "next/server"; 2 | 3 | import { getPokemon } from "@/pokemon"; 4 | 5 | export const dynamic = "force-dynamic"; 6 | 7 | export async function GET( 8 | req: NextRequest, 9 | { params }: { params: { pokemonId: string } } 10 | ) { 11 | return NextResponse.json(await getPokemon(+(params.pokemonId || ""))); 12 | } 13 | -------------------------------------------------------------------------------- /finished/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "src/app/globals.css", 9 | "baseColor": "slate", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils" 16 | } 17 | } -------------------------------------------------------------------------------- /starter/components.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://ui.shadcn.com/schema.json", 3 | "style": "default", 4 | "rsc": true, 5 | "tsx": true, 6 | "tailwind": { 7 | "config": "tailwind.config.ts", 8 | "css": "src/app/globals.css", 9 | "baseColor": "slate", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils" 16 | } 17 | } -------------------------------------------------------------------------------- /finished/src/app/api/pokemon/route.ts: -------------------------------------------------------------------------------- 1 | import { NextRequest, NextResponse } from "next/server"; 2 | 3 | import { getFullPokemon } from "@/pokemon"; 4 | 5 | export const dynamic = "force-dynamic"; 6 | 7 | export async function GET(req: NextRequest) { 8 | const url = new URL(req.url); 9 | const q = url.searchParams.get("q") ?? ""; 10 | const limit = url.searchParams.get("limit") ?? 10; 11 | return NextResponse.json(await getFullPokemon(+limit, q)); 12 | } 13 | -------------------------------------------------------------------------------- /starter/src/app/api/pokemon/route.ts: -------------------------------------------------------------------------------- 1 | import { NextRequest, NextResponse } from "next/server"; 2 | 3 | import { getFullPokemon } from "@/pokemon"; 4 | 5 | export const dynamic = "force-dynamic"; 6 | 7 | export async function GET(req: NextRequest) { 8 | const url = new URL(req.url); 9 | const q = url.searchParams.get("q") ?? ""; 10 | const limit = url.searchParams.get("limit") ?? 10; 11 | return NextResponse.json(await getFullPokemon(+limit, q)); 12 | } 13 | -------------------------------------------------------------------------------- /finished/src/app/pokemon/[pokemonId]/page.tsx: -------------------------------------------------------------------------------- 1 | import { PokemonInfo } from "@/app/components/PokemonInfo"; 2 | 3 | import { getPokemon } from "@/pokemon"; 4 | 5 | export default async function PokemonDetailPage({ 6 | params: { pokemonId }, 7 | }: { 8 | params: { pokemonId: string }; 9 | }) { 10 | const pokemon = await getPokemon(+pokemonId); 11 | return ( 12 |
13 | 14 |
15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /starter/src/app/pokemon/[pokemonId]/page.tsx: -------------------------------------------------------------------------------- 1 | import { PokemonInfo } from "@/app/components/PokemonInfo"; 2 | 3 | import { getPokemon } from "@/pokemon"; 4 | 5 | export default async function PokemonDetailPage({ 6 | params: { pokemonId }, 7 | }: { 8 | params: { pokemonId: string }; 9 | }) { 10 | const pokemon = await getPokemon(+pokemonId); 11 | return ( 12 |
13 | 14 |
15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /starter/src/app/components/PokemonGrid.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | 3 | import { PokemonCard } from "./PokemonCard"; 4 | import { Pokemon } from "@/types"; 5 | 6 | export function PokemonGrid({ pokemon }: { pokemon: Pokemon[] }) { 7 | return ( 8 |
9 | {pokemon.map((p) => ( 10 | 11 | 12 | 13 | ))} 14 |
15 | ); 16 | } 17 | -------------------------------------------------------------------------------- /finished/src/app/search/page.tsx: -------------------------------------------------------------------------------- 1 | import { getFullPokemon } from "@/pokemon"; 2 | 3 | import SearchList from "./SearchList"; 4 | 5 | export const dynamic = "force-dynamic"; 6 | 7 | export default async function SearchPage({ 8 | searchParams, 9 | }: { 10 | searchParams: { q?: string }; 11 | }) { 12 | const pokemon = await getFullPokemon(10, searchParams.q); 13 | 14 | return ( 15 |
16 | 17 |
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /starter/src/app/search/page.tsx: -------------------------------------------------------------------------------- 1 | import { getFullPokemon } from "@/pokemon"; 2 | 3 | import SearchList from "./SearchList"; 4 | 5 | export const dynamic = "force-dynamic"; 6 | 7 | export default async function SearchPage({ 8 | searchParams, 9 | }: { 10 | searchParams: { q?: string }; 11 | }) { 12 | const pokemon = await getFullPokemon(10, searchParams.q); 13 | 14 | return ( 15 |
16 | 17 |
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /finished/src/app/components/PokemonGrid.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | 3 | import { PokemonDetail } from "@/routes"; 4 | import { PokemonCard } from "./PokemonCard"; 5 | import { Pokemon } from "@/types"; 6 | 7 | export function PokemonGrid({ pokemon }: { pokemon: Pokemon[] }) { 8 | return ( 9 |
10 | {pokemon.map((p) => ( 11 | 12 | 13 | 14 | ))} 15 |
16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /finished/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /starter/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | .yarn/install-state.gz 8 | 9 | # testing 10 | /coverage 11 | 12 | # next.js 13 | /.next/ 14 | /out/ 15 | 16 | # production 17 | /build 18 | 19 | # misc 20 | .DS_Store 21 | *.pem 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /finished/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /starter/public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /finished/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "plugins": [ 16 | { 17 | "name": "next" 18 | } 19 | ], 20 | "paths": { 21 | "@/*": ["./src/*"] 22 | } 23 | }, 24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | -------------------------------------------------------------------------------- /starter/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "lib": ["dom", "dom.iterable", "esnext"], 4 | "allowJs": true, 5 | "skipLibCheck": true, 6 | "strict": true, 7 | "noEmit": true, 8 | "esModuleInterop": true, 9 | "module": "esnext", 10 | "moduleResolution": "bundler", 11 | "resolveJsonModule": true, 12 | "isolatedModules": true, 13 | "jsx": "preserve", 14 | "incremental": true, 15 | "plugins": [ 16 | { 17 | "name": "next" 18 | } 19 | ], 20 | "paths": { 21 | "@/*": ["./src/*"] 22 | } 23 | }, 24 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 25 | "exclude": ["node_modules"] 26 | } 27 | -------------------------------------------------------------------------------- /starter/src/app/components/PokemonCard.tsx: -------------------------------------------------------------------------------- 1 | import { Pokemon } from "@/types"; 2 | import Image from "next/image"; 3 | 4 | export function PokemonCard({ pokemon }: { pokemon: Pokemon }) { 5 | return ( 6 |
7 |
8 | {pokemon.name} 15 |
16 |
17 |

{pokemon.name}

18 |
19 |
20 | ); 21 | } 22 | -------------------------------------------------------------------------------- /starter/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pokemon", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint" 10 | }, 11 | "dependencies": { 12 | "class-variance-authority": "^0.7.0", 13 | "clsx": "^2.1.0", 14 | "lucide-react": "^0.331.0", 15 | "next": "14.1.0", 16 | "react": "^18", 17 | "react-dom": "^18", 18 | "tailwind-merge": "^2.2.1", 19 | "tailwindcss-animate": "^1.0.7" 20 | }, 21 | "devDependencies": { 22 | "@tailwindcss/container-queries": "^0.1.1", 23 | "@types/node": "^20", 24 | "@types/react": "^18", 25 | "@types/react-dom": "^18", 26 | "autoprefixer": "^10.0.1", 27 | "eslint": "^8", 28 | "eslint-config-next": "14.1.0", 29 | "postcss": "^8", 30 | "tailwindcss": "^3.3.0", 31 | "typescript": "^5" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /finished/src/app/components/PokemonCard.tsx: -------------------------------------------------------------------------------- 1 | import { Pokemon } from "@/types"; 2 | import Image from "next/image"; 3 | import { PokemonDetail } from "@/routes"; 4 | 5 | export function PokemonCard({ pokemon }: { pokemon: Pokemon }) { 6 | return ( 7 |
8 |
9 | {pokemon.name} 16 |
17 |
18 |

{pokemon.name}

19 |
{PokemonDetail({ pokemonId: pokemon.id })}
20 |
21 |
22 | ); 23 | } 24 | -------------------------------------------------------------------------------- /finished/src/components/ui/input.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | export interface InputProps 6 | extends React.InputHTMLAttributes {} 7 | 8 | const Input = React.forwardRef( 9 | ({ className, type, ...props }, ref) => { 10 | return ( 11 | 20 | ) 21 | } 22 | ) 23 | Input.displayName = "Input" 24 | 25 | export { Input } 26 | -------------------------------------------------------------------------------- /starter/src/components/ui/input.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | 3 | import { cn } from "@/lib/utils" 4 | 5 | export interface InputProps 6 | extends React.InputHTMLAttributes {} 7 | 8 | const Input = React.forwardRef( 9 | ({ className, type, ...props }, ref) => { 10 | return ( 11 | 20 | ) 21 | } 22 | ) 23 | Input.displayName = "Input" 24 | 25 | export { Input } 26 | -------------------------------------------------------------------------------- /finished/src/app/components/SelectableGrid.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import { useState } from "react"; 3 | import Link from "next/link"; 4 | 5 | import { Pokemon } from "@/types"; 6 | 7 | import { PokemonCard } from "./PokemonCard"; 8 | import { PokemonInfo } from "./PokemonInfo"; 9 | 10 | export function SelectableGrid({ pokemon }: { pokemon: Pokemon[] }) { 11 | const [selected, setSelected] = useState(); 12 | 13 | return ( 14 |
15 |
16 | {pokemon.map((p) => ( 17 |
setSelected(p)} key={p.id}> 18 | 19 |
20 | ))} 21 |
22 | {selected && ( 23 |
24 | 25 | 26 | 27 |
28 | )} 29 |
30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /starter/src/app/components/SelectableGrid.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import { useState } from "react"; 3 | import Link from "next/link"; 4 | 5 | import { Pokemon } from "@/types"; 6 | 7 | import { PokemonCard } from "./PokemonCard"; 8 | import { PokemonInfo } from "./PokemonInfo"; 9 | 10 | export function SelectableGrid({ pokemon }: { pokemon: Pokemon[] }) { 11 | const [selected, setSelected] = useState(); 12 | 13 | return ( 14 |
15 |
16 | {pokemon.map((p) => ( 17 |
setSelected(p)} key={p.id}> 18 | 19 |
20 | ))} 21 |
22 | {selected && ( 23 |
24 | 25 | 26 | 27 |
28 | )} 29 |
30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /starter/src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import { Inter } from "next/font/google"; 3 | import Link from "next/link"; 4 | 5 | import "./globals.css"; 6 | 7 | const inter = Inter({ subsets: ["latin"] }); 8 | 9 | export const metadata: Metadata = { 10 | title: "Create Next App", 11 | description: "Generated by create next app", 12 | }; 13 | 14 | export default function RootLayout({ 15 | children, 16 | }: Readonly<{ 17 | children: React.ReactNode; 18 | }>) { 19 | return ( 20 | 21 | 22 |
23 | 24 | Home 25 | 26 | 27 | Search 28 | 29 |
30 |
{children}
31 | 32 | 33 | ); 34 | } 35 | -------------------------------------------------------------------------------- /finished/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pokemon", 3 | "version": "0.1.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start", 9 | "lint": "next lint", 10 | "dr:build": "npx declarative-routing build", 11 | "dr:build:watch": "npx declarative-routing build --watch" 12 | }, 13 | "dependencies": { 14 | "class-variance-authority": "^0.7.0", 15 | "clsx": "^2.1.0", 16 | "lucide-react": "^0.331.0", 17 | "next": "14.1.0", 18 | "query-string": "^9.0.0", 19 | "react": "^18", 20 | "react-dom": "^18", 21 | "tailwind-merge": "^2.2.1", 22 | "tailwindcss-animate": "^1.0.7", 23 | "zod": "^3.22.4" 24 | }, 25 | "devDependencies": { 26 | "@tailwindcss/container-queries": "^0.1.1", 27 | "@types/node": "^20", 28 | "@types/react": "^18", 29 | "@types/react-dom": "^18", 30 | "autoprefixer": "^10.0.1", 31 | "eslint": "^8", 32 | "eslint-config-next": "14.1.0", 33 | "postcss": "^8", 34 | "tailwindcss": "^3.3.0", 35 | "typescript": "^5" 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /finished/src/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import type { Metadata } from "next"; 2 | import { Inter } from "next/font/google"; 3 | import Link from "next/link"; 4 | 5 | import { Home, Search } from "@/routes"; 6 | 7 | import "./globals.css"; 8 | 9 | const inter = Inter({ subsets: ["latin"] }); 10 | 11 | export const metadata: Metadata = { 12 | title: "Create Next App", 13 | description: "Generated by create next app", 14 | }; 15 | 16 | export default function RootLayout({ 17 | children, 18 | }: Readonly<{ 19 | children: React.ReactNode; 20 | }>) { 21 | return ( 22 | 23 | 24 |
25 | Home 26 | 27 | Search 28 | 29 |
30 |
{children}
31 | 32 | 33 | ); 34 | } 35 | -------------------------------------------------------------------------------- /starter/public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /finished/public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /finished/src/routes/index.ts: -------------------------------------------------------------------------------- 1 | // Automatically generated by declarative-routing, do NOT edit 2 | import { z } from "zod"; 3 | import { makeGetRoute, makeRoute } from "./makeRoute"; 4 | 5 | const defaultInfo = { 6 | search: z.object({}) 7 | }; 8 | 9 | import * as HomeRoute from "@/app/page.info"; 10 | import * as PokemonSearchAPIRoute from "@/app/api/pokemon/route.info"; 11 | import * as ApiPokemonPokemonIdRoute from "@/app/api/pokemon/[pokemonId]/route.info"; 12 | import * as PokemonDetailRoute from "@/app/pokemon/[pokemonId]/page.info"; 13 | import * as SearchRoute from "@/app/search/page.info"; 14 | 15 | export const Home = makeRoute( 16 | "/", 17 | { 18 | ...defaultInfo, 19 | ...HomeRoute.Route 20 | } 21 | ); 22 | export const PokemonDetail = makeRoute( 23 | "/pokemon/[pokemonId]", 24 | { 25 | ...defaultInfo, 26 | ...PokemonDetailRoute.Route 27 | } 28 | ); 29 | export const Search = makeRoute( 30 | "/search", 31 | { 32 | ...defaultInfo, 33 | ...SearchRoute.Route 34 | } 35 | ); 36 | 37 | export const getPokemonSearchAPI = makeGetRoute( 38 | "/api/pokemon", 39 | { 40 | ...defaultInfo, 41 | ...PokemonSearchAPIRoute.Route 42 | }, 43 | PokemonSearchAPIRoute.GET 44 | ); 45 | export const getApiPokemonPokemonId = makeGetRoute( 46 | "/api/pokemon/[pokemonId]", 47 | { 48 | ...defaultInfo, 49 | ...ApiPokemonPokemonIdRoute.Route 50 | }, 51 | ApiPokemonPokemonIdRoute.GET 52 | ); 53 | -------------------------------------------------------------------------------- /finished/src/app/search/SearchList.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import { useState } from "react"; 3 | import { Input } from "@/components/ui/input"; 4 | 5 | import { getPokemonSearchAPI } from "@/routes"; 6 | import { Pokemon } from "@/types"; 7 | 8 | import { PokemonGrid } from "@/app/components/PokemonGrid"; 9 | import { useSearchParams } from "next/navigation"; 10 | 11 | export default function Search({ 12 | pokemon: initialPokemon, 13 | }: { 14 | pokemon: Pokemon[]; 15 | }) { 16 | const q = (useSearchParams().get("q") as string) || ""; 17 | const [query, setQuery] = useState(q); 18 | const [pokemon, setPokemon] = useState(initialPokemon); 19 | 20 | const search = async () => { 21 | const data = await getPokemonSearchAPI({}, { q: query }); 22 | setPokemon(data); 23 | }; 24 | 25 | return ( 26 |
27 |
28 | setQuery(e.target.value)} 33 | onKeyUp={(e) => { 34 | if (e.key !== "Enter") return; 35 | search(); 36 | }} 37 | /> 38 | 46 |
47 | 48 |
49 | ); 50 | } 51 | -------------------------------------------------------------------------------- /starter/src/app/search/SearchList.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import { useState } from "react"; 3 | import { Input } from "@/components/ui/input"; 4 | 5 | import { Pokemon } from "@/types"; 6 | 7 | import { PokemonGrid } from "@/app/components/PokemonGrid"; 8 | import { useSearchParams } from "next/navigation"; 9 | 10 | export default function Search({ 11 | pokemon: initialPokemon, 12 | }: { 13 | pokemon: Pokemon[]; 14 | }) { 15 | const q = (useSearchParams().get("q") as string) || ""; 16 | const [query, setQuery] = useState(q); 17 | const [pokemon, setPokemon] = useState(initialPokemon); 18 | 19 | const search = async () => { 20 | const resp = await fetch(`/api/pokemon?q=${encodeURIComponent(query)}`); 21 | const data = await resp.json(); 22 | setPokemon(data); 23 | }; 24 | 25 | return ( 26 |
27 |
28 | setQuery(e.target.value)} 33 | onKeyUp={(e) => { 34 | if (e.key !== "Enter") return; 35 | search(); 36 | }} 37 | /> 38 | 46 |
47 | 48 |
49 | ); 50 | } 51 | -------------------------------------------------------------------------------- /finished/README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | # or 12 | pnpm dev 13 | # or 14 | bun dev 15 | ``` 16 | 17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 18 | 19 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. 20 | 21 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. 22 | 23 | ## Learn More 24 | 25 | To learn more about Next.js, take a look at the following resources: 26 | 27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 29 | 30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 31 | 32 | ## Deploy on Vercel 33 | 34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 35 | 36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 37 | -------------------------------------------------------------------------------- /starter/README.md: -------------------------------------------------------------------------------- 1 | This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app). 2 | 3 | ## Getting Started 4 | 5 | First, run the development server: 6 | 7 | ```bash 8 | npm run dev 9 | # or 10 | yarn dev 11 | # or 12 | pnpm dev 13 | # or 14 | bun dev 15 | ``` 16 | 17 | Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. 18 | 19 | You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. 20 | 21 | This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font. 22 | 23 | ## Learn More 24 | 25 | To learn more about Next.js, take a look at the following resources: 26 | 27 | - [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. 28 | - [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. 29 | 30 | You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome! 31 | 32 | ## Deploy on Vercel 33 | 34 | The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. 35 | 36 | Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. 37 | -------------------------------------------------------------------------------- /finished/src/pokemon.ts: -------------------------------------------------------------------------------- 1 | import { Pokemon } from "./types"; 2 | 3 | function upperCaseFirstLetter(string: string) { 4 | return string.charAt(0).toUpperCase() + string.slice(1); 5 | } 6 | 7 | function summarizePokemon(pokemon: any): Pokemon { 8 | return { 9 | name: upperCaseFirstLetter(pokemon.name), 10 | id: pokemon.id, 11 | image: 12 | pokemon.sprites?.other?.["official-artwork"]?.front_default || 13 | pokemon.sprites.front_default, 14 | species: pokemon.species.name, 15 | types: pokemon.types 16 | .slice(0, 10) 17 | .map((s: any) => s.type.name) 18 | .join(", "), 19 | stats: pokemon.stats 20 | .slice(0, 10) 21 | .map((s: any) => `${s.stat.name}: ${s.base_stat}`) 22 | .join(", "), 23 | moves: pokemon.moves 24 | .slice(0, 10) 25 | .map((m: any) => m.move.name) 26 | .join(", "), 27 | }; 28 | } 29 | 30 | export async function getFullPokemon( 31 | limit: number = 10, 32 | q?: string 33 | ): Promise { 34 | const resp = await fetch( 35 | `https://pokeapi.co/api/v2/pokemon?limit=${ 36 | q ? 10000 : limit || 10 37 | }&offset=0` 38 | ); 39 | const json = await resp.json(); 40 | 41 | let results: any[] = json.results; 42 | if (q) { 43 | results = results 44 | .filter(({ name }: { name: string }) => name.includes(q)) 45 | .slice(0, +limit); 46 | } 47 | 48 | return await Promise.all( 49 | results.slice(0, +limit).map(async ({ url }: { url: string }) => { 50 | const resp = await fetch(url); 51 | return summarizePokemon(await resp.json()); 52 | }) 53 | ); 54 | } 55 | 56 | export async function getPokemon(id: number): Promise { 57 | const resp = await fetch(`https://pokeapi.co/api/v2/pokemon/${id}`); 58 | return summarizePokemon(await resp.json()); 59 | } 60 | -------------------------------------------------------------------------------- /starter/src/pokemon.ts: -------------------------------------------------------------------------------- 1 | import { Pokemon } from "./types"; 2 | 3 | function upperCaseFirstLetter(string: string) { 4 | return string.charAt(0).toUpperCase() + string.slice(1); 5 | } 6 | 7 | function summarizePokemon(pokemon: any): Pokemon { 8 | return { 9 | name: upperCaseFirstLetter(pokemon.name), 10 | id: pokemon.id, 11 | image: 12 | pokemon.sprites?.other?.["official-artwork"]?.front_default || 13 | pokemon.sprites.front_default, 14 | species: pokemon.species.name, 15 | types: pokemon.types 16 | .slice(0, 10) 17 | .map((s: any) => s.type.name) 18 | .join(", "), 19 | stats: pokemon.stats 20 | .slice(0, 10) 21 | .map((s: any) => `${s.stat.name}: ${s.base_stat}`) 22 | .join(", "), 23 | moves: pokemon.moves 24 | .slice(0, 10) 25 | .map((m: any) => m.move.name) 26 | .join(", "), 27 | }; 28 | } 29 | 30 | export async function getFullPokemon( 31 | limit: number = 10, 32 | q?: string 33 | ): Promise { 34 | const resp = await fetch( 35 | `https://pokeapi.co/api/v2/pokemon?limit=${ 36 | q ? 10000 : limit || 10 37 | }&offset=0` 38 | ); 39 | const json = await resp.json(); 40 | 41 | let results: any[] = json.results; 42 | if (q) { 43 | results = results 44 | .filter(({ name }: { name: string }) => name.includes(q)) 45 | .slice(0, +limit); 46 | } 47 | 48 | return await Promise.all( 49 | results.slice(0, +limit).map(async ({ url }: { url: string }) => { 50 | const resp = await fetch(url); 51 | return summarizePokemon(await resp.json()); 52 | }) 53 | ); 54 | } 55 | 56 | export async function getPokemon(id: number): Promise { 57 | const resp = await fetch(`https://pokeapi.co/api/v2/pokemon/${id}`); 58 | return summarizePokemon(await resp.json()); 59 | } 60 | -------------------------------------------------------------------------------- /finished/src/app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | :root { 7 | --background: 0 0% 100%; 8 | --foreground: 222.2 84% 4.9%; 9 | 10 | --card: 0 0% 100%; 11 | --card-foreground: 222.2 84% 4.9%; 12 | 13 | --popover: 0 0% 100%; 14 | --popover-foreground: 222.2 84% 4.9%; 15 | 16 | --primary: 222.2 47.4% 11.2%; 17 | --primary-foreground: 210 40% 98%; 18 | 19 | --secondary: 210 40% 96.1%; 20 | --secondary-foreground: 222.2 47.4% 11.2%; 21 | 22 | --muted: 210 40% 96.1%; 23 | --muted-foreground: 215.4 16.3% 46.9%; 24 | 25 | --accent: 210 40% 96.1%; 26 | --accent-foreground: 222.2 47.4% 11.2%; 27 | 28 | --destructive: 0 84.2% 60.2%; 29 | --destructive-foreground: 210 40% 98%; 30 | 31 | --border: 214.3 31.8% 91.4%; 32 | --input: 214.3 31.8% 91.4%; 33 | --ring: 222.2 84% 4.9%; 34 | 35 | --radius: 0.5rem; 36 | } 37 | 38 | .dark { 39 | --background: 222.2 84% 4.9%; 40 | --foreground: 210 40% 98%; 41 | 42 | --card: 222.2 84% 4.9%; 43 | --card-foreground: 210 40% 98%; 44 | 45 | --popover: 222.2 84% 4.9%; 46 | --popover-foreground: 210 40% 98%; 47 | 48 | --primary: 210 40% 98%; 49 | --primary-foreground: 222.2 47.4% 11.2%; 50 | 51 | --secondary: 217.2 32.6% 17.5%; 52 | --secondary-foreground: 210 40% 98%; 53 | 54 | --muted: 217.2 32.6% 17.5%; 55 | --muted-foreground: 215 20.2% 65.1%; 56 | 57 | --accent: 217.2 32.6% 17.5%; 58 | --accent-foreground: 210 40% 98%; 59 | 60 | --destructive: 0 62.8% 30.6%; 61 | --destructive-foreground: 210 40% 98%; 62 | 63 | --border: 217.2 32.6% 17.5%; 64 | --input: 217.2 32.6% 17.5%; 65 | --ring: 212.7 26.8% 83.9%; 66 | } 67 | } 68 | 69 | @layer base { 70 | * { 71 | @apply border-border; 72 | } 73 | body { 74 | @apply bg-background text-foreground; 75 | } 76 | } -------------------------------------------------------------------------------- /starter/src/app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | @layer base { 6 | :root { 7 | --background: 0 0% 100%; 8 | --foreground: 222.2 84% 4.9%; 9 | 10 | --card: 0 0% 100%; 11 | --card-foreground: 222.2 84% 4.9%; 12 | 13 | --popover: 0 0% 100%; 14 | --popover-foreground: 222.2 84% 4.9%; 15 | 16 | --primary: 222.2 47.4% 11.2%; 17 | --primary-foreground: 210 40% 98%; 18 | 19 | --secondary: 210 40% 96.1%; 20 | --secondary-foreground: 222.2 47.4% 11.2%; 21 | 22 | --muted: 210 40% 96.1%; 23 | --muted-foreground: 215.4 16.3% 46.9%; 24 | 25 | --accent: 210 40% 96.1%; 26 | --accent-foreground: 222.2 47.4% 11.2%; 27 | 28 | --destructive: 0 84.2% 60.2%; 29 | --destructive-foreground: 210 40% 98%; 30 | 31 | --border: 214.3 31.8% 91.4%; 32 | --input: 214.3 31.8% 91.4%; 33 | --ring: 222.2 84% 4.9%; 34 | 35 | --radius: 0.5rem; 36 | } 37 | 38 | .dark { 39 | --background: 222.2 84% 4.9%; 40 | --foreground: 210 40% 98%; 41 | 42 | --card: 222.2 84% 4.9%; 43 | --card-foreground: 210 40% 98%; 44 | 45 | --popover: 222.2 84% 4.9%; 46 | --popover-foreground: 210 40% 98%; 47 | 48 | --primary: 210 40% 98%; 49 | --primary-foreground: 222.2 47.4% 11.2%; 50 | 51 | --secondary: 217.2 32.6% 17.5%; 52 | --secondary-foreground: 210 40% 98%; 53 | 54 | --muted: 217.2 32.6% 17.5%; 55 | --muted-foreground: 215 20.2% 65.1%; 56 | 57 | --accent: 217.2 32.6% 17.5%; 58 | --accent-foreground: 210 40% 98%; 59 | 60 | --destructive: 0 62.8% 30.6%; 61 | --destructive-foreground: 210 40% 98%; 62 | 63 | --border: 217.2 32.6% 17.5%; 64 | --input: 217.2 32.6% 17.5%; 65 | --ring: 212.7 26.8% 83.9%; 66 | } 67 | } 68 | 69 | @layer base { 70 | * { 71 | @apply border-border; 72 | } 73 | body { 74 | @apply bg-background text-foreground; 75 | } 76 | } -------------------------------------------------------------------------------- /finished/src/app/components/PokemonInfo.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import Image from "next/image"; 3 | import { useEffect, useState } from "react"; 4 | import { Pokemon } from "@/types"; 5 | 6 | export function PokemonInfo({ 7 | id, 8 | pokemon: initialPokemon, 9 | }: { 10 | id: number; 11 | pokemon?: Pokemon; 12 | }) { 13 | const [data, setData] = useState(); 14 | 15 | useEffect(() => { 16 | if (!initialPokemon) { 17 | fetch(`/api/pokemon/${id}`) 18 | .then((res) => res.json()) 19 | .then((data) => setData(data)); 20 | } 21 | }, [id, initialPokemon]); 22 | 23 | const pokemon = initialPokemon || data; 24 | 25 | return pokemon ? ( 26 |
27 |
28 |
29 | {pokemon.name} 36 |
37 | 38 |
39 |

{pokemon.name}

40 |
41 |
Species
42 |
{pokemon.species}
43 |
44 |
45 |
Types
46 |
{pokemon.types}
47 |
48 |
49 |
Stats
50 |
{pokemon.stats}
51 |
52 |
53 |
Moves
54 |
{pokemon.moves}
55 |
56 |
57 |
58 |
59 | ) : null; 60 | } 61 | -------------------------------------------------------------------------------- /starter/src/app/components/PokemonInfo.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | import Image from "next/image"; 3 | import { useEffect, useState } from "react"; 4 | import { Pokemon } from "@/types"; 5 | 6 | export function PokemonInfo({ 7 | id, 8 | pokemon: initialPokemon, 9 | }: { 10 | id: number; 11 | pokemon?: Pokemon; 12 | }) { 13 | const [data, setData] = useState(); 14 | 15 | useEffect(() => { 16 | if (!initialPokemon) { 17 | fetch(`/api/pokemon/${id}`) 18 | .then((res) => res.json()) 19 | .then((data) => setData(data)); 20 | } 21 | }, [id, initialPokemon]); 22 | 23 | const pokemon = initialPokemon || data; 24 | 25 | return pokemon ? ( 26 |
27 |
28 |
29 | {pokemon.name} 36 |
37 | 38 |
39 |

{pokemon.name}

40 |
41 |
Species
42 |
{pokemon.species}
43 |
44 |
45 |
Types
46 |
{pokemon.types}
47 |
48 |
49 |
Stats
50 |
{pokemon.stats}
51 |
52 |
53 |
Moves
54 |
{pokemon.moves}
55 |
56 |
57 |
58 |
59 | ) : null; 60 | } 61 | -------------------------------------------------------------------------------- /finished/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config = { 4 | darkMode: ["class"], 5 | content: [ 6 | "./pages/**/*.{ts,tsx}", 7 | "./components/**/*.{ts,tsx}", 8 | "./app/**/*.{ts,tsx}", 9 | "./src/**/*.{ts,tsx}", 10 | ], 11 | prefix: "", 12 | theme: { 13 | container: { 14 | center: true, 15 | padding: "2rem", 16 | screens: { 17 | "2xl": "1400px", 18 | }, 19 | }, 20 | extend: { 21 | colors: { 22 | border: "hsl(var(--border))", 23 | input: "hsl(var(--input))", 24 | ring: "hsl(var(--ring))", 25 | background: "hsl(var(--background))", 26 | foreground: "hsl(var(--foreground))", 27 | primary: { 28 | DEFAULT: "hsl(var(--primary))", 29 | foreground: "hsl(var(--primary-foreground))", 30 | }, 31 | secondary: { 32 | DEFAULT: "hsl(var(--secondary))", 33 | foreground: "hsl(var(--secondary-foreground))", 34 | }, 35 | destructive: { 36 | DEFAULT: "hsl(var(--destructive))", 37 | foreground: "hsl(var(--destructive-foreground))", 38 | }, 39 | muted: { 40 | DEFAULT: "hsl(var(--muted))", 41 | foreground: "hsl(var(--muted-foreground))", 42 | }, 43 | accent: { 44 | DEFAULT: "hsl(var(--accent))", 45 | foreground: "hsl(var(--accent-foreground))", 46 | }, 47 | popover: { 48 | DEFAULT: "hsl(var(--popover))", 49 | foreground: "hsl(var(--popover-foreground))", 50 | }, 51 | card: { 52 | DEFAULT: "hsl(var(--card))", 53 | foreground: "hsl(var(--card-foreground))", 54 | }, 55 | }, 56 | borderRadius: { 57 | lg: "var(--radius)", 58 | md: "calc(var(--radius) - 2px)", 59 | sm: "calc(var(--radius) - 4px)", 60 | }, 61 | keyframes: { 62 | "accordion-down": { 63 | from: { height: "0" }, 64 | to: { height: "var(--radix-accordion-content-height)" }, 65 | }, 66 | "accordion-up": { 67 | from: { height: "var(--radix-accordion-content-height)" }, 68 | to: { height: "0" }, 69 | }, 70 | }, 71 | animation: { 72 | "accordion-down": "accordion-down 0.2s ease-out", 73 | "accordion-up": "accordion-up 0.2s ease-out", 74 | }, 75 | }, 76 | }, 77 | plugins: [ 78 | require("@tailwindcss/container-queries"), 79 | require("tailwindcss-animate"), 80 | ], 81 | } satisfies Config; 82 | 83 | export default config; 84 | -------------------------------------------------------------------------------- /starter/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from "tailwindcss"; 2 | 3 | const config = { 4 | darkMode: ["class"], 5 | content: [ 6 | "./pages/**/*.{ts,tsx}", 7 | "./components/**/*.{ts,tsx}", 8 | "./app/**/*.{ts,tsx}", 9 | "./src/**/*.{ts,tsx}", 10 | ], 11 | prefix: "", 12 | theme: { 13 | container: { 14 | center: true, 15 | padding: "2rem", 16 | screens: { 17 | "2xl": "1400px", 18 | }, 19 | }, 20 | extend: { 21 | colors: { 22 | border: "hsl(var(--border))", 23 | input: "hsl(var(--input))", 24 | ring: "hsl(var(--ring))", 25 | background: "hsl(var(--background))", 26 | foreground: "hsl(var(--foreground))", 27 | primary: { 28 | DEFAULT: "hsl(var(--primary))", 29 | foreground: "hsl(var(--primary-foreground))", 30 | }, 31 | secondary: { 32 | DEFAULT: "hsl(var(--secondary))", 33 | foreground: "hsl(var(--secondary-foreground))", 34 | }, 35 | destructive: { 36 | DEFAULT: "hsl(var(--destructive))", 37 | foreground: "hsl(var(--destructive-foreground))", 38 | }, 39 | muted: { 40 | DEFAULT: "hsl(var(--muted))", 41 | foreground: "hsl(var(--muted-foreground))", 42 | }, 43 | accent: { 44 | DEFAULT: "hsl(var(--accent))", 45 | foreground: "hsl(var(--accent-foreground))", 46 | }, 47 | popover: { 48 | DEFAULT: "hsl(var(--popover))", 49 | foreground: "hsl(var(--popover-foreground))", 50 | }, 51 | card: { 52 | DEFAULT: "hsl(var(--card))", 53 | foreground: "hsl(var(--card-foreground))", 54 | }, 55 | }, 56 | borderRadius: { 57 | lg: "var(--radius)", 58 | md: "calc(var(--radius) - 2px)", 59 | sm: "calc(var(--radius) - 4px)", 60 | }, 61 | keyframes: { 62 | "accordion-down": { 63 | from: { height: "0" }, 64 | to: { height: "var(--radix-accordion-content-height)" }, 65 | }, 66 | "accordion-up": { 67 | from: { height: "var(--radix-accordion-content-height)" }, 68 | to: { height: "0" }, 69 | }, 70 | }, 71 | animation: { 72 | "accordion-down": "accordion-down 0.2s ease-out", 73 | "accordion-up": "accordion-up 0.2s ease-out", 74 | }, 75 | }, 76 | }, 77 | plugins: [ 78 | require("@tailwindcss/container-queries"), 79 | require("tailwindcss-animate"), 80 | ], 81 | } satisfies Config; 82 | 83 | export default config; 84 | -------------------------------------------------------------------------------- /finished/DR-README.md: -------------------------------------------------------------------------------- 1 | This application supports typesafe routing for NextJS using the `declarative-routing` system. 2 | 3 | # What is `declarative-routing`? 4 | 5 | Declarative Routes is a system for typesafe routing in React. It uses a combination of TypeScript and a custom routing system to ensure that your routes are always in sync with your code. You'll never have to worry about broken links or missing routes again. 6 | 7 | In NextJS applications, Declarative Routes also handles API routes, so you'll have typesafe input and output from all of your APIs. In addition to `fetch` functions that are written for you automatically. 8 | 9 | # Route List 10 | 11 | Here are the routes of the application: 12 | 13 | | Route | Verb | Route Name | Using It | 14 | | ----- | ---- | ---- | ---- | 15 | | `/api/pokemon/[pokemonId]` | GET | `ApiPokemonPokemonId` | `getApiPokemonPokemonId(...)` | 16 | | `/api/pokemon` | GET | `ApiPokemon` | `getApiPokemon(...)` | 17 | | `/` | - | `Home` | `` | 18 | | `/pokemon/[pokemonId]` | - | `PokemonPokemonId` | `` | 19 | | `/search` | - | `Search` | `` | 20 | 21 | To use the routes, you can import them from `@/routes` and use them in your code. 22 | 23 | # Using the routes in your application 24 | 25 | For pages, use the `Link` component (built on top of `next/link`) to link to other pages. For example: 26 | 27 | ```tsx 28 | import { ProductDetail } from "@/routes"; 29 | 30 | return ( 31 | Product abc123 32 | ); 33 | ``` 34 | 35 | This is the equivalent of doing `Product abc123` but with typesafety. And you never have to remember the URL. If the route moves, the typesafe route will be updated automatically. 36 | 37 | For APIs, use the exported `fetch` wrapping functions. For example: 38 | 39 | ```tsx 40 | import { useEffect } from "react"; 41 | import { getProductInfo } from "@/routes"; 42 | 43 | useEffect(() => { 44 | // Parameters are typed to the input of the API 45 | getProductInfo({ productId: "abc123" }).then((data) => { 46 | // Data is typed to the result of the API 47 | console.log(data); 48 | }); 49 | }, []); 50 | ``` 51 | 52 | This is the equivalent of doing `fetch('/api/product/abc123')` but with typesafety, and you never have to remember the URL. If the API moves, the typesafe route will be updated automatically. 53 | 54 | # When your routes change 55 | 56 | Tou'll need to run `pnpm dr:build` to update the generated files. This will update the types and the `@/routes` module to reflect the changes. 57 | 58 | The way the system works the `.info.ts` files are link to the `@/routes/index.ts` file. So changing the Zod schemas for the routes does **NOT** require a rebuild. You need to run the build command when: 59 | 60 | - You change the name of the route in the `.info.ts` file 61 | - You change the location of the route (e.g. `/product` to `/products`) 62 | - You change the parameters of the route (e.g. `/product/[id]` to `/product/[productId]`) 63 | - You add or remove routes 64 | - You add or remove verbs from API routes (e.g. adding `POST` to an existing route) 65 | 66 | You can also run the build command in watch mode using `pnpm dr:build:watch` but we don't recommend using that unless you are changing routes a lot. It's a neat party trick to change a route directory name and to watch the links automagically change with hot module reloading, but routes really don't change that much. 67 | 68 | # Finishing your setup 69 | 70 | Post setup there are some additional tasks that you need to complete to completely typesafe your routes. We've compiled a handy check list so you can keep track of your progress. 71 | 72 | - [ ] `/api/pokemon/[pokemonId]/route.info.ts`: Add typing for `GET` 73 | - [ ] Convert `GET` fetch calls to `/api/pokemon/[pokemonId]` to `getApiPokemonPokemonId(...)` calls 74 | - [ ] `/api/pokemon/route.info.ts`: Add typing for `GET` 75 | - [ ] Convert `GET` fetch calls to `/api/pokemon` to `getApiPokemon(...)` calls 76 | - [ ] `/page.info.ts`: Add search typing to if the page supports search paramaters 77 | - [ ] Convert `Link` components for `/` to `` 78 | - [ ] `/pokemon/[pokemonId]/page.info.ts`: Add search typing to if the page supports search paramaters 79 | - [ ] Convert `Link` components for `/pokemon/[pokemonId]` to `` 80 | - [ ] Convert `params` typing in `/pokemon/[pokemonId]/page.ts` to `z.infer<>` 81 | - [ ] `/search/page.info.ts`: Add search typing to if the page supports search paramaters 82 | - [ ] Convert `Link` components for `/search` to `` 83 | Once you've got that done you can remove this section. 84 | 85 | # Why is `makeRoute` copied into the `@/routes` module? 86 | 87 | You **own** this routing system once you install it. And we anticipate as part of that ownership you'll want to customize the routing system. That's why we create a `makeRoute.tsx` file in the `@/routes` module. This file is a copy of the `makeRoute.tsx` file from the `declarative-routing` package. You can modify this file to change the behavior of the routing system. 88 | 89 | For example, you might want to change the way `GET`, `POST`, `PUT`, and `DELETE` are handled. Or you might want to change the way the `Link` component works. You can do all of that by modifying the `makeRoute.tsx` file. 90 | 91 | We do **NOT** recommend changing the parameters of `makeRoute`, `makeGetRoute`, `makePostRoute`, `makePutRoute`, or `makeDeleteRoute` functions because that would cause incompatiblity with the `build` command of `declarative-routing`. 92 | 93 | # Credit where credit is due 94 | 95 | This system is based on the work in [Fix Next.JS Routing To Have Full Type-Safety](https://www.flightcontrol.dev/blog/fix-nextjs-routing-to-have-full-type-safety). However the original article had a significantly different interface and didn't cover API routes at all. 96 | -------------------------------------------------------------------------------- /finished/src/routes/makeRoute.tsx: -------------------------------------------------------------------------------- 1 | /* 2 | Derived from: https://www.flightcontrol.dev/blog/fix-nextjs-routing-to-have-full-type-safety 3 | */ 4 | import { z } from "zod"; 5 | import { 6 | useParams as useNextParams, 7 | useSearchParams as useNextSearchParams, 8 | } from "next/navigation"; 9 | import queryString from "query-string"; 10 | import Link from "next/link"; 11 | import { useRouter } from "next/navigation"; 12 | 13 | type LinkProps = Parameters[0]; 14 | 15 | export type RouteInfo< 16 | Params extends z.ZodSchema, 17 | Search extends z.ZodSchema 18 | > = { 19 | name: string; 20 | params: Params; 21 | search: Search; 22 | description?: string; 23 | }; 24 | 25 | export type GetInfo = { 26 | result: Result; 27 | }; 28 | 29 | export type PostInfo = { 30 | body: Body; 31 | result: Result; 32 | description?: string; 33 | }; 34 | 35 | export type PutInfo = { 36 | body: Body; 37 | result: Result; 38 | description?: string; 39 | }; 40 | 41 | type FetchOptions = Parameters[1]; 42 | 43 | type PushOptions = Parameters["push"]>[1]; 44 | 45 | type CoreRouteElements< 46 | Params extends z.ZodSchema, 47 | Search extends z.ZodSchema = typeof emptySchema 48 | > = { 49 | params: z.output; 50 | paramsSchema: Params; 51 | search: z.output; 52 | searchSchema: Search; 53 | }; 54 | 55 | type PutRouteBuilder< 56 | Params extends z.ZodSchema, 57 | Search extends z.ZodSchema, 58 | Body extends z.ZodSchema, 59 | Result extends z.ZodSchema 60 | > = CoreRouteElements & { 61 | ( 62 | body: z.input, 63 | p?: z.input, 64 | search?: z.input, 65 | options?: FetchOptions 66 | ): Promise>; 67 | 68 | body: z.output; 69 | bodySchema: Body; 70 | result: z.output; 71 | resultSchema: Result; 72 | }; 73 | 74 | type PostRouteBuilder< 75 | Params extends z.ZodSchema, 76 | Search extends z.ZodSchema, 77 | Body extends z.ZodSchema, 78 | Result extends z.ZodSchema 79 | > = CoreRouteElements & { 80 | ( 81 | body: z.input, 82 | p?: z.input, 83 | search?: z.input, 84 | options?: FetchOptions 85 | ): Promise>; 86 | 87 | body: z.output; 88 | bodySchema: Body; 89 | result: z.output; 90 | resultSchema: Result; 91 | }; 92 | 93 | type GetRouteBuilder< 94 | Params extends z.ZodSchema, 95 | Search extends z.ZodSchema, 96 | Result extends z.ZodSchema 97 | > = CoreRouteElements & { 98 | ( 99 | p?: z.input, 100 | search?: z.input, 101 | options?: FetchOptions 102 | ): Promise>; 103 | 104 | result: z.output; 105 | resultSchema: Result; 106 | }; 107 | 108 | type DeleteRouteBuilder = CoreRouteElements< 109 | Params, 110 | z.ZodSchema 111 | > & { 112 | (p?: z.input, options?: FetchOptions): Promise; 113 | }; 114 | 115 | type RouteBuilder< 116 | Params extends z.ZodSchema, 117 | Search extends z.ZodSchema 118 | > = CoreRouteElements & { 119 | (p?: z.input, search?: z.input): string; 120 | 121 | useParams: () => z.output; 122 | useSearchParams: () => z.output; 123 | usePush: () => ( 124 | params: z.input, 125 | search?: z.input, 126 | options?: PushOptions 127 | ) => void; 128 | 129 | Link: React.FC< 130 | Omit & 131 | z.input & { 132 | search?: z.input; 133 | } & { children?: React.ReactNode } 134 | >; 135 | ParamsLink: React.FC< 136 | Omit & { 137 | params?: z.input; 138 | search?: z.input; 139 | } & { children?: React.ReactNode } 140 | >; 141 | }; 142 | 143 | function createPathBuilder>( 144 | route: string 145 | ): (params: T) => string { 146 | const pathArr = route.split("/"); 147 | 148 | let catchAllSegment: ((params: T) => string) | null = null; 149 | if (pathArr.at(-1)?.startsWith("[[...")) { 150 | const catchKey = pathArr.pop()!.replace("[[...", "").replace("]]", ""); 151 | catchAllSegment = (params: T) => { 152 | const catchAll = params[catchKey] as unknown as string[]; 153 | return catchAll ? `/${catchAll.join("/")}` : ""; 154 | }; 155 | } 156 | 157 | const elems: ((params: T) => string)[] = []; 158 | for (const elem of pathArr) { 159 | const catchAll = elem.match(/\[\.\.\.(.*)\]/); 160 | const param = elem.match(/\[(.*)\]/); 161 | if (catchAll?.[1]) { 162 | const key = catchAll[1]; 163 | elems.push((params: T) => 164 | (params[key as unknown as string] as string[]).join("/") 165 | ); 166 | } else if (param?.[1]) { 167 | const key = param[1]; 168 | elems.push((params: T) => params[key as unknown as string] as string); 169 | } else { 170 | elems.push(() => elem); 171 | } 172 | } 173 | 174 | return (params: T): string => { 175 | const p = elems.map((e) => e(params)).join("/"); 176 | if (catchAllSegment) { 177 | return p + catchAllSegment(params); 178 | } else { 179 | return p; 180 | } 181 | }; 182 | } 183 | 184 | function createRouteBuilder< 185 | Params extends z.ZodSchema, 186 | Search extends z.ZodSchema 187 | >(route: string, info: RouteInfo) { 188 | const fn = createPathBuilder>(route); 189 | 190 | return (params?: z.input, search?: z.input) => { 191 | let checkedParams = params || {}; 192 | if (info.params) { 193 | const safeParams = info.params.safeParse(checkedParams); 194 | if (!safeParams?.success) { 195 | throw new Error( 196 | `Invalid params for route ${info.name}: ${safeParams.error.message}` 197 | ); 198 | } else { 199 | checkedParams = safeParams.data; 200 | } 201 | } 202 | const safeSearch = info.search 203 | ? info.search?.safeParse(search || {}) 204 | : null; 205 | if (info.search && !safeSearch?.success) { 206 | throw new Error( 207 | `Invalid search params for route ${info.name}: ${safeSearch?.error.message}` 208 | ); 209 | } 210 | 211 | const baseUrl = fn(checkedParams); 212 | const searchString = search && queryString.stringify(search); 213 | return [baseUrl, searchString ? `?${searchString}` : ""].join(""); 214 | }; 215 | } 216 | 217 | const emptySchema = z.object({}); 218 | 219 | export function makePostRoute< 220 | Params extends z.ZodSchema, 221 | Search extends z.ZodSchema, 222 | Body extends z.ZodSchema, 223 | Result extends z.ZodSchema 224 | >( 225 | route: string, 226 | info: RouteInfo, 227 | postInfo: PostInfo 228 | ): PostRouteBuilder { 229 | const urlBuilder = createRouteBuilder(route, info); 230 | 231 | const routeBuilder: PostRouteBuilder = ( 232 | body: z.input, 233 | p?: z.input, 234 | search?: z.input, 235 | options?: FetchOptions 236 | ): Promise> => { 237 | const safeBody = postInfo.body.safeParse(body); 238 | if (!safeBody.success) { 239 | throw new Error( 240 | `Invalid body for route ${info.name}: ${safeBody.error.message}` 241 | ); 242 | } 243 | 244 | return fetch(urlBuilder(p, search), { 245 | ...options, 246 | method: "POST", 247 | body: JSON.stringify(safeBody.data), 248 | headers: { 249 | ...(options?.headers || {}), 250 | "Content-Type": "application/json", 251 | }, 252 | }) 253 | .then((res) => { 254 | if (!res.ok) { 255 | throw new Error(`Failed to fetch ${info.name}: ${res.statusText}`); 256 | } 257 | return res.json() as Promise>; 258 | }) 259 | .then((data) => { 260 | const result = postInfo.result.safeParse(data); 261 | if (!result.success) { 262 | throw new Error( 263 | `Invalid response for route ${info.name}: ${result.error.message}` 264 | ); 265 | } 266 | return result.data; 267 | }); 268 | }; 269 | 270 | routeBuilder.params = undefined as z.output; 271 | routeBuilder.paramsSchema = info.params; 272 | routeBuilder.search = undefined as z.output; 273 | routeBuilder.searchSchema = info.search; 274 | routeBuilder.body = undefined as z.output; 275 | routeBuilder.bodySchema = postInfo.body; 276 | routeBuilder.result = undefined as z.output; 277 | routeBuilder.resultSchema = postInfo.result; 278 | 279 | return routeBuilder; 280 | } 281 | 282 | export function makePutRoute< 283 | Params extends z.ZodSchema, 284 | Search extends z.ZodSchema, 285 | Body extends z.ZodSchema, 286 | Result extends z.ZodSchema 287 | >( 288 | route: string, 289 | info: RouteInfo, 290 | putInfo: PutInfo 291 | ): PutRouteBuilder { 292 | const urlBuilder = createRouteBuilder(route, info); 293 | 294 | const routeBuilder: PutRouteBuilder = ( 295 | body: z.input, 296 | p?: z.input, 297 | search?: z.input, 298 | options?: FetchOptions 299 | ): Promise> => { 300 | const safeBody = putInfo.body.safeParse(body); 301 | if (!safeBody.success) { 302 | throw new Error( 303 | `Invalid body for route ${info.name}: ${safeBody.error.message}` 304 | ); 305 | } 306 | 307 | return fetch(urlBuilder(p, search), { 308 | ...options, 309 | method: "PUT", 310 | body: JSON.stringify(safeBody.data), 311 | headers: { 312 | ...(options?.headers || {}), 313 | "Content-Type": "application/json", 314 | }, 315 | }) 316 | .then((res) => { 317 | if (!res.ok) { 318 | throw new Error(`Failed to fetch ${info.name}: ${res.statusText}`); 319 | } 320 | return res.json() as Promise>; 321 | }) 322 | .then((data) => { 323 | const result = putInfo.result.safeParse(data); 324 | if (!result.success) { 325 | throw new Error( 326 | `Invalid response for route ${info.name}: ${result.error.message}` 327 | ); 328 | } 329 | return result.data; 330 | }); 331 | }; 332 | 333 | routeBuilder.params = undefined as z.output; 334 | routeBuilder.paramsSchema = info.params; 335 | routeBuilder.search = undefined as z.output; 336 | routeBuilder.searchSchema = info.search; 337 | routeBuilder.body = undefined as z.output; 338 | routeBuilder.bodySchema = putInfo.body; 339 | routeBuilder.result = undefined as z.output; 340 | routeBuilder.resultSchema = putInfo.result; 341 | 342 | return routeBuilder; 343 | } 344 | 345 | export function makeGetRoute< 346 | Params extends z.ZodSchema, 347 | Search extends z.ZodSchema, 348 | Result extends z.ZodSchema 349 | >( 350 | route: string, 351 | info: RouteInfo, 352 | getInfo: GetInfo 353 | ): GetRouteBuilder { 354 | const urlBuilder = createRouteBuilder(route, info); 355 | 356 | const routeBuilder: GetRouteBuilder = ( 357 | p?: z.input, 358 | search?: z.input, 359 | options?: FetchOptions 360 | ): Promise> => { 361 | return fetch(urlBuilder(p, search), options) 362 | .then((res) => { 363 | if (!res.ok) { 364 | throw new Error(`Failed to fetch ${info.name}: ${res.statusText}`); 365 | } 366 | return res.json() as Promise>; 367 | }) 368 | .then((data) => { 369 | const result = getInfo.result.safeParse(data); 370 | if (!result.success) { 371 | throw new Error( 372 | `Invalid response for route ${info.name}: ${result.error.message}` 373 | ); 374 | } 375 | return result.data; 376 | }); 377 | }; 378 | 379 | routeBuilder.params = undefined as z.output; 380 | routeBuilder.paramsSchema = info.params; 381 | routeBuilder.search = undefined as z.output; 382 | routeBuilder.searchSchema = info.search; 383 | routeBuilder.result = undefined as z.output; 384 | routeBuilder.resultSchema = getInfo.result; 385 | 386 | return routeBuilder; 387 | } 388 | 389 | export function makeDeleteRoute< 390 | Params extends z.ZodSchema, 391 | Search extends z.ZodSchema 392 | >(route: string, info: RouteInfo): DeleteRouteBuilder { 393 | const urlBuilder = createRouteBuilder(route, info); 394 | 395 | const routeBuilder: DeleteRouteBuilder = ( 396 | p?: z.input, 397 | search?: z.input, 398 | options?: FetchOptions 399 | ): Promise => { 400 | return fetch(urlBuilder(p, search), options).then((res) => { 401 | if (!res.ok) { 402 | throw new Error(`Failed to fetch ${info.name}: ${res.statusText}`); 403 | } 404 | }); 405 | }; 406 | 407 | routeBuilder.params = undefined as z.output; 408 | routeBuilder.paramsSchema = info.params; 409 | routeBuilder.search = undefined as z.output; 410 | routeBuilder.searchSchema = info.search; 411 | 412 | return routeBuilder; 413 | } 414 | 415 | export function makeRoute< 416 | Params extends z.ZodSchema, 417 | Search extends z.ZodSchema = typeof emptySchema 418 | >( 419 | route: string, 420 | info: RouteInfo 421 | ): RouteBuilder { 422 | const urlBuilder: RouteBuilder = createRouteBuilder( 423 | route, 424 | info 425 | ) as RouteBuilder; 426 | 427 | urlBuilder.useParams = function useParams(): z.output { 428 | const res = info.params.safeParse(useNextParams()); 429 | if (!res.success) { 430 | throw new Error( 431 | `Invalid route params for route ${info.name}: ${res.error.message}` 432 | ); 433 | } 434 | return res.data; 435 | }; 436 | 437 | if (info?.search) { 438 | urlBuilder.useSearchParams = function useSearchParams(): z.output { 439 | const res = info.search!.safeParse( 440 | convertURLSearchParamsToObject(useNextSearchParams()) 441 | ); 442 | if (!res.success) { 443 | throw new Error( 444 | `Invalid search params for route ${info.name}: ${res.error.message}` 445 | ); 446 | } 447 | return res.data; 448 | }; 449 | } else { 450 | urlBuilder.useSearchParams = function useSearchParams() { 451 | throw new Error(`Route ${info.name} does not have search params`); 452 | }; 453 | } 454 | 455 | urlBuilder.ParamsLink = function RouteLink({ 456 | params: linkParams, 457 | search: linkSearch, 458 | children, 459 | ...props 460 | }: Omit & { 461 | params?: z.input; 462 | search?: z.input; 463 | } & { children?: React.ReactNode }) { 464 | return ( 465 | 466 | {children} 467 | 468 | ); 469 | }; 470 | 471 | urlBuilder.Link = function RouteLink({ 472 | search: linkSearch, 473 | children, 474 | ...props 475 | }: Omit & 476 | z.input & { 477 | search?: z.input; 478 | } & { children?: React.ReactNode }) { 479 | const params = info.params.parse(props); 480 | const extraProps = { ...props }; 481 | for (const key of Object.keys(params)) { 482 | delete extraProps[key]; 483 | } 484 | return ( 485 | 489 | {children} 490 | 491 | ); 492 | }; 493 | 494 | urlBuilder.usePush = function usePush() { 495 | const { push } = useRouter(); 496 | return ( 497 | p: z.input, 498 | search?: z.input, 499 | options?: PushOptions 500 | ) => { 501 | push(urlBuilder(p, search), options); 502 | }; 503 | }; 504 | 505 | urlBuilder.params = undefined as z.output; 506 | urlBuilder.paramsSchema = info.params; 507 | urlBuilder.search = undefined as z.output; 508 | urlBuilder.searchSchema = info.search; 509 | 510 | return urlBuilder; 511 | } 512 | 513 | function convertURLSearchParamsToObject( 514 | params: Readonly | null 515 | ): Record { 516 | if (!params) { 517 | return {}; 518 | } 519 | 520 | const obj: Record = {}; 521 | // @ts-ignore 522 | for (const [key, value] of params.entries()) { 523 | if (params.getAll(key).length > 1) { 524 | obj[key] = params.getAll(key); 525 | } else { 526 | obj[key] = value; 527 | } 528 | } 529 | return obj; 530 | } 531 | -------------------------------------------------------------------------------- /starter/pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | class-variance-authority: 9 | specifier: ^0.7.0 10 | version: 0.7.0 11 | clsx: 12 | specifier: ^2.1.0 13 | version: 2.1.0 14 | lucide-react: 15 | specifier: ^0.331.0 16 | version: 0.331.0(react@18.2.0) 17 | next: 18 | specifier: 14.1.0 19 | version: 14.1.0(react-dom@18.2.0)(react@18.2.0) 20 | react: 21 | specifier: ^18 22 | version: 18.2.0 23 | react-dom: 24 | specifier: ^18 25 | version: 18.2.0(react@18.2.0) 26 | tailwind-merge: 27 | specifier: ^2.2.1 28 | version: 2.2.1 29 | tailwindcss-animate: 30 | specifier: ^1.0.7 31 | version: 1.0.7(tailwindcss@3.4.1) 32 | 33 | devDependencies: 34 | '@tailwindcss/container-queries': 35 | specifier: ^0.1.1 36 | version: 0.1.1(tailwindcss@3.4.1) 37 | '@types/node': 38 | specifier: ^20 39 | version: 20.11.19 40 | '@types/react': 41 | specifier: ^18 42 | version: 18.2.56 43 | '@types/react-dom': 44 | specifier: ^18 45 | version: 18.2.19 46 | autoprefixer: 47 | specifier: ^10.0.1 48 | version: 10.4.17(postcss@8.4.35) 49 | eslint: 50 | specifier: ^8 51 | version: 8.56.0 52 | eslint-config-next: 53 | specifier: 14.1.0 54 | version: 14.1.0(eslint@8.56.0)(typescript@5.3.3) 55 | postcss: 56 | specifier: ^8 57 | version: 8.4.35 58 | tailwindcss: 59 | specifier: ^3.3.0 60 | version: 3.4.1 61 | typescript: 62 | specifier: ^5 63 | version: 5.3.3 64 | 65 | packages: 66 | 67 | /@aashutoshrathi/word-wrap@1.2.6: 68 | resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} 69 | engines: {node: '>=0.10.0'} 70 | dev: true 71 | 72 | /@alloc/quick-lru@5.2.0: 73 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 74 | engines: {node: '>=10'} 75 | 76 | /@babel/runtime@7.23.9: 77 | resolution: {integrity: sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==} 78 | engines: {node: '>=6.9.0'} 79 | dependencies: 80 | regenerator-runtime: 0.14.1 81 | 82 | /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): 83 | resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} 84 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 85 | peerDependencies: 86 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 87 | dependencies: 88 | eslint: 8.56.0 89 | eslint-visitor-keys: 3.4.3 90 | dev: true 91 | 92 | /@eslint-community/regexpp@4.10.0: 93 | resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} 94 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 95 | dev: true 96 | 97 | /@eslint/eslintrc@2.1.4: 98 | resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} 99 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 100 | dependencies: 101 | ajv: 6.12.6 102 | debug: 4.3.4 103 | espree: 9.6.1 104 | globals: 13.24.0 105 | ignore: 5.3.1 106 | import-fresh: 3.3.0 107 | js-yaml: 4.1.0 108 | minimatch: 3.1.2 109 | strip-json-comments: 3.1.1 110 | transitivePeerDependencies: 111 | - supports-color 112 | dev: true 113 | 114 | /@eslint/js@8.56.0: 115 | resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} 116 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 117 | dev: true 118 | 119 | /@humanwhocodes/config-array@0.11.14: 120 | resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} 121 | engines: {node: '>=10.10.0'} 122 | dependencies: 123 | '@humanwhocodes/object-schema': 2.0.2 124 | debug: 4.3.4 125 | minimatch: 3.1.2 126 | transitivePeerDependencies: 127 | - supports-color 128 | dev: true 129 | 130 | /@humanwhocodes/module-importer@1.0.1: 131 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 132 | engines: {node: '>=12.22'} 133 | dev: true 134 | 135 | /@humanwhocodes/object-schema@2.0.2: 136 | resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} 137 | dev: true 138 | 139 | /@isaacs/cliui@8.0.2: 140 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 141 | engines: {node: '>=12'} 142 | dependencies: 143 | string-width: 5.1.2 144 | string-width-cjs: /string-width@4.2.3 145 | strip-ansi: 7.1.0 146 | strip-ansi-cjs: /strip-ansi@6.0.1 147 | wrap-ansi: 8.1.0 148 | wrap-ansi-cjs: /wrap-ansi@7.0.0 149 | 150 | /@jridgewell/gen-mapping@0.3.3: 151 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 152 | engines: {node: '>=6.0.0'} 153 | dependencies: 154 | '@jridgewell/set-array': 1.1.2 155 | '@jridgewell/sourcemap-codec': 1.4.15 156 | '@jridgewell/trace-mapping': 0.3.22 157 | 158 | /@jridgewell/resolve-uri@3.1.2: 159 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 160 | engines: {node: '>=6.0.0'} 161 | 162 | /@jridgewell/set-array@1.1.2: 163 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 164 | engines: {node: '>=6.0.0'} 165 | 166 | /@jridgewell/sourcemap-codec@1.4.15: 167 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 168 | 169 | /@jridgewell/trace-mapping@0.3.22: 170 | resolution: {integrity: sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw==} 171 | dependencies: 172 | '@jridgewell/resolve-uri': 3.1.2 173 | '@jridgewell/sourcemap-codec': 1.4.15 174 | 175 | /@next/env@14.1.0: 176 | resolution: {integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==} 177 | dev: false 178 | 179 | /@next/eslint-plugin-next@14.1.0: 180 | resolution: {integrity: sha512-x4FavbNEeXx/baD/zC/SdrvkjSby8nBn8KcCREqk6UuwvwoAPZmaV8TFCAuo/cpovBRTIY67mHhe86MQQm/68Q==} 181 | dependencies: 182 | glob: 10.3.10 183 | dev: true 184 | 185 | /@next/swc-darwin-arm64@14.1.0: 186 | resolution: {integrity: sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==} 187 | engines: {node: '>= 10'} 188 | cpu: [arm64] 189 | os: [darwin] 190 | requiresBuild: true 191 | dev: false 192 | optional: true 193 | 194 | /@next/swc-darwin-x64@14.1.0: 195 | resolution: {integrity: sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==} 196 | engines: {node: '>= 10'} 197 | cpu: [x64] 198 | os: [darwin] 199 | requiresBuild: true 200 | dev: false 201 | optional: true 202 | 203 | /@next/swc-linux-arm64-gnu@14.1.0: 204 | resolution: {integrity: sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==} 205 | engines: {node: '>= 10'} 206 | cpu: [arm64] 207 | os: [linux] 208 | requiresBuild: true 209 | dev: false 210 | optional: true 211 | 212 | /@next/swc-linux-arm64-musl@14.1.0: 213 | resolution: {integrity: sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==} 214 | engines: {node: '>= 10'} 215 | cpu: [arm64] 216 | os: [linux] 217 | requiresBuild: true 218 | dev: false 219 | optional: true 220 | 221 | /@next/swc-linux-x64-gnu@14.1.0: 222 | resolution: {integrity: sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==} 223 | engines: {node: '>= 10'} 224 | cpu: [x64] 225 | os: [linux] 226 | requiresBuild: true 227 | dev: false 228 | optional: true 229 | 230 | /@next/swc-linux-x64-musl@14.1.0: 231 | resolution: {integrity: sha512-rbaIYFt2X9YZBSbH/CwGAjbBG2/MrACCVu2X0+kSykHzHnYH5FjHxwXLkcoJ10cX0aWCEynpu+rP76x0914atg==} 232 | engines: {node: '>= 10'} 233 | cpu: [x64] 234 | os: [linux] 235 | requiresBuild: true 236 | dev: false 237 | optional: true 238 | 239 | /@next/swc-win32-arm64-msvc@14.1.0: 240 | resolution: {integrity: sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==} 241 | engines: {node: '>= 10'} 242 | cpu: [arm64] 243 | os: [win32] 244 | requiresBuild: true 245 | dev: false 246 | optional: true 247 | 248 | /@next/swc-win32-ia32-msvc@14.1.0: 249 | resolution: {integrity: sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==} 250 | engines: {node: '>= 10'} 251 | cpu: [ia32] 252 | os: [win32] 253 | requiresBuild: true 254 | dev: false 255 | optional: true 256 | 257 | /@next/swc-win32-x64-msvc@14.1.0: 258 | resolution: {integrity: sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==} 259 | engines: {node: '>= 10'} 260 | cpu: [x64] 261 | os: [win32] 262 | requiresBuild: true 263 | dev: false 264 | optional: true 265 | 266 | /@nodelib/fs.scandir@2.1.5: 267 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 268 | engines: {node: '>= 8'} 269 | dependencies: 270 | '@nodelib/fs.stat': 2.0.5 271 | run-parallel: 1.2.0 272 | 273 | /@nodelib/fs.stat@2.0.5: 274 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 275 | engines: {node: '>= 8'} 276 | 277 | /@nodelib/fs.walk@1.2.8: 278 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 279 | engines: {node: '>= 8'} 280 | dependencies: 281 | '@nodelib/fs.scandir': 2.1.5 282 | fastq: 1.17.1 283 | 284 | /@pkgjs/parseargs@0.11.0: 285 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 286 | engines: {node: '>=14'} 287 | requiresBuild: true 288 | optional: true 289 | 290 | /@rushstack/eslint-patch@1.7.2: 291 | resolution: {integrity: sha512-RbhOOTCNoCrbfkRyoXODZp75MlpiHMgbE5MEBZAnnnLyQNgrigEj4p0lzsMDyc1zVsJDLrivB58tgg3emX0eEA==} 292 | dev: true 293 | 294 | /@swc/helpers@0.5.2: 295 | resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} 296 | dependencies: 297 | tslib: 2.6.2 298 | dev: false 299 | 300 | /@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.1): 301 | resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==} 302 | peerDependencies: 303 | tailwindcss: '>=3.2.0' 304 | dependencies: 305 | tailwindcss: 3.4.1 306 | dev: true 307 | 308 | /@types/json5@0.0.29: 309 | resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} 310 | dev: true 311 | 312 | /@types/node@20.11.19: 313 | resolution: {integrity: sha512-7xMnVEcZFu0DikYjWOlRq7NTPETrm7teqUT2WkQjrTIkEgUyyGdWsj/Zg8bEJt5TNklzbPD1X3fqfsHw3SpapQ==} 314 | dependencies: 315 | undici-types: 5.26.5 316 | dev: true 317 | 318 | /@types/prop-types@15.7.11: 319 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} 320 | dev: true 321 | 322 | /@types/react-dom@18.2.19: 323 | resolution: {integrity: sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==} 324 | dependencies: 325 | '@types/react': 18.2.56 326 | dev: true 327 | 328 | /@types/react@18.2.56: 329 | resolution: {integrity: sha512-NpwHDMkS/EFZF2dONFQHgkPRwhvgq/OAvIaGQzxGSBmaeR++kTg6njr15Vatz0/2VcCEwJQFi6Jf4Q0qBu0rLA==} 330 | dependencies: 331 | '@types/prop-types': 15.7.11 332 | '@types/scheduler': 0.16.8 333 | csstype: 3.1.3 334 | dev: true 335 | 336 | /@types/scheduler@0.16.8: 337 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} 338 | dev: true 339 | 340 | /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.3.3): 341 | resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} 342 | engines: {node: ^16.0.0 || >=18.0.0} 343 | peerDependencies: 344 | eslint: ^7.0.0 || ^8.0.0 345 | typescript: '*' 346 | peerDependenciesMeta: 347 | typescript: 348 | optional: true 349 | dependencies: 350 | '@typescript-eslint/scope-manager': 6.21.0 351 | '@typescript-eslint/types': 6.21.0 352 | '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) 353 | '@typescript-eslint/visitor-keys': 6.21.0 354 | debug: 4.3.4 355 | eslint: 8.56.0 356 | typescript: 5.3.3 357 | transitivePeerDependencies: 358 | - supports-color 359 | dev: true 360 | 361 | /@typescript-eslint/scope-manager@6.21.0: 362 | resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} 363 | engines: {node: ^16.0.0 || >=18.0.0} 364 | dependencies: 365 | '@typescript-eslint/types': 6.21.0 366 | '@typescript-eslint/visitor-keys': 6.21.0 367 | dev: true 368 | 369 | /@typescript-eslint/types@6.21.0: 370 | resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} 371 | engines: {node: ^16.0.0 || >=18.0.0} 372 | dev: true 373 | 374 | /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3): 375 | resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} 376 | engines: {node: ^16.0.0 || >=18.0.0} 377 | peerDependencies: 378 | typescript: '*' 379 | peerDependenciesMeta: 380 | typescript: 381 | optional: true 382 | dependencies: 383 | '@typescript-eslint/types': 6.21.0 384 | '@typescript-eslint/visitor-keys': 6.21.0 385 | debug: 4.3.4 386 | globby: 11.1.0 387 | is-glob: 4.0.3 388 | minimatch: 9.0.3 389 | semver: 7.6.0 390 | ts-api-utils: 1.2.1(typescript@5.3.3) 391 | typescript: 5.3.3 392 | transitivePeerDependencies: 393 | - supports-color 394 | dev: true 395 | 396 | /@typescript-eslint/visitor-keys@6.21.0: 397 | resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} 398 | engines: {node: ^16.0.0 || >=18.0.0} 399 | dependencies: 400 | '@typescript-eslint/types': 6.21.0 401 | eslint-visitor-keys: 3.4.3 402 | dev: true 403 | 404 | /@ungap/structured-clone@1.2.0: 405 | resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} 406 | dev: true 407 | 408 | /acorn-jsx@5.3.2(acorn@8.11.3): 409 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 410 | peerDependencies: 411 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 412 | dependencies: 413 | acorn: 8.11.3 414 | dev: true 415 | 416 | /acorn@8.11.3: 417 | resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} 418 | engines: {node: '>=0.4.0'} 419 | hasBin: true 420 | dev: true 421 | 422 | /ajv@6.12.6: 423 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 424 | dependencies: 425 | fast-deep-equal: 3.1.3 426 | fast-json-stable-stringify: 2.1.0 427 | json-schema-traverse: 0.4.1 428 | uri-js: 4.4.1 429 | dev: true 430 | 431 | /ansi-regex@5.0.1: 432 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 433 | engines: {node: '>=8'} 434 | 435 | /ansi-regex@6.0.1: 436 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 437 | engines: {node: '>=12'} 438 | 439 | /ansi-styles@4.3.0: 440 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 441 | engines: {node: '>=8'} 442 | dependencies: 443 | color-convert: 2.0.1 444 | 445 | /ansi-styles@6.2.1: 446 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 447 | engines: {node: '>=12'} 448 | 449 | /any-promise@1.3.0: 450 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 451 | 452 | /anymatch@3.1.3: 453 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 454 | engines: {node: '>= 8'} 455 | dependencies: 456 | normalize-path: 3.0.0 457 | picomatch: 2.3.1 458 | 459 | /arg@5.0.2: 460 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 461 | 462 | /argparse@2.0.1: 463 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 464 | dev: true 465 | 466 | /aria-query@5.3.0: 467 | resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} 468 | dependencies: 469 | dequal: 2.0.3 470 | dev: true 471 | 472 | /array-buffer-byte-length@1.0.1: 473 | resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} 474 | engines: {node: '>= 0.4'} 475 | dependencies: 476 | call-bind: 1.0.7 477 | is-array-buffer: 3.0.4 478 | dev: true 479 | 480 | /array-includes@3.1.7: 481 | resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} 482 | engines: {node: '>= 0.4'} 483 | dependencies: 484 | call-bind: 1.0.7 485 | define-properties: 1.2.1 486 | es-abstract: 1.22.4 487 | get-intrinsic: 1.2.4 488 | is-string: 1.0.7 489 | dev: true 490 | 491 | /array-union@2.1.0: 492 | resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} 493 | engines: {node: '>=8'} 494 | dev: true 495 | 496 | /array.prototype.filter@1.0.3: 497 | resolution: {integrity: sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==} 498 | engines: {node: '>= 0.4'} 499 | dependencies: 500 | call-bind: 1.0.7 501 | define-properties: 1.2.1 502 | es-abstract: 1.22.4 503 | es-array-method-boxes-properly: 1.0.0 504 | is-string: 1.0.7 505 | dev: true 506 | 507 | /array.prototype.findlastindex@1.2.4: 508 | resolution: {integrity: sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==} 509 | engines: {node: '>= 0.4'} 510 | dependencies: 511 | call-bind: 1.0.7 512 | define-properties: 1.2.1 513 | es-abstract: 1.22.4 514 | es-errors: 1.3.0 515 | es-shim-unscopables: 1.0.2 516 | dev: true 517 | 518 | /array.prototype.flat@1.3.2: 519 | resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} 520 | engines: {node: '>= 0.4'} 521 | dependencies: 522 | call-bind: 1.0.7 523 | define-properties: 1.2.1 524 | es-abstract: 1.22.4 525 | es-shim-unscopables: 1.0.2 526 | dev: true 527 | 528 | /array.prototype.flatmap@1.3.2: 529 | resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} 530 | engines: {node: '>= 0.4'} 531 | dependencies: 532 | call-bind: 1.0.7 533 | define-properties: 1.2.1 534 | es-abstract: 1.22.4 535 | es-shim-unscopables: 1.0.2 536 | dev: true 537 | 538 | /array.prototype.tosorted@1.1.3: 539 | resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} 540 | dependencies: 541 | call-bind: 1.0.7 542 | define-properties: 1.2.1 543 | es-abstract: 1.22.4 544 | es-errors: 1.3.0 545 | es-shim-unscopables: 1.0.2 546 | dev: true 547 | 548 | /arraybuffer.prototype.slice@1.0.3: 549 | resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} 550 | engines: {node: '>= 0.4'} 551 | dependencies: 552 | array-buffer-byte-length: 1.0.1 553 | call-bind: 1.0.7 554 | define-properties: 1.2.1 555 | es-abstract: 1.22.4 556 | es-errors: 1.3.0 557 | get-intrinsic: 1.2.4 558 | is-array-buffer: 3.0.4 559 | is-shared-array-buffer: 1.0.2 560 | dev: true 561 | 562 | /ast-types-flow@0.0.8: 563 | resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} 564 | dev: true 565 | 566 | /asynciterator.prototype@1.0.0: 567 | resolution: {integrity: sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg==} 568 | dependencies: 569 | has-symbols: 1.0.3 570 | dev: true 571 | 572 | /autoprefixer@10.4.17(postcss@8.4.35): 573 | resolution: {integrity: sha512-/cpVNRLSfhOtcGflT13P2794gVSgmPgTR+erw5ifnMLZb0UnSlkK4tquLmkd3BhA+nLo5tX8Cu0upUsGKvKbmg==} 574 | engines: {node: ^10 || ^12 || >=14} 575 | hasBin: true 576 | peerDependencies: 577 | postcss: ^8.1.0 578 | dependencies: 579 | browserslist: 4.23.0 580 | caniuse-lite: 1.0.30001588 581 | fraction.js: 4.3.7 582 | normalize-range: 0.1.2 583 | picocolors: 1.0.0 584 | postcss: 8.4.35 585 | postcss-value-parser: 4.2.0 586 | dev: true 587 | 588 | /available-typed-arrays@1.0.6: 589 | resolution: {integrity: sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==} 590 | engines: {node: '>= 0.4'} 591 | dev: true 592 | 593 | /axe-core@4.7.0: 594 | resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} 595 | engines: {node: '>=4'} 596 | dev: true 597 | 598 | /axobject-query@3.2.1: 599 | resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} 600 | dependencies: 601 | dequal: 2.0.3 602 | dev: true 603 | 604 | /balanced-match@1.0.2: 605 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 606 | 607 | /binary-extensions@2.2.0: 608 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 609 | engines: {node: '>=8'} 610 | 611 | /brace-expansion@1.1.11: 612 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 613 | dependencies: 614 | balanced-match: 1.0.2 615 | concat-map: 0.0.1 616 | dev: true 617 | 618 | /brace-expansion@2.0.1: 619 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 620 | dependencies: 621 | balanced-match: 1.0.2 622 | 623 | /braces@3.0.2: 624 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 625 | engines: {node: '>=8'} 626 | dependencies: 627 | fill-range: 7.0.1 628 | 629 | /browserslist@4.23.0: 630 | resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} 631 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 632 | hasBin: true 633 | dependencies: 634 | caniuse-lite: 1.0.30001588 635 | electron-to-chromium: 1.4.673 636 | node-releases: 2.0.14 637 | update-browserslist-db: 1.0.13(browserslist@4.23.0) 638 | dev: true 639 | 640 | /busboy@1.6.0: 641 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 642 | engines: {node: '>=10.16.0'} 643 | dependencies: 644 | streamsearch: 1.1.0 645 | dev: false 646 | 647 | /call-bind@1.0.7: 648 | resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 649 | engines: {node: '>= 0.4'} 650 | dependencies: 651 | es-define-property: 1.0.0 652 | es-errors: 1.3.0 653 | function-bind: 1.1.2 654 | get-intrinsic: 1.2.4 655 | set-function-length: 1.2.1 656 | dev: true 657 | 658 | /callsites@3.1.0: 659 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 660 | engines: {node: '>=6'} 661 | dev: true 662 | 663 | /camelcase-css@2.0.1: 664 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 665 | engines: {node: '>= 6'} 666 | 667 | /caniuse-lite@1.0.30001588: 668 | resolution: {integrity: sha512-+hVY9jE44uKLkH0SrUTqxjxqNTOWHsbnQDIKjwkZ3lNTzUUVdBLBGXtj/q5Mp5u98r3droaZAewQuEDzjQdZlQ==} 669 | 670 | /chalk@4.1.2: 671 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 672 | engines: {node: '>=10'} 673 | dependencies: 674 | ansi-styles: 4.3.0 675 | supports-color: 7.2.0 676 | dev: true 677 | 678 | /chokidar@3.6.0: 679 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 680 | engines: {node: '>= 8.10.0'} 681 | dependencies: 682 | anymatch: 3.1.3 683 | braces: 3.0.2 684 | glob-parent: 5.1.2 685 | is-binary-path: 2.1.0 686 | is-glob: 4.0.3 687 | normalize-path: 3.0.0 688 | readdirp: 3.6.0 689 | optionalDependencies: 690 | fsevents: 2.3.3 691 | 692 | /class-variance-authority@0.7.0: 693 | resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} 694 | dependencies: 695 | clsx: 2.0.0 696 | dev: false 697 | 698 | /client-only@0.0.1: 699 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 700 | dev: false 701 | 702 | /clsx@2.0.0: 703 | resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} 704 | engines: {node: '>=6'} 705 | dev: false 706 | 707 | /clsx@2.1.0: 708 | resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} 709 | engines: {node: '>=6'} 710 | dev: false 711 | 712 | /color-convert@2.0.1: 713 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 714 | engines: {node: '>=7.0.0'} 715 | dependencies: 716 | color-name: 1.1.4 717 | 718 | /color-name@1.1.4: 719 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 720 | 721 | /commander@4.1.1: 722 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 723 | engines: {node: '>= 6'} 724 | 725 | /concat-map@0.0.1: 726 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 727 | dev: true 728 | 729 | /cross-spawn@7.0.3: 730 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 731 | engines: {node: '>= 8'} 732 | dependencies: 733 | path-key: 3.1.1 734 | shebang-command: 2.0.0 735 | which: 2.0.2 736 | 737 | /cssesc@3.0.0: 738 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 739 | engines: {node: '>=4'} 740 | hasBin: true 741 | 742 | /csstype@3.1.3: 743 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 744 | dev: true 745 | 746 | /damerau-levenshtein@1.0.8: 747 | resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} 748 | dev: true 749 | 750 | /debug@3.2.7: 751 | resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} 752 | peerDependencies: 753 | supports-color: '*' 754 | peerDependenciesMeta: 755 | supports-color: 756 | optional: true 757 | dependencies: 758 | ms: 2.1.3 759 | dev: true 760 | 761 | /debug@4.3.4: 762 | resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} 763 | engines: {node: '>=6.0'} 764 | peerDependencies: 765 | supports-color: '*' 766 | peerDependenciesMeta: 767 | supports-color: 768 | optional: true 769 | dependencies: 770 | ms: 2.1.2 771 | dev: true 772 | 773 | /deep-is@0.1.4: 774 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 775 | dev: true 776 | 777 | /define-data-property@1.1.4: 778 | resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 779 | engines: {node: '>= 0.4'} 780 | dependencies: 781 | es-define-property: 1.0.0 782 | es-errors: 1.3.0 783 | gopd: 1.0.1 784 | dev: true 785 | 786 | /define-properties@1.2.1: 787 | resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} 788 | engines: {node: '>= 0.4'} 789 | dependencies: 790 | define-data-property: 1.1.4 791 | has-property-descriptors: 1.0.2 792 | object-keys: 1.1.1 793 | dev: true 794 | 795 | /dequal@2.0.3: 796 | resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} 797 | engines: {node: '>=6'} 798 | dev: true 799 | 800 | /didyoumean@1.2.2: 801 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 802 | 803 | /dir-glob@3.0.1: 804 | resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 805 | engines: {node: '>=8'} 806 | dependencies: 807 | path-type: 4.0.0 808 | dev: true 809 | 810 | /dlv@1.1.3: 811 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 812 | 813 | /doctrine@2.1.0: 814 | resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} 815 | engines: {node: '>=0.10.0'} 816 | dependencies: 817 | esutils: 2.0.3 818 | dev: true 819 | 820 | /doctrine@3.0.0: 821 | resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} 822 | engines: {node: '>=6.0.0'} 823 | dependencies: 824 | esutils: 2.0.3 825 | dev: true 826 | 827 | /eastasianwidth@0.2.0: 828 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 829 | 830 | /electron-to-chromium@1.4.673: 831 | resolution: {integrity: sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==} 832 | dev: true 833 | 834 | /emoji-regex@8.0.0: 835 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 836 | 837 | /emoji-regex@9.2.2: 838 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 839 | 840 | /enhanced-resolve@5.15.0: 841 | resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} 842 | engines: {node: '>=10.13.0'} 843 | dependencies: 844 | graceful-fs: 4.2.11 845 | tapable: 2.2.1 846 | dev: true 847 | 848 | /es-abstract@1.22.4: 849 | resolution: {integrity: sha512-vZYJlk2u6qHYxBOTjAeg7qUxHdNfih64Uu2J8QqWgXZ2cri0ZpJAkzDUK/q593+mvKwlxyaxr6F1Q+3LKoQRgg==} 850 | engines: {node: '>= 0.4'} 851 | dependencies: 852 | array-buffer-byte-length: 1.0.1 853 | arraybuffer.prototype.slice: 1.0.3 854 | available-typed-arrays: 1.0.6 855 | call-bind: 1.0.7 856 | es-define-property: 1.0.0 857 | es-errors: 1.3.0 858 | es-set-tostringtag: 2.0.2 859 | es-to-primitive: 1.2.1 860 | function.prototype.name: 1.1.6 861 | get-intrinsic: 1.2.4 862 | get-symbol-description: 1.0.2 863 | globalthis: 1.0.3 864 | gopd: 1.0.1 865 | has-property-descriptors: 1.0.2 866 | has-proto: 1.0.1 867 | has-symbols: 1.0.3 868 | hasown: 2.0.1 869 | internal-slot: 1.0.7 870 | is-array-buffer: 3.0.4 871 | is-callable: 1.2.7 872 | is-negative-zero: 2.0.2 873 | is-regex: 1.1.4 874 | is-shared-array-buffer: 1.0.2 875 | is-string: 1.0.7 876 | is-typed-array: 1.1.13 877 | is-weakref: 1.0.2 878 | object-inspect: 1.13.1 879 | object-keys: 1.1.1 880 | object.assign: 4.1.5 881 | regexp.prototype.flags: 1.5.2 882 | safe-array-concat: 1.1.0 883 | safe-regex-test: 1.0.3 884 | string.prototype.trim: 1.2.8 885 | string.prototype.trimend: 1.0.7 886 | string.prototype.trimstart: 1.0.7 887 | typed-array-buffer: 1.0.1 888 | typed-array-byte-length: 1.0.0 889 | typed-array-byte-offset: 1.0.1 890 | typed-array-length: 1.0.4 891 | unbox-primitive: 1.0.2 892 | which-typed-array: 1.1.14 893 | dev: true 894 | 895 | /es-array-method-boxes-properly@1.0.0: 896 | resolution: {integrity: sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==} 897 | dev: true 898 | 899 | /es-define-property@1.0.0: 900 | resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} 901 | engines: {node: '>= 0.4'} 902 | dependencies: 903 | get-intrinsic: 1.2.4 904 | dev: true 905 | 906 | /es-errors@1.3.0: 907 | resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} 908 | engines: {node: '>= 0.4'} 909 | dev: true 910 | 911 | /es-iterator-helpers@1.0.17: 912 | resolution: {integrity: sha512-lh7BsUqelv4KUbR5a/ZTaGGIMLCjPGPqJ6q+Oq24YP0RdyptX1uzm4vvaqzk7Zx3bpl/76YLTTDj9L7uYQ92oQ==} 913 | engines: {node: '>= 0.4'} 914 | dependencies: 915 | asynciterator.prototype: 1.0.0 916 | call-bind: 1.0.7 917 | define-properties: 1.2.1 918 | es-abstract: 1.22.4 919 | es-errors: 1.3.0 920 | es-set-tostringtag: 2.0.2 921 | function-bind: 1.1.2 922 | get-intrinsic: 1.2.4 923 | globalthis: 1.0.3 924 | has-property-descriptors: 1.0.2 925 | has-proto: 1.0.1 926 | has-symbols: 1.0.3 927 | internal-slot: 1.0.7 928 | iterator.prototype: 1.1.2 929 | safe-array-concat: 1.1.0 930 | dev: true 931 | 932 | /es-set-tostringtag@2.0.2: 933 | resolution: {integrity: sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==} 934 | engines: {node: '>= 0.4'} 935 | dependencies: 936 | get-intrinsic: 1.2.4 937 | has-tostringtag: 1.0.2 938 | hasown: 2.0.1 939 | dev: true 940 | 941 | /es-shim-unscopables@1.0.2: 942 | resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} 943 | dependencies: 944 | hasown: 2.0.1 945 | dev: true 946 | 947 | /es-to-primitive@1.2.1: 948 | resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} 949 | engines: {node: '>= 0.4'} 950 | dependencies: 951 | is-callable: 1.2.7 952 | is-date-object: 1.0.5 953 | is-symbol: 1.0.4 954 | dev: true 955 | 956 | /escalade@3.1.2: 957 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 958 | engines: {node: '>=6'} 959 | dev: true 960 | 961 | /escape-string-regexp@4.0.0: 962 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 963 | engines: {node: '>=10'} 964 | dev: true 965 | 966 | /eslint-config-next@14.1.0(eslint@8.56.0)(typescript@5.3.3): 967 | resolution: {integrity: sha512-SBX2ed7DoRFXC6CQSLc/SbLY9Ut6HxNB2wPTcoIWjUMd7aF7O/SIE7111L8FdZ9TXsNV4pulUDnfthpyPtbFUg==} 968 | peerDependencies: 969 | eslint: ^7.23.0 || ^8.0.0 970 | typescript: '>=3.3.1' 971 | peerDependenciesMeta: 972 | typescript: 973 | optional: true 974 | dependencies: 975 | '@next/eslint-plugin-next': 14.1.0 976 | '@rushstack/eslint-patch': 1.7.2 977 | '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) 978 | eslint: 8.56.0 979 | eslint-import-resolver-node: 0.3.9 980 | eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) 981 | eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) 982 | eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0) 983 | eslint-plugin-react: 7.33.2(eslint@8.56.0) 984 | eslint-plugin-react-hooks: 4.6.0(eslint@8.56.0) 985 | typescript: 5.3.3 986 | transitivePeerDependencies: 987 | - eslint-import-resolver-webpack 988 | - supports-color 989 | dev: true 990 | 991 | /eslint-import-resolver-node@0.3.9: 992 | resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} 993 | dependencies: 994 | debug: 3.2.7 995 | is-core-module: 2.13.1 996 | resolve: 1.22.8 997 | transitivePeerDependencies: 998 | - supports-color 999 | dev: true 1000 | 1001 | /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0): 1002 | resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} 1003 | engines: {node: ^14.18.0 || >=16.0.0} 1004 | peerDependencies: 1005 | eslint: '*' 1006 | eslint-plugin-import: '*' 1007 | dependencies: 1008 | debug: 4.3.4 1009 | enhanced-resolve: 5.15.0 1010 | eslint: 8.56.0 1011 | eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) 1012 | eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) 1013 | fast-glob: 3.3.2 1014 | get-tsconfig: 4.7.2 1015 | is-core-module: 2.13.1 1016 | is-glob: 4.0.3 1017 | transitivePeerDependencies: 1018 | - '@typescript-eslint/parser' 1019 | - eslint-import-resolver-node 1020 | - eslint-import-resolver-webpack 1021 | - supports-color 1022 | dev: true 1023 | 1024 | /eslint-module-utils@2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): 1025 | resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} 1026 | engines: {node: '>=4'} 1027 | peerDependencies: 1028 | '@typescript-eslint/parser': '*' 1029 | eslint: '*' 1030 | eslint-import-resolver-node: '*' 1031 | eslint-import-resolver-typescript: '*' 1032 | eslint-import-resolver-webpack: '*' 1033 | peerDependenciesMeta: 1034 | '@typescript-eslint/parser': 1035 | optional: true 1036 | eslint: 1037 | optional: true 1038 | eslint-import-resolver-node: 1039 | optional: true 1040 | eslint-import-resolver-typescript: 1041 | optional: true 1042 | eslint-import-resolver-webpack: 1043 | optional: true 1044 | dependencies: 1045 | '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) 1046 | debug: 3.2.7 1047 | eslint: 8.56.0 1048 | eslint-import-resolver-node: 0.3.9 1049 | eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1)(eslint@8.56.0) 1050 | transitivePeerDependencies: 1051 | - supports-color 1052 | dev: true 1053 | 1054 | /eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0): 1055 | resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} 1056 | engines: {node: '>=4'} 1057 | peerDependencies: 1058 | '@typescript-eslint/parser': '*' 1059 | eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 1060 | peerDependenciesMeta: 1061 | '@typescript-eslint/parser': 1062 | optional: true 1063 | dependencies: 1064 | '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.3.3) 1065 | array-includes: 3.1.7 1066 | array.prototype.findlastindex: 1.2.4 1067 | array.prototype.flat: 1.3.2 1068 | array.prototype.flatmap: 1.3.2 1069 | debug: 3.2.7 1070 | doctrine: 2.1.0 1071 | eslint: 8.56.0 1072 | eslint-import-resolver-node: 0.3.9 1073 | eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1)(eslint@8.56.0) 1074 | hasown: 2.0.1 1075 | is-core-module: 2.13.1 1076 | is-glob: 4.0.3 1077 | minimatch: 3.1.2 1078 | object.fromentries: 2.0.7 1079 | object.groupby: 1.0.2 1080 | object.values: 1.1.7 1081 | semver: 6.3.1 1082 | tsconfig-paths: 3.15.0 1083 | transitivePeerDependencies: 1084 | - eslint-import-resolver-typescript 1085 | - eslint-import-resolver-webpack 1086 | - supports-color 1087 | dev: true 1088 | 1089 | /eslint-plugin-jsx-a11y@6.8.0(eslint@8.56.0): 1090 | resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} 1091 | engines: {node: '>=4.0'} 1092 | peerDependencies: 1093 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 1094 | dependencies: 1095 | '@babel/runtime': 7.23.9 1096 | aria-query: 5.3.0 1097 | array-includes: 3.1.7 1098 | array.prototype.flatmap: 1.3.2 1099 | ast-types-flow: 0.0.8 1100 | axe-core: 4.7.0 1101 | axobject-query: 3.2.1 1102 | damerau-levenshtein: 1.0.8 1103 | emoji-regex: 9.2.2 1104 | es-iterator-helpers: 1.0.17 1105 | eslint: 8.56.0 1106 | hasown: 2.0.1 1107 | jsx-ast-utils: 3.3.5 1108 | language-tags: 1.0.9 1109 | minimatch: 3.1.2 1110 | object.entries: 1.1.7 1111 | object.fromentries: 2.0.7 1112 | dev: true 1113 | 1114 | /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0): 1115 | resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==} 1116 | engines: {node: '>=10'} 1117 | peerDependencies: 1118 | eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 1119 | dependencies: 1120 | eslint: 8.56.0 1121 | dev: true 1122 | 1123 | /eslint-plugin-react@7.33.2(eslint@8.56.0): 1124 | resolution: {integrity: sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw==} 1125 | engines: {node: '>=4'} 1126 | peerDependencies: 1127 | eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 1128 | dependencies: 1129 | array-includes: 3.1.7 1130 | array.prototype.flatmap: 1.3.2 1131 | array.prototype.tosorted: 1.1.3 1132 | doctrine: 2.1.0 1133 | es-iterator-helpers: 1.0.17 1134 | eslint: 8.56.0 1135 | estraverse: 5.3.0 1136 | jsx-ast-utils: 3.3.5 1137 | minimatch: 3.1.2 1138 | object.entries: 1.1.7 1139 | object.fromentries: 2.0.7 1140 | object.hasown: 1.1.3 1141 | object.values: 1.1.7 1142 | prop-types: 15.8.1 1143 | resolve: 2.0.0-next.5 1144 | semver: 6.3.1 1145 | string.prototype.matchall: 4.0.10 1146 | dev: true 1147 | 1148 | /eslint-scope@7.2.2: 1149 | resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} 1150 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1151 | dependencies: 1152 | esrecurse: 4.3.0 1153 | estraverse: 5.3.0 1154 | dev: true 1155 | 1156 | /eslint-visitor-keys@3.4.3: 1157 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 1158 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1159 | dev: true 1160 | 1161 | /eslint@8.56.0: 1162 | resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} 1163 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1164 | hasBin: true 1165 | dependencies: 1166 | '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) 1167 | '@eslint-community/regexpp': 4.10.0 1168 | '@eslint/eslintrc': 2.1.4 1169 | '@eslint/js': 8.56.0 1170 | '@humanwhocodes/config-array': 0.11.14 1171 | '@humanwhocodes/module-importer': 1.0.1 1172 | '@nodelib/fs.walk': 1.2.8 1173 | '@ungap/structured-clone': 1.2.0 1174 | ajv: 6.12.6 1175 | chalk: 4.1.2 1176 | cross-spawn: 7.0.3 1177 | debug: 4.3.4 1178 | doctrine: 3.0.0 1179 | escape-string-regexp: 4.0.0 1180 | eslint-scope: 7.2.2 1181 | eslint-visitor-keys: 3.4.3 1182 | espree: 9.6.1 1183 | esquery: 1.5.0 1184 | esutils: 2.0.3 1185 | fast-deep-equal: 3.1.3 1186 | file-entry-cache: 6.0.1 1187 | find-up: 5.0.0 1188 | glob-parent: 6.0.2 1189 | globals: 13.24.0 1190 | graphemer: 1.4.0 1191 | ignore: 5.3.1 1192 | imurmurhash: 0.1.4 1193 | is-glob: 4.0.3 1194 | is-path-inside: 3.0.3 1195 | js-yaml: 4.1.0 1196 | json-stable-stringify-without-jsonify: 1.0.1 1197 | levn: 0.4.1 1198 | lodash.merge: 4.6.2 1199 | minimatch: 3.1.2 1200 | natural-compare: 1.4.0 1201 | optionator: 0.9.3 1202 | strip-ansi: 6.0.1 1203 | text-table: 0.2.0 1204 | transitivePeerDependencies: 1205 | - supports-color 1206 | dev: true 1207 | 1208 | /espree@9.6.1: 1209 | resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} 1210 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 1211 | dependencies: 1212 | acorn: 8.11.3 1213 | acorn-jsx: 5.3.2(acorn@8.11.3) 1214 | eslint-visitor-keys: 3.4.3 1215 | dev: true 1216 | 1217 | /esquery@1.5.0: 1218 | resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} 1219 | engines: {node: '>=0.10'} 1220 | dependencies: 1221 | estraverse: 5.3.0 1222 | dev: true 1223 | 1224 | /esrecurse@4.3.0: 1225 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 1226 | engines: {node: '>=4.0'} 1227 | dependencies: 1228 | estraverse: 5.3.0 1229 | dev: true 1230 | 1231 | /estraverse@5.3.0: 1232 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 1233 | engines: {node: '>=4.0'} 1234 | dev: true 1235 | 1236 | /esutils@2.0.3: 1237 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 1238 | engines: {node: '>=0.10.0'} 1239 | dev: true 1240 | 1241 | /fast-deep-equal@3.1.3: 1242 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 1243 | dev: true 1244 | 1245 | /fast-glob@3.3.2: 1246 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1247 | engines: {node: '>=8.6.0'} 1248 | dependencies: 1249 | '@nodelib/fs.stat': 2.0.5 1250 | '@nodelib/fs.walk': 1.2.8 1251 | glob-parent: 5.1.2 1252 | merge2: 1.4.1 1253 | micromatch: 4.0.5 1254 | 1255 | /fast-json-stable-stringify@2.1.0: 1256 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 1257 | dev: true 1258 | 1259 | /fast-levenshtein@2.0.6: 1260 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 1261 | dev: true 1262 | 1263 | /fastq@1.17.1: 1264 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 1265 | dependencies: 1266 | reusify: 1.0.4 1267 | 1268 | /file-entry-cache@6.0.1: 1269 | resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} 1270 | engines: {node: ^10.12.0 || >=12.0.0} 1271 | dependencies: 1272 | flat-cache: 3.2.0 1273 | dev: true 1274 | 1275 | /fill-range@7.0.1: 1276 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1277 | engines: {node: '>=8'} 1278 | dependencies: 1279 | to-regex-range: 5.0.1 1280 | 1281 | /find-up@5.0.0: 1282 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 1283 | engines: {node: '>=10'} 1284 | dependencies: 1285 | locate-path: 6.0.0 1286 | path-exists: 4.0.0 1287 | dev: true 1288 | 1289 | /flat-cache@3.2.0: 1290 | resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} 1291 | engines: {node: ^10.12.0 || >=12.0.0} 1292 | dependencies: 1293 | flatted: 3.2.9 1294 | keyv: 4.5.4 1295 | rimraf: 3.0.2 1296 | dev: true 1297 | 1298 | /flatted@3.2.9: 1299 | resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} 1300 | dev: true 1301 | 1302 | /for-each@0.3.3: 1303 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 1304 | dependencies: 1305 | is-callable: 1.2.7 1306 | dev: true 1307 | 1308 | /foreground-child@3.1.1: 1309 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1310 | engines: {node: '>=14'} 1311 | dependencies: 1312 | cross-spawn: 7.0.3 1313 | signal-exit: 4.1.0 1314 | 1315 | /fraction.js@4.3.7: 1316 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 1317 | dev: true 1318 | 1319 | /fs.realpath@1.0.0: 1320 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 1321 | dev: true 1322 | 1323 | /fsevents@2.3.3: 1324 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1325 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1326 | os: [darwin] 1327 | requiresBuild: true 1328 | optional: true 1329 | 1330 | /function-bind@1.1.2: 1331 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1332 | 1333 | /function.prototype.name@1.1.6: 1334 | resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} 1335 | engines: {node: '>= 0.4'} 1336 | dependencies: 1337 | call-bind: 1.0.7 1338 | define-properties: 1.2.1 1339 | es-abstract: 1.22.4 1340 | functions-have-names: 1.2.3 1341 | dev: true 1342 | 1343 | /functions-have-names@1.2.3: 1344 | resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} 1345 | dev: true 1346 | 1347 | /get-intrinsic@1.2.4: 1348 | resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} 1349 | engines: {node: '>= 0.4'} 1350 | dependencies: 1351 | es-errors: 1.3.0 1352 | function-bind: 1.1.2 1353 | has-proto: 1.0.1 1354 | has-symbols: 1.0.3 1355 | hasown: 2.0.1 1356 | dev: true 1357 | 1358 | /get-symbol-description@1.0.2: 1359 | resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} 1360 | engines: {node: '>= 0.4'} 1361 | dependencies: 1362 | call-bind: 1.0.7 1363 | es-errors: 1.3.0 1364 | get-intrinsic: 1.2.4 1365 | dev: true 1366 | 1367 | /get-tsconfig@4.7.2: 1368 | resolution: {integrity: sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==} 1369 | dependencies: 1370 | resolve-pkg-maps: 1.0.0 1371 | dev: true 1372 | 1373 | /glob-parent@5.1.2: 1374 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1375 | engines: {node: '>= 6'} 1376 | dependencies: 1377 | is-glob: 4.0.3 1378 | 1379 | /glob-parent@6.0.2: 1380 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1381 | engines: {node: '>=10.13.0'} 1382 | dependencies: 1383 | is-glob: 4.0.3 1384 | 1385 | /glob@10.3.10: 1386 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 1387 | engines: {node: '>=16 || 14 >=14.17'} 1388 | hasBin: true 1389 | dependencies: 1390 | foreground-child: 3.1.1 1391 | jackspeak: 2.3.6 1392 | minimatch: 9.0.3 1393 | minipass: 7.0.4 1394 | path-scurry: 1.10.1 1395 | 1396 | /glob@7.2.3: 1397 | resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} 1398 | dependencies: 1399 | fs.realpath: 1.0.0 1400 | inflight: 1.0.6 1401 | inherits: 2.0.4 1402 | minimatch: 3.1.2 1403 | once: 1.4.0 1404 | path-is-absolute: 1.0.1 1405 | dev: true 1406 | 1407 | /globals@13.24.0: 1408 | resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} 1409 | engines: {node: '>=8'} 1410 | dependencies: 1411 | type-fest: 0.20.2 1412 | dev: true 1413 | 1414 | /globalthis@1.0.3: 1415 | resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} 1416 | engines: {node: '>= 0.4'} 1417 | dependencies: 1418 | define-properties: 1.2.1 1419 | dev: true 1420 | 1421 | /globby@11.1.0: 1422 | resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} 1423 | engines: {node: '>=10'} 1424 | dependencies: 1425 | array-union: 2.1.0 1426 | dir-glob: 3.0.1 1427 | fast-glob: 3.3.2 1428 | ignore: 5.3.1 1429 | merge2: 1.4.1 1430 | slash: 3.0.0 1431 | dev: true 1432 | 1433 | /gopd@1.0.1: 1434 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 1435 | dependencies: 1436 | get-intrinsic: 1.2.4 1437 | dev: true 1438 | 1439 | /graceful-fs@4.2.11: 1440 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1441 | 1442 | /graphemer@1.4.0: 1443 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 1444 | dev: true 1445 | 1446 | /has-bigints@1.0.2: 1447 | resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} 1448 | dev: true 1449 | 1450 | /has-flag@4.0.0: 1451 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 1452 | engines: {node: '>=8'} 1453 | dev: true 1454 | 1455 | /has-property-descriptors@1.0.2: 1456 | resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} 1457 | dependencies: 1458 | es-define-property: 1.0.0 1459 | dev: true 1460 | 1461 | /has-proto@1.0.1: 1462 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1463 | engines: {node: '>= 0.4'} 1464 | dev: true 1465 | 1466 | /has-symbols@1.0.3: 1467 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1468 | engines: {node: '>= 0.4'} 1469 | dev: true 1470 | 1471 | /has-tostringtag@1.0.2: 1472 | resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} 1473 | engines: {node: '>= 0.4'} 1474 | dependencies: 1475 | has-symbols: 1.0.3 1476 | dev: true 1477 | 1478 | /hasown@2.0.1: 1479 | resolution: {integrity: sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==} 1480 | engines: {node: '>= 0.4'} 1481 | dependencies: 1482 | function-bind: 1.1.2 1483 | 1484 | /ignore@5.3.1: 1485 | resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} 1486 | engines: {node: '>= 4'} 1487 | dev: true 1488 | 1489 | /import-fresh@3.3.0: 1490 | resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 1491 | engines: {node: '>=6'} 1492 | dependencies: 1493 | parent-module: 1.0.1 1494 | resolve-from: 4.0.0 1495 | dev: true 1496 | 1497 | /imurmurhash@0.1.4: 1498 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 1499 | engines: {node: '>=0.8.19'} 1500 | dev: true 1501 | 1502 | /inflight@1.0.6: 1503 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 1504 | dependencies: 1505 | once: 1.4.0 1506 | wrappy: 1.0.2 1507 | dev: true 1508 | 1509 | /inherits@2.0.4: 1510 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1511 | dev: true 1512 | 1513 | /internal-slot@1.0.7: 1514 | resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} 1515 | engines: {node: '>= 0.4'} 1516 | dependencies: 1517 | es-errors: 1.3.0 1518 | hasown: 2.0.1 1519 | side-channel: 1.0.5 1520 | dev: true 1521 | 1522 | /is-array-buffer@3.0.4: 1523 | resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} 1524 | engines: {node: '>= 0.4'} 1525 | dependencies: 1526 | call-bind: 1.0.7 1527 | get-intrinsic: 1.2.4 1528 | dev: true 1529 | 1530 | /is-async-function@2.0.0: 1531 | resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} 1532 | engines: {node: '>= 0.4'} 1533 | dependencies: 1534 | has-tostringtag: 1.0.2 1535 | dev: true 1536 | 1537 | /is-bigint@1.0.4: 1538 | resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} 1539 | dependencies: 1540 | has-bigints: 1.0.2 1541 | dev: true 1542 | 1543 | /is-binary-path@2.1.0: 1544 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1545 | engines: {node: '>=8'} 1546 | dependencies: 1547 | binary-extensions: 2.2.0 1548 | 1549 | /is-boolean-object@1.1.2: 1550 | resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} 1551 | engines: {node: '>= 0.4'} 1552 | dependencies: 1553 | call-bind: 1.0.7 1554 | has-tostringtag: 1.0.2 1555 | dev: true 1556 | 1557 | /is-callable@1.2.7: 1558 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1559 | engines: {node: '>= 0.4'} 1560 | dev: true 1561 | 1562 | /is-core-module@2.13.1: 1563 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1564 | dependencies: 1565 | hasown: 2.0.1 1566 | 1567 | /is-date-object@1.0.5: 1568 | resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} 1569 | engines: {node: '>= 0.4'} 1570 | dependencies: 1571 | has-tostringtag: 1.0.2 1572 | dev: true 1573 | 1574 | /is-extglob@2.1.1: 1575 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1576 | engines: {node: '>=0.10.0'} 1577 | 1578 | /is-finalizationregistry@1.0.2: 1579 | resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} 1580 | dependencies: 1581 | call-bind: 1.0.7 1582 | dev: true 1583 | 1584 | /is-fullwidth-code-point@3.0.0: 1585 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1586 | engines: {node: '>=8'} 1587 | 1588 | /is-generator-function@1.0.10: 1589 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} 1590 | engines: {node: '>= 0.4'} 1591 | dependencies: 1592 | has-tostringtag: 1.0.2 1593 | dev: true 1594 | 1595 | /is-glob@4.0.3: 1596 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1597 | engines: {node: '>=0.10.0'} 1598 | dependencies: 1599 | is-extglob: 2.1.1 1600 | 1601 | /is-map@2.0.2: 1602 | resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==} 1603 | dev: true 1604 | 1605 | /is-negative-zero@2.0.2: 1606 | resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} 1607 | engines: {node: '>= 0.4'} 1608 | dev: true 1609 | 1610 | /is-number-object@1.0.7: 1611 | resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} 1612 | engines: {node: '>= 0.4'} 1613 | dependencies: 1614 | has-tostringtag: 1.0.2 1615 | dev: true 1616 | 1617 | /is-number@7.0.0: 1618 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1619 | engines: {node: '>=0.12.0'} 1620 | 1621 | /is-path-inside@3.0.3: 1622 | resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} 1623 | engines: {node: '>=8'} 1624 | dev: true 1625 | 1626 | /is-regex@1.1.4: 1627 | resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} 1628 | engines: {node: '>= 0.4'} 1629 | dependencies: 1630 | call-bind: 1.0.7 1631 | has-tostringtag: 1.0.2 1632 | dev: true 1633 | 1634 | /is-set@2.0.2: 1635 | resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==} 1636 | dev: true 1637 | 1638 | /is-shared-array-buffer@1.0.2: 1639 | resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} 1640 | dependencies: 1641 | call-bind: 1.0.7 1642 | dev: true 1643 | 1644 | /is-string@1.0.7: 1645 | resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} 1646 | engines: {node: '>= 0.4'} 1647 | dependencies: 1648 | has-tostringtag: 1.0.2 1649 | dev: true 1650 | 1651 | /is-symbol@1.0.4: 1652 | resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} 1653 | engines: {node: '>= 0.4'} 1654 | dependencies: 1655 | has-symbols: 1.0.3 1656 | dev: true 1657 | 1658 | /is-typed-array@1.1.13: 1659 | resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} 1660 | engines: {node: '>= 0.4'} 1661 | dependencies: 1662 | which-typed-array: 1.1.14 1663 | dev: true 1664 | 1665 | /is-weakmap@2.0.1: 1666 | resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} 1667 | dev: true 1668 | 1669 | /is-weakref@1.0.2: 1670 | resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} 1671 | dependencies: 1672 | call-bind: 1.0.7 1673 | dev: true 1674 | 1675 | /is-weakset@2.0.2: 1676 | resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} 1677 | dependencies: 1678 | call-bind: 1.0.7 1679 | get-intrinsic: 1.2.4 1680 | dev: true 1681 | 1682 | /isarray@2.0.5: 1683 | resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} 1684 | dev: true 1685 | 1686 | /isexe@2.0.0: 1687 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1688 | 1689 | /iterator.prototype@1.1.2: 1690 | resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} 1691 | dependencies: 1692 | define-properties: 1.2.1 1693 | get-intrinsic: 1.2.4 1694 | has-symbols: 1.0.3 1695 | reflect.getprototypeof: 1.0.5 1696 | set-function-name: 2.0.1 1697 | dev: true 1698 | 1699 | /jackspeak@2.3.6: 1700 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1701 | engines: {node: '>=14'} 1702 | dependencies: 1703 | '@isaacs/cliui': 8.0.2 1704 | optionalDependencies: 1705 | '@pkgjs/parseargs': 0.11.0 1706 | 1707 | /jiti@1.21.0: 1708 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 1709 | hasBin: true 1710 | 1711 | /js-tokens@4.0.0: 1712 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1713 | 1714 | /js-yaml@4.1.0: 1715 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 1716 | hasBin: true 1717 | dependencies: 1718 | argparse: 2.0.1 1719 | dev: true 1720 | 1721 | /json-buffer@3.0.1: 1722 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1723 | dev: true 1724 | 1725 | /json-schema-traverse@0.4.1: 1726 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1727 | dev: true 1728 | 1729 | /json-stable-stringify-without-jsonify@1.0.1: 1730 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1731 | dev: true 1732 | 1733 | /json5@1.0.2: 1734 | resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} 1735 | hasBin: true 1736 | dependencies: 1737 | minimist: 1.2.8 1738 | dev: true 1739 | 1740 | /jsx-ast-utils@3.3.5: 1741 | resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} 1742 | engines: {node: '>=4.0'} 1743 | dependencies: 1744 | array-includes: 3.1.7 1745 | array.prototype.flat: 1.3.2 1746 | object.assign: 4.1.5 1747 | object.values: 1.1.7 1748 | dev: true 1749 | 1750 | /keyv@4.5.4: 1751 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1752 | dependencies: 1753 | json-buffer: 3.0.1 1754 | dev: true 1755 | 1756 | /language-subtag-registry@0.3.22: 1757 | resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} 1758 | dev: true 1759 | 1760 | /language-tags@1.0.9: 1761 | resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} 1762 | engines: {node: '>=0.10'} 1763 | dependencies: 1764 | language-subtag-registry: 0.3.22 1765 | dev: true 1766 | 1767 | /levn@0.4.1: 1768 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1769 | engines: {node: '>= 0.8.0'} 1770 | dependencies: 1771 | prelude-ls: 1.2.1 1772 | type-check: 0.4.0 1773 | dev: true 1774 | 1775 | /lilconfig@2.1.0: 1776 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1777 | engines: {node: '>=10'} 1778 | 1779 | /lilconfig@3.1.1: 1780 | resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} 1781 | engines: {node: '>=14'} 1782 | 1783 | /lines-and-columns@1.2.4: 1784 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1785 | 1786 | /locate-path@6.0.0: 1787 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1788 | engines: {node: '>=10'} 1789 | dependencies: 1790 | p-locate: 5.0.0 1791 | dev: true 1792 | 1793 | /lodash.merge@4.6.2: 1794 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1795 | dev: true 1796 | 1797 | /loose-envify@1.4.0: 1798 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1799 | hasBin: true 1800 | dependencies: 1801 | js-tokens: 4.0.0 1802 | 1803 | /lru-cache@10.2.0: 1804 | resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} 1805 | engines: {node: 14 || >=16.14} 1806 | 1807 | /lru-cache@6.0.0: 1808 | resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} 1809 | engines: {node: '>=10'} 1810 | dependencies: 1811 | yallist: 4.0.0 1812 | dev: true 1813 | 1814 | /lucide-react@0.331.0(react@18.2.0): 1815 | resolution: {integrity: sha512-CHFJ0ve9vaZ7bB2VRAl27SlX1ELh6pfNC0jS96qGpPEEzLkLDGq4pDBFU8RhOoRMqsjXqTzLm9U6bZ1OcIHq7Q==} 1816 | peerDependencies: 1817 | react: ^16.5.1 || ^17.0.0 || ^18.0.0 1818 | dependencies: 1819 | react: 18.2.0 1820 | dev: false 1821 | 1822 | /merge2@1.4.1: 1823 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1824 | engines: {node: '>= 8'} 1825 | 1826 | /micromatch@4.0.5: 1827 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1828 | engines: {node: '>=8.6'} 1829 | dependencies: 1830 | braces: 3.0.2 1831 | picomatch: 2.3.1 1832 | 1833 | /minimatch@3.1.2: 1834 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1835 | dependencies: 1836 | brace-expansion: 1.1.11 1837 | dev: true 1838 | 1839 | /minimatch@9.0.3: 1840 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1841 | engines: {node: '>=16 || 14 >=14.17'} 1842 | dependencies: 1843 | brace-expansion: 2.0.1 1844 | 1845 | /minimist@1.2.8: 1846 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 1847 | dev: true 1848 | 1849 | /minipass@7.0.4: 1850 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1851 | engines: {node: '>=16 || 14 >=14.17'} 1852 | 1853 | /ms@2.1.2: 1854 | resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} 1855 | dev: true 1856 | 1857 | /ms@2.1.3: 1858 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1859 | dev: true 1860 | 1861 | /mz@2.7.0: 1862 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1863 | dependencies: 1864 | any-promise: 1.3.0 1865 | object-assign: 4.1.1 1866 | thenify-all: 1.6.0 1867 | 1868 | /nanoid@3.3.7: 1869 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1870 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1871 | hasBin: true 1872 | 1873 | /natural-compare@1.4.0: 1874 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1875 | dev: true 1876 | 1877 | /next@14.1.0(react-dom@18.2.0)(react@18.2.0): 1878 | resolution: {integrity: sha512-wlzrsbfeSU48YQBjZhDzOwhWhGsy+uQycR8bHAOt1LY1bn3zZEcDyHQOEoN3aWzQ8LHCAJ1nqrWCc9XF2+O45Q==} 1879 | engines: {node: '>=18.17.0'} 1880 | hasBin: true 1881 | peerDependencies: 1882 | '@opentelemetry/api': ^1.1.0 1883 | react: ^18.2.0 1884 | react-dom: ^18.2.0 1885 | sass: ^1.3.0 1886 | peerDependenciesMeta: 1887 | '@opentelemetry/api': 1888 | optional: true 1889 | sass: 1890 | optional: true 1891 | dependencies: 1892 | '@next/env': 14.1.0 1893 | '@swc/helpers': 0.5.2 1894 | busboy: 1.6.0 1895 | caniuse-lite: 1.0.30001588 1896 | graceful-fs: 4.2.11 1897 | postcss: 8.4.31 1898 | react: 18.2.0 1899 | react-dom: 18.2.0(react@18.2.0) 1900 | styled-jsx: 5.1.1(react@18.2.0) 1901 | optionalDependencies: 1902 | '@next/swc-darwin-arm64': 14.1.0 1903 | '@next/swc-darwin-x64': 14.1.0 1904 | '@next/swc-linux-arm64-gnu': 14.1.0 1905 | '@next/swc-linux-arm64-musl': 14.1.0 1906 | '@next/swc-linux-x64-gnu': 14.1.0 1907 | '@next/swc-linux-x64-musl': 14.1.0 1908 | '@next/swc-win32-arm64-msvc': 14.1.0 1909 | '@next/swc-win32-ia32-msvc': 14.1.0 1910 | '@next/swc-win32-x64-msvc': 14.1.0 1911 | transitivePeerDependencies: 1912 | - '@babel/core' 1913 | - babel-plugin-macros 1914 | dev: false 1915 | 1916 | /node-releases@2.0.14: 1917 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 1918 | dev: true 1919 | 1920 | /normalize-path@3.0.0: 1921 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1922 | engines: {node: '>=0.10.0'} 1923 | 1924 | /normalize-range@0.1.2: 1925 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1926 | engines: {node: '>=0.10.0'} 1927 | dev: true 1928 | 1929 | /object-assign@4.1.1: 1930 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1931 | engines: {node: '>=0.10.0'} 1932 | 1933 | /object-hash@3.0.0: 1934 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1935 | engines: {node: '>= 6'} 1936 | 1937 | /object-inspect@1.13.1: 1938 | resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} 1939 | dev: true 1940 | 1941 | /object-keys@1.1.1: 1942 | resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} 1943 | engines: {node: '>= 0.4'} 1944 | dev: true 1945 | 1946 | /object.assign@4.1.5: 1947 | resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} 1948 | engines: {node: '>= 0.4'} 1949 | dependencies: 1950 | call-bind: 1.0.7 1951 | define-properties: 1.2.1 1952 | has-symbols: 1.0.3 1953 | object-keys: 1.1.1 1954 | dev: true 1955 | 1956 | /object.entries@1.1.7: 1957 | resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} 1958 | engines: {node: '>= 0.4'} 1959 | dependencies: 1960 | call-bind: 1.0.7 1961 | define-properties: 1.2.1 1962 | es-abstract: 1.22.4 1963 | dev: true 1964 | 1965 | /object.fromentries@2.0.7: 1966 | resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} 1967 | engines: {node: '>= 0.4'} 1968 | dependencies: 1969 | call-bind: 1.0.7 1970 | define-properties: 1.2.1 1971 | es-abstract: 1.22.4 1972 | dev: true 1973 | 1974 | /object.groupby@1.0.2: 1975 | resolution: {integrity: sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==} 1976 | dependencies: 1977 | array.prototype.filter: 1.0.3 1978 | call-bind: 1.0.7 1979 | define-properties: 1.2.1 1980 | es-abstract: 1.22.4 1981 | es-errors: 1.3.0 1982 | dev: true 1983 | 1984 | /object.hasown@1.1.3: 1985 | resolution: {integrity: sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA==} 1986 | dependencies: 1987 | define-properties: 1.2.1 1988 | es-abstract: 1.22.4 1989 | dev: true 1990 | 1991 | /object.values@1.1.7: 1992 | resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} 1993 | engines: {node: '>= 0.4'} 1994 | dependencies: 1995 | call-bind: 1.0.7 1996 | define-properties: 1.2.1 1997 | es-abstract: 1.22.4 1998 | dev: true 1999 | 2000 | /once@1.4.0: 2001 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 2002 | dependencies: 2003 | wrappy: 1.0.2 2004 | dev: true 2005 | 2006 | /optionator@0.9.3: 2007 | resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} 2008 | engines: {node: '>= 0.8.0'} 2009 | dependencies: 2010 | '@aashutoshrathi/word-wrap': 1.2.6 2011 | deep-is: 0.1.4 2012 | fast-levenshtein: 2.0.6 2013 | levn: 0.4.1 2014 | prelude-ls: 1.2.1 2015 | type-check: 0.4.0 2016 | dev: true 2017 | 2018 | /p-limit@3.1.0: 2019 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 2020 | engines: {node: '>=10'} 2021 | dependencies: 2022 | yocto-queue: 0.1.0 2023 | dev: true 2024 | 2025 | /p-locate@5.0.0: 2026 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 2027 | engines: {node: '>=10'} 2028 | dependencies: 2029 | p-limit: 3.1.0 2030 | dev: true 2031 | 2032 | /parent-module@1.0.1: 2033 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 2034 | engines: {node: '>=6'} 2035 | dependencies: 2036 | callsites: 3.1.0 2037 | dev: true 2038 | 2039 | /path-exists@4.0.0: 2040 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 2041 | engines: {node: '>=8'} 2042 | dev: true 2043 | 2044 | /path-is-absolute@1.0.1: 2045 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} 2046 | engines: {node: '>=0.10.0'} 2047 | dev: true 2048 | 2049 | /path-key@3.1.1: 2050 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 2051 | engines: {node: '>=8'} 2052 | 2053 | /path-parse@1.0.7: 2054 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 2055 | 2056 | /path-scurry@1.10.1: 2057 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 2058 | engines: {node: '>=16 || 14 >=14.17'} 2059 | dependencies: 2060 | lru-cache: 10.2.0 2061 | minipass: 7.0.4 2062 | 2063 | /path-type@4.0.0: 2064 | resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} 2065 | engines: {node: '>=8'} 2066 | dev: true 2067 | 2068 | /picocolors@1.0.0: 2069 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 2070 | 2071 | /picomatch@2.3.1: 2072 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 2073 | engines: {node: '>=8.6'} 2074 | 2075 | /pify@2.3.0: 2076 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 2077 | engines: {node: '>=0.10.0'} 2078 | 2079 | /pirates@4.0.6: 2080 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 2081 | engines: {node: '>= 6'} 2082 | 2083 | /postcss-import@15.1.0(postcss@8.4.35): 2084 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 2085 | engines: {node: '>=14.0.0'} 2086 | peerDependencies: 2087 | postcss: ^8.0.0 2088 | dependencies: 2089 | postcss: 8.4.35 2090 | postcss-value-parser: 4.2.0 2091 | read-cache: 1.0.0 2092 | resolve: 1.22.8 2093 | 2094 | /postcss-js@4.0.1(postcss@8.4.35): 2095 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 2096 | engines: {node: ^12 || ^14 || >= 16} 2097 | peerDependencies: 2098 | postcss: ^8.4.21 2099 | dependencies: 2100 | camelcase-css: 2.0.1 2101 | postcss: 8.4.35 2102 | 2103 | /postcss-load-config@4.0.2(postcss@8.4.35): 2104 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 2105 | engines: {node: '>= 14'} 2106 | peerDependencies: 2107 | postcss: '>=8.0.9' 2108 | ts-node: '>=9.0.0' 2109 | peerDependenciesMeta: 2110 | postcss: 2111 | optional: true 2112 | ts-node: 2113 | optional: true 2114 | dependencies: 2115 | lilconfig: 3.1.1 2116 | postcss: 8.4.35 2117 | yaml: 2.3.4 2118 | 2119 | /postcss-nested@6.0.1(postcss@8.4.35): 2120 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 2121 | engines: {node: '>=12.0'} 2122 | peerDependencies: 2123 | postcss: ^8.2.14 2124 | dependencies: 2125 | postcss: 8.4.35 2126 | postcss-selector-parser: 6.0.15 2127 | 2128 | /postcss-selector-parser@6.0.15: 2129 | resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} 2130 | engines: {node: '>=4'} 2131 | dependencies: 2132 | cssesc: 3.0.0 2133 | util-deprecate: 1.0.2 2134 | 2135 | /postcss-value-parser@4.2.0: 2136 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 2137 | 2138 | /postcss@8.4.31: 2139 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 2140 | engines: {node: ^10 || ^12 || >=14} 2141 | dependencies: 2142 | nanoid: 3.3.7 2143 | picocolors: 1.0.0 2144 | source-map-js: 1.0.2 2145 | dev: false 2146 | 2147 | /postcss@8.4.35: 2148 | resolution: {integrity: sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==} 2149 | engines: {node: ^10 || ^12 || >=14} 2150 | dependencies: 2151 | nanoid: 3.3.7 2152 | picocolors: 1.0.0 2153 | source-map-js: 1.0.2 2154 | 2155 | /prelude-ls@1.2.1: 2156 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 2157 | engines: {node: '>= 0.8.0'} 2158 | dev: true 2159 | 2160 | /prop-types@15.8.1: 2161 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 2162 | dependencies: 2163 | loose-envify: 1.4.0 2164 | object-assign: 4.1.1 2165 | react-is: 16.13.1 2166 | dev: true 2167 | 2168 | /punycode@2.3.1: 2169 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 2170 | engines: {node: '>=6'} 2171 | dev: true 2172 | 2173 | /queue-microtask@1.2.3: 2174 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 2175 | 2176 | /react-dom@18.2.0(react@18.2.0): 2177 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 2178 | peerDependencies: 2179 | react: ^18.2.0 2180 | dependencies: 2181 | loose-envify: 1.4.0 2182 | react: 18.2.0 2183 | scheduler: 0.23.0 2184 | dev: false 2185 | 2186 | /react-is@16.13.1: 2187 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 2188 | dev: true 2189 | 2190 | /react@18.2.0: 2191 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 2192 | engines: {node: '>=0.10.0'} 2193 | dependencies: 2194 | loose-envify: 1.4.0 2195 | dev: false 2196 | 2197 | /read-cache@1.0.0: 2198 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 2199 | dependencies: 2200 | pify: 2.3.0 2201 | 2202 | /readdirp@3.6.0: 2203 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 2204 | engines: {node: '>=8.10.0'} 2205 | dependencies: 2206 | picomatch: 2.3.1 2207 | 2208 | /reflect.getprototypeof@1.0.5: 2209 | resolution: {integrity: sha512-62wgfC8dJWrmxv44CA36pLDnP6KKl3Vhxb7PL+8+qrrFMMoJij4vgiMP8zV4O8+CBMXY1mHxI5fITGHXFHVmQQ==} 2210 | engines: {node: '>= 0.4'} 2211 | dependencies: 2212 | call-bind: 1.0.7 2213 | define-properties: 1.2.1 2214 | es-abstract: 1.22.4 2215 | es-errors: 1.3.0 2216 | get-intrinsic: 1.2.4 2217 | globalthis: 1.0.3 2218 | which-builtin-type: 1.1.3 2219 | dev: true 2220 | 2221 | /regenerator-runtime@0.14.1: 2222 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 2223 | 2224 | /regexp.prototype.flags@1.5.2: 2225 | resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} 2226 | engines: {node: '>= 0.4'} 2227 | dependencies: 2228 | call-bind: 1.0.7 2229 | define-properties: 1.2.1 2230 | es-errors: 1.3.0 2231 | set-function-name: 2.0.1 2232 | dev: true 2233 | 2234 | /resolve-from@4.0.0: 2235 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 2236 | engines: {node: '>=4'} 2237 | dev: true 2238 | 2239 | /resolve-pkg-maps@1.0.0: 2240 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 2241 | dev: true 2242 | 2243 | /resolve@1.22.8: 2244 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 2245 | hasBin: true 2246 | dependencies: 2247 | is-core-module: 2.13.1 2248 | path-parse: 1.0.7 2249 | supports-preserve-symlinks-flag: 1.0.0 2250 | 2251 | /resolve@2.0.0-next.5: 2252 | resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} 2253 | hasBin: true 2254 | dependencies: 2255 | is-core-module: 2.13.1 2256 | path-parse: 1.0.7 2257 | supports-preserve-symlinks-flag: 1.0.0 2258 | dev: true 2259 | 2260 | /reusify@1.0.4: 2261 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 2262 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 2263 | 2264 | /rimraf@3.0.2: 2265 | resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} 2266 | hasBin: true 2267 | dependencies: 2268 | glob: 7.2.3 2269 | dev: true 2270 | 2271 | /run-parallel@1.2.0: 2272 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 2273 | dependencies: 2274 | queue-microtask: 1.2.3 2275 | 2276 | /safe-array-concat@1.1.0: 2277 | resolution: {integrity: sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg==} 2278 | engines: {node: '>=0.4'} 2279 | dependencies: 2280 | call-bind: 1.0.7 2281 | get-intrinsic: 1.2.4 2282 | has-symbols: 1.0.3 2283 | isarray: 2.0.5 2284 | dev: true 2285 | 2286 | /safe-regex-test@1.0.3: 2287 | resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} 2288 | engines: {node: '>= 0.4'} 2289 | dependencies: 2290 | call-bind: 1.0.7 2291 | es-errors: 1.3.0 2292 | is-regex: 1.1.4 2293 | dev: true 2294 | 2295 | /scheduler@0.23.0: 2296 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 2297 | dependencies: 2298 | loose-envify: 1.4.0 2299 | dev: false 2300 | 2301 | /semver@6.3.1: 2302 | resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} 2303 | hasBin: true 2304 | dev: true 2305 | 2306 | /semver@7.6.0: 2307 | resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} 2308 | engines: {node: '>=10'} 2309 | hasBin: true 2310 | dependencies: 2311 | lru-cache: 6.0.0 2312 | dev: true 2313 | 2314 | /set-function-length@1.2.1: 2315 | resolution: {integrity: sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==} 2316 | engines: {node: '>= 0.4'} 2317 | dependencies: 2318 | define-data-property: 1.1.4 2319 | es-errors: 1.3.0 2320 | function-bind: 1.1.2 2321 | get-intrinsic: 1.2.4 2322 | gopd: 1.0.1 2323 | has-property-descriptors: 1.0.2 2324 | dev: true 2325 | 2326 | /set-function-name@2.0.1: 2327 | resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} 2328 | engines: {node: '>= 0.4'} 2329 | dependencies: 2330 | define-data-property: 1.1.4 2331 | functions-have-names: 1.2.3 2332 | has-property-descriptors: 1.0.2 2333 | dev: true 2334 | 2335 | /shebang-command@2.0.0: 2336 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 2337 | engines: {node: '>=8'} 2338 | dependencies: 2339 | shebang-regex: 3.0.0 2340 | 2341 | /shebang-regex@3.0.0: 2342 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 2343 | engines: {node: '>=8'} 2344 | 2345 | /side-channel@1.0.5: 2346 | resolution: {integrity: sha512-QcgiIWV4WV7qWExbN5llt6frQB/lBven9pqliLXfGPB+K9ZYXxDozp0wLkHS24kWCm+6YXH/f0HhnObZnZOBnQ==} 2347 | engines: {node: '>= 0.4'} 2348 | dependencies: 2349 | call-bind: 1.0.7 2350 | es-errors: 1.3.0 2351 | get-intrinsic: 1.2.4 2352 | object-inspect: 1.13.1 2353 | dev: true 2354 | 2355 | /signal-exit@4.1.0: 2356 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 2357 | engines: {node: '>=14'} 2358 | 2359 | /slash@3.0.0: 2360 | resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 2361 | engines: {node: '>=8'} 2362 | dev: true 2363 | 2364 | /source-map-js@1.0.2: 2365 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 2366 | engines: {node: '>=0.10.0'} 2367 | 2368 | /streamsearch@1.1.0: 2369 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 2370 | engines: {node: '>=10.0.0'} 2371 | dev: false 2372 | 2373 | /string-width@4.2.3: 2374 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 2375 | engines: {node: '>=8'} 2376 | dependencies: 2377 | emoji-regex: 8.0.0 2378 | is-fullwidth-code-point: 3.0.0 2379 | strip-ansi: 6.0.1 2380 | 2381 | /string-width@5.1.2: 2382 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 2383 | engines: {node: '>=12'} 2384 | dependencies: 2385 | eastasianwidth: 0.2.0 2386 | emoji-regex: 9.2.2 2387 | strip-ansi: 7.1.0 2388 | 2389 | /string.prototype.matchall@4.0.10: 2390 | resolution: {integrity: sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ==} 2391 | dependencies: 2392 | call-bind: 1.0.7 2393 | define-properties: 1.2.1 2394 | es-abstract: 1.22.4 2395 | get-intrinsic: 1.2.4 2396 | has-symbols: 1.0.3 2397 | internal-slot: 1.0.7 2398 | regexp.prototype.flags: 1.5.2 2399 | set-function-name: 2.0.1 2400 | side-channel: 1.0.5 2401 | dev: true 2402 | 2403 | /string.prototype.trim@1.2.8: 2404 | resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} 2405 | engines: {node: '>= 0.4'} 2406 | dependencies: 2407 | call-bind: 1.0.7 2408 | define-properties: 1.2.1 2409 | es-abstract: 1.22.4 2410 | dev: true 2411 | 2412 | /string.prototype.trimend@1.0.7: 2413 | resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} 2414 | dependencies: 2415 | call-bind: 1.0.7 2416 | define-properties: 1.2.1 2417 | es-abstract: 1.22.4 2418 | dev: true 2419 | 2420 | /string.prototype.trimstart@1.0.7: 2421 | resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} 2422 | dependencies: 2423 | call-bind: 1.0.7 2424 | define-properties: 1.2.1 2425 | es-abstract: 1.22.4 2426 | dev: true 2427 | 2428 | /strip-ansi@6.0.1: 2429 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 2430 | engines: {node: '>=8'} 2431 | dependencies: 2432 | ansi-regex: 5.0.1 2433 | 2434 | /strip-ansi@7.1.0: 2435 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 2436 | engines: {node: '>=12'} 2437 | dependencies: 2438 | ansi-regex: 6.0.1 2439 | 2440 | /strip-bom@3.0.0: 2441 | resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} 2442 | engines: {node: '>=4'} 2443 | dev: true 2444 | 2445 | /strip-json-comments@3.1.1: 2446 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 2447 | engines: {node: '>=8'} 2448 | dev: true 2449 | 2450 | /styled-jsx@5.1.1(react@18.2.0): 2451 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 2452 | engines: {node: '>= 12.0.0'} 2453 | peerDependencies: 2454 | '@babel/core': '*' 2455 | babel-plugin-macros: '*' 2456 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 2457 | peerDependenciesMeta: 2458 | '@babel/core': 2459 | optional: true 2460 | babel-plugin-macros: 2461 | optional: true 2462 | dependencies: 2463 | client-only: 0.0.1 2464 | react: 18.2.0 2465 | dev: false 2466 | 2467 | /sucrase@3.35.0: 2468 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 2469 | engines: {node: '>=16 || 14 >=14.17'} 2470 | hasBin: true 2471 | dependencies: 2472 | '@jridgewell/gen-mapping': 0.3.3 2473 | commander: 4.1.1 2474 | glob: 10.3.10 2475 | lines-and-columns: 1.2.4 2476 | mz: 2.7.0 2477 | pirates: 4.0.6 2478 | ts-interface-checker: 0.1.13 2479 | 2480 | /supports-color@7.2.0: 2481 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 2482 | engines: {node: '>=8'} 2483 | dependencies: 2484 | has-flag: 4.0.0 2485 | dev: true 2486 | 2487 | /supports-preserve-symlinks-flag@1.0.0: 2488 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2489 | engines: {node: '>= 0.4'} 2490 | 2491 | /tailwind-merge@2.2.1: 2492 | resolution: {integrity: sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==} 2493 | dependencies: 2494 | '@babel/runtime': 7.23.9 2495 | dev: false 2496 | 2497 | /tailwindcss-animate@1.0.7(tailwindcss@3.4.1): 2498 | resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} 2499 | peerDependencies: 2500 | tailwindcss: '>=3.0.0 || insiders' 2501 | dependencies: 2502 | tailwindcss: 3.4.1 2503 | dev: false 2504 | 2505 | /tailwindcss@3.4.1: 2506 | resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} 2507 | engines: {node: '>=14.0.0'} 2508 | hasBin: true 2509 | dependencies: 2510 | '@alloc/quick-lru': 5.2.0 2511 | arg: 5.0.2 2512 | chokidar: 3.6.0 2513 | didyoumean: 1.2.2 2514 | dlv: 1.1.3 2515 | fast-glob: 3.3.2 2516 | glob-parent: 6.0.2 2517 | is-glob: 4.0.3 2518 | jiti: 1.21.0 2519 | lilconfig: 2.1.0 2520 | micromatch: 4.0.5 2521 | normalize-path: 3.0.0 2522 | object-hash: 3.0.0 2523 | picocolors: 1.0.0 2524 | postcss: 8.4.35 2525 | postcss-import: 15.1.0(postcss@8.4.35) 2526 | postcss-js: 4.0.1(postcss@8.4.35) 2527 | postcss-load-config: 4.0.2(postcss@8.4.35) 2528 | postcss-nested: 6.0.1(postcss@8.4.35) 2529 | postcss-selector-parser: 6.0.15 2530 | resolve: 1.22.8 2531 | sucrase: 3.35.0 2532 | transitivePeerDependencies: 2533 | - ts-node 2534 | 2535 | /tapable@2.2.1: 2536 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 2537 | engines: {node: '>=6'} 2538 | dev: true 2539 | 2540 | /text-table@0.2.0: 2541 | resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} 2542 | dev: true 2543 | 2544 | /thenify-all@1.6.0: 2545 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2546 | engines: {node: '>=0.8'} 2547 | dependencies: 2548 | thenify: 3.3.1 2549 | 2550 | /thenify@3.3.1: 2551 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2552 | dependencies: 2553 | any-promise: 1.3.0 2554 | 2555 | /to-regex-range@5.0.1: 2556 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2557 | engines: {node: '>=8.0'} 2558 | dependencies: 2559 | is-number: 7.0.0 2560 | 2561 | /ts-api-utils@1.2.1(typescript@5.3.3): 2562 | resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} 2563 | engines: {node: '>=16'} 2564 | peerDependencies: 2565 | typescript: '>=4.2.0' 2566 | dependencies: 2567 | typescript: 5.3.3 2568 | dev: true 2569 | 2570 | /ts-interface-checker@0.1.13: 2571 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 2572 | 2573 | /tsconfig-paths@3.15.0: 2574 | resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} 2575 | dependencies: 2576 | '@types/json5': 0.0.29 2577 | json5: 1.0.2 2578 | minimist: 1.2.8 2579 | strip-bom: 3.0.0 2580 | dev: true 2581 | 2582 | /tslib@2.6.2: 2583 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 2584 | dev: false 2585 | 2586 | /type-check@0.4.0: 2587 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 2588 | engines: {node: '>= 0.8.0'} 2589 | dependencies: 2590 | prelude-ls: 1.2.1 2591 | dev: true 2592 | 2593 | /type-fest@0.20.2: 2594 | resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} 2595 | engines: {node: '>=10'} 2596 | dev: true 2597 | 2598 | /typed-array-buffer@1.0.1: 2599 | resolution: {integrity: sha512-RSqu1UEuSlrBhHTWC8O9FnPjOduNs4M7rJ4pRKoEjtx1zUNOPN2sSXHLDX+Y2WPbHIxbvg4JFo2DNAEfPIKWoQ==} 2600 | engines: {node: '>= 0.4'} 2601 | dependencies: 2602 | call-bind: 1.0.7 2603 | es-errors: 1.3.0 2604 | is-typed-array: 1.1.13 2605 | dev: true 2606 | 2607 | /typed-array-byte-length@1.0.0: 2608 | resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} 2609 | engines: {node: '>= 0.4'} 2610 | dependencies: 2611 | call-bind: 1.0.7 2612 | for-each: 0.3.3 2613 | has-proto: 1.0.1 2614 | is-typed-array: 1.1.13 2615 | dev: true 2616 | 2617 | /typed-array-byte-offset@1.0.1: 2618 | resolution: {integrity: sha512-tcqKMrTRXjqvHN9S3553NPCaGL0VPgFI92lXszmrE8DMhiDPLBYLlvo8Uu4WZAAX/aGqp/T1sbA4ph8EWjDF9Q==} 2619 | engines: {node: '>= 0.4'} 2620 | dependencies: 2621 | available-typed-arrays: 1.0.6 2622 | call-bind: 1.0.7 2623 | for-each: 0.3.3 2624 | gopd: 1.0.1 2625 | has-proto: 1.0.1 2626 | is-typed-array: 1.1.13 2627 | dev: true 2628 | 2629 | /typed-array-length@1.0.4: 2630 | resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} 2631 | dependencies: 2632 | call-bind: 1.0.7 2633 | for-each: 0.3.3 2634 | is-typed-array: 1.1.13 2635 | dev: true 2636 | 2637 | /typescript@5.3.3: 2638 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 2639 | engines: {node: '>=14.17'} 2640 | hasBin: true 2641 | dev: true 2642 | 2643 | /unbox-primitive@1.0.2: 2644 | resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} 2645 | dependencies: 2646 | call-bind: 1.0.7 2647 | has-bigints: 1.0.2 2648 | has-symbols: 1.0.3 2649 | which-boxed-primitive: 1.0.2 2650 | dev: true 2651 | 2652 | /undici-types@5.26.5: 2653 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 2654 | dev: true 2655 | 2656 | /update-browserslist-db@1.0.13(browserslist@4.23.0): 2657 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 2658 | hasBin: true 2659 | peerDependencies: 2660 | browserslist: '>= 4.21.0' 2661 | dependencies: 2662 | browserslist: 4.23.0 2663 | escalade: 3.1.2 2664 | picocolors: 1.0.0 2665 | dev: true 2666 | 2667 | /uri-js@4.4.1: 2668 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 2669 | dependencies: 2670 | punycode: 2.3.1 2671 | dev: true 2672 | 2673 | /util-deprecate@1.0.2: 2674 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2675 | 2676 | /which-boxed-primitive@1.0.2: 2677 | resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} 2678 | dependencies: 2679 | is-bigint: 1.0.4 2680 | is-boolean-object: 1.1.2 2681 | is-number-object: 1.0.7 2682 | is-string: 1.0.7 2683 | is-symbol: 1.0.4 2684 | dev: true 2685 | 2686 | /which-builtin-type@1.1.3: 2687 | resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} 2688 | engines: {node: '>= 0.4'} 2689 | dependencies: 2690 | function.prototype.name: 1.1.6 2691 | has-tostringtag: 1.0.2 2692 | is-async-function: 2.0.0 2693 | is-date-object: 1.0.5 2694 | is-finalizationregistry: 1.0.2 2695 | is-generator-function: 1.0.10 2696 | is-regex: 1.1.4 2697 | is-weakref: 1.0.2 2698 | isarray: 2.0.5 2699 | which-boxed-primitive: 1.0.2 2700 | which-collection: 1.0.1 2701 | which-typed-array: 1.1.14 2702 | dev: true 2703 | 2704 | /which-collection@1.0.1: 2705 | resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} 2706 | dependencies: 2707 | is-map: 2.0.2 2708 | is-set: 2.0.2 2709 | is-weakmap: 2.0.1 2710 | is-weakset: 2.0.2 2711 | dev: true 2712 | 2713 | /which-typed-array@1.1.14: 2714 | resolution: {integrity: sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==} 2715 | engines: {node: '>= 0.4'} 2716 | dependencies: 2717 | available-typed-arrays: 1.0.6 2718 | call-bind: 1.0.7 2719 | for-each: 0.3.3 2720 | gopd: 1.0.1 2721 | has-tostringtag: 1.0.2 2722 | dev: true 2723 | 2724 | /which@2.0.2: 2725 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2726 | engines: {node: '>= 8'} 2727 | hasBin: true 2728 | dependencies: 2729 | isexe: 2.0.0 2730 | 2731 | /wrap-ansi@7.0.0: 2732 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2733 | engines: {node: '>=10'} 2734 | dependencies: 2735 | ansi-styles: 4.3.0 2736 | string-width: 4.2.3 2737 | strip-ansi: 6.0.1 2738 | 2739 | /wrap-ansi@8.1.0: 2740 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2741 | engines: {node: '>=12'} 2742 | dependencies: 2743 | ansi-styles: 6.2.1 2744 | string-width: 5.1.2 2745 | strip-ansi: 7.1.0 2746 | 2747 | /wrappy@1.0.2: 2748 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 2749 | dev: true 2750 | 2751 | /yallist@4.0.0: 2752 | resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} 2753 | dev: true 2754 | 2755 | /yaml@2.3.4: 2756 | resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} 2757 | engines: {node: '>= 14'} 2758 | 2759 | /yocto-queue@0.1.0: 2760 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 2761 | engines: {node: '>=10'} 2762 | dev: true 2763 | --------------------------------------------------------------------------------