├── 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
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 |
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 |
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 |
102 |
Premium Designs
103 |
104 |
105 |
127 |
Exclusive Freebies
128 |
129 |
130 |
152 |
Monthly Free Exclusive
153 |
154 |
155 |
177 |
Customer Support
178 |
179 |
180 | -
181 |
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 |
205 |
206 |
207 |
208 |
230 |
Premium Designs
231 |
232 |
233 |
255 |
Exclusive Freebies
256 |
257 |
258 |
280 |
Monthly Free Exclusive
281 |
282 |
283 |
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 |
--------------------------------------------------------------------------------