├── app ├── style.css ├── favicon.ico ├── blog │ ├── detail │ │ └── page.tsx │ └── page.tsx ├── api │ ├── get-wallpapers │ │ └── route.ts │ ├── get-user-info │ │ └── route.ts │ ├── gen-wallpaper │ │ └── route.ts │ └── checkout │ │ └── route.ts ├── layout.tsx ├── pricing │ └── page.tsx ├── page.tsx ├── pay-success │ └── [session_id] │ │ └── page.tsx └── globals.css ├── next.config.js ├── postcss.config.js ├── .vscode └── settings.json ├── lib ├── utils.ts └── s3.ts ├── service ├── openai.ts └── order.ts ├── types ├── order.d.ts ├── wallpaper.d.ts └── user.d.ts ├── .env ├── README.md ├── models ├── db.ts ├── user.ts ├── wallpaper.ts └── order.ts ├── components.json ├── middleware.ts ├── debug └── apitest.http ├── .gitignore ├── public ├── vercel.svg └── next.svg ├── components ├── hero │ └── index.tsx ├── ui │ ├── input.tsx │ ├── badge.tsx │ ├── avatar.tsx │ └── button.tsx ├── input │ └── index.tsx ├── header │ └── index.tsx ├── wallpapers │ └── index.tsx ├── footer │ └── index.tsx └── pricing │ └── index.tsx ├── tsconfig.json ├── data └── install.sql ├── package.json ├── tailwind.config.ts └── pnpm-lock.yaml /app/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: red; 3 | } 4 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ai-1024/aiwallpaper-demo/HEAD/app/favicon.ico -------------------------------------------------------------------------------- /app/blog/detail/page.tsx: -------------------------------------------------------------------------------- 1 | export default function() { 2 | return
blog detail
3 | } -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = {} 3 | 4 | module.exports = nextConfig 5 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /app/blog/page.tsx: -------------------------------------------------------------------------------- 1 | export default function() { 2 | return
3 | 点击查看博客详情 4 |
5 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.defaultFormatter": "esbenp.prettier-vscode", 3 | "[javascript]": { 4 | "editor.defaultFormatter": "esbenp.prettier-vscode" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /service/openai.ts: -------------------------------------------------------------------------------- 1 | import OpenAI from "openai"; 2 | 3 | export function getOpenAIClient(): OpenAI { 4 | const openai = new OpenAI({ 5 | apiKey: process.env["OPENAI_API_KEY"], 6 | }); 7 | 8 | return openai; 9 | } 10 | -------------------------------------------------------------------------------- /types/order.d.ts: -------------------------------------------------------------------------------- 1 | export interface Order { 2 | order_no: string; 3 | created_at: string; 4 | user_email: string; 5 | amount: number; 6 | plan: string; 7 | expired_at: string; 8 | order_status: number; 9 | paied_at?: string; 10 | stripe_session_id?: string; 11 | credits: number; 12 | } 13 | -------------------------------------------------------------------------------- /app/api/get-wallpapers/route.ts: -------------------------------------------------------------------------------- 1 | import { getWallpapers } from "@/models/wallpaper"; 2 | 3 | export async function GET(req: Request) { 4 | const wallpapers = await getWallpapers(1, 50); 5 | 6 | return Response.json({ 7 | code: 0, 8 | message: "ok", 9 | data: wallpapers, 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | # aws keys 2 | AWS_AK="" 3 | AWS_SK="" 4 | AWS_BUCKET="" 5 | 6 | # postgres db 7 | POSTGRES_URL="" 8 | 9 | # login 10 | NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY="" 11 | CLERK_SECRET_KEY="" 12 | 13 | # pay 14 | STRIPE_PRIVATE_KEY="" 15 | STRIPE_PUBLIC_KEY="" 16 | 17 | WEB_BASE_URI="http://localhost:3000" 18 | 19 | -------------------------------------------------------------------------------- /types/wallpaper.d.ts: -------------------------------------------------------------------------------- 1 | export interface Wallpaper { 2 | id?: number; 3 | user_email: string; 4 | img_description?: string; 5 | img_size?: string; 6 | img_url: string; 7 | llm_name: string; 8 | llm_params?: string; 9 | created_at: string; 10 | user_avatar?: string; 11 | user_nickname?: string; 12 | } 13 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## 本地开发 2 | 3 | 1. 拉取代码 4 | 5 | ```shell 6 | git clone https://github.com/trysai/aiwallpaper-demo 7 | ``` 8 | 9 | 2. 进入项目根目录安装 10 | 11 | ```shell 12 | cd aiwallpaper-demo 13 | pnpm install 14 | ``` 15 | 16 | 3. 本地调试 17 | 18 | ```shell 19 | pnpm dev 20 | ``` 21 | 22 | 4. 本地访问 23 | 24 | http://localhost:3000 25 | -------------------------------------------------------------------------------- /types/user.d.ts: -------------------------------------------------------------------------------- 1 | export interface User { 2 | id?: number; 3 | email: string; 4 | nickname: string; 5 | avatar_url: string; 6 | created_at?: string; 7 | } 8 | 9 | export interface UserCredits { 10 | one_time_credits: number; 11 | monthly_credits: number; 12 | total_credits: number; 13 | used_credits: number; 14 | left_credits: number; 15 | } 16 | -------------------------------------------------------------------------------- /models/db.ts: -------------------------------------------------------------------------------- 1 | import { Pool } from "pg"; 2 | 3 | let globalPool: Pool; 4 | 5 | export function getDb() { 6 | if (!globalPool) { 7 | const connectionString = process.env.POSTGRES_URL; 8 | console.log("connectionString", connectionString); 9 | 10 | globalPool = new Pool({ 11 | connectionString, 12 | }); 13 | } 14 | 15 | return globalPool; 16 | } 17 | -------------------------------------------------------------------------------- /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": "app/globals.css", 9 | "baseColor": "slate", 10 | "cssVariables": true, 11 | "prefix": "" 12 | }, 13 | "aliases": { 14 | "components": "@/components", 15 | "utils": "@/lib/utils" 16 | } 17 | } -------------------------------------------------------------------------------- /middleware.ts: -------------------------------------------------------------------------------- 1 | import { authMiddleware } from "@clerk/nextjs"; 2 | 3 | // This example protects all routes including api/trpc routes 4 | // Please edit this to allow other routes to be public as needed. 5 | // See https://clerk.com/docs/references/nextjs/auth-middleware for more information about configuring your Middleware 6 | export default authMiddleware({}); 7 | 8 | export const config = { 9 | matcher: ["/((?!.+\\.[\\w]+$|_next).*)", "/", "/(api|trpc)(.*)"], 10 | }; 11 | -------------------------------------------------------------------------------- /debug/apitest.http: -------------------------------------------------------------------------------- 1 | @baseUri=http://localhost:3000/api 2 | 3 | ### test 4 | POST {{baseUri}}/test 5 | 6 | ### generate wallpaper 7 | POST {{baseUri}}/gen-wallpaper 8 | Content-Type: application/json 9 | 10 | { 11 | "description": "coding at sky." 12 | } 13 | 14 | ### get wallpapers 15 | GET {{baseUri}}/get-wallpapers 16 | 17 | ### checkout 18 | POST {{baseUri}}/checkout 19 | Content-Type: application/json 20 | 21 | { 22 | "amount": 990, 23 | "plan": "subscribe", 24 | "credits": 50 25 | } -------------------------------------------------------------------------------- /models/user.ts: -------------------------------------------------------------------------------- 1 | import { User } from "@/types/user"; 2 | import { getDb } from "./db"; 3 | 4 | export async function insertUser(user: User) { 5 | const createdAt: string = new Date().toISOString(); 6 | 7 | const db = await getDb(); 8 | const res = await db.query( 9 | `INSERT INTO users 10 | (email, nickname, avatar_url, created_at) 11 | VALUES 12 | ($1, $2, $3, $4) 13 | `, 14 | [user.email, user.nickname, user.avatar_url, createdAt] 15 | ); 16 | 17 | return res; 18 | } 19 | -------------------------------------------------------------------------------- /.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 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /public/vercel.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /app/api/get-user-info/route.ts: -------------------------------------------------------------------------------- 1 | import { currentUser } from "@clerk/nextjs"; 2 | import { getUserCredits } from "@/service/order"; 3 | 4 | export async function POST(req: Request) { 5 | const user = await currentUser(); 6 | if (!user || !user.emailAddresses || user.emailAddresses.length === 0) { 7 | return Response.json("not login"); 8 | } 9 | const user_email = user.emailAddresses[0].emailAddress; 10 | 11 | const user_credis = await getUserCredits(user_email); 12 | console.log("user_credis", user_credis); 13 | 14 | return Response.json({ 15 | code: 0, 16 | message: "ok", 17 | data: { 18 | credits: user_credis, 19 | }, 20 | }); 21 | } 22 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import "./globals.css"; 2 | 3 | import { ClerkProvider } from "@clerk/nextjs"; 4 | import { Inter } from "next/font/google"; 5 | import type { Metadata } from "next"; 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 | }: { 17 | children: React.ReactNode; 18 | }) { 19 | return ( 20 | 21 | 22 | {children} 23 | 24 | 25 | ); 26 | } 27 | -------------------------------------------------------------------------------- /components/hero/index.tsx: -------------------------------------------------------------------------------- 1 | import Input from "../input"; 2 | 3 | export default function () { 4 | return ( 5 |
6 |
7 |
8 |

9 | AI 壁纸生成器 10 |

11 |

12 | 帮你生成好看的壁纸 13 |

14 |
15 |
16 |
17 |
18 | ); 19 | } 20 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /data/install.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE wallpapers ( 2 | id SERIAL PRIMARY KEY, 3 | user_email VARCHAR(255) NOT NULL, 4 | img_description TEXT, 5 | img_size VARCHAR(255), 6 | img_url TEXT, 7 | llm_name VARCHAR(100), 8 | llm_params JSON, 9 | created_at timestamptz 10 | ); 11 | 12 | CREATE TABLE users ( 13 | id SERIAL PRIMARY KEY, 14 | email VARCHAR(255) UNIQUE NOT NULL, 15 | nickname VARCHAR(255), 16 | avatar_url VARCHAR(255), 17 | created_at timestamptz 18 | ); 19 | 20 | CREATE TABLE orders ( 21 | id SERIAL PRIMARY KEY, 22 | order_no VARCHAR(255) UNIQUE NOT NULL, 23 | created_at timestamptz, 24 | user_email VARCHAR(255) NOT NULL, 25 | amount INT NOT NULL, 26 | plan VARCHAR(50), 27 | expired_at timestamptz, 28 | order_status SMALLINT NOT NULL, 29 | paied_at timestamptz, 30 | stripe_session_id VARCHAR(255), 31 | credits INT NOT NULL 32 | ); -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /app/pricing/page.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useEffect, useState } from "react"; 4 | 5 | import Footer from "@/components/footer"; 6 | import Header from "@/components/header"; 7 | import Hero from "@/components/hero"; 8 | import Image from "next/image"; 9 | import Input from "@/components/input"; 10 | import Pricing from "@/components/pricing"; 11 | import { Wallpaper } from "@/types/wallpaper"; 12 | import Wallpapers from "@/components/wallpapers"; 13 | 14 | export default function Home() { 15 | const [wallpapers, setWallpapers] = useState([]); 16 | 17 | const fetchWallpapers = async function () { 18 | const result = await fetch("/api/get-wallpapers"); 19 | const { data } = await result.json(); 20 | 21 | if (data) { 22 | setWallpapers(data); 23 | } 24 | }; 25 | 26 | useEffect(() => { 27 | fetchWallpapers(); 28 | }, []); 29 | 30 | return ( 31 |
32 |
33 | 34 | 35 | 36 |
37 |
38 | ); 39 | } 40 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useEffect, useState } from "react"; 4 | 5 | import Footer from "@/components/footer"; 6 | import Header from "@/components/header"; 7 | import Hero from "@/components/hero"; 8 | import Image from "next/image"; 9 | import Input from "@/components/input"; 10 | import { Wallpaper } from "@/types/wallpaper"; 11 | import Wallpapers from "@/components/wallpapers"; 12 | 13 | export default function Home() { 14 | const [wallpapers, setWallpapers] = useState([]); 15 | 16 | const fetchWallpapers = async function () { 17 | const result = await fetch("/api/get-wallpapers"); 18 | const { data } = await result.json(); 19 | 20 | if (data) { 21 | setWallpapers(data); 22 | } 23 | }; 24 | 25 | useEffect(() => { 26 | fetchWallpapers(); 27 | }, []); 28 | 29 | return ( 30 |
31 |
32 | 33 | 34 | 35 |
36 |
37 | ); 38 | } 39 | -------------------------------------------------------------------------------- /app/pay-success/[session_id]/page.tsx: -------------------------------------------------------------------------------- 1 | import Stripe from "stripe"; 2 | import { redirect } from "next/navigation"; 3 | import { updateOrderStatus } from "@/models/order"; 4 | 5 | export default async function ({ params }: { params: { session_id: string } }) { 6 | console.log("pay callback id", params.session_id); 7 | 8 | const stripe = new Stripe(process.env.STRIPE_PRIVATE_KEY || ""); 9 | try { 10 | const session = await stripe.checkout.sessions.retrieve(params.session_id); 11 | console.log("order session: ", session); 12 | 13 | console.log("metadata", session.metadata); 14 | if (!session || !session.metadata || !session.metadata.order_no) { 15 | console.log("invalid session", params.session_id); 16 | throw new Error("invalid session"); 17 | } 18 | 19 | const order_no = session.metadata.order_no; 20 | const paied_at = new Date().toISOString(); 21 | 22 | updateOrderStatus(order_no, 2, paied_at); 23 | console.log("update success order status: ", order_no, paied_at); 24 | 25 | redirect("/"); 26 | } catch (e) { 27 | console.log("handle order session failed: ", e); 28 | throw e; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /components/ui/badge.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { cva, type VariantProps } from "class-variance-authority" 3 | 4 | import { cn } from "@/lib/utils" 5 | 6 | const badgeVariants = cva( 7 | "inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2", 8 | { 9 | variants: { 10 | variant: { 11 | default: 12 | "border-transparent bg-primary text-primary-foreground hover:bg-primary/80", 13 | secondary: 14 | "border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80", 15 | destructive: 16 | "border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80", 17 | outline: "text-foreground", 18 | }, 19 | }, 20 | defaultVariants: { 21 | variant: "default", 22 | }, 23 | } 24 | ) 25 | 26 | export interface BadgeProps 27 | extends React.HTMLAttributes, 28 | VariantProps {} 29 | 30 | function Badge({ className, variant, ...props }: BadgeProps) { 31 | return ( 32 |
33 | ) 34 | } 35 | 36 | export { Badge, badgeVariants } 37 | -------------------------------------------------------------------------------- /public/next.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aiwallpaper", 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 | "@clerk/nextjs": "^4.29.3", 13 | "@radix-ui/react-avatar": "^1.0.4", 14 | "@radix-ui/react-slot": "^1.0.2", 15 | "@stripe/stripe-js": "^2.4.0", 16 | "aws-sdk": "^2.1537.0", 17 | "axios": "^1.6.5", 18 | "class-variance-authority": "^0.7.0", 19 | "clsx": "^2.1.0", 20 | "lucide-react": "^0.309.0", 21 | "next": "14.0.4", 22 | "openai": "^4.24.2", 23 | "pg": "^8.11.3", 24 | "react": "^18", 25 | "react-copy-to-clipboard": "^5.1.0", 26 | "react-dom": "^18", 27 | "react-icons": "^5.0.0", 28 | "react-lazy-load-image-component": "^1.6.0", 29 | "sonner": "^1.3.1", 30 | "stripe": "^14.13.0", 31 | "tailwind-merge": "^2.2.0", 32 | "tailwindcss-animate": "^1.0.7" 33 | }, 34 | "devDependencies": { 35 | "@types/node": "^20", 36 | "@types/pg": "^8.10.9", 37 | "@types/react": "^18", 38 | "@types/react-copy-to-clipboard": "^5.0.7", 39 | "@types/react-dom": "^18", 40 | "@types/react-lazy-load-image-component": "^1.6.3", 41 | "autoprefixer": "^10.0.1", 42 | "postcss": "^8", 43 | "tailwindcss": "^3.3.0", 44 | "typescript": "^5" 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /components/ui/avatar.tsx: -------------------------------------------------------------------------------- 1 | "use client" 2 | 3 | import * as React from "react" 4 | import * as AvatarPrimitive from "@radix-ui/react-avatar" 5 | 6 | import { cn } from "@/lib/utils" 7 | 8 | const Avatar = React.forwardRef< 9 | React.ElementRef, 10 | React.ComponentPropsWithoutRef 11 | >(({ className, ...props }, ref) => ( 12 | 20 | )) 21 | Avatar.displayName = AvatarPrimitive.Root.displayName 22 | 23 | const AvatarImage = React.forwardRef< 24 | React.ElementRef, 25 | React.ComponentPropsWithoutRef 26 | >(({ className, ...props }, ref) => ( 27 | 32 | )) 33 | AvatarImage.displayName = AvatarPrimitive.Image.displayName 34 | 35 | const AvatarFallback = React.forwardRef< 36 | React.ElementRef, 37 | React.ComponentPropsWithoutRef 38 | >(({ className, ...props }, ref) => ( 39 | 47 | )) 48 | AvatarFallback.displayName = AvatarPrimitive.Fallback.displayName 49 | 50 | export { Avatar, AvatarImage, AvatarFallback } 51 | -------------------------------------------------------------------------------- /lib/s3.ts: -------------------------------------------------------------------------------- 1 | import AWS from "aws-sdk"; 2 | import { Readable } from "stream"; 3 | import axios from "axios"; 4 | import fs from "fs"; 5 | 6 | AWS.config.update({ 7 | accessKeyId: process.env.AWS_AK, 8 | secretAccessKey: process.env.AWS_SK, 9 | }); 10 | 11 | const s3 = new AWS.S3(); 12 | 13 | export async function downloadAndUploadImage( 14 | imageUrl: string, 15 | bucketName: string, 16 | s3Key: string 17 | ) { 18 | try { 19 | const response = await axios({ 20 | method: "GET", 21 | url: imageUrl, 22 | responseType: "stream", 23 | }); 24 | 25 | const uploadParams = { 26 | Bucket: bucketName, 27 | Key: s3Key, 28 | Body: response.data as Readable, 29 | }; 30 | 31 | return s3.upload(uploadParams).promise(); 32 | } catch (e) { 33 | console.log("upload failed:", e); 34 | throw e; 35 | } 36 | } 37 | 38 | export async function downloadImage(imageUrl: string, outputPath: string) { 39 | try { 40 | const response = await axios({ 41 | method: "GET", 42 | url: imageUrl, 43 | responseType: "stream", 44 | }); 45 | 46 | return new Promise((resolve, reject) => { 47 | const writer = fs.createWriteStream(outputPath); 48 | response.data.pipe(writer); 49 | 50 | let error: Error | null = null; 51 | writer.on("error", (err) => { 52 | error = err; 53 | writer.close(); 54 | reject(err); 55 | }); 56 | 57 | writer.on("close", () => { 58 | if (!error) { 59 | resolve(null); 60 | } 61 | }); 62 | }); 63 | } catch (e) { 64 | console.log("upload failed:", e); 65 | throw e; 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /service/order.ts: -------------------------------------------------------------------------------- 1 | import { Order } from "@/types/order"; 2 | import { UserCredits } from "@/types/user"; 3 | import { getUserOrders } from "@/models/order"; 4 | import { getUserWallpapersCount } from "@/models/wallpaper"; 5 | 6 | export async function getUserCredits(user_email: string): Promise { 7 | let user_credits: UserCredits = { 8 | one_time_credits: 2, 9 | monthly_credits: 1, 10 | total_credits: 3, 11 | used_credits: 0, 12 | left_credits: 3, 13 | }; 14 | 15 | console.log("user", user_credits); 16 | 17 | try { 18 | const used_credits = await getUserWallpapersCount(user_email); 19 | console.log("used_credits", used_credits); 20 | user_credits.used_credits = Number(used_credits); 21 | 22 | const orders = await getUserOrders(user_email); 23 | if (!orders) { 24 | return user_credits; 25 | } 26 | 27 | let monthly_credits = 0; 28 | let one_time_credits = 0; 29 | let total_credits = 0; 30 | 31 | orders.forEach((order: Order) => { 32 | if (order.plan === "monthly") { 33 | monthly_credits += order.credits; 34 | } else { 35 | one_time_credits += order.credits; 36 | } 37 | total_credits += order.credits; 38 | }); 39 | 40 | user_credits.monthly_credits = monthly_credits; 41 | user_credits.one_time_credits = one_time_credits; 42 | user_credits.total_credits = total_credits; 43 | user_credits.left_credits = total_credits - used_credits; 44 | if (user_credits.left_credits < 0) { 45 | user_credits.left_credits = 0; 46 | } 47 | 48 | return user_credits; 49 | } catch (e) { 50 | console.log("get user credits failed: ", e); 51 | return user_credits; 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /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: 20 14.3% 4.1%; 9 | --card: 0 0% 100%; 10 | --card-foreground: 20 14.3% 4.1%; 11 | --popover: 0 0% 100%; 12 | --popover-foreground: 20 14.3% 4.1%; 13 | --primary: 24.6 95% 53.1%; 14 | --primary-foreground: 60 9.1% 97.8%; 15 | --secondary: 60 4.8% 95.9%; 16 | --secondary-foreground: 24 9.8% 10%; 17 | --muted: 60 4.8% 95.9%; 18 | --muted-foreground: 25 5.3% 44.7%; 19 | --accent: 60 4.8% 95.9%; 20 | --accent-foreground: 24 9.8% 10%; 21 | --destructive: 0 84.2% 60.2%; 22 | --destructive-foreground: 60 9.1% 97.8%; 23 | --border: 20 5.9% 90%; 24 | --input: 20 5.9% 90%; 25 | --ring: 24.6 95% 53.1%; 26 | --radius: 0.75rem; 27 | } 28 | 29 | .dark { 30 | --background: 20 14.3% 4.1%; 31 | --foreground: 60 9.1% 97.8%; 32 | --card: 20 14.3% 4.1%; 33 | --card-foreground: 60 9.1% 97.8%; 34 | --popover: 20 14.3% 4.1%; 35 | --popover-foreground: 60 9.1% 97.8%; 36 | --primary: 20.5 90.2% 48.2%; 37 | --primary-foreground: 60 9.1% 97.8%; 38 | --secondary: 12 6.5% 15.1%; 39 | --secondary-foreground: 60 9.1% 97.8%; 40 | --muted: 12 6.5% 15.1%; 41 | --muted-foreground: 24 5.4% 63.9%; 42 | --accent: 12 6.5% 15.1%; 43 | --accent-foreground: 60 9.1% 97.8%; 44 | --destructive: 0 72.2% 50.6%; 45 | --destructive-foreground: 60 9.1% 97.8%; 46 | --border: 12 6.5% 15.1%; 47 | --input: 12 6.5% 15.1%; 48 | --ring: 20.5 90.2% 48.2%; 49 | } 50 | } 51 | 52 | @layer base { 53 | * { 54 | @apply border-border; 55 | } 56 | body { 57 | @apply bg-background text-foreground; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /components/input/index.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { Dispatch, SetStateAction, useEffect, useState } from "react"; 4 | 5 | import { Button } from "@/components/ui/button"; 6 | import { Input } from "@/components/ui/input"; 7 | import { Wallpaper } from "@/types/wallpaper"; 8 | 9 | interface Props { 10 | setWallpapers: Dispatch>; 11 | } 12 | 13 | export default function ({ setWallpapers }: Props) { 14 | const [description, setDescription] = useState(""); 15 | const [loading, setLoading] = useState(false); 16 | 17 | const generateWallpaper = async function () { 18 | const params = { 19 | description: description, 20 | }; 21 | 22 | setLoading(true); 23 | const result = await fetch("/api/gen-wallpaper", { 24 | method: "POST", 25 | body: JSON.stringify(params), 26 | }); 27 | const { data } = await result.json(); 28 | setLoading(false); 29 | 30 | if (data) { 31 | console.log("new wallpaper:", data); 32 | setWallpapers((wallpapers: Wallpaper[]) => [data, ...wallpapers]); 33 | } 34 | }; 35 | 36 | const handleSubmit = async function () { 37 | console.log("current", description); 38 | if (!description) { 39 | alert("壁纸描述不能为空"); 40 | return; 41 | } 42 | 43 | await generateWallpaper(); 44 | }; 45 | 46 | return ( 47 |
48 | setDescription(e.target.value)} 53 | disabled={loading} 54 | /> 55 | 58 |
59 | ); 60 | } 61 | -------------------------------------------------------------------------------- /components/header/index.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useEffect, useState } from "react"; 4 | 5 | import { Button } from "@/components/ui/button"; 6 | import { UserButton } from "@clerk/nextjs"; 7 | 8 | export default function () { 9 | const [credis, setCredits] = useState(0); 10 | 11 | const fetchUserInfo = async () => { 12 | const response = await fetch("/api/get-user-info", { 13 | method: "POST", 14 | }); 15 | 16 | const { code, message, data } = await response.json(); 17 | console.log("userinfo", data); 18 | if (data && data.credits) { 19 | setCredits(data.credits.left_credits); 20 | } 21 | }; 22 | 23 | useEffect(() => { 24 | fetchUserInfo(); 25 | }, []); 26 | 27 | return ( 28 |
29 |
30 | 58 |
59 |
60 | ); 61 | } 62 | -------------------------------------------------------------------------------- /components/ui/button.tsx: -------------------------------------------------------------------------------- 1 | import * as React from "react" 2 | import { Slot } from "@radix-ui/react-slot" 3 | import { cva, type VariantProps } from "class-variance-authority" 4 | 5 | import { cn } from "@/lib/utils" 6 | 7 | const buttonVariants = cva( 8 | "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", 9 | { 10 | variants: { 11 | variant: { 12 | default: "bg-primary text-primary-foreground hover:bg-primary/90", 13 | destructive: 14 | "bg-destructive text-destructive-foreground hover:bg-destructive/90", 15 | outline: 16 | "border border-input bg-background hover:bg-accent hover:text-accent-foreground", 17 | secondary: 18 | "bg-secondary text-secondary-foreground hover:bg-secondary/80", 19 | ghost: "hover:bg-accent hover:text-accent-foreground", 20 | link: "text-primary underline-offset-4 hover:underline", 21 | }, 22 | size: { 23 | default: "h-10 px-4 py-2", 24 | sm: "h-9 rounded-md px-3", 25 | lg: "h-11 rounded-md px-8", 26 | icon: "h-10 w-10", 27 | }, 28 | }, 29 | defaultVariants: { 30 | variant: "default", 31 | size: "default", 32 | }, 33 | } 34 | ) 35 | 36 | export interface ButtonProps 37 | extends React.ButtonHTMLAttributes, 38 | VariantProps { 39 | asChild?: boolean 40 | } 41 | 42 | const Button = React.forwardRef( 43 | ({ className, variant, size, asChild = false, ...props }, ref) => { 44 | const Comp = asChild ? Slot : "button" 45 | return ( 46 | 51 | ) 52 | } 53 | ) 54 | Button.displayName = "Button" 55 | 56 | export { Button, buttonVariants } 57 | -------------------------------------------------------------------------------- /models/wallpaper.ts: -------------------------------------------------------------------------------- 1 | import { Wallpaper } from "@/types/wallpaper"; 2 | import { getDb } from "./db"; 3 | 4 | export async function insertWallpaper(wallpaper: Wallpaper) { 5 | const db = getDb(); 6 | const res = await db.query( 7 | `INSERT INTO wallpapers 8 | (user_email, img_description, img_size, img_url, llm_name, llm_params, created_at) 9 | VALUES 10 | ($1, $2, $3, $4, $5, $6, $7) 11 | `, 12 | [ 13 | wallpaper.user_email, 14 | wallpaper.img_description, 15 | wallpaper.img_size, 16 | wallpaper.img_url, 17 | wallpaper.llm_name, 18 | wallpaper.llm_params, 19 | wallpaper.created_at, 20 | ] 21 | ); 22 | 23 | return res; 24 | } 25 | 26 | export async function getWallpapers( 27 | page: number, 28 | limit: number 29 | ): Promise { 30 | if (page < 1) { 31 | page = 1; 32 | } 33 | if (limit <= 0) { 34 | limit = 50; 35 | } 36 | const offset = (page - 1) * limit; 37 | 38 | const db = getDb(); 39 | const res = await db.query(`select * from wallpapers limit $1 offset $2`, [ 40 | limit, 41 | offset, 42 | ]); 43 | if (res.rowCount === 0) { 44 | return undefined; 45 | } 46 | 47 | const { rows } = res; 48 | let wallpapers: Wallpaper[] = []; 49 | 50 | rows.forEach((row) => { 51 | const wallpaper: Wallpaper = { 52 | id: row.id, 53 | user_email: row.user_email, 54 | img_description: row.img_description, 55 | img_size: row.img_size, 56 | img_url: row.img_url, 57 | llm_name: row.llm_name, 58 | llm_params: row.llm_params, 59 | created_at: row.created_at, 60 | }; 61 | wallpapers.push(wallpaper); 62 | }); 63 | 64 | return wallpapers; 65 | } 66 | 67 | export async function getUserWallpapersCount( 68 | user_email: string 69 | ): Promise { 70 | const db = getDb(); 71 | const res = await db.query( 72 | `SELECT count(1) as count FROM wallpapers WHERE user_email = $1`, 73 | [user_email] 74 | ); 75 | if (res.rowCount === 0) { 76 | return 0; 77 | } 78 | 79 | const { rows } = res; 80 | const row = rows[0]; 81 | 82 | return row.count; 83 | } 84 | -------------------------------------------------------------------------------- /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: [require("tailwindcss-animate")], 78 | } satisfies Config 79 | 80 | export default config -------------------------------------------------------------------------------- /components/wallpapers/index.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { Button } from "@/components/ui/button"; 4 | import { Wallpaper } from "@/types/wallpaper"; 5 | 6 | interface Props { 7 | wallpapers: Wallpaper[]; 8 | } 9 | 10 | export default function ({ wallpapers }: Props) { 11 | return ( 12 |
13 |
14 |
15 |
16 |

17 | 全部壁纸 18 |

19 |

20 | 一共 100 条由 AI 生成的壁纸 21 |

22 |
23 |
24 | {wallpapers && 25 | wallpapers.map((wallpaper: Wallpaper, idx: number) => { 26 | return ( 27 |
31 |
32 |
33 | 38 |
39 | {wallpaper.user_nickname} 40 |
41 |
42 | 46 | {wallpaper.img_size} 47 | 48 |
49 | 54 |
55 | ); 56 | })} 57 |
58 |
59 | 60 |
61 |
62 |
63 |
64 | ); 65 | } 66 | -------------------------------------------------------------------------------- /app/api/gen-wallpaper/route.ts: -------------------------------------------------------------------------------- 1 | import { auth, currentUser } from "@clerk/nextjs"; 2 | 3 | import { ImageGenerateParams } from "openai/resources/images.mjs"; 4 | import { User } from "@/types/user"; 5 | import { Wallpaper } from "@/types/wallpaper"; 6 | import { downloadAndUploadImage } from "@/lib/s3"; 7 | import { getOpenAIClient } from "@/service/openai"; 8 | import { getUserCredits } from "@/service/order"; 9 | import { insertUser } from "@/models/user"; 10 | import { insertWallpaper } from "@/models/wallpaper"; 11 | 12 | export async function POST(req: Request) { 13 | const { description } = await req.json(); 14 | 15 | const user = await currentUser(); 16 | if (!user || !user.emailAddresses || user.emailAddresses.length === 0) { 17 | return Response.json({ 18 | code: -2, 19 | message: "user not login", 20 | }); 21 | } 22 | 23 | const user_email = user.emailAddresses[0].emailAddress; 24 | const credits = await getUserCredits(user_email); 25 | console.log("credits", credits); 26 | 27 | if (credits.left_credits < 150) { 28 | return Response.json({ 29 | code: -1, 30 | message: "credits is not enough", 31 | }); 32 | } 33 | 34 | const nickname = user.firstName; 35 | const avatarUrl = user.imageUrl; 36 | const userInfo: User = { 37 | email: user_email, 38 | nickname: nickname || "", 39 | avatar_url: avatarUrl, 40 | }; 41 | 42 | // await insertUser(userInfo); 43 | 44 | console.log("description", description); 45 | 46 | const client = getOpenAIClient(); 47 | 48 | const img_size = "1792x1024"; 49 | const llm_name = "dall-e-3"; 50 | const llm_params: ImageGenerateParams = { 51 | prompt: `generate a desktop wallpaper about: ${description}`, 52 | model: llm_name, 53 | n: 1, 54 | quality: "hd", 55 | response_format: "url", 56 | size: img_size, 57 | style: "natural", 58 | }; 59 | const result = await client.images.generate(llm_params); 60 | 61 | console.log("generate wallpaper result: ", result); 62 | 63 | const raw_img_url = result.data[0].url; // openai dall-e img url 64 | if (!raw_img_url) { 65 | return Response.json({ 66 | code: -1, 67 | message: "generate wallpaper failed", 68 | }); 69 | } 70 | 71 | const img_name = encodeURIComponent(description); 72 | // const s3_img = await downloadAndUploadImage( 73 | // raw_img_url, 74 | // process.env.AWS_BUCKET || "aiwallpaper-demo", 75 | // `wallpapers/${img_name}.png` 76 | // ); 77 | // const img_url = s3_img.Location; 78 | const img_url = raw_img_url; 79 | 80 | const created_at = new Date().toISOString(); 81 | 82 | const wallpaper: Wallpaper = { 83 | user_email: user_email, 84 | img_description: description, 85 | img_size: img_size, 86 | img_url: img_url, 87 | llm_name: llm_name, 88 | llm_params: JSON.stringify(llm_params), 89 | created_at: created_at, 90 | }; 91 | await insertWallpaper(wallpaper); 92 | 93 | return Response.json({ 94 | code: 0, 95 | message: "ok", 96 | data: wallpaper, 97 | }); 98 | } 99 | -------------------------------------------------------------------------------- /models/order.ts: -------------------------------------------------------------------------------- 1 | import { Order } from "@/types/order"; 2 | import { QueryResultRow } from "pg"; 3 | import { getDb } from "@/models/db"; 4 | 5 | export async function insertOrder(order: Order) { 6 | const db = getDb(); 7 | const res = await db.query( 8 | `INSERT INTO orders 9 | (order_no, created_at, user_email, amount, plan, expired_at, order_status, credits) 10 | VALUES 11 | ($1, $2, $3, $4, $5, $6, $7, $8) 12 | `, 13 | [ 14 | order.order_no, 15 | order.created_at, 16 | order.user_email, 17 | order.amount, 18 | order.plan, 19 | order.expired_at, 20 | order.order_status, 21 | order.credits, 22 | ] 23 | ); 24 | 25 | return res; 26 | } 27 | 28 | export async function findOrderByOrderNo( 29 | order_no: number 30 | ): Promise { 31 | const db = getDb(); 32 | const res = await db.query( 33 | `SELECT * FROM orders WHERE order_no = $1 LIMIT 1`, 34 | [order_no] 35 | ); 36 | if (res.rowCount === 0) { 37 | return undefined; 38 | } 39 | 40 | const { rows } = res; 41 | const row = rows[0]; 42 | const order = formatOrder(row); 43 | 44 | return order; 45 | } 46 | 47 | export async function updateOrderStatus( 48 | order_no: string, 49 | order_status: number, 50 | paied_at: string 51 | ) { 52 | const db = getDb(); 53 | const res = await db.query( 54 | `UPDATE orders SET order_status=$1, paied_at=$2 WHERE order_no=$3`, 55 | [order_status, paied_at, order_no] 56 | ); 57 | 58 | return res; 59 | } 60 | 61 | export async function updateOrderSession( 62 | order_no: string, 63 | stripe_session_id: string 64 | ) { 65 | const db = getDb(); 66 | const res = await db.query( 67 | `UPDATE orders SET stripe_session_id=$1 WHERE order_no=$2`, 68 | [stripe_session_id, order_no] 69 | ); 70 | 71 | return res; 72 | } 73 | 74 | export async function getUserOrders( 75 | user_email: string 76 | ): Promise { 77 | const now = new Date().toISOString(); 78 | const db = getDb(); 79 | const res = await db.query( 80 | `SELECT * FROM orders WHERE user_email = $1 AND order_status = 2 AND expired_at >= $2`, 81 | [user_email, now] 82 | ); 83 | if (res.rowCount === 0) { 84 | return undefined; 85 | } 86 | 87 | let orders: Order[] = []; 88 | const { rows } = res; 89 | rows.forEach((row) => { 90 | const order = formatOrder(row); 91 | orders.push(order); 92 | }); 93 | 94 | return orders; 95 | } 96 | 97 | function formatOrder(row: QueryResultRow): Order { 98 | const order: Order = { 99 | order_no: row.order_no, 100 | created_at: row.created_at, 101 | user_email: row.user_email, 102 | amount: row.amount, 103 | plan: row.plan, 104 | expired_at: row.expired_at, 105 | order_status: row.order_status, 106 | paied_at: row.paied_at, 107 | stripe_session_id: row.stripe_session_id, 108 | credits: row.credits, 109 | }; 110 | 111 | return order; 112 | } 113 | -------------------------------------------------------------------------------- /app/api/checkout/route.ts: -------------------------------------------------------------------------------- 1 | import { insertOrder, updateOrderSession } from "@/models/order"; 2 | 3 | import { Order } from "@/types/order"; 4 | import Stripe from "stripe"; 5 | import { currentUser } from "@clerk/nextjs"; 6 | 7 | export async function POST(req: Request) { 8 | // 0. 获取当前登录用户的标识 9 | const user = await currentUser(); 10 | if (!user || !user.emailAddresses || user.emailAddresses.length === 0) { 11 | return Response.json("not login"); 12 | } 13 | const user_email = user.emailAddresses[0].emailAddress; 14 | console.log("user_email", user_email); 15 | 16 | // 1. 获取下单参数 17 | const params = await req.json(); 18 | console.log("params", params); 19 | 20 | const currentDate = new Date(); 21 | const oneMonthLater = new Date(currentDate); 22 | oneMonthLater.setMonth(currentDate.getMonth() + 1); 23 | 24 | const created_at = currentDate.toISOString(); 25 | const expired_at = oneMonthLater.toISOString(); 26 | const order_no = new Date().getMilliseconds(); 27 | 28 | // 2. 创建订单 29 | const order: Order = { 30 | order_no: order_no.toString(), 31 | created_at: created_at, 32 | user_email: user_email, 33 | amount: params.amount, 34 | plan: params.plan, 35 | expired_at: expired_at, 36 | order_status: 1, 37 | credits: params.credits, 38 | }; 39 | console.log("order", order); 40 | // 把订单保存到 db 41 | await insertOrder(order); 42 | 43 | // 3. 调 stripe 下单 44 | const stripe = new Stripe(process.env.STRIPE_PRIVATE_KEY || ""); 45 | 46 | const session = await stripe.checkout.sessions.create({ 47 | customer_email: user_email, 48 | payment_method_types: ["card"], 49 | line_items: [ 50 | { 51 | price_data: { 52 | currency: "usd", 53 | product_data: { 54 | name: "aiwallpaper.demo credits plan", 55 | }, 56 | unit_amount: params.amount, 57 | recurring: 58 | params.plan === "monthly" 59 | ? { 60 | interval: "month", 61 | } 62 | : undefined, 63 | }, 64 | quantity: 1, 65 | }, 66 | ], 67 | allow_promotion_codes: false, 68 | metadata: { 69 | project: "aiwallpaper-demo", 70 | pay_scene: "buy-credits", 71 | order_no: order_no.toString(), 72 | user_email: user_email, 73 | credits: params.credits, 74 | }, 75 | mode: params.plan === "monthly" ? "subscription" : "payment", 76 | success_url: `${process.env.WEB_BASE_URI}/pay-success/{CHECKOUT_SESSION_ID}`, 77 | cancel_url: `${process.env.WEB_BASE_URI}/pricing`, 78 | }); 79 | 80 | // console.log("pay result", session); 81 | 82 | // 4. 更新支付标识 83 | const stripe_session_id = session.id; 84 | console.log("stripe session id", stripe_session_id); 85 | await updateOrderSession(order_no.toString(), stripe_session_id); 86 | 87 | return Response.json({ 88 | code: 0, 89 | message: "ok", 90 | data: { 91 | public_key: process.env.STRIPE_PUBLIC_KEY, 92 | order_no: order_no.toString(), 93 | session_id: stripe_session_id, 94 | }, 95 | }); 96 | } 97 | -------------------------------------------------------------------------------- /components/footer/index.tsx: -------------------------------------------------------------------------------- 1 | export default function () { 2 | return ( 3 | 90 | ); 91 | } 92 | -------------------------------------------------------------------------------- /components/pricing/index.tsx: -------------------------------------------------------------------------------- 1 | import { loadStripe } from "@stripe/stripe-js"; 2 | 3 | export default function () { 4 | const handleCheckout = async () => { 5 | const params = { 6 | amount: 990, 7 | credits: 50, 8 | plan: "subscribe", 9 | }; 10 | 11 | const response = await fetch("/api/checkout", { 12 | method: "POST", 13 | headers: { 14 | "Content-Type": "application/json", 15 | }, 16 | body: JSON.stringify(params), 17 | }); 18 | 19 | const { code, message, data } = await response.json(); 20 | if (!data) { 21 | return; 22 | } 23 | const { public_key, session_id } = data; 24 | console.log("checkout res", public_key, session_id); 25 | 26 | const stripe = await loadStripe(public_key); 27 | if (!stripe) { 28 | return; 29 | } 30 | 31 | const result = await stripe.redirectToCheckout({ 32 | sessionId: session_id, 33 | }); 34 | console.log("result", result); 35 | 36 | if (result.error) { 37 | // 处理错误 38 | console.log(result.error.message); 39 | } 40 | }; 41 | 42 | return ( 43 |
44 |
45 |

付款

46 |

47 | 30 days money-back guarantee 48 |

49 |
    50 |
  • 51 |
    52 |

    BASIC

    53 |
    54 |

    55 | Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam, 56 | purus sit 57 |

    58 |

    59 | $99/month 60 |

    61 | 79 |
    80 | 88 | 89 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 |

    Premium Designs

    103 |
    104 |
    105 | 113 | 114 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 |

    Exclusive Freebies

    128 |
    129 |
    130 | 138 | 139 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 |

    Monthly Free Exclusive

    153 |
    154 |
    155 | 163 | 164 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 |

    Customer Support

    178 |
    179 |
  • 180 |
  • 181 |
    182 |

    GROWTH

    183 |
    184 |

    185 | Lorem ipsum dolor sit amet consectetur adipiscing elit ut aliquam, 186 | purus sit 187 |

    188 |

    189 | $149/year 190 |

    191 | 195 |
    付款
    196 |
    197 | 202 | Arrow Right 203 | 204 | 205 |
    206 |
    207 |
    208 | 216 | 217 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 |

    Premium Designs

    231 |
    232 |
    233 | 241 | 242 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 |

    Exclusive Freebies

    256 |
    257 |
    258 | 266 | 267 | 273 | 274 | 275 | 276 | 277 | 278 | 279 | 280 |

    Monthly Free Exclusive

    281 |
    282 |
    283 | 291 | 292 | 298 | 299 | 300 | 301 | 302 | 303 | 304 | 305 |

    Customer Support

    306 |
    307 |
  • 308 |
309 |
310 |
311 | ); 312 | } 313 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@clerk/nextjs': 9 | specifier: ^4.29.3 10 | version: 4.29.3(next@14.0.4)(react-dom@18.2.0)(react@18.2.0) 11 | '@radix-ui/react-avatar': 12 | specifier: ^1.0.4 13 | version: 1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) 14 | '@radix-ui/react-slot': 15 | specifier: ^1.0.2 16 | version: 1.0.2(@types/react@18.2.47)(react@18.2.0) 17 | '@stripe/stripe-js': 18 | specifier: ^2.4.0 19 | version: 2.4.0 20 | aws-sdk: 21 | specifier: ^2.1537.0 22 | version: 2.1537.0 23 | axios: 24 | specifier: ^1.6.5 25 | version: 1.6.5 26 | class-variance-authority: 27 | specifier: ^0.7.0 28 | version: 0.7.0 29 | clsx: 30 | specifier: ^2.1.0 31 | version: 2.1.0 32 | lucide-react: 33 | specifier: ^0.309.0 34 | version: 0.309.0(react@18.2.0) 35 | next: 36 | specifier: 14.0.4 37 | version: 14.0.4(react-dom@18.2.0)(react@18.2.0) 38 | openai: 39 | specifier: ^4.24.2 40 | version: 4.24.2 41 | pg: 42 | specifier: ^8.11.3 43 | version: 8.11.3 44 | react: 45 | specifier: ^18 46 | version: 18.2.0 47 | react-copy-to-clipboard: 48 | specifier: ^5.1.0 49 | version: 5.1.0(react@18.2.0) 50 | react-dom: 51 | specifier: ^18 52 | version: 18.2.0(react@18.2.0) 53 | react-icons: 54 | specifier: ^5.0.0 55 | version: 5.0.0(react@18.2.0) 56 | react-lazy-load-image-component: 57 | specifier: ^1.6.0 58 | version: 1.6.0(react-dom@18.2.0)(react@18.2.0) 59 | sonner: 60 | specifier: ^1.3.1 61 | version: 1.3.1(react-dom@18.2.0)(react@18.2.0) 62 | stripe: 63 | specifier: ^14.13.0 64 | version: 14.13.0 65 | tailwind-merge: 66 | specifier: ^2.2.0 67 | version: 2.2.0 68 | tailwindcss-animate: 69 | specifier: ^1.0.7 70 | version: 1.0.7(tailwindcss@3.4.1) 71 | 72 | devDependencies: 73 | '@types/node': 74 | specifier: ^20 75 | version: 20.10.8 76 | '@types/pg': 77 | specifier: ^8.10.9 78 | version: 8.10.9 79 | '@types/react': 80 | specifier: ^18 81 | version: 18.2.47 82 | '@types/react-copy-to-clipboard': 83 | specifier: ^5.0.7 84 | version: 5.0.7 85 | '@types/react-dom': 86 | specifier: ^18 87 | version: 18.2.18 88 | '@types/react-lazy-load-image-component': 89 | specifier: ^1.6.3 90 | version: 1.6.3 91 | autoprefixer: 92 | specifier: ^10.0.1 93 | version: 10.4.16(postcss@8.4.33) 94 | postcss: 95 | specifier: ^8 96 | version: 8.4.33 97 | tailwindcss: 98 | specifier: ^3.3.0 99 | version: 3.4.1 100 | typescript: 101 | specifier: ^5 102 | version: 5.3.3 103 | 104 | packages: 105 | 106 | /@alloc/quick-lru@5.2.0: 107 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 108 | engines: {node: '>=10'} 109 | 110 | /@babel/runtime@7.23.8: 111 | resolution: {integrity: sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==} 112 | engines: {node: '>=6.9.0'} 113 | dependencies: 114 | regenerator-runtime: 0.14.1 115 | dev: false 116 | 117 | /@clerk/backend@0.37.2(react@18.2.0): 118 | resolution: {integrity: sha512-Ymnf8LfcZTP/P15uMrY7myUtoOKgKiUR1G2c8429cIPdMTDC/fX+P+HUF1TlcKjwERuT+pGySufSjmPrDwqeMw==} 119 | engines: {node: '>=14'} 120 | dependencies: 121 | '@clerk/shared': 1.3.1(react@18.2.0) 122 | '@clerk/types': 3.60.0 123 | '@peculiar/webcrypto': 1.4.1 124 | '@types/node': 16.18.6 125 | cookie: 0.5.0 126 | deepmerge: 4.2.2 127 | node-fetch-native: 1.0.1 128 | snakecase-keys: 5.4.4 129 | tslib: 2.4.1 130 | transitivePeerDependencies: 131 | - react 132 | dev: false 133 | 134 | /@clerk/clerk-react@4.30.3(react@18.2.0): 135 | resolution: {integrity: sha512-bX4fUxGXUrMl8A50TpeUM8PHFKbMHmt7UfJ/NnUQMBN54h9N/NF2eSE2omY1+lDxBJmh/V9EiJZV8S6MwDflzw==} 136 | engines: {node: '>=14'} 137 | peerDependencies: 138 | react: '>=16' 139 | dependencies: 140 | '@clerk/shared': 1.3.1(react@18.2.0) 141 | '@clerk/types': 3.60.0 142 | react: 18.2.0 143 | tslib: 2.4.1 144 | dev: false 145 | 146 | /@clerk/clerk-sdk-node@4.13.6(react@18.2.0): 147 | resolution: {integrity: sha512-p/bGFvageJ6gTxuyG/VMdl0UiT0HzfT7ymrrcpZjN/lDheCoL5lin5JBBgdV4189tw9xb6wAl2XjsiOvYqo64w==} 148 | engines: {node: '>=14'} 149 | dependencies: 150 | '@clerk/backend': 0.37.2(react@18.2.0) 151 | '@clerk/shared': 1.3.1(react@18.2.0) 152 | '@clerk/types': 3.60.0 153 | '@types/cookies': 0.7.7 154 | '@types/express': 4.17.14 155 | '@types/node-fetch': 2.6.2 156 | camelcase-keys: 6.2.2 157 | snakecase-keys: 3.2.1 158 | tslib: 2.4.1 159 | transitivePeerDependencies: 160 | - react 161 | dev: false 162 | 163 | /@clerk/nextjs@4.29.3(next@14.0.4)(react-dom@18.2.0)(react@18.2.0): 164 | resolution: {integrity: sha512-qPBHjOAEAwKPnBx7eat6oB5SUlqWWTALeize+pY4TRYURliUk/iZtNFFr/smF87bYCNwslZ+vDRQznEQsSpSkA==} 165 | engines: {node: '>=14'} 166 | peerDependencies: 167 | next: '>=10' 168 | react: ^17.0.2 || ^18.0.0-0 169 | react-dom: ^17.0.2 || ^18.0.0-0 170 | dependencies: 171 | '@clerk/backend': 0.37.2(react@18.2.0) 172 | '@clerk/clerk-react': 4.30.3(react@18.2.0) 173 | '@clerk/clerk-sdk-node': 4.13.6(react@18.2.0) 174 | '@clerk/shared': 1.3.1(react@18.2.0) 175 | '@clerk/types': 3.60.0 176 | next: 14.0.4(react-dom@18.2.0)(react@18.2.0) 177 | path-to-regexp: 6.2.1 178 | react: 18.2.0 179 | react-dom: 18.2.0(react@18.2.0) 180 | tslib: 2.4.1 181 | dev: false 182 | 183 | /@clerk/shared@1.3.1(react@18.2.0): 184 | resolution: {integrity: sha512-nzv4+uA90I/eQp55zfK9a1Po9VgCYlzlNhuZnKqyRsPyJ38l4gpIf3B3qSHHdN0+MTx9cWGFrik1CnpftdOBXQ==} 185 | peerDependencies: 186 | react: '>=16' 187 | peerDependenciesMeta: 188 | react: 189 | optional: true 190 | dependencies: 191 | glob-to-regexp: 0.4.1 192 | js-cookie: 3.0.1 193 | react: 18.2.0 194 | swr: 2.2.0(react@18.2.0) 195 | dev: false 196 | 197 | /@clerk/types@3.60.0: 198 | resolution: {integrity: sha512-f1A16wFh5MtikxEo7o6vAVX7FxpqC1YmzA6c4ugwq5MH8J2mvIM/LwNVIHgNpZkn/s/G+BUhBcJJmUXqajDK2Q==} 199 | engines: {node: '>=14'} 200 | dependencies: 201 | csstype: 3.1.1 202 | dev: false 203 | 204 | /@isaacs/cliui@8.0.2: 205 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 206 | engines: {node: '>=12'} 207 | dependencies: 208 | string-width: 5.1.2 209 | string-width-cjs: /string-width@4.2.3 210 | strip-ansi: 7.1.0 211 | strip-ansi-cjs: /strip-ansi@6.0.1 212 | wrap-ansi: 8.1.0 213 | wrap-ansi-cjs: /wrap-ansi@7.0.0 214 | 215 | /@jridgewell/gen-mapping@0.3.3: 216 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} 217 | engines: {node: '>=6.0.0'} 218 | dependencies: 219 | '@jridgewell/set-array': 1.1.2 220 | '@jridgewell/sourcemap-codec': 1.4.15 221 | '@jridgewell/trace-mapping': 0.3.20 222 | 223 | /@jridgewell/resolve-uri@3.1.1: 224 | resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} 225 | engines: {node: '>=6.0.0'} 226 | 227 | /@jridgewell/set-array@1.1.2: 228 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} 229 | engines: {node: '>=6.0.0'} 230 | 231 | /@jridgewell/sourcemap-codec@1.4.15: 232 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 233 | 234 | /@jridgewell/trace-mapping@0.3.20: 235 | resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} 236 | dependencies: 237 | '@jridgewell/resolve-uri': 3.1.1 238 | '@jridgewell/sourcemap-codec': 1.4.15 239 | 240 | /@next/env@14.0.4: 241 | resolution: {integrity: sha512-irQnbMLbUNQpP1wcE5NstJtbuA/69kRfzBrpAD7Gsn8zm/CY6YQYc3HQBz8QPxwISG26tIm5afvvVbu508oBeQ==} 242 | dev: false 243 | 244 | /@next/swc-darwin-arm64@14.0.4: 245 | resolution: {integrity: sha512-mF05E/5uPthWzyYDyptcwHptucf/jj09i2SXBPwNzbgBNc+XnwzrL0U6BmPjQeOL+FiB+iG1gwBeq7mlDjSRPg==} 246 | engines: {node: '>= 10'} 247 | cpu: [arm64] 248 | os: [darwin] 249 | requiresBuild: true 250 | dev: false 251 | optional: true 252 | 253 | /@next/swc-darwin-x64@14.0.4: 254 | resolution: {integrity: sha512-IZQ3C7Bx0k2rYtrZZxKKiusMTM9WWcK5ajyhOZkYYTCc8xytmwSzR1skU7qLgVT/EY9xtXDG0WhY6fyujnI3rw==} 255 | engines: {node: '>= 10'} 256 | cpu: [x64] 257 | os: [darwin] 258 | requiresBuild: true 259 | dev: false 260 | optional: true 261 | 262 | /@next/swc-linux-arm64-gnu@14.0.4: 263 | resolution: {integrity: sha512-VwwZKrBQo/MGb1VOrxJ6LrKvbpo7UbROuyMRvQKTFKhNaXjUmKTu7wxVkIuCARAfiI8JpaWAnKR+D6tzpCcM4w==} 264 | engines: {node: '>= 10'} 265 | cpu: [arm64] 266 | os: [linux] 267 | requiresBuild: true 268 | dev: false 269 | optional: true 270 | 271 | /@next/swc-linux-arm64-musl@14.0.4: 272 | resolution: {integrity: sha512-8QftwPEW37XxXoAwsn+nXlodKWHfpMaSvt81W43Wh8dv0gkheD+30ezWMcFGHLI71KiWmHK5PSQbTQGUiidvLQ==} 273 | engines: {node: '>= 10'} 274 | cpu: [arm64] 275 | os: [linux] 276 | requiresBuild: true 277 | dev: false 278 | optional: true 279 | 280 | /@next/swc-linux-x64-gnu@14.0.4: 281 | resolution: {integrity: sha512-/s/Pme3VKfZAfISlYVq2hzFS8AcAIOTnoKupc/j4WlvF6GQ0VouS2Q2KEgPuO1eMBwakWPB1aYFIA4VNVh667A==} 282 | engines: {node: '>= 10'} 283 | cpu: [x64] 284 | os: [linux] 285 | requiresBuild: true 286 | dev: false 287 | optional: true 288 | 289 | /@next/swc-linux-x64-musl@14.0.4: 290 | resolution: {integrity: sha512-m8z/6Fyal4L9Bnlxde5g2Mfa1Z7dasMQyhEhskDATpqr+Y0mjOBZcXQ7G5U+vgL22cI4T7MfvgtrM2jdopqWaw==} 291 | engines: {node: '>= 10'} 292 | cpu: [x64] 293 | os: [linux] 294 | requiresBuild: true 295 | dev: false 296 | optional: true 297 | 298 | /@next/swc-win32-arm64-msvc@14.0.4: 299 | resolution: {integrity: sha512-7Wv4PRiWIAWbm5XrGz3D8HUkCVDMMz9igffZG4NB1p4u1KoItwx9qjATHz88kwCEal/HXmbShucaslXCQXUM5w==} 300 | engines: {node: '>= 10'} 301 | cpu: [arm64] 302 | os: [win32] 303 | requiresBuild: true 304 | dev: false 305 | optional: true 306 | 307 | /@next/swc-win32-ia32-msvc@14.0.4: 308 | resolution: {integrity: sha512-zLeNEAPULsl0phfGb4kdzF/cAVIfaC7hY+kt0/d+y9mzcZHsMS3hAS829WbJ31DkSlVKQeHEjZHIdhN+Pg7Gyg==} 309 | engines: {node: '>= 10'} 310 | cpu: [ia32] 311 | os: [win32] 312 | requiresBuild: true 313 | dev: false 314 | optional: true 315 | 316 | /@next/swc-win32-x64-msvc@14.0.4: 317 | resolution: {integrity: sha512-yEh2+R8qDlDCjxVpzOTEpBLQTEFAcP2A8fUFLaWNap9GitYKkKv1//y2S6XY6zsR4rCOPRpU7plYDR+az2n30A==} 318 | engines: {node: '>= 10'} 319 | cpu: [x64] 320 | os: [win32] 321 | requiresBuild: true 322 | dev: false 323 | optional: true 324 | 325 | /@nodelib/fs.scandir@2.1.5: 326 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 327 | engines: {node: '>= 8'} 328 | dependencies: 329 | '@nodelib/fs.stat': 2.0.5 330 | run-parallel: 1.2.0 331 | 332 | /@nodelib/fs.stat@2.0.5: 333 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 334 | engines: {node: '>= 8'} 335 | 336 | /@nodelib/fs.walk@1.2.8: 337 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 338 | engines: {node: '>= 8'} 339 | dependencies: 340 | '@nodelib/fs.scandir': 2.1.5 341 | fastq: 1.16.0 342 | 343 | /@peculiar/asn1-schema@2.3.8: 344 | resolution: {integrity: sha512-ULB1XqHKx1WBU/tTFIA+uARuRoBVZ4pNdOA878RDrRbBfBGcSzi5HBkdScC6ZbHn8z7L8gmKCgPC1LHRrP46tA==} 345 | dependencies: 346 | asn1js: 3.0.5 347 | pvtsutils: 1.3.5 348 | tslib: 2.6.2 349 | dev: false 350 | 351 | /@peculiar/json-schema@1.1.12: 352 | resolution: {integrity: sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==} 353 | engines: {node: '>=8.0.0'} 354 | dependencies: 355 | tslib: 2.6.2 356 | dev: false 357 | 358 | /@peculiar/webcrypto@1.4.1: 359 | resolution: {integrity: sha512-eK4C6WTNYxoI7JOabMoZICiyqRRtJB220bh0Mbj5RwRycleZf9BPyZoxsTvpP0FpmVS2aS13NKOuh5/tN3sIRw==} 360 | engines: {node: '>=10.12.0'} 361 | dependencies: 362 | '@peculiar/asn1-schema': 2.3.8 363 | '@peculiar/json-schema': 1.1.12 364 | pvtsutils: 1.3.5 365 | tslib: 2.6.2 366 | webcrypto-core: 1.7.7 367 | dev: false 368 | 369 | /@pkgjs/parseargs@0.11.0: 370 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 371 | engines: {node: '>=14'} 372 | requiresBuild: true 373 | optional: true 374 | 375 | /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): 376 | resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} 377 | peerDependencies: 378 | '@types/react': '*' 379 | '@types/react-dom': '*' 380 | react: ^16.8 || ^17.0 || ^18.0 381 | react-dom: ^16.8 || ^17.0 || ^18.0 382 | peerDependenciesMeta: 383 | '@types/react': 384 | optional: true 385 | '@types/react-dom': 386 | optional: true 387 | dependencies: 388 | '@babel/runtime': 7.23.8 389 | '@radix-ui/react-context': 1.0.1(@types/react@18.2.47)(react@18.2.0) 390 | '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0) 391 | '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.47)(react@18.2.0) 392 | '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.47)(react@18.2.0) 393 | '@types/react': 18.2.47 394 | '@types/react-dom': 18.2.18 395 | react: 18.2.0 396 | react-dom: 18.2.0(react@18.2.0) 397 | dev: false 398 | 399 | /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.47)(react@18.2.0): 400 | resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} 401 | peerDependencies: 402 | '@types/react': '*' 403 | react: ^16.8 || ^17.0 || ^18.0 404 | peerDependenciesMeta: 405 | '@types/react': 406 | optional: true 407 | dependencies: 408 | '@babel/runtime': 7.23.8 409 | '@types/react': 18.2.47 410 | react: 18.2.0 411 | dev: false 412 | 413 | /@radix-ui/react-context@1.0.1(@types/react@18.2.47)(react@18.2.0): 414 | resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} 415 | peerDependencies: 416 | '@types/react': '*' 417 | react: ^16.8 || ^17.0 || ^18.0 418 | peerDependenciesMeta: 419 | '@types/react': 420 | optional: true 421 | dependencies: 422 | '@babel/runtime': 7.23.8 423 | '@types/react': 18.2.47 424 | react: 18.2.0 425 | dev: false 426 | 427 | /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.18)(@types/react@18.2.47)(react-dom@18.2.0)(react@18.2.0): 428 | resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} 429 | peerDependencies: 430 | '@types/react': '*' 431 | '@types/react-dom': '*' 432 | react: ^16.8 || ^17.0 || ^18.0 433 | react-dom: ^16.8 || ^17.0 || ^18.0 434 | peerDependenciesMeta: 435 | '@types/react': 436 | optional: true 437 | '@types/react-dom': 438 | optional: true 439 | dependencies: 440 | '@babel/runtime': 7.23.8 441 | '@radix-ui/react-slot': 1.0.2(@types/react@18.2.47)(react@18.2.0) 442 | '@types/react': 18.2.47 443 | '@types/react-dom': 18.2.18 444 | react: 18.2.0 445 | react-dom: 18.2.0(react@18.2.0) 446 | dev: false 447 | 448 | /@radix-ui/react-slot@1.0.2(@types/react@18.2.47)(react@18.2.0): 449 | resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} 450 | peerDependencies: 451 | '@types/react': '*' 452 | react: ^16.8 || ^17.0 || ^18.0 453 | peerDependenciesMeta: 454 | '@types/react': 455 | optional: true 456 | dependencies: 457 | '@babel/runtime': 7.23.8 458 | '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.47)(react@18.2.0) 459 | '@types/react': 18.2.47 460 | react: 18.2.0 461 | dev: false 462 | 463 | /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.47)(react@18.2.0): 464 | resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} 465 | peerDependencies: 466 | '@types/react': '*' 467 | react: ^16.8 || ^17.0 || ^18.0 468 | peerDependenciesMeta: 469 | '@types/react': 470 | optional: true 471 | dependencies: 472 | '@babel/runtime': 7.23.8 473 | '@types/react': 18.2.47 474 | react: 18.2.0 475 | dev: false 476 | 477 | /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.47)(react@18.2.0): 478 | resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} 479 | peerDependencies: 480 | '@types/react': '*' 481 | react: ^16.8 || ^17.0 || ^18.0 482 | peerDependenciesMeta: 483 | '@types/react': 484 | optional: true 485 | dependencies: 486 | '@babel/runtime': 7.23.8 487 | '@types/react': 18.2.47 488 | react: 18.2.0 489 | dev: false 490 | 491 | /@stripe/stripe-js@2.4.0: 492 | resolution: {integrity: sha512-WFkQx1mbs2b5+7looI9IV1BLa3bIApuN3ehp9FP58xGg7KL9hCHDECgW3BwO9l9L+xBPVAD7Yjn1EhGe6EDTeA==} 493 | dev: false 494 | 495 | /@swc/helpers@0.5.2: 496 | resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} 497 | dependencies: 498 | tslib: 2.6.2 499 | dev: false 500 | 501 | /@types/body-parser@1.19.5: 502 | resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} 503 | dependencies: 504 | '@types/connect': 3.4.38 505 | '@types/node': 20.10.8 506 | dev: false 507 | 508 | /@types/connect@3.4.38: 509 | resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} 510 | dependencies: 511 | '@types/node': 20.10.8 512 | dev: false 513 | 514 | /@types/cookies@0.7.7: 515 | resolution: {integrity: sha512-h7BcvPUogWbKCzBR2lY4oqaZbO3jXZksexYJVFvkrFeLgbZjQkU4x8pRq6eg2MHXQhY0McQdqmmsxRWlVAHooA==} 516 | dependencies: 517 | '@types/connect': 3.4.38 518 | '@types/express': 4.17.14 519 | '@types/keygrip': 1.0.6 520 | '@types/node': 20.10.8 521 | dev: false 522 | 523 | /@types/express-serve-static-core@4.17.41: 524 | resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} 525 | dependencies: 526 | '@types/node': 20.10.8 527 | '@types/qs': 6.9.11 528 | '@types/range-parser': 1.2.7 529 | '@types/send': 0.17.4 530 | dev: false 531 | 532 | /@types/express@4.17.14: 533 | resolution: {integrity: sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==} 534 | dependencies: 535 | '@types/body-parser': 1.19.5 536 | '@types/express-serve-static-core': 4.17.41 537 | '@types/qs': 6.9.11 538 | '@types/serve-static': 1.15.5 539 | dev: false 540 | 541 | /@types/http-errors@2.0.4: 542 | resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} 543 | dev: false 544 | 545 | /@types/keygrip@1.0.6: 546 | resolution: {integrity: sha512-lZuNAY9xeJt7Bx4t4dx0rYCDqGPW8RXhQZK1td7d4H6E9zYbLoOtjBvfwdTKpsyxQI/2jv+armjX/RW+ZNpXOQ==} 547 | dev: false 548 | 549 | /@types/mime@1.3.5: 550 | resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} 551 | dev: false 552 | 553 | /@types/mime@3.0.4: 554 | resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} 555 | dev: false 556 | 557 | /@types/node-fetch@2.6.10: 558 | resolution: {integrity: sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA==} 559 | dependencies: 560 | '@types/node': 20.10.8 561 | form-data: 4.0.0 562 | dev: false 563 | 564 | /@types/node-fetch@2.6.2: 565 | resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==} 566 | dependencies: 567 | '@types/node': 20.10.8 568 | form-data: 3.0.1 569 | dev: false 570 | 571 | /@types/node@16.18.6: 572 | resolution: {integrity: sha512-vmYJF0REqDyyU0gviezF/KHq/fYaUbFhkcNbQCuPGFQj6VTbXuHZoxs/Y7mutWe73C8AC6l9fFu8mSYiBAqkGA==} 573 | dev: false 574 | 575 | /@types/node@18.19.6: 576 | resolution: {integrity: sha512-X36s5CXMrrJOs2lQCdDF68apW4Rfx9ixYMawlepwmE4Anezv/AV2LSpKD1Ub8DAc+urp5bk0BGZ6NtmBitfnsg==} 577 | dependencies: 578 | undici-types: 5.26.5 579 | dev: false 580 | 581 | /@types/node@20.10.8: 582 | resolution: {integrity: sha512-f8nQs3cLxbAFc00vEU59yf9UyGUftkPaLGfvbVOIDdx2i1b8epBqj2aNGyP19fiyXWvlmZ7qC1XLjAzw/OKIeA==} 583 | dependencies: 584 | undici-types: 5.26.5 585 | 586 | /@types/pg@8.10.9: 587 | resolution: {integrity: sha512-UksbANNE/f8w0wOMxVKKIrLCbEMV+oM1uKejmwXr39olg4xqcfBDbXxObJAt6XxHbDa4XTKOlUEcEltXDX+XLQ==} 588 | dependencies: 589 | '@types/node': 20.10.8 590 | pg-protocol: 1.6.0 591 | pg-types: 4.0.1 592 | dev: true 593 | 594 | /@types/prop-types@15.7.11: 595 | resolution: {integrity: sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==} 596 | 597 | /@types/qs@6.9.11: 598 | resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} 599 | dev: false 600 | 601 | /@types/range-parser@1.2.7: 602 | resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} 603 | dev: false 604 | 605 | /@types/react-copy-to-clipboard@5.0.7: 606 | resolution: {integrity: sha512-Gft19D+as4M+9Whq1oglhmK49vqPhcLzk8WfvfLvaYMIPYanyfLy0+CwFucMJfdKoSFyySPmkkWn8/E6voQXjQ==} 607 | dependencies: 608 | '@types/react': 18.2.47 609 | dev: true 610 | 611 | /@types/react-dom@18.2.18: 612 | resolution: {integrity: sha512-TJxDm6OfAX2KJWJdMEVTwWke5Sc/E/RlnPGvGfS0W7+6ocy2xhDVQVh/KvC2Uf7kACs+gDytdusDSdWfWkaNzw==} 613 | dependencies: 614 | '@types/react': 18.2.47 615 | 616 | /@types/react-lazy-load-image-component@1.6.3: 617 | resolution: {integrity: sha512-HsIsYz7yWWTh/bftdzGnijKD26JyofLRqM/RM80sxs7Gk13G83ew8R/ra2XzXuiZfjNEjAq/Va+NBHFF9ciwxA==} 618 | dependencies: 619 | '@types/react': 18.2.47 620 | csstype: 3.1.3 621 | dev: true 622 | 623 | /@types/react@18.2.47: 624 | resolution: {integrity: sha512-xquNkkOirwyCgoClNk85BjP+aqnIS+ckAJ8i37gAbDs14jfW/J23f2GItAf33oiUPQnqNMALiFeoM9Y5mbjpVQ==} 625 | dependencies: 626 | '@types/prop-types': 15.7.11 627 | '@types/scheduler': 0.16.8 628 | csstype: 3.1.3 629 | 630 | /@types/scheduler@0.16.8: 631 | resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} 632 | 633 | /@types/send@0.17.4: 634 | resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} 635 | dependencies: 636 | '@types/mime': 1.3.5 637 | '@types/node': 20.10.8 638 | dev: false 639 | 640 | /@types/serve-static@1.15.5: 641 | resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} 642 | dependencies: 643 | '@types/http-errors': 2.0.4 644 | '@types/mime': 3.0.4 645 | '@types/node': 20.10.8 646 | dev: false 647 | 648 | /abort-controller@3.0.0: 649 | resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} 650 | engines: {node: '>=6.5'} 651 | dependencies: 652 | event-target-shim: 5.0.1 653 | dev: false 654 | 655 | /agentkeepalive@4.5.0: 656 | resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} 657 | engines: {node: '>= 8.0.0'} 658 | dependencies: 659 | humanize-ms: 1.2.1 660 | dev: false 661 | 662 | /ansi-regex@5.0.1: 663 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 664 | engines: {node: '>=8'} 665 | 666 | /ansi-regex@6.0.1: 667 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 668 | engines: {node: '>=12'} 669 | 670 | /ansi-styles@4.3.0: 671 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 672 | engines: {node: '>=8'} 673 | dependencies: 674 | color-convert: 2.0.1 675 | 676 | /ansi-styles@6.2.1: 677 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 678 | engines: {node: '>=12'} 679 | 680 | /any-promise@1.3.0: 681 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 682 | 683 | /anymatch@3.1.3: 684 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 685 | engines: {node: '>= 8'} 686 | dependencies: 687 | normalize-path: 3.0.0 688 | picomatch: 2.3.1 689 | 690 | /arg@5.0.2: 691 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 692 | 693 | /asn1js@3.0.5: 694 | resolution: {integrity: sha512-FVnvrKJwpt9LP2lAMl8qZswRNm3T4q9CON+bxldk2iwk3FFpuwhx2FfinyitizWHsVYyaY+y5JzDR0rCMV5yTQ==} 695 | engines: {node: '>=12.0.0'} 696 | dependencies: 697 | pvtsutils: 1.3.5 698 | pvutils: 1.1.3 699 | tslib: 2.6.2 700 | dev: false 701 | 702 | /asynckit@0.4.0: 703 | resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} 704 | dev: false 705 | 706 | /autoprefixer@10.4.16(postcss@8.4.33): 707 | resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} 708 | engines: {node: ^10 || ^12 || >=14} 709 | hasBin: true 710 | peerDependencies: 711 | postcss: ^8.1.0 712 | dependencies: 713 | browserslist: 4.22.2 714 | caniuse-lite: 1.0.30001576 715 | fraction.js: 4.3.7 716 | normalize-range: 0.1.2 717 | picocolors: 1.0.0 718 | postcss: 8.4.33 719 | postcss-value-parser: 4.2.0 720 | dev: true 721 | 722 | /available-typed-arrays@1.0.5: 723 | resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} 724 | engines: {node: '>= 0.4'} 725 | dev: false 726 | 727 | /aws-sdk@2.1537.0: 728 | resolution: {integrity: sha512-ILC4pSOA07XdkqbOVGJ4W2s1cBlmG5xQnVEgo4g5g0vhrjpuJm3jTSkBSGAOqpGuZ0TA/5uFCfsGnYnpoT2z0A==} 729 | engines: {node: '>= 10.0.0'} 730 | dependencies: 731 | buffer: 4.9.2 732 | events: 1.1.1 733 | ieee754: 1.1.13 734 | jmespath: 0.16.0 735 | querystring: 0.2.0 736 | sax: 1.2.1 737 | url: 0.10.3 738 | util: 0.12.5 739 | uuid: 8.0.0 740 | xml2js: 0.5.0 741 | dev: false 742 | 743 | /axios@1.6.5: 744 | resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==} 745 | dependencies: 746 | follow-redirects: 1.15.5 747 | form-data: 4.0.0 748 | proxy-from-env: 1.1.0 749 | transitivePeerDependencies: 750 | - debug 751 | dev: false 752 | 753 | /balanced-match@1.0.2: 754 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 755 | 756 | /base-64@0.1.0: 757 | resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} 758 | dev: false 759 | 760 | /base64-js@1.5.1: 761 | resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} 762 | dev: false 763 | 764 | /binary-extensions@2.2.0: 765 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 766 | engines: {node: '>=8'} 767 | 768 | /brace-expansion@2.0.1: 769 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 770 | dependencies: 771 | balanced-match: 1.0.2 772 | 773 | /braces@3.0.2: 774 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 775 | engines: {node: '>=8'} 776 | dependencies: 777 | fill-range: 7.0.1 778 | 779 | /browserslist@4.22.2: 780 | resolution: {integrity: sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==} 781 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 782 | hasBin: true 783 | dependencies: 784 | caniuse-lite: 1.0.30001576 785 | electron-to-chromium: 1.4.626 786 | node-releases: 2.0.14 787 | update-browserslist-db: 1.0.13(browserslist@4.22.2) 788 | dev: true 789 | 790 | /buffer-writer@2.0.0: 791 | resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} 792 | engines: {node: '>=4'} 793 | dev: false 794 | 795 | /buffer@4.9.2: 796 | resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==} 797 | dependencies: 798 | base64-js: 1.5.1 799 | ieee754: 1.1.13 800 | isarray: 1.0.0 801 | dev: false 802 | 803 | /busboy@1.6.0: 804 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 805 | engines: {node: '>=10.16.0'} 806 | dependencies: 807 | streamsearch: 1.1.0 808 | dev: false 809 | 810 | /call-bind@1.0.5: 811 | resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} 812 | dependencies: 813 | function-bind: 1.1.2 814 | get-intrinsic: 1.2.2 815 | set-function-length: 1.2.0 816 | dev: false 817 | 818 | /camelcase-css@2.0.1: 819 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 820 | engines: {node: '>= 6'} 821 | 822 | /camelcase-keys@6.2.2: 823 | resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} 824 | engines: {node: '>=8'} 825 | dependencies: 826 | camelcase: 5.3.1 827 | map-obj: 4.3.0 828 | quick-lru: 4.0.1 829 | dev: false 830 | 831 | /camelcase@5.3.1: 832 | resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} 833 | engines: {node: '>=6'} 834 | dev: false 835 | 836 | /caniuse-lite@1.0.30001576: 837 | resolution: {integrity: sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==} 838 | 839 | /charenc@0.0.2: 840 | resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} 841 | dev: false 842 | 843 | /chokidar@3.5.3: 844 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 845 | engines: {node: '>= 8.10.0'} 846 | dependencies: 847 | anymatch: 3.1.3 848 | braces: 3.0.2 849 | glob-parent: 5.1.2 850 | is-binary-path: 2.1.0 851 | is-glob: 4.0.3 852 | normalize-path: 3.0.0 853 | readdirp: 3.6.0 854 | optionalDependencies: 855 | fsevents: 2.3.3 856 | 857 | /class-variance-authority@0.7.0: 858 | resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} 859 | dependencies: 860 | clsx: 2.0.0 861 | dev: false 862 | 863 | /client-only@0.0.1: 864 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 865 | dev: false 866 | 867 | /clsx@2.0.0: 868 | resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} 869 | engines: {node: '>=6'} 870 | dev: false 871 | 872 | /clsx@2.1.0: 873 | resolution: {integrity: sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==} 874 | engines: {node: '>=6'} 875 | dev: false 876 | 877 | /color-convert@2.0.1: 878 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 879 | engines: {node: '>=7.0.0'} 880 | dependencies: 881 | color-name: 1.1.4 882 | 883 | /color-name@1.1.4: 884 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 885 | 886 | /combined-stream@1.0.8: 887 | resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} 888 | engines: {node: '>= 0.8'} 889 | dependencies: 890 | delayed-stream: 1.0.0 891 | dev: false 892 | 893 | /commander@4.1.1: 894 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 895 | engines: {node: '>= 6'} 896 | 897 | /cookie@0.5.0: 898 | resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} 899 | engines: {node: '>= 0.6'} 900 | dev: false 901 | 902 | /copy-to-clipboard@3.3.3: 903 | resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} 904 | dependencies: 905 | toggle-selection: 1.0.6 906 | dev: false 907 | 908 | /cross-spawn@7.0.3: 909 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 910 | engines: {node: '>= 8'} 911 | dependencies: 912 | path-key: 3.1.1 913 | shebang-command: 2.0.0 914 | which: 2.0.2 915 | 916 | /crypt@0.0.2: 917 | resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} 918 | dev: false 919 | 920 | /cssesc@3.0.0: 921 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 922 | engines: {node: '>=4'} 923 | hasBin: true 924 | 925 | /csstype@3.1.1: 926 | resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} 927 | dev: false 928 | 929 | /csstype@3.1.3: 930 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 931 | 932 | /deepmerge@4.2.2: 933 | resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==} 934 | engines: {node: '>=0.10.0'} 935 | dev: false 936 | 937 | /define-data-property@1.1.1: 938 | resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} 939 | engines: {node: '>= 0.4'} 940 | dependencies: 941 | get-intrinsic: 1.2.2 942 | gopd: 1.0.1 943 | has-property-descriptors: 1.0.1 944 | dev: false 945 | 946 | /delayed-stream@1.0.0: 947 | resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} 948 | engines: {node: '>=0.4.0'} 949 | dev: false 950 | 951 | /didyoumean@1.2.2: 952 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 953 | 954 | /digest-fetch@1.3.0: 955 | resolution: {integrity: sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA==} 956 | dependencies: 957 | base-64: 0.1.0 958 | md5: 2.3.0 959 | dev: false 960 | 961 | /dlv@1.1.3: 962 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 963 | 964 | /dot-case@3.0.4: 965 | resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} 966 | dependencies: 967 | no-case: 3.0.4 968 | tslib: 2.6.2 969 | dev: false 970 | 971 | /eastasianwidth@0.2.0: 972 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 973 | 974 | /electron-to-chromium@1.4.626: 975 | resolution: {integrity: sha512-f7/be56VjRRQk+Ric6PmIrEtPcIqsn3tElyAu9Sh6egha2VLJ82qwkcOdcnT06W+Pb6RUulV1ckzrGbKzVcTHg==} 976 | dev: true 977 | 978 | /emoji-regex@8.0.0: 979 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 980 | 981 | /emoji-regex@9.2.2: 982 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 983 | 984 | /escalade@3.1.1: 985 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 986 | engines: {node: '>=6'} 987 | dev: true 988 | 989 | /event-target-shim@5.0.1: 990 | resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} 991 | engines: {node: '>=6'} 992 | dev: false 993 | 994 | /events@1.1.1: 995 | resolution: {integrity: sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==} 996 | engines: {node: '>=0.4.x'} 997 | dev: false 998 | 999 | /fast-glob@3.3.2: 1000 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 1001 | engines: {node: '>=8.6.0'} 1002 | dependencies: 1003 | '@nodelib/fs.stat': 2.0.5 1004 | '@nodelib/fs.walk': 1.2.8 1005 | glob-parent: 5.1.2 1006 | merge2: 1.4.1 1007 | micromatch: 4.0.5 1008 | 1009 | /fastq@1.16.0: 1010 | resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} 1011 | dependencies: 1012 | reusify: 1.0.4 1013 | 1014 | /fill-range@7.0.1: 1015 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 1016 | engines: {node: '>=8'} 1017 | dependencies: 1018 | to-regex-range: 5.0.1 1019 | 1020 | /follow-redirects@1.15.5: 1021 | resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} 1022 | engines: {node: '>=4.0'} 1023 | peerDependencies: 1024 | debug: '*' 1025 | peerDependenciesMeta: 1026 | debug: 1027 | optional: true 1028 | dev: false 1029 | 1030 | /for-each@0.3.3: 1031 | resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} 1032 | dependencies: 1033 | is-callable: 1.2.7 1034 | dev: false 1035 | 1036 | /foreground-child@3.1.1: 1037 | resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} 1038 | engines: {node: '>=14'} 1039 | dependencies: 1040 | cross-spawn: 7.0.3 1041 | signal-exit: 4.1.0 1042 | 1043 | /form-data-encoder@1.7.2: 1044 | resolution: {integrity: sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A==} 1045 | dev: false 1046 | 1047 | /form-data@3.0.1: 1048 | resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} 1049 | engines: {node: '>= 6'} 1050 | dependencies: 1051 | asynckit: 0.4.0 1052 | combined-stream: 1.0.8 1053 | mime-types: 2.1.35 1054 | dev: false 1055 | 1056 | /form-data@4.0.0: 1057 | resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} 1058 | engines: {node: '>= 6'} 1059 | dependencies: 1060 | asynckit: 0.4.0 1061 | combined-stream: 1.0.8 1062 | mime-types: 2.1.35 1063 | dev: false 1064 | 1065 | /formdata-node@4.4.1: 1066 | resolution: {integrity: sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ==} 1067 | engines: {node: '>= 12.20'} 1068 | dependencies: 1069 | node-domexception: 1.0.0 1070 | web-streams-polyfill: 4.0.0-beta.3 1071 | dev: false 1072 | 1073 | /fraction.js@4.3.7: 1074 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 1075 | dev: true 1076 | 1077 | /fsevents@2.3.3: 1078 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 1079 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 1080 | os: [darwin] 1081 | requiresBuild: true 1082 | optional: true 1083 | 1084 | /function-bind@1.1.2: 1085 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 1086 | 1087 | /get-intrinsic@1.2.2: 1088 | resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} 1089 | dependencies: 1090 | function-bind: 1.1.2 1091 | has-proto: 1.0.1 1092 | has-symbols: 1.0.3 1093 | hasown: 2.0.0 1094 | dev: false 1095 | 1096 | /glob-parent@5.1.2: 1097 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 1098 | engines: {node: '>= 6'} 1099 | dependencies: 1100 | is-glob: 4.0.3 1101 | 1102 | /glob-parent@6.0.2: 1103 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 1104 | engines: {node: '>=10.13.0'} 1105 | dependencies: 1106 | is-glob: 4.0.3 1107 | 1108 | /glob-to-regexp@0.4.1: 1109 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 1110 | dev: false 1111 | 1112 | /glob@10.3.10: 1113 | resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} 1114 | engines: {node: '>=16 || 14 >=14.17'} 1115 | hasBin: true 1116 | dependencies: 1117 | foreground-child: 3.1.1 1118 | jackspeak: 2.3.6 1119 | minimatch: 9.0.3 1120 | minipass: 7.0.4 1121 | path-scurry: 1.10.1 1122 | 1123 | /gopd@1.0.1: 1124 | resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} 1125 | dependencies: 1126 | get-intrinsic: 1.2.2 1127 | dev: false 1128 | 1129 | /graceful-fs@4.2.11: 1130 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 1131 | dev: false 1132 | 1133 | /has-property-descriptors@1.0.1: 1134 | resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} 1135 | dependencies: 1136 | get-intrinsic: 1.2.2 1137 | dev: false 1138 | 1139 | /has-proto@1.0.1: 1140 | resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} 1141 | engines: {node: '>= 0.4'} 1142 | dev: false 1143 | 1144 | /has-symbols@1.0.3: 1145 | resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} 1146 | engines: {node: '>= 0.4'} 1147 | dev: false 1148 | 1149 | /has-tostringtag@1.0.0: 1150 | resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} 1151 | engines: {node: '>= 0.4'} 1152 | dependencies: 1153 | has-symbols: 1.0.3 1154 | dev: false 1155 | 1156 | /hasown@2.0.0: 1157 | resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} 1158 | engines: {node: '>= 0.4'} 1159 | dependencies: 1160 | function-bind: 1.1.2 1161 | 1162 | /humanize-ms@1.2.1: 1163 | resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} 1164 | dependencies: 1165 | ms: 2.1.3 1166 | dev: false 1167 | 1168 | /ieee754@1.1.13: 1169 | resolution: {integrity: sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==} 1170 | dev: false 1171 | 1172 | /inherits@2.0.4: 1173 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 1174 | dev: false 1175 | 1176 | /is-arguments@1.1.1: 1177 | resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} 1178 | engines: {node: '>= 0.4'} 1179 | dependencies: 1180 | call-bind: 1.0.5 1181 | has-tostringtag: 1.0.0 1182 | dev: false 1183 | 1184 | /is-binary-path@2.1.0: 1185 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 1186 | engines: {node: '>=8'} 1187 | dependencies: 1188 | binary-extensions: 2.2.0 1189 | 1190 | /is-buffer@1.1.6: 1191 | resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 1192 | dev: false 1193 | 1194 | /is-callable@1.2.7: 1195 | resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} 1196 | engines: {node: '>= 0.4'} 1197 | dev: false 1198 | 1199 | /is-core-module@2.13.1: 1200 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 1201 | dependencies: 1202 | hasown: 2.0.0 1203 | 1204 | /is-extglob@2.1.1: 1205 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 1206 | engines: {node: '>=0.10.0'} 1207 | 1208 | /is-fullwidth-code-point@3.0.0: 1209 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 1210 | engines: {node: '>=8'} 1211 | 1212 | /is-generator-function@1.0.10: 1213 | resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} 1214 | engines: {node: '>= 0.4'} 1215 | dependencies: 1216 | has-tostringtag: 1.0.0 1217 | dev: false 1218 | 1219 | /is-glob@4.0.3: 1220 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 1221 | engines: {node: '>=0.10.0'} 1222 | dependencies: 1223 | is-extglob: 2.1.1 1224 | 1225 | /is-number@7.0.0: 1226 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 1227 | engines: {node: '>=0.12.0'} 1228 | 1229 | /is-typed-array@1.1.12: 1230 | resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} 1231 | engines: {node: '>= 0.4'} 1232 | dependencies: 1233 | which-typed-array: 1.1.13 1234 | dev: false 1235 | 1236 | /isarray@1.0.0: 1237 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 1238 | dev: false 1239 | 1240 | /isexe@2.0.0: 1241 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 1242 | 1243 | /jackspeak@2.3.6: 1244 | resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} 1245 | engines: {node: '>=14'} 1246 | dependencies: 1247 | '@isaacs/cliui': 8.0.2 1248 | optionalDependencies: 1249 | '@pkgjs/parseargs': 0.11.0 1250 | 1251 | /jiti@1.21.0: 1252 | resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} 1253 | hasBin: true 1254 | 1255 | /jmespath@0.16.0: 1256 | resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} 1257 | engines: {node: '>= 0.6.0'} 1258 | dev: false 1259 | 1260 | /js-cookie@3.0.1: 1261 | resolution: {integrity: sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==} 1262 | engines: {node: '>=12'} 1263 | dev: false 1264 | 1265 | /js-tokens@4.0.0: 1266 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 1267 | dev: false 1268 | 1269 | /lilconfig@2.1.0: 1270 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 1271 | engines: {node: '>=10'} 1272 | 1273 | /lilconfig@3.0.0: 1274 | resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==} 1275 | engines: {node: '>=14'} 1276 | 1277 | /lines-and-columns@1.2.4: 1278 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 1279 | 1280 | /lodash.debounce@4.0.8: 1281 | resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} 1282 | dev: false 1283 | 1284 | /lodash.throttle@4.1.1: 1285 | resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==} 1286 | dev: false 1287 | 1288 | /loose-envify@1.4.0: 1289 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 1290 | hasBin: true 1291 | dependencies: 1292 | js-tokens: 4.0.0 1293 | dev: false 1294 | 1295 | /lower-case@2.0.2: 1296 | resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} 1297 | dependencies: 1298 | tslib: 2.6.2 1299 | dev: false 1300 | 1301 | /lru-cache@10.1.0: 1302 | resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} 1303 | engines: {node: 14 || >=16.14} 1304 | 1305 | /lucide-react@0.309.0(react@18.2.0): 1306 | resolution: {integrity: sha512-zNVPczuwFrCfksZH3zbd1UDE6/WYhYAdbe2k7CImVyPAkXLgIwbs6eXQ4loigqDnUFjyFYCI5jZ1y10Kqal0dg==} 1307 | peerDependencies: 1308 | react: ^16.5.1 || ^17.0.0 || ^18.0.0 1309 | dependencies: 1310 | react: 18.2.0 1311 | dev: false 1312 | 1313 | /map-obj@4.3.0: 1314 | resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} 1315 | engines: {node: '>=8'} 1316 | dev: false 1317 | 1318 | /md5@2.3.0: 1319 | resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} 1320 | dependencies: 1321 | charenc: 0.0.2 1322 | crypt: 0.0.2 1323 | is-buffer: 1.1.6 1324 | dev: false 1325 | 1326 | /merge2@1.4.1: 1327 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1328 | engines: {node: '>= 8'} 1329 | 1330 | /micromatch@4.0.5: 1331 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 1332 | engines: {node: '>=8.6'} 1333 | dependencies: 1334 | braces: 3.0.2 1335 | picomatch: 2.3.1 1336 | 1337 | /mime-db@1.52.0: 1338 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1339 | engines: {node: '>= 0.6'} 1340 | dev: false 1341 | 1342 | /mime-types@2.1.35: 1343 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1344 | engines: {node: '>= 0.6'} 1345 | dependencies: 1346 | mime-db: 1.52.0 1347 | dev: false 1348 | 1349 | /minimatch@9.0.3: 1350 | resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} 1351 | engines: {node: '>=16 || 14 >=14.17'} 1352 | dependencies: 1353 | brace-expansion: 2.0.1 1354 | 1355 | /minipass@7.0.4: 1356 | resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} 1357 | engines: {node: '>=16 || 14 >=14.17'} 1358 | 1359 | /ms@2.1.3: 1360 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1361 | dev: false 1362 | 1363 | /mz@2.7.0: 1364 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 1365 | dependencies: 1366 | any-promise: 1.3.0 1367 | object-assign: 4.1.1 1368 | thenify-all: 1.6.0 1369 | 1370 | /nanoid@3.3.7: 1371 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 1372 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 1373 | hasBin: true 1374 | 1375 | /next@14.0.4(react-dom@18.2.0)(react@18.2.0): 1376 | resolution: {integrity: sha512-qbwypnM7327SadwFtxXnQdGiKpkuhaRLE2uq62/nRul9cj9KhQ5LhHmlziTNqUidZotw/Q1I9OjirBROdUJNgA==} 1377 | engines: {node: '>=18.17.0'} 1378 | hasBin: true 1379 | peerDependencies: 1380 | '@opentelemetry/api': ^1.1.0 1381 | react: ^18.2.0 1382 | react-dom: ^18.2.0 1383 | sass: ^1.3.0 1384 | peerDependenciesMeta: 1385 | '@opentelemetry/api': 1386 | optional: true 1387 | sass: 1388 | optional: true 1389 | dependencies: 1390 | '@next/env': 14.0.4 1391 | '@swc/helpers': 0.5.2 1392 | busboy: 1.6.0 1393 | caniuse-lite: 1.0.30001576 1394 | graceful-fs: 4.2.11 1395 | postcss: 8.4.31 1396 | react: 18.2.0 1397 | react-dom: 18.2.0(react@18.2.0) 1398 | styled-jsx: 5.1.1(react@18.2.0) 1399 | watchpack: 2.4.0 1400 | optionalDependencies: 1401 | '@next/swc-darwin-arm64': 14.0.4 1402 | '@next/swc-darwin-x64': 14.0.4 1403 | '@next/swc-linux-arm64-gnu': 14.0.4 1404 | '@next/swc-linux-arm64-musl': 14.0.4 1405 | '@next/swc-linux-x64-gnu': 14.0.4 1406 | '@next/swc-linux-x64-musl': 14.0.4 1407 | '@next/swc-win32-arm64-msvc': 14.0.4 1408 | '@next/swc-win32-ia32-msvc': 14.0.4 1409 | '@next/swc-win32-x64-msvc': 14.0.4 1410 | transitivePeerDependencies: 1411 | - '@babel/core' 1412 | - babel-plugin-macros 1413 | dev: false 1414 | 1415 | /no-case@3.0.4: 1416 | resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} 1417 | dependencies: 1418 | lower-case: 2.0.2 1419 | tslib: 2.6.2 1420 | dev: false 1421 | 1422 | /node-domexception@1.0.0: 1423 | resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} 1424 | engines: {node: '>=10.5.0'} 1425 | dev: false 1426 | 1427 | /node-fetch-native@1.0.1: 1428 | resolution: {integrity: sha512-VzW+TAk2wE4X9maiKMlT+GsPU4OMmR1U9CrHSmd3DFLn2IcZ9VJ6M6BBugGfYUnPCLSYxXdZy17M0BEJyhUTwg==} 1429 | dev: false 1430 | 1431 | /node-fetch@2.7.0: 1432 | resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} 1433 | engines: {node: 4.x || >=6.0.0} 1434 | peerDependencies: 1435 | encoding: ^0.1.0 1436 | peerDependenciesMeta: 1437 | encoding: 1438 | optional: true 1439 | dependencies: 1440 | whatwg-url: 5.0.0 1441 | dev: false 1442 | 1443 | /node-releases@2.0.14: 1444 | resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} 1445 | dev: true 1446 | 1447 | /normalize-path@3.0.0: 1448 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1449 | engines: {node: '>=0.10.0'} 1450 | 1451 | /normalize-range@0.1.2: 1452 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 1453 | engines: {node: '>=0.10.0'} 1454 | dev: true 1455 | 1456 | /object-assign@4.1.1: 1457 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 1458 | engines: {node: '>=0.10.0'} 1459 | 1460 | /object-hash@3.0.0: 1461 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 1462 | engines: {node: '>= 6'} 1463 | 1464 | /object-inspect@1.13.1: 1465 | resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} 1466 | dev: false 1467 | 1468 | /obuf@1.1.2: 1469 | resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} 1470 | dev: true 1471 | 1472 | /openai@4.24.2: 1473 | resolution: {integrity: sha512-Np5zFPAYsBRmsfgPS8cMM25r1wVO5NCTdmeoYDNEUhJn/rw6jNXU0CFSFwhbWsjIkYhdv31pPIzQ0xChHCvltQ==} 1474 | hasBin: true 1475 | dependencies: 1476 | '@types/node': 18.19.6 1477 | '@types/node-fetch': 2.6.10 1478 | abort-controller: 3.0.0 1479 | agentkeepalive: 4.5.0 1480 | digest-fetch: 1.3.0 1481 | form-data-encoder: 1.7.2 1482 | formdata-node: 4.4.1 1483 | node-fetch: 2.7.0 1484 | web-streams-polyfill: 3.3.2 1485 | transitivePeerDependencies: 1486 | - encoding 1487 | dev: false 1488 | 1489 | /packet-reader@1.0.0: 1490 | resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} 1491 | dev: false 1492 | 1493 | /path-key@3.1.1: 1494 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1495 | engines: {node: '>=8'} 1496 | 1497 | /path-parse@1.0.7: 1498 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1499 | 1500 | /path-scurry@1.10.1: 1501 | resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} 1502 | engines: {node: '>=16 || 14 >=14.17'} 1503 | dependencies: 1504 | lru-cache: 10.1.0 1505 | minipass: 7.0.4 1506 | 1507 | /path-to-regexp@6.2.1: 1508 | resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} 1509 | dev: false 1510 | 1511 | /pg-cloudflare@1.1.1: 1512 | resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} 1513 | requiresBuild: true 1514 | dev: false 1515 | optional: true 1516 | 1517 | /pg-connection-string@2.6.2: 1518 | resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} 1519 | dev: false 1520 | 1521 | /pg-int8@1.0.1: 1522 | resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} 1523 | engines: {node: '>=4.0.0'} 1524 | 1525 | /pg-numeric@1.0.2: 1526 | resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} 1527 | engines: {node: '>=4'} 1528 | dev: true 1529 | 1530 | /pg-pool@3.6.1(pg@8.11.3): 1531 | resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} 1532 | peerDependencies: 1533 | pg: '>=8.0' 1534 | dependencies: 1535 | pg: 8.11.3 1536 | dev: false 1537 | 1538 | /pg-protocol@1.6.0: 1539 | resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} 1540 | 1541 | /pg-types@2.2.0: 1542 | resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} 1543 | engines: {node: '>=4'} 1544 | dependencies: 1545 | pg-int8: 1.0.1 1546 | postgres-array: 2.0.0 1547 | postgres-bytea: 1.0.0 1548 | postgres-date: 1.0.7 1549 | postgres-interval: 1.2.0 1550 | dev: false 1551 | 1552 | /pg-types@4.0.1: 1553 | resolution: {integrity: sha512-hRCSDuLII9/LE3smys1hRHcu5QGcLs9ggT7I/TCs0IE+2Eesxi9+9RWAAwZ0yaGjxoWICF/YHLOEjydGujoJ+g==} 1554 | engines: {node: '>=10'} 1555 | dependencies: 1556 | pg-int8: 1.0.1 1557 | pg-numeric: 1.0.2 1558 | postgres-array: 3.0.2 1559 | postgres-bytea: 3.0.0 1560 | postgres-date: 2.0.1 1561 | postgres-interval: 3.0.0 1562 | postgres-range: 1.1.3 1563 | dev: true 1564 | 1565 | /pg@8.11.3: 1566 | resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} 1567 | engines: {node: '>= 8.0.0'} 1568 | peerDependencies: 1569 | pg-native: '>=3.0.1' 1570 | peerDependenciesMeta: 1571 | pg-native: 1572 | optional: true 1573 | dependencies: 1574 | buffer-writer: 2.0.0 1575 | packet-reader: 1.0.0 1576 | pg-connection-string: 2.6.2 1577 | pg-pool: 3.6.1(pg@8.11.3) 1578 | pg-protocol: 1.6.0 1579 | pg-types: 2.2.0 1580 | pgpass: 1.0.5 1581 | optionalDependencies: 1582 | pg-cloudflare: 1.1.1 1583 | dev: false 1584 | 1585 | /pgpass@1.0.5: 1586 | resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} 1587 | dependencies: 1588 | split2: 4.2.0 1589 | dev: false 1590 | 1591 | /picocolors@1.0.0: 1592 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 1593 | 1594 | /picomatch@2.3.1: 1595 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1596 | engines: {node: '>=8.6'} 1597 | 1598 | /pify@2.3.0: 1599 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 1600 | engines: {node: '>=0.10.0'} 1601 | 1602 | /pirates@4.0.6: 1603 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 1604 | engines: {node: '>= 6'} 1605 | 1606 | /postcss-import@15.1.0(postcss@8.4.33): 1607 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 1608 | engines: {node: '>=14.0.0'} 1609 | peerDependencies: 1610 | postcss: ^8.0.0 1611 | dependencies: 1612 | postcss: 8.4.33 1613 | postcss-value-parser: 4.2.0 1614 | read-cache: 1.0.0 1615 | resolve: 1.22.8 1616 | 1617 | /postcss-js@4.0.1(postcss@8.4.33): 1618 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 1619 | engines: {node: ^12 || ^14 || >= 16} 1620 | peerDependencies: 1621 | postcss: ^8.4.21 1622 | dependencies: 1623 | camelcase-css: 2.0.1 1624 | postcss: 8.4.33 1625 | 1626 | /postcss-load-config@4.0.2(postcss@8.4.33): 1627 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 1628 | engines: {node: '>= 14'} 1629 | peerDependencies: 1630 | postcss: '>=8.0.9' 1631 | ts-node: '>=9.0.0' 1632 | peerDependenciesMeta: 1633 | postcss: 1634 | optional: true 1635 | ts-node: 1636 | optional: true 1637 | dependencies: 1638 | lilconfig: 3.0.0 1639 | postcss: 8.4.33 1640 | yaml: 2.3.4 1641 | 1642 | /postcss-nested@6.0.1(postcss@8.4.33): 1643 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} 1644 | engines: {node: '>=12.0'} 1645 | peerDependencies: 1646 | postcss: ^8.2.14 1647 | dependencies: 1648 | postcss: 8.4.33 1649 | postcss-selector-parser: 6.0.15 1650 | 1651 | /postcss-selector-parser@6.0.15: 1652 | resolution: {integrity: sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==} 1653 | engines: {node: '>=4'} 1654 | dependencies: 1655 | cssesc: 3.0.0 1656 | util-deprecate: 1.0.2 1657 | 1658 | /postcss-value-parser@4.2.0: 1659 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1660 | 1661 | /postcss@8.4.31: 1662 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 1663 | engines: {node: ^10 || ^12 || >=14} 1664 | dependencies: 1665 | nanoid: 3.3.7 1666 | picocolors: 1.0.0 1667 | source-map-js: 1.0.2 1668 | dev: false 1669 | 1670 | /postcss@8.4.33: 1671 | resolution: {integrity: sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg==} 1672 | engines: {node: ^10 || ^12 || >=14} 1673 | dependencies: 1674 | nanoid: 3.3.7 1675 | picocolors: 1.0.0 1676 | source-map-js: 1.0.2 1677 | 1678 | /postgres-array@2.0.0: 1679 | resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} 1680 | engines: {node: '>=4'} 1681 | dev: false 1682 | 1683 | /postgres-array@3.0.2: 1684 | resolution: {integrity: sha512-6faShkdFugNQCLwucjPcY5ARoW1SlbnrZjmGl0IrrqewpvxvhSLHimCVzqeuULCbG0fQv7Dtk1yDbG3xv7Veog==} 1685 | engines: {node: '>=12'} 1686 | dev: true 1687 | 1688 | /postgres-bytea@1.0.0: 1689 | resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} 1690 | engines: {node: '>=0.10.0'} 1691 | dev: false 1692 | 1693 | /postgres-bytea@3.0.0: 1694 | resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} 1695 | engines: {node: '>= 6'} 1696 | dependencies: 1697 | obuf: 1.1.2 1698 | dev: true 1699 | 1700 | /postgres-date@1.0.7: 1701 | resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} 1702 | engines: {node: '>=0.10.0'} 1703 | dev: false 1704 | 1705 | /postgres-date@2.0.1: 1706 | resolution: {integrity: sha512-YtMKdsDt5Ojv1wQRvUhnyDJNSr2dGIC96mQVKz7xufp07nfuFONzdaowrMHjlAzY6GDLd4f+LUHHAAM1h4MdUw==} 1707 | engines: {node: '>=12'} 1708 | dev: true 1709 | 1710 | /postgres-interval@1.2.0: 1711 | resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} 1712 | engines: {node: '>=0.10.0'} 1713 | dependencies: 1714 | xtend: 4.0.2 1715 | dev: false 1716 | 1717 | /postgres-interval@3.0.0: 1718 | resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} 1719 | engines: {node: '>=12'} 1720 | dev: true 1721 | 1722 | /postgres-range@1.1.3: 1723 | resolution: {integrity: sha512-VdlZoocy5lCP0c/t66xAfclglEapXPCIVhqqJRncYpvbCgImF0w67aPKfbqUMr72tO2k5q0TdTZwCLjPTI6C9g==} 1724 | dev: true 1725 | 1726 | /prop-types@15.8.1: 1727 | resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} 1728 | dependencies: 1729 | loose-envify: 1.4.0 1730 | object-assign: 4.1.1 1731 | react-is: 16.13.1 1732 | dev: false 1733 | 1734 | /proxy-from-env@1.1.0: 1735 | resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} 1736 | dev: false 1737 | 1738 | /punycode@1.3.2: 1739 | resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==} 1740 | dev: false 1741 | 1742 | /pvtsutils@1.3.5: 1743 | resolution: {integrity: sha512-ARvb14YB9Nm2Xi6nBq1ZX6dAM0FsJnuk+31aUp4TrcZEdKUlSqOqsxJHUPJDNE3qiIp+iUPEIeR6Je/tgV7zsA==} 1744 | dependencies: 1745 | tslib: 2.6.2 1746 | dev: false 1747 | 1748 | /pvutils@1.1.3: 1749 | resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} 1750 | engines: {node: '>=6.0.0'} 1751 | dev: false 1752 | 1753 | /qs@6.11.2: 1754 | resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} 1755 | engines: {node: '>=0.6'} 1756 | dependencies: 1757 | side-channel: 1.0.4 1758 | dev: false 1759 | 1760 | /querystring@0.2.0: 1761 | resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==} 1762 | engines: {node: '>=0.4.x'} 1763 | deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead. 1764 | dev: false 1765 | 1766 | /queue-microtask@1.2.3: 1767 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1768 | 1769 | /quick-lru@4.0.1: 1770 | resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} 1771 | engines: {node: '>=8'} 1772 | dev: false 1773 | 1774 | /react-copy-to-clipboard@5.1.0(react@18.2.0): 1775 | resolution: {integrity: sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==} 1776 | peerDependencies: 1777 | react: ^15.3.0 || 16 || 17 || 18 1778 | dependencies: 1779 | copy-to-clipboard: 3.3.3 1780 | prop-types: 15.8.1 1781 | react: 18.2.0 1782 | dev: false 1783 | 1784 | /react-dom@18.2.0(react@18.2.0): 1785 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 1786 | peerDependencies: 1787 | react: ^18.2.0 1788 | dependencies: 1789 | loose-envify: 1.4.0 1790 | react: 18.2.0 1791 | scheduler: 0.23.0 1792 | dev: false 1793 | 1794 | /react-icons@5.0.0(react@18.2.0): 1795 | resolution: {integrity: sha512-8gBBjYRrO14BU9RuMEVptG5aB1gwNPAAgsKOuPggx2hg332pTky/r8FidEJW95cL6IG2mYCEHaYuAxw74wLefw==} 1796 | peerDependencies: 1797 | react: '*' 1798 | dependencies: 1799 | react: 18.2.0 1800 | dev: false 1801 | 1802 | /react-is@16.13.1: 1803 | resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} 1804 | dev: false 1805 | 1806 | /react-lazy-load-image-component@1.6.0(react-dom@18.2.0)(react@18.2.0): 1807 | resolution: {integrity: sha512-8KFkDTgjh+0+PVbH+cx0AgxLGbdTsxWMnxXzU5HEUztqewk9ufQAu8cstjZhyvtMIPsdMcPZfA0WAa7HtjQbBQ==} 1808 | peerDependencies: 1809 | react: ^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x 1810 | react-dom: ^15.x.x || ^16.x.x || ^17.x.x || ^18.x.x 1811 | dependencies: 1812 | lodash.debounce: 4.0.8 1813 | lodash.throttle: 4.1.1 1814 | react: 18.2.0 1815 | react-dom: 18.2.0(react@18.2.0) 1816 | dev: false 1817 | 1818 | /react@18.2.0: 1819 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 1820 | engines: {node: '>=0.10.0'} 1821 | dependencies: 1822 | loose-envify: 1.4.0 1823 | dev: false 1824 | 1825 | /read-cache@1.0.0: 1826 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 1827 | dependencies: 1828 | pify: 2.3.0 1829 | 1830 | /readdirp@3.6.0: 1831 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 1832 | engines: {node: '>=8.10.0'} 1833 | dependencies: 1834 | picomatch: 2.3.1 1835 | 1836 | /regenerator-runtime@0.14.1: 1837 | resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} 1838 | dev: false 1839 | 1840 | /resolve@1.22.8: 1841 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1842 | hasBin: true 1843 | dependencies: 1844 | is-core-module: 2.13.1 1845 | path-parse: 1.0.7 1846 | supports-preserve-symlinks-flag: 1.0.0 1847 | 1848 | /reusify@1.0.4: 1849 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1850 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1851 | 1852 | /run-parallel@1.2.0: 1853 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1854 | dependencies: 1855 | queue-microtask: 1.2.3 1856 | 1857 | /sax@1.2.1: 1858 | resolution: {integrity: sha512-8I2a3LovHTOpm7NV5yOyO8IHqgVsfK4+UuySrXU8YXkSRX7k6hCV9b3HrkKCr3nMpgj+0bmocaJJWpvp1oc7ZA==} 1859 | dev: false 1860 | 1861 | /scheduler@0.23.0: 1862 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 1863 | dependencies: 1864 | loose-envify: 1.4.0 1865 | dev: false 1866 | 1867 | /set-function-length@1.2.0: 1868 | resolution: {integrity: sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w==} 1869 | engines: {node: '>= 0.4'} 1870 | dependencies: 1871 | define-data-property: 1.1.1 1872 | function-bind: 1.1.2 1873 | get-intrinsic: 1.2.2 1874 | gopd: 1.0.1 1875 | has-property-descriptors: 1.0.1 1876 | dev: false 1877 | 1878 | /shebang-command@2.0.0: 1879 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1880 | engines: {node: '>=8'} 1881 | dependencies: 1882 | shebang-regex: 3.0.0 1883 | 1884 | /shebang-regex@3.0.0: 1885 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1886 | engines: {node: '>=8'} 1887 | 1888 | /side-channel@1.0.4: 1889 | resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} 1890 | dependencies: 1891 | call-bind: 1.0.5 1892 | get-intrinsic: 1.2.2 1893 | object-inspect: 1.13.1 1894 | dev: false 1895 | 1896 | /signal-exit@4.1.0: 1897 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1898 | engines: {node: '>=14'} 1899 | 1900 | /snake-case@3.0.4: 1901 | resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} 1902 | dependencies: 1903 | dot-case: 3.0.4 1904 | tslib: 2.6.2 1905 | dev: false 1906 | 1907 | /snakecase-keys@3.2.1: 1908 | resolution: {integrity: sha512-CjU5pyRfwOtaOITYv5C8DzpZ8XA/ieRsDpr93HI2r6e3YInC6moZpSQbmUtg8cTk58tq2x3jcG2gv+p1IZGmMA==} 1909 | engines: {node: '>=8'} 1910 | dependencies: 1911 | map-obj: 4.3.0 1912 | to-snake-case: 1.0.0 1913 | dev: false 1914 | 1915 | /snakecase-keys@5.4.4: 1916 | resolution: {integrity: sha512-YTywJG93yxwHLgrYLZjlC75moVEX04LZM4FHfihjHe1FCXm+QaLOFfSf535aXOAd0ArVQMWUAe8ZPm4VtWyXaA==} 1917 | engines: {node: '>=12'} 1918 | dependencies: 1919 | map-obj: 4.3.0 1920 | snake-case: 3.0.4 1921 | type-fest: 2.19.0 1922 | dev: false 1923 | 1924 | /sonner@1.3.1(react-dom@18.2.0)(react@18.2.0): 1925 | resolution: {integrity: sha512-+rOAO56b2eI3q5BtgljERSn2umRk63KFIvgb2ohbZ5X+Eb5u+a/7/0ZgswYqgBMg8dyl7n6OXd9KasA8QF9ToA==} 1926 | peerDependencies: 1927 | react: ^18.0.0 1928 | react-dom: ^18.0.0 1929 | dependencies: 1930 | react: 18.2.0 1931 | react-dom: 18.2.0(react@18.2.0) 1932 | dev: false 1933 | 1934 | /source-map-js@1.0.2: 1935 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 1936 | engines: {node: '>=0.10.0'} 1937 | 1938 | /split2@4.2.0: 1939 | resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} 1940 | engines: {node: '>= 10.x'} 1941 | dev: false 1942 | 1943 | /streamsearch@1.1.0: 1944 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1945 | engines: {node: '>=10.0.0'} 1946 | dev: false 1947 | 1948 | /string-width@4.2.3: 1949 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1950 | engines: {node: '>=8'} 1951 | dependencies: 1952 | emoji-regex: 8.0.0 1953 | is-fullwidth-code-point: 3.0.0 1954 | strip-ansi: 6.0.1 1955 | 1956 | /string-width@5.1.2: 1957 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1958 | engines: {node: '>=12'} 1959 | dependencies: 1960 | eastasianwidth: 0.2.0 1961 | emoji-regex: 9.2.2 1962 | strip-ansi: 7.1.0 1963 | 1964 | /strip-ansi@6.0.1: 1965 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1966 | engines: {node: '>=8'} 1967 | dependencies: 1968 | ansi-regex: 5.0.1 1969 | 1970 | /strip-ansi@7.1.0: 1971 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1972 | engines: {node: '>=12'} 1973 | dependencies: 1974 | ansi-regex: 6.0.1 1975 | 1976 | /stripe@14.13.0: 1977 | resolution: {integrity: sha512-uLOfWtBUL1amJCTpKCXWrHntFOSaO2PWb/2hsxV/OlXLr0bz5MyU8IW1pFlmZqpw6hBqAW5Fad7Ty7xRxDYrzA==} 1978 | engines: {node: '>=12.*'} 1979 | dependencies: 1980 | '@types/node': 20.10.8 1981 | qs: 6.11.2 1982 | dev: false 1983 | 1984 | /styled-jsx@5.1.1(react@18.2.0): 1985 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 1986 | engines: {node: '>= 12.0.0'} 1987 | peerDependencies: 1988 | '@babel/core': '*' 1989 | babel-plugin-macros: '*' 1990 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 1991 | peerDependenciesMeta: 1992 | '@babel/core': 1993 | optional: true 1994 | babel-plugin-macros: 1995 | optional: true 1996 | dependencies: 1997 | client-only: 0.0.1 1998 | react: 18.2.0 1999 | dev: false 2000 | 2001 | /sucrase@3.35.0: 2002 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 2003 | engines: {node: '>=16 || 14 >=14.17'} 2004 | hasBin: true 2005 | dependencies: 2006 | '@jridgewell/gen-mapping': 0.3.3 2007 | commander: 4.1.1 2008 | glob: 10.3.10 2009 | lines-and-columns: 1.2.4 2010 | mz: 2.7.0 2011 | pirates: 4.0.6 2012 | ts-interface-checker: 0.1.13 2013 | 2014 | /supports-preserve-symlinks-flag@1.0.0: 2015 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 2016 | engines: {node: '>= 0.4'} 2017 | 2018 | /swr@2.2.0(react@18.2.0): 2019 | resolution: {integrity: sha512-AjqHOv2lAhkuUdIiBu9xbuettzAzWXmCEcLONNKJRba87WAefz8Ca9d6ds/SzrPc235n1IxWYdhJ2zF3MNUaoQ==} 2020 | peerDependencies: 2021 | react: ^16.11.0 || ^17.0.0 || ^18.0.0 2022 | dependencies: 2023 | react: 18.2.0 2024 | use-sync-external-store: 1.2.0(react@18.2.0) 2025 | dev: false 2026 | 2027 | /tailwind-merge@2.2.0: 2028 | resolution: {integrity: sha512-SqqhhaL0T06SW59+JVNfAqKdqLs0497esifRrZ7jOaefP3o64fdFNDMrAQWZFMxTLJPiHVjRLUywT8uFz1xNWQ==} 2029 | dependencies: 2030 | '@babel/runtime': 7.23.8 2031 | dev: false 2032 | 2033 | /tailwindcss-animate@1.0.7(tailwindcss@3.4.1): 2034 | resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} 2035 | peerDependencies: 2036 | tailwindcss: '>=3.0.0 || insiders' 2037 | dependencies: 2038 | tailwindcss: 3.4.1 2039 | dev: false 2040 | 2041 | /tailwindcss@3.4.1: 2042 | resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} 2043 | engines: {node: '>=14.0.0'} 2044 | hasBin: true 2045 | dependencies: 2046 | '@alloc/quick-lru': 5.2.0 2047 | arg: 5.0.2 2048 | chokidar: 3.5.3 2049 | didyoumean: 1.2.2 2050 | dlv: 1.1.3 2051 | fast-glob: 3.3.2 2052 | glob-parent: 6.0.2 2053 | is-glob: 4.0.3 2054 | jiti: 1.21.0 2055 | lilconfig: 2.1.0 2056 | micromatch: 4.0.5 2057 | normalize-path: 3.0.0 2058 | object-hash: 3.0.0 2059 | picocolors: 1.0.0 2060 | postcss: 8.4.33 2061 | postcss-import: 15.1.0(postcss@8.4.33) 2062 | postcss-js: 4.0.1(postcss@8.4.33) 2063 | postcss-load-config: 4.0.2(postcss@8.4.33) 2064 | postcss-nested: 6.0.1(postcss@8.4.33) 2065 | postcss-selector-parser: 6.0.15 2066 | resolve: 1.22.8 2067 | sucrase: 3.35.0 2068 | transitivePeerDependencies: 2069 | - ts-node 2070 | 2071 | /thenify-all@1.6.0: 2072 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 2073 | engines: {node: '>=0.8'} 2074 | dependencies: 2075 | thenify: 3.3.1 2076 | 2077 | /thenify@3.3.1: 2078 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 2079 | dependencies: 2080 | any-promise: 1.3.0 2081 | 2082 | /to-no-case@1.0.2: 2083 | resolution: {integrity: sha512-Z3g735FxuZY8rodxV4gH7LxClE4H0hTIyHNIHdk+vpQxjLm0cwnKXq/OFVZ76SOQmto7txVcwSCwkU5kqp+FKg==} 2084 | dev: false 2085 | 2086 | /to-regex-range@5.0.1: 2087 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 2088 | engines: {node: '>=8.0'} 2089 | dependencies: 2090 | is-number: 7.0.0 2091 | 2092 | /to-snake-case@1.0.0: 2093 | resolution: {integrity: sha512-joRpzBAk1Bhi2eGEYBjukEWHOe/IvclOkiJl3DtA91jV6NwQ3MwXA4FHYeqk8BNp/D8bmi9tcNbRu/SozP0jbQ==} 2094 | dependencies: 2095 | to-space-case: 1.0.0 2096 | dev: false 2097 | 2098 | /to-space-case@1.0.0: 2099 | resolution: {integrity: sha512-rLdvwXZ39VOn1IxGL3V6ZstoTbwLRckQmn/U8ZDLuWwIXNpuZDhQ3AiRUlhTbOXFVE9C+dR51wM0CBDhk31VcA==} 2100 | dependencies: 2101 | to-no-case: 1.0.2 2102 | dev: false 2103 | 2104 | /toggle-selection@1.0.6: 2105 | resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} 2106 | dev: false 2107 | 2108 | /tr46@0.0.3: 2109 | resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} 2110 | dev: false 2111 | 2112 | /ts-interface-checker@0.1.13: 2113 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 2114 | 2115 | /tslib@2.4.1: 2116 | resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} 2117 | dev: false 2118 | 2119 | /tslib@2.6.2: 2120 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 2121 | dev: false 2122 | 2123 | /type-fest@2.19.0: 2124 | resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} 2125 | engines: {node: '>=12.20'} 2126 | dev: false 2127 | 2128 | /typescript@5.3.3: 2129 | resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} 2130 | engines: {node: '>=14.17'} 2131 | hasBin: true 2132 | dev: true 2133 | 2134 | /undici-types@5.26.5: 2135 | resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 2136 | 2137 | /update-browserslist-db@1.0.13(browserslist@4.22.2): 2138 | resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} 2139 | hasBin: true 2140 | peerDependencies: 2141 | browserslist: '>= 4.21.0' 2142 | dependencies: 2143 | browserslist: 4.22.2 2144 | escalade: 3.1.1 2145 | picocolors: 1.0.0 2146 | dev: true 2147 | 2148 | /url@0.10.3: 2149 | resolution: {integrity: sha512-hzSUW2q06EqL1gKM/a+obYHLIO6ct2hwPuviqTTOcfFVc61UbfJ2Q32+uGL/HCPxKqrdGB5QUwIe7UqlDgwsOQ==} 2150 | dependencies: 2151 | punycode: 1.3.2 2152 | querystring: 0.2.0 2153 | dev: false 2154 | 2155 | /use-sync-external-store@1.2.0(react@18.2.0): 2156 | resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} 2157 | peerDependencies: 2158 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 2159 | dependencies: 2160 | react: 18.2.0 2161 | dev: false 2162 | 2163 | /util-deprecate@1.0.2: 2164 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2165 | 2166 | /util@0.12.5: 2167 | resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} 2168 | dependencies: 2169 | inherits: 2.0.4 2170 | is-arguments: 1.1.1 2171 | is-generator-function: 1.0.10 2172 | is-typed-array: 1.1.12 2173 | which-typed-array: 1.1.13 2174 | dev: false 2175 | 2176 | /uuid@8.0.0: 2177 | resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} 2178 | hasBin: true 2179 | dev: false 2180 | 2181 | /watchpack@2.4.0: 2182 | resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} 2183 | engines: {node: '>=10.13.0'} 2184 | dependencies: 2185 | glob-to-regexp: 0.4.1 2186 | graceful-fs: 4.2.11 2187 | dev: false 2188 | 2189 | /web-streams-polyfill@3.3.2: 2190 | resolution: {integrity: sha512-3pRGuxRF5gpuZc0W+EpwQRmCD7gRqcDOMt688KmdlDAgAyaB1XlN0zq2njfDNm44XVdIouE7pZ6GzbdyH47uIQ==} 2191 | engines: {node: '>= 8'} 2192 | dev: false 2193 | 2194 | /web-streams-polyfill@4.0.0-beta.3: 2195 | resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==} 2196 | engines: {node: '>= 14'} 2197 | dev: false 2198 | 2199 | /webcrypto-core@1.7.7: 2200 | resolution: {integrity: sha512-7FjigXNsBfopEj+5DV2nhNpfic2vumtjjgPmeDKk45z+MJwXKKfhPB7118Pfzrmh4jqOMST6Ch37iPAHoImg5g==} 2201 | dependencies: 2202 | '@peculiar/asn1-schema': 2.3.8 2203 | '@peculiar/json-schema': 1.1.12 2204 | asn1js: 3.0.5 2205 | pvtsutils: 1.3.5 2206 | tslib: 2.6.2 2207 | dev: false 2208 | 2209 | /webidl-conversions@3.0.1: 2210 | resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} 2211 | dev: false 2212 | 2213 | /whatwg-url@5.0.0: 2214 | resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} 2215 | dependencies: 2216 | tr46: 0.0.3 2217 | webidl-conversions: 3.0.1 2218 | dev: false 2219 | 2220 | /which-typed-array@1.1.13: 2221 | resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} 2222 | engines: {node: '>= 0.4'} 2223 | dependencies: 2224 | available-typed-arrays: 1.0.5 2225 | call-bind: 1.0.5 2226 | for-each: 0.3.3 2227 | gopd: 1.0.1 2228 | has-tostringtag: 1.0.0 2229 | dev: false 2230 | 2231 | /which@2.0.2: 2232 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 2233 | engines: {node: '>= 8'} 2234 | hasBin: true 2235 | dependencies: 2236 | isexe: 2.0.0 2237 | 2238 | /wrap-ansi@7.0.0: 2239 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 2240 | engines: {node: '>=10'} 2241 | dependencies: 2242 | ansi-styles: 4.3.0 2243 | string-width: 4.2.3 2244 | strip-ansi: 6.0.1 2245 | 2246 | /wrap-ansi@8.1.0: 2247 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 2248 | engines: {node: '>=12'} 2249 | dependencies: 2250 | ansi-styles: 6.2.1 2251 | string-width: 5.1.2 2252 | strip-ansi: 7.1.0 2253 | 2254 | /xml2js@0.5.0: 2255 | resolution: {integrity: sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==} 2256 | engines: {node: '>=4.0.0'} 2257 | dependencies: 2258 | sax: 1.2.1 2259 | xmlbuilder: 11.0.1 2260 | dev: false 2261 | 2262 | /xmlbuilder@11.0.1: 2263 | resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} 2264 | engines: {node: '>=4.0'} 2265 | dev: false 2266 | 2267 | /xtend@4.0.2: 2268 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 2269 | engines: {node: '>=0.4'} 2270 | dev: false 2271 | 2272 | /yaml@2.3.4: 2273 | resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==} 2274 | engines: {node: '>= 14'} 2275 | --------------------------------------------------------------------------------