diff --git a/Dockerfile.api b/Dockerfile.api index 5e2a073..92c9230 100644 --- a/Dockerfile.api +++ b/Dockerfile.api @@ -29,6 +29,8 @@ WORKDIR /app # Optionally install pnpm or use node directly. If you need pnpm for starting, install it. RUN npm install -g pnpm +RUN npm install -g tsdown + # Copy built files and production node_modules from builder COPY --from=builder /app/apps/api/dist ./apps/api/dist @@ -38,4 +40,5 @@ ENV NODE_ENV=production EXPOSE 4005 # Replace with your production start command (adjust path/script) -CMD ["node", "apps/api/dist/index.js"] +# CMD ["node", "apps/api/dist/index.js"] +CMD ["pnpm", "--filter", "api", "dev"] diff --git a/Dockerfile.dbot b/Dockerfile.dbot index b583376..33701cc 100644 --- a/Dockerfile.dbot +++ b/Dockerfile.dbot @@ -28,6 +28,7 @@ WORKDIR /app # Optionally install pnpm or use node directly. If you need pnpm for starting, install it. RUN npm install -g pnpm +RUN npm install -g tsdown # Copy built files and production node_modules from builder COPY --from=builder /app/apps/discord-bot/dist ./apps/discord-bot/dist diff --git a/apps/api/package.json b/apps/api/package.json index 1ab9088..d532062 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "start": "node ./dist/index.js", - "dev": "npx tsdown --watch src/index.ts", + "dev": "npx tsdown --watch src --onSuccess \"node dist/index.js\"", "build": "npx tsdown", "clean": "rm -rf ../../build/api", "typecheck": "tsc --noEmit", diff --git a/apps/api/src/server.ts b/apps/api/src/server.ts index 8310e11..bc37783 100644 --- a/apps/api/src/server.ts +++ b/apps/api/src/server.ts @@ -1,4 +1,4 @@ -import { checkConnection, runMigrations } from "@taskcord/database"; +import { generateMigration, runMigrations } from "@taskcord/database"; import * as dotenv from "dotenv"; import type { FastifyInstance, FastifyServerOptions } from "fastify"; import Fastify from "fastify"; @@ -70,7 +70,8 @@ export const startServer = async (): Promise => { // check if cache & postgres are connected await fastifyServer.cacheDb.ping(); - await checkConnection(); + // await checkConnection(); + await generateMigration(); await runMigrations(); await fastifyServer.listen({ port: Number(port), host: "0.0.0.0" }); diff --git a/apps/api/src/utils/golabalUtils.ts b/apps/api/src/utils/golabalUtils.ts index c1663f1..464ecc3 100644 --- a/apps/api/src/utils/golabalUtils.ts +++ b/apps/api/src/utils/golabalUtils.ts @@ -1,70 +1,61 @@ /* eslint-disable @typescript-eslint/no-unnecessary-condition -- ensure that the environment is set */ /* eslint-disable @typescript-eslint/no-extraneous-class -- This is a utility class */ -import jwt from "jsonwebtoken"; import dotenv from "dotenv"; -import type { z } from "zod"; import { buildJsonSchemas } from "fastify-zod"; +import jwt from "jsonwebtoken"; +import type { z } from "zod"; dotenv.config(); class GlobalUtils { - private static currentEnv = process.env.NODE_ENV || "local"; + private static currentEnv = process.env.NODE_ENV || "local"; - public static getApiHostUrl(): string { - if (this.currentEnv === "prod") { - return process.env.REMOTE_BACKEND_HOST_URL; + public static getApiHostUrl(): string { + return process.env.BACKEND_HOST_URL || "http://localhost:4005"; } - return process.env.LOCAL_BACKEND_HOST_URL; - } - public static getRedisUrl(): string | undefined { - if (this.currentEnv === "prod") { - return process.env.REDIS_URL_PROD; + public static getRedisUrl(): string | undefined { + return process.env.REDIS_URL; } - return process.env.REDIS_URL_LOCAL; - } - public static getPostgresUrl(): string | undefined { - if (this.currentEnv === "prod") { - return process.env.PG_DB_URL_PROD; + public static getPostgresUrl(): string | undefined { + return process.env.PG_DB_URL; } - return process.env.PG_DB_URL_LOCAL; - } - public static getDiscordOAuthRedirectUrl(): string { - const apiHostUrl = this.getApiHostUrl(); - return apiHostUrl + process.env.DISCORD_OAUTH_REDIRECT_URL!; - } - - public static verifyJwtToken(token: string) { - const secret = process.env.JWT_SECRET!; - if (!secret) { - throw new Error("JWT_SECRET is not set"); + public static getDiscordOAuthRedirectUrl(): string { + const apiHostUrl = this.getApiHostUrl(); + return apiHostUrl + process.env.DISCORD_OAUTH_REDIRECT_URL!; } - return jwt.verify(token, secret); - } - public static signJwtToken(payload: Record) { - const secret = process.env.JWT_SECRET!; - if (!secret) { - throw new Error("JWT_SECRET is not set"); + public static verifyJwtToken(token: string) { + const secret = process.env.JWT_SECRET!; + if (!secret) { + throw new Error("JWT_SECRET is not set"); + } + return jwt.verify(token, secret); } - const maxAge = process.env.JWT_MAX_AGE! || "7d"; - const token = jwt.sign(payload, secret, { - expiresIn: maxAge as unknown as number, - }); - return token; - } + public static signJwtToken(payload: Record) { + const secret = process.env.JWT_SECRET!; + if (!secret) { + throw new Error("JWT_SECRET is not set"); + } + const maxAge = process.env.JWT_MAX_AGE! || "7d"; + const token = jwt.sign(payload, secret, { + expiresIn: maxAge as unknown as number, + }); + + return token; + } - public static getCurrentEnv(): string { - return this.currentEnv; - } + public static getCurrentEnv(): string { + return this.currentEnv; + } - public static zodToSchema(schema: Record) { - return buildJsonSchemas(schema).schemas[0]; - } + public static zodToSchema(schema: Record) { + return buildJsonSchemas(schema).schemas[0]; + } } export default GlobalUtils; diff --git a/apps/api/tsdown.config.ts b/apps/api/tsdown.config.ts index f0b9b5f..503c6a7 100644 --- a/apps/api/tsdown.config.ts +++ b/apps/api/tsdown.config.ts @@ -1,8 +1,8 @@ // import { copyFile } from "node:fs/promises"; // import path from "node:path"; -import { defineConfig, type Options } from "tsup"; +import { defineConfig } from "tsdown"; -export default defineConfig((options: Options) => ({ +export default defineConfig((options) => ({ entryPoints: ["src/index.ts"], outDir: "dist", target: "es2020", @@ -10,19 +10,4 @@ export default defineConfig((options: Options) => ({ sourcemap: true, format: ["cjs"], ...options, - // async onSuccess() { - // // Copy .env file - // await copyFile( - // path.join(__dirname, ".env"), - // path.join(__dirname, "../../build/api/.env") - // ).catch(() => { - // console.log("No .env file found to copy"); - // }); - - // // Copy package.json - // await copyFile( - // path.join(__dirname, "package.json"), - // path.join(__dirname, "../../build/api/package.json") - // ); - // }, })); diff --git a/apps/dashboard-client/src/components/common/discord-signin/index.tsx b/apps/dashboard-client/src/components/common/discord-signin/index.tsx index 5d1f89e..5f0f6c1 100644 --- a/apps/dashboard-client/src/components/common/discord-signin/index.tsx +++ b/apps/dashboard-client/src/components/common/discord-signin/index.tsx @@ -9,8 +9,19 @@ interface DiscordSigninProps { export const DiscordSignIn: FC = ({ className }) => { const currentHost = `${window.location.protocol}//${window.location.host}`; return ( - - Login with Discord + + + + + Add to Discord ); }; diff --git a/apps/dashboard-client/src/components/landing/ComparisonSection.tsx b/apps/dashboard-client/src/components/landing/ComparisonSection.tsx new file mode 100644 index 0000000..cd8da51 --- /dev/null +++ b/apps/dashboard-client/src/components/landing/ComparisonSection.tsx @@ -0,0 +1,153 @@ +import { motion } from 'framer-motion'; +import { Check, X, ArrowRight } from 'lucide-react'; +import { useInView } from '@/hooks/use-in-view'; +import { Button } from '@/components/ui/button'; + +export function ComparisonSection() { + const [ref, inView] = useInView({ + triggerOnce: true, + threshold: 0.1, + }); + + const features = [ + { name: 'Native Discord Bot', taskWaku: true, trello: false, linear: false, jira: false }, + { name: '2-Way GitHub Sync', taskWaku: true, trello: 'partial', linear: 'partial', jira: 'partial' }, + { name: 'Open Source', taskWaku: true, trello: false, linear: false, jira: false }, + { name: 'Self-Hostable', taskWaku: true, trello: false, linear: false, jira: 'enterprise' }, + { name: 'Setup Time', taskWaku: '< 5 min', trello: '30+ min', linear: '15 min', jira: '1+ hour' }, + { name: 'Learning Curve', taskWaku: 'Minimal', trello: 'Low', linear: 'Medium', jira: 'Steep' }, + { name: 'Price (per user)', taskWaku: '$2', trello: '$10+', linear: '$8+', jira: '$7.75+' }, + { name: 'Real-time Sync', taskWaku: '< 100ms', trello: 'Minutes', linear: 'Seconds', jira: 'Seconds' }, + { name: 'Offline Mode', taskWaku: true, trello: false, linear: false, jira: false }, + { name: 'API Access', taskWaku: true, trello: 'paid', linear: 'paid', jira: 'paid' }, + ]; + + const renderCell = (value: boolean | string) => { + if (value === true) { + return ( +
+
+ +
+
+ ); + } + if (value === false) { + return ( +
+
+ +
+
+ ); + } + if (value === 'partial') { + return ( +
+ ⚠️ Limited +
+ ); + } + return ( +
+ {value} +
+ ); + }; + + return ( +
+
+ {/* Section Header */} + +

+ Why{' '} + + Task Waku + {' '} + Wins +

+

+ Compare us to the tools you're currently using. The choice is clear. +

+
+ + {/* Comparison Table */} + +
+ + + + + + + + + + + + {features.map((feature, index) => ( + + + + + + + + ))} + +
Feature +
+
+
Task Waku
+
Our Solution
+
+
+
Trello
+
+ Zapier
+
LinearJira
{feature.name} +
+
{renderCell(feature.taskWaku)}
+
{renderCell(feature.trello)}{renderCell(feature.linear)}{renderCell(feature.jira)}
+
+
+ + {/* Bottom CTA */} + +

+ Stop overpaying for tools that don't fit your workflow. +

+ +
+
+ + {/* Decorative elements */} +
+
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/FAQSection.tsx b/apps/dashboard-client/src/components/landing/FAQSection.tsx new file mode 100644 index 0000000..a7e574c --- /dev/null +++ b/apps/dashboard-client/src/components/landing/FAQSection.tsx @@ -0,0 +1,126 @@ +import { motion } from 'framer-motion'; +import { ChevronDown } from 'lucide-react'; +import { useState } from 'react'; +import { useInView } from '@/hooks/use-in-view'; +import { + Collapsible, + CollapsibleContent, + CollapsibleTrigger, +} from '@/components/ui/collapsible'; + +export function FAQSection() { + const [ref, inView] = useInView({ + triggerOnce: true, + threshold: 0.1, + }); + + const faqs = [ + { + question: 'Do I need to host my own server?', + answer: 'No! We offer a fully managed cloud solution at $2/member/month. But if you want complete control, our open-source version can be self-hosted on your own infrastructure with Docker or Kubernetes.', + }, + { + question: 'What happens to my data if I want to switch?', + answer: 'You own your data, always. Export all your projects, tasks, and history anytime in JSON or CSV format. Our open-source nature means no vendor lock-in—you can even fork the code if needed.', + }, + { + question: 'How hard is the Discord bot setup?', + answer: 'Super easy! Just click "Add to Discord," authorize the bot, and you\'re done. It takes about 30 seconds. Then use slash commands like /task create to start managing your projects.', + }, + { + question: 'Can I migrate from Trello, Linear, or Jira?', + answer: 'Yes! We support CSV import for tasks and projects. For GitHub issues, they sync automatically once you connect your repo. We also offer migration assistance for teams on our Managed Cloud plan.', + }, + { + question: 'How does the GitHub sync work?', + answer: 'It\'s a true two-way sync. When you create a task in Task Waku, it appears as a GitHub issue. When someone comments on that issue, the comment appears in your task. Labels, assignees, and status changes sync in real-time (< 100ms).', + }, + { + question: 'Is my data secure?', + answer: 'Absolutely. We use end-to-end encryption, OAuth 2.0 authentication (we never see your passwords), and encrypt data at rest and in transit. We\'re working toward SOC 2 compliance for enterprise customers.', + }, + { + question: 'What\'s included in the free plan?', + answer: 'Everything! Our open-source version has no feature limitations. The Managed Cloud plan adds hosting, backups, priority support, and advanced analytics. Small teams (up to 5 members) can use Managed Cloud free forever.', + }, + { + question: 'Can I use this for non-development projects?', + answer: 'Definitely! While we\'re optimized for dev teams using Discord + GitHub, our Kanban boards and task management work great for any team—marketing, design, operations, you name it.', + }, + ]; + + return ( +
+
+ {/* Section Header */} + +

+ Frequently Asked{' '} + + Questions + +

+

+ Everything you need to know about Task Waku. Can't find your answer?{' '} + + Reach out to us + + . +

+
+ + {/* FAQ List */} +
+ {faqs.map((faq, index) => ( + + ))} +
+
+
+ ); +} + +function FAQItem({ + faq, + index, + inView +}: { + faq: { question: string; answer: string }; + index: number; + inView: boolean; +}) { + const [isOpen, setIsOpen] = useState(false); + + return ( + + +
+ +

+ {faq.question} +

+ +
+ +
+

{faq.answer}

+
+
+
+
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/FeaturesSection.tsx b/apps/dashboard-client/src/components/landing/FeaturesSection.tsx new file mode 100644 index 0000000..cd61179 --- /dev/null +++ b/apps/dashboard-client/src/components/landing/FeaturesSection.tsx @@ -0,0 +1,167 @@ +import { motion } from 'framer-motion'; +import { + MessageSquare, + GitBranch, + LayoutDashboard, + Bell, + TrendingUp, + Zap, + Lock, + Rocket, +} from 'lucide-react'; +import { useInView } from '@/hooks/use-in-view'; + +export function FeaturesSection() { + const [ref, inView] = useInView({ + triggerOnce: true, + threshold: 0.1, + }); + + const features = [ + { + icon: MessageSquare, + title: 'Deep Discord Integration', + subtitle: 'Manage Your Project Without Leaving Your Chat', + description: + 'Create, assign, and update tasks using simple slash commands. View Kanban boards and project progress directly in Discord channels.', + highlights: ['Slash commands', 'In-channel boards', 'Thread-based discussions', 'Inline updates'], + gradient: 'from-purple-500 to-blue-500', + }, + { + icon: GitBranch, + title: 'Real-Time GitHub Sync', + subtitle: 'Keep Your Code and Tasks in Perfect Sync', + description: + 'A robust, two-way synchronization where GitHub issues and PRs automatically appear as tasks. Comments and status changes are mirrored in real-time.', + highlights: ['Two-way sync', 'Auto-create tasks', 'Comment mirroring', 'Label mapping'], + gradient: 'from-blue-500 to-cyan-500', + }, + { + icon: LayoutDashboard, + title: 'Minimal, Powerful PM', + subtitle: 'All the Power You Need. None of the Bloat', + description: + 'A clean, visual Kanban-style board with essential features like assignees, due dates, and milestone tracking. No steep learning curve.', + highlights: ['Kanban boards', 'Timeline view', 'Drag & drop', 'Quick filters'], + gradient: 'from-cyan-500 to-teal-500', + }, + { + icon: Bell, + title: 'Smart Notifications', + subtitle: 'Stay in the Loop, Without the Noise', + description: + 'Get intelligent Discord notifications when tasks are assigned, deadlines approach, or PRs need review. No more missed updates buried in DMs.', + highlights: ['Smart alerts', 'Digest mode', 'Custom triggers', 'Mention routing'], + gradient: 'from-teal-500 to-green-500', + }, + { + icon: TrendingUp, + title: 'Analytics & Insights', + subtitle: 'Understand Your Team\'s Velocity', + description: + 'Built-in burndown charts, cycle time tracking, and productivity insights. See bottlenecks, sprint progress, and team performance at a glance.', + highlights: ['Burndown charts', 'Cycle time', 'Velocity tracking', 'Sprint analytics'], + gradient: 'from-green-500 to-emerald-500', + }, + { + icon: Zap, + title: 'Lightning Fast', + subtitle: 'Optimized for Speed and Performance', + description: + 'Real-time updates across all platforms. Changes sync instantly between Discord, GitHub, and the web dashboard with zero lag.', + highlights: ['< 100ms sync', 'Offline support', 'Optimistic UI', 'Edge caching'], + gradient: 'from-yellow-500 to-orange-500', + }, + { + icon: Lock, + title: 'Secure by Design', + subtitle: 'Enterprise-Grade Security', + description: + 'End-to-end encryption, OAuth-only authentication, and granular permissions. Your data is encrypted at rest and in transit.', + highlights: ['E2E encryption', 'OAuth 2.0', 'RBAC', 'Audit logs'], + gradient: 'from-red-500 to-pink-500', + }, + { + icon: Rocket, + title: 'Self-Host Ready', + subtitle: 'Your Infrastructure, Your Control', + description: + 'Open-source core means you can deploy on your own infrastructure. Docker compose files and one-click deployment scripts included.', + highlights: ['Docker ready', 'One-click deploy', 'Cloud agnostic', 'Full control'], + gradient: 'from-pink-500 to-purple-500', + }, + ]; + + return ( +
+
+ {/* Section Header */} + +

+ Everything You Need.{' '} + + Nothing You Don't. + +

+

+ Powerful features designed for modern development teams. No bloat, no complexity. +

+
+ + {/* Features Grid */} +
+ {features.map((feature, index) => { + const Icon = feature.icon; + return ( + + {/* Hover gradient border */} +
+ +
+ {/* Icon */} +
+ +
+ + {/* Title & Subtitle */} +

{feature.title}

+

{feature.subtitle}

+ + {/* Description */} +

{feature.description}

+ + {/* Highlights */} +
+ {feature.highlights.map((highlight, hIndex) => ( + + {highlight} + + ))} +
+
+ + ); + })} +
+
+ + {/* Decorative gradients */} +
+
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/FinalCTASection.tsx b/apps/dashboard-client/src/components/landing/FinalCTASection.tsx new file mode 100644 index 0000000..d3774af --- /dev/null +++ b/apps/dashboard-client/src/components/landing/FinalCTASection.tsx @@ -0,0 +1,129 @@ +import { motion } from 'framer-motion'; +import { ArrowRight, Github, Sparkles } from 'lucide-react'; +import { useInView } from '@/hooks/use-in-view'; +import { Button } from '@/components/ui/button'; + +export function FinalCTASection() { + const [ref, inView] = useInView({ + triggerOnce: true, + threshold: 0.1, + }); + + return ( +
+ {/* Animated background */} +
+ +
+ + {/* Badge */} + + + Join 500+ teams already using Task Waku + + + {/* Headline */} + + Stop the Context Switching. +
+ + Get Your Free Account Today. + +
+ + {/* Subheadline */} + + Use all core features for free with our generous plan for small teams. +
+ No credit card required. +
+ + {/* CTA Buttons */} + + + + + + + {/* Trust badges */} + +
+ + + + Free forever plan +
+
+ + + + No credit card required +
+
+ + + + Setup in 30 seconds +
+
+ + + + Cancel anytime +
+
+
+ + {/* Decorative elements */} +
+
+
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/Footer.tsx b/apps/dashboard-client/src/components/landing/Footer.tsx new file mode 100644 index 0000000..7aebac7 --- /dev/null +++ b/apps/dashboard-client/src/components/landing/Footer.tsx @@ -0,0 +1,148 @@ +import { Github, Twitter, MessageSquare, Mail } from 'lucide-react'; + +export function Footer() { + const currentYear = new Date().getFullYear(); + + const links = { + product: [ + { name: 'Features', href: '#features' }, + { name: 'Pricing', href: '#pricing' }, + { name: 'Roadmap', href: '#' }, + { name: 'Changelog', href: '#' }, + ], + resources: [ + { name: 'Documentation', href: '#' }, + { name: 'API Reference', href: '#' }, + { name: 'Guides', href: '#' }, + { name: 'Blog', href: '#' }, + ], + company: [ + { name: 'About', href: '#' }, + { name: 'Open Source', href: '#' }, + { name: 'Careers', href: '#' }, + { name: 'Contact', href: '#' }, + ], + legal: [ + { name: 'Privacy', href: '#' }, + { name: 'Terms', href: '#' }, + { name: 'Security', href: '#' }, + { name: 'Status', href: '#' }, + ], + }; + + return ( +
+
+
+ {/* Brand Column */} +
+
+ Task Waku + Task Waku +
+

+ Your project command center, right in Discord. Built for teams that value speed, + simplicity, and deep integration. +

+ +
+ + {/* Product */} +
+

Product

+ +
+ + {/* Resources */} +
+

Resources

+ +
+ + {/* Company */} +
+

Company

+ +
+ + {/* Legal */} +
+

Legal

+ +
+
+ + {/* Bottom Bar */} +
+
+

+ © {currentYear} Task Waku. All rights reserved. Built with 💜 by the community. +

+ +
+
+
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/HeroSection.tsx b/apps/dashboard-client/src/components/landing/HeroSection.tsx new file mode 100644 index 0000000..70b46d1 --- /dev/null +++ b/apps/dashboard-client/src/components/landing/HeroSection.tsx @@ -0,0 +1,141 @@ +import { motion } from 'framer-motion'; +import { ArrowRight, Github, Star } from 'lucide-react'; +import { Button } from '@/components/ui/button'; +import { Badge } from '@/components/ui/badge'; +import { DiscordSignIn } from '../common/discord-signin'; + +export function HeroSection() { + return ( +
+ {/* Animated background elements */} +
+
+ +
+ + {/* Social Proof Badges */} + + + + Open Source + + + + 1.2k+ Stars + + + No Credit Card Required + + + + {/* Main Headline */} + + Stop Switching.{' '} + + Start Unifying. + + + + {/* Sub-headline */} + + Your Entire Workflow in Discord. + + + + A minimal project management app natively built for Discord-centric, GitHub-powered teams. +
+ Eliminate context switching and create a single source of truth. +
+ + {/* CTAs */} + + + + + + + {/* Trust Indicators */} + +
+
+ Used by 500+ teams +
+
+
+ 50k+ tasks synced +
+
+
+ Free forever +
+ + + + {/* Hero Visual/Demo */} + +
+
+
+ Task Waku Dashboard + {/* Overlay badge */} +
+ ✨ See it in action +
+
+
+ +
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/HowItWorksSection.tsx b/apps/dashboard-client/src/components/landing/HowItWorksSection.tsx new file mode 100644 index 0000000..b406c94 --- /dev/null +++ b/apps/dashboard-client/src/components/landing/HowItWorksSection.tsx @@ -0,0 +1,145 @@ +import { motion } from 'framer-motion'; +import { MessageSquare, RefreshCcw, BarChart3, ArrowRight } from 'lucide-react'; +import { useInView } from '@/hooks/use-in-view'; + +export function HowItWorksSection() { + const [ref, inView] = useInView({ + triggerOnce: true, + threshold: 0.1, + }); + + const steps = [ + { + icon: MessageSquare, + number: '01', + title: 'Work in Discord', + description: 'Use intuitive slash commands to create, assign, and update tasks. No need to open another app.', + commands: ['/task create', '/task assign', '/board view'], + gradient: 'from-purple-500 to-blue-500', + }, + { + icon: RefreshCcw, + number: '02', + title: 'Auto-Sync with GitHub', + description: 'GitHub issues and PRs automatically become tasks. Comments, status changes, and labels sync instantly.', + commands: ['Issues → Tasks', 'PRs → Tasks', 'Comments sync'], + gradient: 'from-blue-500 to-cyan-500', + }, + { + icon: BarChart3, + number: '03', + title: 'Visualize on Web', + description: 'See your Kanban board, timelines, burndown charts, and team analytics in a beautiful dashboard.', + commands: ['Kanban boards', 'Timeline view', 'Analytics'], + gradient: 'from-cyan-500 to-teal-500', + }, + ]; + + return ( +
+
+ {/* Section Header */} + +

+ Three Tools.{' '} + + One Workflow. + {' '} + Zero Friction. +

+

+ Here's how Task Waku brings it all together in seconds. +

+
+ + {/* Steps Flow */} +
+ {steps.map((step, index) => { + const Icon = step.icon; + const isEven = index % 2 === 0; + + return ( + + {/* Content */} +
+
+ + {step.number} + +
+ +
+
+ +

+ {step.title} +

+ +

+ {step.description} +

+ + {/* Feature tags */} +
+ {step.commands.map((command, cmdIndex) => ( + + {command} + + ))} +
+
+ + {/* Visual */} +
+
+
+ {/* Placeholder for step illustration */} +
+
+ Step {step.number} Illustration +
+
+
+
+ + ); + })} +
+ + {/* Flow Visualization */} + +
+ Discord + + GitHub + + Web Dashboard + + + ✨ Unified + +
+
+
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/InteractiveDemo.tsx b/apps/dashboard-client/src/components/landing/InteractiveDemo.tsx new file mode 100644 index 0000000..d82c44a --- /dev/null +++ b/apps/dashboard-client/src/components/landing/InteractiveDemo.tsx @@ -0,0 +1,238 @@ +import { useState } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { Send, Check, ExternalLink } from 'lucide-react'; +import { Button } from '@/components/ui/button'; + +/** + * Interactive Demo Component + * Shows the "aha moment" - Discord command → Task creation → GitHub sync + * Can be embedded in Hero or as standalone section + */ +export function InteractiveDemo() { + const [step, setStep] = useState(0); + const [command, setCommand] = useState(''); + + const demoSteps = [ + { + title: 'Type a Discord command', + placeholder: '/task create "Fix navigation bug"', + action: 'Send', + }, + { + title: 'Task appears on your board', + action: 'Next', + }, + { + title: 'Syncs to GitHub automatically', + action: 'See it live', + }, + ]; + + const handleSubmit = (e: React.FormEvent) => { + e.preventDefault(); + if (step < demoSteps.length - 1) { + setStep(step + 1); + } + }; + + const reset = () => { + setStep(0); + setCommand(''); + }; + + return ( +
+ {/* Demo Header */} +
+
+ ✨ Try it yourself +
+

See the Magic in Action

+

+ Watch how a single Discord command syncs across your entire workflow +

+
+ + {/* Demo Container */} +
+ {/* Progress Indicator */} +
+ {demoSteps.map((_, index) => ( +
+
+ {index < demoSteps.length - 1 && ( +
+ )} +
+ ))} +
+ + {/* Demo Steps */} + + {step === 0 && ( + +
+

+ {demoSteps[0].title} +

+
+ + {/* Mock Discord Interface */} +
+
+
+
+ general +
+
+ setCommand(e.target.value)} + placeholder={demoSteps[0].placeholder} + className="flex-1 rounded-lg border border-white/10 bg-gray-700/50 px-4 py-3 text-white placeholder:text-gray-500 focus:border-blue-500 focus:outline-none" + /> + +
+
+ + + )} + + {step === 1 && ( + +
+
+ + Task Created! +
+

+ {demoSteps[1].title} +

+
+ + {/* Mock Kanban Board */} +
+
TO DO
+ +
Fix navigation bug
+
+
+ Just now +
+ +
+ + +
+ )} + + {step === 2 && ( + +
+
+ + Synced to GitHub! +
+

+ {demoSteps[2].title} +

+
+ + {/* Mock GitHub Issue */} +
+
+ + + +
+
#42 opened just now
+
your-repo/your-project
+
+
+
Fix navigation bug
+

+ Created automatically from Discord via Task Waku +

+
+ +
+ + +
+
+ )} + + + {/* Floating stats */} +
+
+
{'<100ms'}
+
Sync time
+
+
+
100%
+
Accurate
+
+
+
2-way
+
Sync
+
+
+
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/LandingNav.tsx b/apps/dashboard-client/src/components/landing/LandingNav.tsx new file mode 100644 index 0000000..9dae925 --- /dev/null +++ b/apps/dashboard-client/src/components/landing/LandingNav.tsx @@ -0,0 +1,122 @@ +import { useState, useEffect } from 'react'; +import { motion, AnimatePresence } from 'framer-motion'; +import { Menu, X, Github } from 'lucide-react'; +import { Button } from '@/components/ui/button'; + +export function LandingNav() { + const [isScrolled, setIsScrolled] = useState(false); + const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); + + useEffect(() => { + const handleScroll = () => { + setIsScrolled(window.scrollY > 20); + }; + + window.addEventListener('scroll', handleScroll); + return () => window.removeEventListener('scroll', handleScroll); + }, []); + + const navLinks = [ + { name: 'Features', href: '#features' }, + { name: 'Pricing', href: '#pricing' }, + { name: 'Docs', href: '#' }, + { name: 'Dashboard', href: '/onboarding' }, + ]; + + return ( + +
+
+ {/* Logo */} +
+ Task Waku Logo + Task Waku +
+ + {/* Desktop Navigation */} + + + {/* Desktop CTA Buttons */} +
+ + +
+ + {/* Mobile Menu Button */} + +
+
+ + {/* Mobile Menu */} + + {isMobileMenuOpen && ( + + + + )} + +
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/OpenSourceSection.tsx b/apps/dashboard-client/src/components/landing/OpenSourceSection.tsx new file mode 100644 index 0000000..e204055 --- /dev/null +++ b/apps/dashboard-client/src/components/landing/OpenSourceSection.tsx @@ -0,0 +1,188 @@ +import { motion } from 'framer-motion'; +import { Github, Heart, Users, Code2, Shield, TrendingUp } from 'lucide-react'; +import { useInView } from '@/hooks/use-in-view'; +import { Button } from '@/components/ui/button'; + +export function OpenSourceSection() { + const [ref, inView] = useInView({ + triggerOnce: true, + threshold: 0.1, + }); + + const benefits = [ + { + icon: Shield, + title: 'Transparent & Trustworthy', + description: 'Every line of code is open for review. No hidden tracking, no vendor lock-in.', + }, + { + icon: Users, + title: 'Community-Driven', + description: 'Built with input from 100+ contributors. Your feedback shapes the roadmap.', + }, + { + icon: Code2, + title: 'Self-Host Ready', + description: 'Deploy on your infrastructure with full control over your data and privacy.', + }, + { + icon: TrendingUp, + title: 'Rapid Innovation', + description: 'New features ship weekly. Security patches deployed within hours, not days.', + }, + ]; + + const stats = [ + { label: 'GitHub Stars', value: '1.2k+' }, + { label: 'Contributors', value: '100+' }, + { label: 'Commits', value: '5,000+' }, + { label: 'Community Members', value: '2,500+' }, + ]; + + return ( +
+
+
+ {/* Left: Content */} + +
+ + Open Source +
+ +

+ Transparent,{' '} + + Community-Driven, + {' '} + and Free +

+ +

+ Task Waku is built on open-source principles. We believe in transparency, community collaboration, + and giving you complete control over your project management tools. +

+ + {/* Benefits Grid */} +
+ {benefits.map((benefit, index) => { + const Icon = benefit.icon; + return ( + +
+
+ +
+
+
+

{benefit.title}

+

{benefit.description}

+
+
+ ); + })} +
+ + {/* CTAs */} +
+ + +
+
+ + {/* Right: Stats & Visual */} + + {/* Stats Grid */} +
+ {stats.map((stat, index) => ( + +
+
+
{stat.value}
+
{stat.label}
+
+ + ))} +
+ + {/* GitHub Activity Visualization */} + +
+
+ +
+
fazlulShanto/task-waku
+
Public repository
+
+
+ + {/* Contribution graph placeholder */} +
+
+ {Array.from({ length: 52 }).map((_, i) => ( +
0.3 + ? 'bg-green-500/80' + : Math.random() > 0.5 + ? 'bg-green-500/50' + : 'bg-gray-700' + }`} + /> + ))} +
+

Active development & community contributions

+
+
+ + +
+
+ + {/* Decorative gradient */} +
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/PersonaSection.tsx b/apps/dashboard-client/src/components/landing/PersonaSection.tsx new file mode 100644 index 0000000..711c002 --- /dev/null +++ b/apps/dashboard-client/src/components/landing/PersonaSection.tsx @@ -0,0 +1,153 @@ +import { motion } from 'framer-motion'; +import { Briefcase, Code, Sparkles } from 'lucide-react'; +import { useInView } from '@/hooks/use-in-view'; + +export function PersonaSection() { + const [ref, inView] = useInView({ + triggerOnce: true, + threshold: 0.1, + }); + + const personas = [ + { + icon: Code, + name: 'Alex', + role: 'Engineering Team Lead', + company: '15-person startup', + problem: 'Frustrated with tool sprawl and clunky Trello-GitHub integration', + quote: "I need a tool that fits our Discord-centric workflow, not one that fights it.", + painPoints: [ + 'Team already lives in Discord', + 'Trello feels disconnected from GitHub', + 'Zapier integrations break constantly', + 'Need something developer-friendly', + ], + }, + { + icon: Briefcase, + name: 'Sarah', + role: 'Agile Product Manager', + company: 'Remote marketing agency', + problem: 'Lost tasks in Discord threads, no visibility into sprint progress', + quote: "I can't get my team to open Jira. They just want to work in Discord.", + painPoints: [ + 'Team ignores traditional PM tools', + 'Hard to track sprint velocity', + 'Tasks get lost in chat', + 'Need lightweight solution', + ], + }, + { + icon: Sparkles, + name: 'Jamie', + role: 'Solo Indie Developer', + company: 'Building open-source projects', + problem: 'Juggling GitHub issues, Discord community, and personal todos', + quote: "I want to manage my GitHub issues without leaving Discord.", + painPoints: [ + 'Managing multiple repos', + 'Active Discord community', + 'Too many browser tabs', + 'Need simplicity and speed', + ], + }, + ]; + + return ( +
+
+ {/* Section Header */} + +

+ Built for Teams That{' '} + + Live in Discord + +

+

+ Designed for small software teams, agile marketers, and indie creators who value Discord's collaborative community vibe. +

+
+ + {/* Persona Cards */} +
+ {personas.map((persona, index) => { + const Icon = persona.icon; + return ( + +
+ +
+ {/* Avatar & Icon */} +
+
+ +
+
+

{persona.name}

+

{persona.role}

+

{persona.company}

+
+
+ + {/* Problem */} +
+

The Problem:

+

{persona.problem}

+
+ + {/* Quote */} +
+

"{persona.quote}"

+
+ + {/* Pain Points */} +
+

Pain Points:

+
    + {persona.painPoints.map((point, pIndex) => ( +
  • + + {point} +
  • + ))} +
+
+
+ + ); + })} +
+ + {/* Bottom CTA */} + +

+ Does this sound like you? +

+

+ Join 500+ teams who've eliminated context switching and found their flow. +

+
+
+ + {/* Decorative elements */} +
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/PricingSection.tsx b/apps/dashboard-client/src/components/landing/PricingSection.tsx new file mode 100644 index 0000000..bbce97c --- /dev/null +++ b/apps/dashboard-client/src/components/landing/PricingSection.tsx @@ -0,0 +1,195 @@ +import { motion } from 'framer-motion'; +import { Check, ArrowRight, Star, Sparkles } from 'lucide-react'; +import { useInView } from '@/hooks/use-in-view'; +import { Button } from '@/components/ui/button'; +import { Badge } from '@/components/ui/badge'; + +export function PricingSection() { + const [ref, inView] = useInView({ + triggerOnce: true, + threshold: 0.1, + }); + + const plans = [ + { + name: 'Open Source', + subtitle: 'Self-Hosted', + price: 'Free', + period: 'forever', + description: 'Perfect for teams who want complete control over their infrastructure.', + features: [ + 'Full source code access', + 'Unlimited projects & tasks', + 'Discord & GitHub integration', + 'Self-host on your servers', + 'Community support', + 'Docker & Kubernetes ready', + 'No telemetry or tracking', + 'MIT License', + ], + cta: 'Star on GitHub', + ctaVariant: 'outline' as const, + popular: false, + icon: Star, + }, + { + name: 'Managed Cloud', + subtitle: 'Hassle-Free', + price: '$2', + period: 'per member / month', + description: 'Zero-hassle managed solution. We handle hosting, updates, and backups.', + features: [ + 'Everything in Open Source', + 'Managed hosting & updates', + '99.9% uptime SLA', + 'Automated backups', + 'Priority support', + 'Advanced analytics', + 'Custom integrations', + 'SSO (coming soon)', + ], + cta: 'Start Free Trial', + ctaVariant: 'default' as const, + popular: true, + icon: Sparkles, + badge: '25% off yearly', + }, + ]; + + return ( +
+
+ {/* Section Header */} + +

+ Simple,{' '} + + Transparent + {' '} + Pricing +

+

+ Start free. Scale as you grow. No hidden fees, no surprises. +

+
+ + {/* Pricing Cards */} +
+ {plans.map((plan, index) => { + const Icon = plan.icon; + return ( + + {/* Popular badge */} + {plan.popular && ( +
+ + + Most Popular + +
+ )} + + {/* Hover gradient border */} +
+ +
+ {/* Icon */} +
+ +
+ + {/* Plan Name */} +
+

{plan.name}

+ {plan.badge && ( + + {plan.badge} + + )} +
+

{plan.subtitle}

+ + {/* Price */} +
+
+ {plan.price} + {plan.period && {plan.period}} +
+
+ + {/* Description */} +

{plan.description}

+ + {/* CTA Button */} + + + {/* Features List */} +
+

What's included:

+
    + {plan.features.map((feature, fIndex) => ( +
  • +
    + +
    + {feature} +
  • + ))} +
+
+
+ + ); + })} +
+ + {/* Bottom Note */} + +

+ All plans include our core features. No credit card required to start. +

+

+ Questions about pricing? Contact our team +

+
+
+ + {/* Decorative gradients */} +
+
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/ProblemSection.tsx b/apps/dashboard-client/src/components/landing/ProblemSection.tsx new file mode 100644 index 0000000..5286fe0 --- /dev/null +++ b/apps/dashboard-client/src/components/landing/ProblemSection.tsx @@ -0,0 +1,109 @@ +import { motion } from 'framer-motion'; +import { AlertCircle, RefreshCw, Search, Zap } from 'lucide-react'; +import { useInView } from '@/hooks/use-in-view'; + +export function ProblemSection() { + const [ref, inView] = useInView({ + triggerOnce: true, + threshold: 0.1, + }); + + const problems = [ + { + icon: RefreshCw, + title: 'Constant Context Switching', + description: 'Jump between Discord, GitHub, and your PM tool dozens of times a day. Each switch kills your focus and productivity.', + stat: '23% of time wasted', + }, + { + icon: Search, + title: 'Information Gets Lost', + description: 'Critical task updates buried in Discord chat history. Important GitHub discussions disconnected from your board.', + stat: '13 context switches/day', + }, + { + icon: AlertCircle, + title: 'Superficial Integrations', + description: 'Existing tools offer one-way syncs or complex third-party connectors like Zapier. Nothing truly unifies your workflow.', + stat: '3+ tools to manage', + }, + { + icon: Zap, + title: 'Steep Learning Curves', + description: 'Bloated PM tools with features you\'ll never use. Your team spends more time learning the tool than actually working.', + stat: '2+ hours onboarding', + }, + ]; + + return ( +
+
+ {/* Section Header */} + +

+ Tired of Juggling{' '} + + Three Tools + {' '} + to Manage One Project? +

+

+ You're not alone. Modern development teams are drowning in tool sprawl, and it's killing productivity. +

+
+ + {/* Problem Grid */} +
+ {problems.map((problem, index) => { + const Icon = problem.icon; + return ( + +
+
+
+
+ +
+ {problem.stat} +
+

{problem.title}

+

{problem.description}

+
+ + ); + })} +
+ + {/* Dramatic Statement */} + +

+ Teams rely on a patchwork of tools: a PM tool, GitHub for code, and Discord for chat. +

+

+ This forces constant context switching, leading to lost focus and missed information. +

+
+
+ + {/* Decorative elements */} +
+
+
+ ); +} diff --git a/apps/dashboard-client/src/components/landing/SolutionSection.tsx b/apps/dashboard-client/src/components/landing/SolutionSection.tsx new file mode 100644 index 0000000..c79e63f --- /dev/null +++ b/apps/dashboard-client/src/components/landing/SolutionSection.tsx @@ -0,0 +1,156 @@ +import { motion } from 'framer-motion'; +import { ArrowRight, CheckCircle2 } from 'lucide-react'; +import { useInView } from '@/hooks/use-in-view'; +import { Button } from '@/components/ui/button'; + +export function SolutionSection() { + const [ref, inView] = useInView({ + triggerOnce: true, + threshold: 0.1, + }); + + const benefits = [ + 'No more switching between tools', + 'Single source of truth for your team', + 'Two-way sync that actually works', + 'Built for developers, by developers', + 'Open source and transparent', + 'Setup in under 5 minutes', + ]; + + return ( +
+
+
+ {/* Left: Text Content */} + +

+ Task Waku:{' '} + + Your Project Command Center, + {' '} + Right in Discord. +

+ +

+ A minimal yet powerful project management application that unifies your workflow. +

+ +
+
+
+ +
+
+

Dedicated Discord Bot as Primary Interface

+

+ Turn Discord into a command center. Manage everything without ever leaving your chat. +

+
+
+ +
+
+ +
+
+

Deep, Two-Way GitHub Synchronization

+

+ Your code and tasks stay perfectly aligned. Issues, PRs, comments—all synced in real-time. +

+
+
+ +
+
+ +
+
+

Beautiful, Minimal Web Dashboard

+

+ Visual Kanban boards, timeline views, and analytics—all without the bloat. +

+
+
+
+ +
+ {benefits.map((benefit, index) => ( + + + {benefit} + + ))} +
+ +
+ + +
+
+ + {/* Right: Visual/Graphic */} + +
+
+ {/* This would be your product screenshot or illustration */} +
+
+ {/* Placeholder for product image */} +
+ Product Demo Visualization +
+
+
+ + {/* Floating stat cards */} + +
10x
+
Faster sync
+
+ + +
99.9%
+
Uptime
+
+
+ +
+
+ + {/* Decorative gradient */} +
+
+ ); +} diff --git a/apps/dashboard-client/src/hooks/use-in-view.tsx b/apps/dashboard-client/src/hooks/use-in-view.tsx new file mode 100644 index 0000000..6bbf68c --- /dev/null +++ b/apps/dashboard-client/src/hooks/use-in-view.tsx @@ -0,0 +1,34 @@ +import { useEffect, useRef, useState } from 'react'; + +export function useInView(options: { triggerOnce?: boolean; threshold?: number } = {}) { + const ref = useRef(null); + const [inView, setInView] = useState(false); + + useEffect(() => { + const observer = new IntersectionObserver( + ([entry]) => { + if (entry.isIntersecting) { + setInView(true); + if (options.triggerOnce) { + observer.disconnect(); + } + } else if (!options.triggerOnce) { + setInView(false); + } + }, + { + threshold: options.threshold || 0.1, + } + ); + + if (ref.current) { + observer.observe(ref.current); + } + + return () => { + observer.disconnect(); + }; + }, [options.triggerOnce, options.threshold]); + + return [ref, inView] as const; +} diff --git a/apps/dashboard-client/src/pages/landingPage/NewLandingPage.tsx b/apps/dashboard-client/src/pages/landingPage/NewLandingPage.tsx new file mode 100644 index 0000000..babc397 --- /dev/null +++ b/apps/dashboard-client/src/pages/landingPage/NewLandingPage.tsx @@ -0,0 +1,60 @@ +import { LandingNav } from '@/components/landing/LandingNav'; +import { HeroSection } from '@/components/landing/HeroSection'; +import { ProblemSection } from '@/components/landing/ProblemSection'; +import { SolutionSection } from '@/components/landing/SolutionSection'; +import { HowItWorksSection } from '@/components/landing/HowItWorksSection'; +import { FeaturesSection } from '@/components/landing/FeaturesSection'; +import { PersonaSection } from '@/components/landing/PersonaSection'; +import { OpenSourceSection } from '@/components/landing/OpenSourceSection'; +import { ComparisonSection } from '@/components/landing/ComparisonSection'; +import { PricingSection } from '@/components/landing/PricingSection'; +import { FAQSection } from '@/components/landing/FAQSection'; +import { FinalCTASection } from '@/components/landing/FinalCTASection'; +import { Footer } from '@/components/landing/Footer'; + +function LandingPage() { + return ( +
+ {/* Navigation */} + + + {/* Hero Section */} + + + {/* Problem Section */} + + + {/* Solution Section */} + + + {/* How It Works */} + + + {/* Features Showcase */} + + + {/* Target Audience / Personas */} + + + {/* Open Source & Community */} + + + {/* Comparison Table */} + + + {/* Pricing */} + + + {/* FAQ */} + + + {/* Final CTA */} + + + {/* Footer */} +
+
+ ); +} + +export default LandingPage; diff --git a/apps/dashboard-client/src/routes/index.tsx b/apps/dashboard-client/src/routes/index.tsx index af80272..e7926e0 100644 --- a/apps/dashboard-client/src/routes/index.tsx +++ b/apps/dashboard-client/src/routes/index.tsx @@ -1,4 +1,4 @@ -import LandingPage from '@/pages/landingPage'; +import LandingPage from '@/pages/landingPage/NewLandingPage'; import { createFileRoute } from '@tanstack/react-router'; export const Route = createFileRoute('/')({ diff --git a/apps/discord-bot/package.json b/apps/discord-bot/package.json index f12243e..e888db0 100644 --- a/apps/discord-bot/package.json +++ b/apps/discord-bot/package.json @@ -13,12 +13,12 @@ "db-test": "tsx pgtest.ts" }, "dependencies": { - "discord.js": "^14.17.3", "@taskcord/database": "workspace:*", + "discord.js": "^14.23.2", "dotenv": "^16.4.7", "drizzle-orm": "^0.39.3", - "pg": "^8.13.2", - "ioredis": "^5.5.0" + "ioredis": "^5.5.0", + "pg": "^8.13.2" }, "devDependencies": { "@repo/eslint-config": "workspace:*", diff --git a/packages/database/drizzle/0002_migration_1760799203978.sql b/packages/database/drizzle/0002_migration_1760799203978.sql new file mode 100644 index 0000000..09ee7c0 --- /dev/null +++ b/packages/database/drizzle/0002_migration_1760799203978.sql @@ -0,0 +1,34 @@ +CREATE TABLE "project_user_roles" ( + "id" uuid PRIMARY KEY NOT NULL, + "user_id" uuid NOT NULL, + "role_id" uuid NOT NULL, + "project_id" uuid NOT NULL, + "assigned_at" timestamp DEFAULT now(), + CONSTRAINT "project_user_roles_user_id_role_id_project_id_unique" UNIQUE("user_id","role_id","project_id") +); +--> statement-breakpoint +CREATE TABLE "statuses" ( + "id" uuid PRIMARY KEY NOT NULL, + "project_id" uuid NOT NULL, + "name" varchar NOT NULL, + "description" text, + "creator_id" uuid NOT NULL, + "color" varchar NOT NULL, + "order" integer NOT NULL, + "created_at" timestamp DEFAULT now(), + "updated_at" timestamp DEFAULT now() +); +--> statement-breakpoint +ALTER TABLE "project_defined_roles" DROP CONSTRAINT "project_defined_roles_project_id_projects_id_fk"; +--> statement-breakpoint +ALTER TABLE "project_defined_roles" ADD COLUMN "description" varchar(255);--> statement-breakpoint +ALTER TABLE "project_defined_roles" ADD COLUMN "created_at" timestamp DEFAULT now();--> statement-breakpoint +ALTER TABLE "project_defined_roles" ADD COLUMN "updated_at" timestamp DEFAULT now();--> statement-breakpoint +ALTER TABLE "project_defined_roles" ADD COLUMN "permission_code" varchar(255) NOT NULL;--> statement-breakpoint +ALTER TABLE "project_defined_roles" ADD COLUMN "creator_id" uuid NOT NULL;--> statement-breakpoint +ALTER TABLE "project_user_roles" ADD CONSTRAINT "project_user_roles_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "project_user_roles" ADD CONSTRAINT "project_user_roles_role_id_project_defined_roles_id_fk" FOREIGN KEY ("role_id") REFERENCES "public"."project_defined_roles"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "project_user_roles" ADD CONSTRAINT "project_user_roles_project_id_projects_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "statuses" ADD CONSTRAINT "statuses_project_id_projects_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "project_defined_roles" ADD CONSTRAINT "project_defined_roles_creator_id_users_id_fk" FOREIGN KEY ("creator_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint +ALTER TABLE "project_defined_roles" ADD CONSTRAINT "project_defined_roles_project_id_projects_id_fk" FOREIGN KEY ("project_id") REFERENCES "public"."projects"("id") ON DELETE cascade ON UPDATE no action; \ No newline at end of file diff --git a/packages/database/drizzle/meta/0002_snapshot.json b/packages/database/drizzle/meta/0002_snapshot.json new file mode 100644 index 0000000..f5a3a4e --- /dev/null +++ b/packages/database/drizzle/meta/0002_snapshot.json @@ -0,0 +1,1252 @@ +{ + "id": "71215648-0b5a-49cb-953f-b83e9c4b4220", + "prevId": "f2eb7940-c4cd-4a45-9f49-83a4a5799f75", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.comments": { + "name": "comments", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "task_id": { + "name": "task_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "parent_comment_id": { + "name": "parent_comment_id", + "type": "uuid", + "primaryKey": false, + "notNull": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "attachments": { + "name": "attachments", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "comments_task_id_tasks_id_fk": { + "name": "comments_task_id_tasks_id_fk", + "tableFrom": "comments", + "tableTo": "tasks", + "columnsFrom": [ + "task_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "comments_user_id_users_id_fk": { + "name": "comments_user_id_users_id_fk", + "tableFrom": "comments", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "comments_parent_comment_id_comments_id_fk": { + "name": "comments_parent_comment_id_comments_id_fk", + "tableFrom": "comments", + "tableTo": "comments", + "columnsFrom": [ + "parent_comment_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.features": { + "name": "features", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "feature_slug": { + "name": "feature_slug", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "feature_name": { + "name": "feature_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "features_feature_slug_unique": { + "name": "features_feature_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "feature_slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.labels": { + "name": "labels", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "project_id": { + "name": "project_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "label": { + "name": "label", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "color": { + "name": "color", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "labels_project_id_projects_id_fk": { + "name": "labels_project_id_projects_id_fk", + "tableFrom": "labels", + "tableTo": "projects", + "columnsFrom": [ + "project_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.milestone_tasks": { + "name": "milestone_tasks", + "schema": "", + "columns": { + "milestone_id": { + "name": "milestone_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "task_id": { + "name": "task_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "milestone_tasks_milestone_id_milestones_id_fk": { + "name": "milestone_tasks_milestone_id_milestones_id_fk", + "tableFrom": "milestone_tasks", + "tableTo": "milestones", + "columnsFrom": [ + "milestone_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "milestone_tasks_task_id_tasks_id_fk": { + "name": "milestone_tasks_task_id_tasks_id_fk", + "tableFrom": "milestone_tasks", + "tableTo": "tasks", + "columnsFrom": [ + "task_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "milestone_tasks_milestone_id_task_id_pk": { + "name": "milestone_tasks_milestone_id_task_id_pk", + "columns": [ + "milestone_id", + "task_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.milestones": { + "name": "milestones", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "project_id": { + "name": "project_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "start_date": { + "name": "start_date", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "end_date": { + "name": "end_date", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "status": { + "name": "status", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "'pending'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "milestones_project_id_projects_id_fk": { + "name": "milestones_project_id_projects_id_fk", + "tableFrom": "milestones", + "tableTo": "projects", + "columnsFrom": [ + "project_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.permissions": { + "name": "permissions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "permission_slug": { + "name": "permission_slug", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "permission_title": { + "name": "permission_title", + "type": "varchar", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "permissions_permission_slug_unique": { + "name": "permissions_permission_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "permission_slug" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.project_defined_roles": { + "name": "project_defined_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "project_id": { + "name": "project_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "role_name": { + "name": "role_name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "permission_code": { + "name": "permission_code", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "project_defined_roles_project_id_projects_id_fk": { + "name": "project_defined_roles_project_id_projects_id_fk", + "tableFrom": "project_defined_roles", + "tableTo": "projects", + "columnsFrom": [ + "project_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "project_defined_roles_creator_id_users_id_fk": { + "name": "project_defined_roles_creator_id_users_id_fk", + "tableFrom": "project_defined_roles", + "tableTo": "users", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.project_roles": { + "name": "project_roles", + "schema": "", + "columns": { + "project_id": { + "name": "project_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "project_roles_project_id_projects_id_fk": { + "name": "project_roles_project_id_projects_id_fk", + "tableFrom": "project_roles", + "tableTo": "projects", + "columnsFrom": [ + "project_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "project_roles_user_id_users_id_fk": { + "name": "project_roles_user_id_users_id_fk", + "tableFrom": "project_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "project_roles_role_id_project_defined_roles_id_fk": { + "name": "project_roles_role_id_project_defined_roles_id_fk", + "tableFrom": "project_roles", + "tableTo": "project_defined_roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "project_roles_project_id_user_id_role_id_pk": { + "name": "project_roles_project_id_user_id_role_id_pk", + "columns": [ + "project_id", + "user_id", + "role_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.project_user_roles": { + "name": "project_user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "project_id": { + "name": "project_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "assigned_at": { + "name": "assigned_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "project_user_roles_user_id_users_id_fk": { + "name": "project_user_roles_user_id_users_id_fk", + "tableFrom": "project_user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "project_user_roles_role_id_project_defined_roles_id_fk": { + "name": "project_user_roles_role_id_project_defined_roles_id_fk", + "tableFrom": "project_user_roles", + "tableTo": "project_defined_roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "project_user_roles_project_id_projects_id_fk": { + "name": "project_user_roles_project_id_projects_id_fk", + "tableFrom": "project_user_roles", + "tableTo": "projects", + "columnsFrom": [ + "project_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "project_user_roles_user_id_role_id_project_id_unique": { + "name": "project_user_roles_user_id_role_id_project_id_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id", + "role_id", + "project_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.projects": { + "name": "projects", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "manager_id": { + "name": "manager_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "discord_server_id": { + "name": "discord_server_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "logo": { + "name": "logo", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "starting_timestamp": { + "name": "starting_timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "estimated_completion_timestamp": { + "name": "estimated_completion_timestamp", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "completed_at": { + "name": "completed_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": { + "projects_creator_id_users_id_fk": { + "name": "projects_creator_id_users_id_fk", + "tableFrom": "projects", + "tableTo": "users", + "columnsFrom": [ + "creator_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.role_feature_permissions": { + "name": "role_feature_permissions", + "schema": "", + "columns": { + "role_id": { + "name": "role_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "feature_id": { + "name": "feature_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "permission_id": { + "name": "permission_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "role_feature_permissions_role_id_project_defined_roles_id_fk": { + "name": "role_feature_permissions_role_id_project_defined_roles_id_fk", + "tableFrom": "role_feature_permissions", + "tableTo": "project_defined_roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "role_feature_permissions_feature_id_features_id_fk": { + "name": "role_feature_permissions_feature_id_features_id_fk", + "tableFrom": "role_feature_permissions", + "tableTo": "features", + "columnsFrom": [ + "feature_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "role_feature_permissions_permission_id_permissions_id_fk": { + "name": "role_feature_permissions_permission_id_permissions_id_fk", + "tableFrom": "role_feature_permissions", + "tableTo": "permissions", + "columnsFrom": [ + "permission_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "role_feature_permissions_role_id_feature_id_permission_id_pk": { + "name": "role_feature_permissions_role_id_feature_id_permission_id_pk", + "columns": [ + "role_id", + "feature_id", + "permission_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.servers": { + "name": "servers", + "schema": "", + "columns": { + "server_id": { + "name": "server_id", + "type": "varchar", + "primaryKey": true, + "notNull": true + }, + "owner_id": { + "name": "owner_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "server_logo": { + "name": "server_logo", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "server_name": { + "name": "server_name", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "is_bot_in_server": { + "name": "is_bot_in_server", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "last_updated_at": { + "name": "last_updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.statuses": { + "name": "statuses", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "project_id": { + "name": "project_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "color": { + "name": "color", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "order": { + "name": "order", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "statuses_project_id_projects_id_fk": { + "name": "statuses_project_id_projects_id_fk", + "tableFrom": "statuses", + "tableTo": "projects", + "columnsFrom": [ + "project_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.task_assignees": { + "name": "task_assignees", + "schema": "", + "columns": { + "task_id": { + "name": "task_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "task_assignees_task_id_tasks_id_fk": { + "name": "task_assignees_task_id_tasks_id_fk", + "tableFrom": "task_assignees", + "tableTo": "tasks", + "columnsFrom": [ + "task_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "task_assignees_user_id_users_id_fk": { + "name": "task_assignees_user_id_users_id_fk", + "tableFrom": "task_assignees", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": { + "task_assignees_task_id_user_id_pk": { + "name": "task_assignees_task_id_user_id_pk", + "columns": [ + "task_id", + "user_id" + ] + } + }, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.tasks": { + "name": "tasks", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "project_id": { + "name": "project_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "title": { + "name": "title", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "creator_id": { + "name": "creator_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "status": { + "name": "status", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "'TODO'" + }, + "priority": { + "name": "priority", + "type": "varchar", + "primaryKey": false, + "notNull": true, + "default": "'MEDIUM'" + }, + "due_date": { + "name": "due_date", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true + }, + "discord_id": { + "name": "discord_id", + "type": "varchar", + "primaryKey": false, + "notNull": true + }, + "full_name": { + "name": "full_name", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "nick_name": { + "name": "nick_name", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "avatar": { + "name": "avatar", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar", + "primaryKey": false, + "notNull": false, + "default": "''" + }, + "discord_refresh_token": { + "name": "discord_refresh_token", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "discord_access_token": { + "name": "discord_access_token", + "type": "varchar", + "primaryKey": false, + "notNull": false + }, + "discord_access_token_expires_at": { + "name": "discord_access_token_expires_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + }, + "last_auth": { + "name": "last_auth", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "is_verified": { + "name": "is_verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_discord_id_unique": { + "name": "users_discord_id_unique", + "nullsNotDistinct": false, + "columns": [ + "discord_id" + ] + } + }, + "policies": {}, + "checkConstraints": {}, + "isRLSEnabled": false + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "roles": {}, + "policies": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/packages/database/drizzle/meta/_journal.json b/packages/database/drizzle/meta/_journal.json index f13e52b..c585019 100644 --- a/packages/database/drizzle/meta/_journal.json +++ b/packages/database/drizzle/meta/_journal.json @@ -15,6 +15,13 @@ "when": 1749304801409, "tag": "0001_gigantic_santa_claus", "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1760799207547, + "tag": "0002_migration_1760799203978", + "breakpoints": true } ] } \ No newline at end of file diff --git a/packages/database/src/index.ts b/packages/database/src/index.ts index 96fc7b5..1ba5206 100644 --- a/packages/database/src/index.ts +++ b/packages/database/src/index.ts @@ -58,6 +58,26 @@ export const runMigrations = async () => { } }; +// generate migration file utility +export const generateMigration = async (migrationName?: string) => { + const { execSync } = await import("child_process"); + + try { + const name = migrationName || `migration_${Date.now()}`; + console.log(`📝 Generating migration: ${name}`); + + execSync(`npx drizzle-kit generate --name ${name}`, { + stdio: "inherit", + cwd: resolve(__dirname, ".."), + }); + + console.log("✅ Migration file generated successfully"); + } catch (err) { + console.error("❌ Migration generation failed", err); + throw err; + } +}; + // Pool event handlers pool.on("error", () => { console.error("❌ Unexpected error on idle client"); diff --git a/packages/database/src/models/status.model.ts b/packages/database/src/models/status.model.ts index b6454f9..466250e 100644 --- a/packages/database/src/models/status.model.ts +++ b/packages/database/src/models/status.model.ts @@ -1,31 +1,31 @@ +import { eq, inArray } from "drizzle-orm"; import { - pgTable, - uuid, - varchar, - timestamp, - text, - integer, + integer, + pgTable, + text, + timestamp, + uuid, + varchar, } from "drizzle-orm/pg-core"; import { uuidv7 } from "uuidv7"; -import { eq, inArray } from "drizzle-orm"; import { db } from "../index"; import { projectModel } from "./project.model"; export const statusModel = pgTable("statuses", { - id: uuid("id") - .primaryKey() - .notNull() - .$defaultFn(() => uuidv7()), - projectId: uuid("project_id") - .notNull() - .references(() => projectModel.id, { onDelete: "cascade" }), - name: varchar("name").notNull(), - description: text("description"), - creatorId: uuid("creator_id").notNull(), - color: varchar("color").notNull(), - order: integer("order").notNull(), - createdAt: timestamp("created_at").defaultNow(), - updatedAt: timestamp("updated_at").defaultNow(), + id: uuid("id") + .primaryKey() + .notNull() + .$defaultFn(() => uuidv7()), + projectId: uuid("project_id") + .notNull() + .references(() => projectModel.id, { onDelete: "cascade" }), + name: varchar("name").notNull(), + description: text("description"), + creatorId: uuid("creator_id").notNull(), + color: varchar("color").notNull(), + order: integer("order").notNull(), + createdAt: timestamp("created_at").defaultNow(), + updatedAt: timestamp("updated_at").defaultNow(), }); export type DbStatus = typeof statusModel.$inferSelect; @@ -34,54 +34,56 @@ export type DbNewStatus = typeof statusModel.$inferInsert; // Status DAL 🟩 export class StatusDal { - static async createStatus(input: DbNewStatus): Promise { - const [status] = await db.insert(statusModel).values(input).returning(); - return status; - } + static async createStatus(input: DbNewStatus): Promise { + const [status] = await db.insert(statusModel).values(input).returning(); + return status; + } - static async getStatusById(id: string): Promise { - const result = await db - .select() - .from(statusModel) - .where(eq(statusModel.id, id)) - .limit(1); + static async getStatusById(id: string): Promise { + const result = await db + .select() + .from(statusModel) + .where(eq(statusModel.id, id)) + .limit(1); - return result.at(0) ?? null; - } + return result.at(0) ?? null; + } - static async getStatusesByProjectId(projectId: string): Promise { - return await db - .select() - .from(statusModel) - .where(eq(statusModel.projectId, projectId)); - } + static async getStatusesByProjectId( + projectId: string + ): Promise { + return await db + .select() + .from(statusModel) + .where(eq(statusModel.projectId, projectId)); + } - static async updateStatus( - id: string, - data: Partial, - ): Promise { - const [status] = await db - .update(statusModel) - .set(data) - .where(eq(statusModel.id, id)) - .returning(); + static async updateStatus( + id: string, + data: Partial + ): Promise { + const [status] = await db + .update(statusModel) + .set(data) + .where(eq(statusModel.id, id)) + .returning(); - return status; - } + return status; + } - static async deleteStatus(id: string): Promise { - const [status] = await db - .delete(statusModel) - .where(eq(statusModel.id, id)) - .returning(); + static async deleteStatus(id: string): Promise { + const [status] = await db + .delete(statusModel) + .where(eq(statusModel.id, id)) + .returning(); - return status; - } - static async deleteStatusBulk(ids: string[]): Promise { - const statuses = await db - .delete(statusModel) - .where(inArray(statusModel.id, ids)) - .returning(); - return statuses; - } + return status; + } + static async deleteStatusBulk(ids: string[]): Promise { + const statuses = await db + .delete(statusModel) + .where(inArray(statusModel.id, ids)) + .returning(); + return statuses; + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index acead35..e40e296 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -329,8 +329,8 @@ importers: specifier: workspace:* version: link:../../packages/database discord.js: - specifier: ^14.17.3 - version: 14.17.3 + specifier: ^14.23.2 + version: 14.23.2 dotenv: specifier: ^16.4.7 version: 16.4.7 @@ -376,7 +376,7 @@ importers: devDependencies: '@vercel/style-guide': specifier: ^5.2.0 - version: 5.2.0(@next/eslint-plugin-next@14.2.11)(eslint@8.57.1)(jest@29.7.0(@types/node@20.16.5))(prettier@3.6.2)(typescript@5.8.3) + version: 5.2.0(@next/eslint-plugin-next@14.2.11)(eslint@8.57.1)(jest@29.7.0(@types/node@24.8.1))(prettier@3.6.2)(typescript@5.8.3) eslint: specifier: ^8.57.0 version: 8.57.1 @@ -454,6 +454,10 @@ packages: resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} engines: {node: '>=6.9.0'} + '@babel/core@7.28.4': + resolution: {integrity: sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==} + engines: {node: '>=6.9.0'} + '@babel/eslint-parser@7.25.1': resolution: {integrity: sha512-Y956ghgTT4j7rKesabkh5WeqgSFZVFwaPR0IWFm7KFHFmmJ4afbG49SmfW4S+GyRPx0Dy5jxEWA5t0rpxfElWg==} engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} @@ -519,6 +523,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-module-transforms@7.28.3': + resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-optimise-call-expression@7.27.1': resolution: {integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==} engines: {node: '>=6.9.0'} @@ -573,6 +583,10 @@ packages: resolution: {integrity: sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==} engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.4': + resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} + engines: {node: '>=6.9.0'} + '@babel/highlight@7.24.7': resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} @@ -613,8 +627,8 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-attributes@7.25.6': - resolution: {integrity: sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==} + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 @@ -721,6 +735,10 @@ packages: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + '@babel/types@7.25.6': resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} engines: {node: '>=6.9.0'} @@ -739,8 +757,8 @@ packages: '@bufbuild/protobuf@2.6.0': resolution: {integrity: sha512-6cuonJVNOIL7lTj5zgo/Rc2bKAo4/GvN+rKCrUj7GdEHRzCk8zKOfFwUsL9nAVk5rSIsRmlgcpLzTRysopEeeg==} - '@discordjs/builders@1.10.0': - resolution: {integrity: sha512-ikVZsZP+3shmVJ5S1oM+7SveUCK3L9fTyfA8aJ7uD9cNQlTqF+3Irbk2Y22KXTb3C3RNUahRkSInClJMkHrINg==} + '@discordjs/builders@1.12.2': + resolution: {integrity: sha512-AugKmrgRJOHXEyMkABH/hXpAmIBKbYokCEl9VAM4Kh6FvkdobQ+Zhv7AR6K+y5hS7+VQ7gKXPYCe1JQmV07H1g==} engines: {node: '>=16.11.0'} '@discordjs/collection@1.5.3': @@ -751,20 +769,20 @@ packages: resolution: {integrity: sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==} engines: {node: '>=18'} - '@discordjs/formatters@0.6.0': - resolution: {integrity: sha512-YIruKw4UILt/ivO4uISmrGq2GdMY6EkoTtD0oS0GvkJFRZbTSdPhzYiUILbJ/QslsvC9H9nTgGgnarnIl4jMfw==} + '@discordjs/formatters@0.6.1': + resolution: {integrity: sha512-5cnX+tASiPCqCWtFcFslxBVUaCetB0thvM/JyavhbXInP1HJIEU+Qv/zMrnuwSsX3yWH2lVXNJZeDK3EiP4HHg==} engines: {node: '>=16.11.0'} - '@discordjs/rest@2.4.2': - resolution: {integrity: sha512-9bOvXYLQd5IBg/kKGuEFq3cstVxAMJ6wMxO2U3wjrgO+lHv8oNCT+BBRpuzVQh7BoXKvk/gpajceGvQUiRoJ8g==} + '@discordjs/rest@2.6.0': + resolution: {integrity: sha512-RDYrhmpB7mTvmCKcpj+pc5k7POKszS4E2O9TYc+U+Y4iaCP+r910QdO43qmpOja8LRr1RJ0b3U+CqVsnPqzf4w==} engines: {node: '>=18'} '@discordjs/util@1.1.1': resolution: {integrity: sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==} engines: {node: '>=18'} - '@discordjs/ws@1.2.0': - resolution: {integrity: sha512-QH5CAFe3wHDiedbO+EI3OOiyipwWd+Q6BdoFZUw/Wf2fw5Cv2fgU/9UEtJRmJa9RecI+TAhdGPadMaEIur5yJg==} + '@discordjs/ws@1.2.3': + resolution: {integrity: sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw==} engines: {node: '>=16.11.0'} '@drizzle-team/brocli@0.10.2': @@ -1725,10 +1743,16 @@ packages: '@jridgewell/gen-mapping@0.3.12': resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} @@ -1749,6 +1773,9 @@ packages: '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@lukeed/ms@2.0.2': resolution: {integrity: sha512-9I2Zn6+NJLfaGoz9jN3lpwDgAYvfGeNYdbAIjJOqzs4Tpc+VU3Jqq4IofSUBKajiDS8k9fZIg18/z13mpk1bsA==} engines: {node: '>=8'} @@ -1759,8 +1786,8 @@ packages: '@microsoft/tsdoc@0.14.2': resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} - '@napi-rs/wasm-runtime@1.0.6': - resolution: {integrity: sha512-DXj75ewm11LIWUk198QSKUTxjyRjsBwk09MuMk5DGK+GDUtyPhhEHOGP/Xwwj3DjQXXkivoBirmOnKrLfc0+9g==} + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} '@next/eslint-plugin-next@14.2.11': resolution: {integrity: sha512-7mw+xW7Y03Ph4NTCcAzYe+vu4BNjEHZUfZayyF3Y1D9RX6c5NIe25m1grHEAkyUuaqjRxOYhnCNeglOkIqLkBA==} @@ -1791,8 +1818,8 @@ packages: '@orama/cuid2@2.2.3': resolution: {integrity: sha512-Lcak3chblMejdlSHgYU2lS2cdOhDpU6vkfIJH4m+YKvqQyLqs1bB8+w6NT1MG5bO12NUK2GFc34Mn2xshMIQ1g==} - '@oxc-project/types@0.93.0': - resolution: {integrity: sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==} + '@oxc-project/types@0.94.0': + resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} '@petamoriken/float16@3.9.2': resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} @@ -2439,85 +2466,85 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@rolldown/binding-android-arm64@1.0.0-beta.41': - resolution: {integrity: sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ==} + '@rolldown/binding-android-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-TP8bcPOb1s6UmY5syhXrDn9k0XkYcw+XaoylTN4cJxf0JOVS2j682I3aTcpfT51hOFGr2bRwNKN9RZ19XxeQbA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@rolldown/binding-darwin-arm64@1.0.0-beta.41': - resolution: {integrity: sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-kuVWnZsE4vEjMF/10SbSUyzucIW2zmdsqFghYMqy+fsjXnRHg0luTU6qWF8IqJf4Cbpm9NEZRnjIEPpAbdiSNQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.41': - resolution: {integrity: sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==} + '@rolldown/binding-darwin-x64@1.0.0-beta.43': + resolution: {integrity: sha512-u9Ps4sh6lcmJ3vgLtyEg/x4jlhI64U0mM93Ew+tlfFdLDe7yKyA+Fe80cpr2n1mNCeZXrvTSbZluKpXQ0GxLjw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@rolldown/binding-freebsd-x64@1.0.0-beta.41': - resolution: {integrity: sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.43': + resolution: {integrity: sha512-h9lUtVtXgfbk/tnicMpbFfZ3DJvk5Zn2IvmlC1/e0+nUfwoc/TFqpfrRRqcNBXk/e+xiWMSKv6b0MF8N+Rtvlg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': - resolution: {integrity: sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': + resolution: {integrity: sha512-IX2C6bA6wM2rX/RvD75ko+ix9yxPKjKGGq7pOhB8wGI4Z4fqX5B1nDHga/qMDmAdCAR1m9ymzxkmqhm/AFYf7A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': - resolution: {integrity: sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': + resolution: {integrity: sha512-mcjd57vEj+CEQbZAzUiaxNzNgwwgOpFtZBWcINm8DNscvkXl5b/s622Z1dqGNWSdrZmdjdC6LWMvu8iHM6v9sQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': - resolution: {integrity: sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': + resolution: {integrity: sha512-Pa8QMwlkrztTo/1mVjZmPIQ44tCSci10TBqxzVBvXVA5CFh5EpiEi99fPSll2dHG2uT4dCOMeC6fIhyDdb0zXA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': - resolution: {integrity: sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': + resolution: {integrity: sha512-BgynXKMjeaX4AfWLARhOKDetBOOghnSiVRjAHVvhiAaDXgdQN8e65mSmXRiVoVtD3cHXx/cfU8Gw0p0K+qYKVQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': - resolution: {integrity: sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': + resolution: {integrity: sha512-VIsoPlOB/tDSAw9CySckBYysoIBqLeps1/umNSYUD8pMtalJyzMTneAVI1HrUdf4ceFmQ5vARoLIXSsPwVFxNg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': - resolution: {integrity: sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': + resolution: {integrity: sha512-YDXTxVJG67PqTQMKyjVJSddoPbSWJ4yRz/E3xzTLHqNrTDGY0UuhG8EMr8zsYnfH/0cPFJ3wjQd/hJWHuR6nkA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': - resolution: {integrity: sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': + resolution: {integrity: sha512-3M+2DmorXvDuAIGYQ9Z93Oy1G9ETkejLwdXXb1uRTgKN9pMcu7N+KG2zDrJwqyxeeLIFE22AZGtSJm3PJbNu9Q==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': - resolution: {integrity: sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-/B1j1pJs33y9ywtslOMxryUPHq8zIGu/OGEc2gyed0slimJ8fX2uR/SaJVhB4+NEgCFIeYDR4CX6jynAkeRuCA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': - resolution: {integrity: sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==} + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-29oG1swCz7hNP+CQYrsM4EtylsKwuYzM8ljqbqC5TsQwmKat7P8ouDpImsqg/GZxFSXcPP9ezQm0Q0wQwGM3JA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': - resolution: {integrity: sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': + resolution: {integrity: sha512-eWBV1Ef3gfGNehxVGCyXs7wLayRIgCmyItuCZwYYXW5bsk4EvR4n2GP5m3ohjnx7wdiY3nLmwQfH2Knb5gbNZw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -2525,8 +2552,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.11': resolution: {integrity: sha512-L/gAA/hyCSuzTF1ftlzUSI/IKr2POHsv1Dd78GfqkR83KMNuswWD61JxGV2L7nRwBBBSDr6R1gCkdTmoN7W4ag==} - '@rolldown/pluginutils@1.0.0-beta.41': - resolution: {integrity: sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==} + '@rolldown/pluginutils@1.0.0-beta.43': + resolution: {integrity: sha512-5Uxg7fQUCmfhax7FJke2+8B6cqgeUJUD9o2uXIKXhD+mG0mL6NObmVoi9wXEU1tY89mZKgAYA6fTbftx3q2ZPQ==} '@rollup/rollup-android-arm-eabi@4.34.7': resolution: {integrity: sha512-l6CtzHYo8D2TQ3J7qJNpp3Q1Iye56ssIAtqbM2H8axxCEEwvN7o8Ze9PuIapbxFL3OHrJU2JBX6FIIVnP/rYyw==} @@ -2962,14 +2989,14 @@ packages: '@types/babel__core@7.20.5': resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - '@types/babel__generator@7.6.8': - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + '@types/babel__generator@7.27.0': + resolution: {integrity: sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==} '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/babel__traverse@7.28.0': + resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} '@types/cookiejar@2.1.5': resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} @@ -3049,6 +3076,9 @@ packages: '@types/node@22.16.3': resolution: {integrity: sha512-sr4Xz74KOUeYadexo1r8imhRtlVXcs+j3XK3TcoiYk7B1t3YRVJgtaD3cwX73NYb71pmVuMLNRhJ9XKdoDB74g==} + '@types/node@24.8.1': + resolution: {integrity: sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==} + '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} @@ -3078,8 +3108,8 @@ packages: '@types/supertest@6.0.2': resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} - '@types/ws@8.5.14': - resolution: {integrity: sha512-bd/YFLW+URhBzMXurx7lWByOu+xzU9+kb3RboOteXYDfW+tr+JZa99OyNmPINEGB/ahzKrEuc8rcv4gnpJmxTw==} + '@types/ws@8.18.1': + resolution: {integrity: sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==} '@types/yargs-parser@21.0.3': resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} @@ -3286,8 +3316,8 @@ packages: '@vitest/utils@3.0.5': resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} - '@vladfrangu/async_event_emitter@2.4.6': - resolution: {integrity: sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==} + '@vladfrangu/async_event_emitter@2.4.7': + resolution: {integrity: sha512-Xfe6rpCTxSxfbswi/W/Pz7zp1WWSNn4A0eW4mLkQUewCrXXtMj31lCg+iQyTkh/CkusZSq9eDflu7tjEDXUY6g==} engines: {node: '>=v14.0.0', npm: '>=7.0.0'} abstract-logging@2.0.1: @@ -3482,10 +3512,10 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - babel-preset-current-node-syntax@1.1.0: - resolution: {integrity: sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==} + babel-preset-current-node-syntax@1.2.0: + resolution: {integrity: sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==} peerDependencies: - '@babel/core': ^7.0.0 + '@babel/core': ^7.0.0 || ^8.0.0-0 babel-preset-jest@29.6.3: resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} @@ -3627,8 +3657,8 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - cjs-module-lexer@1.4.1: - resolution: {integrity: sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==} + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} class-variance-authority@0.7.1: resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} @@ -3659,8 +3689,8 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + collect-v8-coverage@1.0.3: + resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} @@ -3838,8 +3868,8 @@ packages: decode-formdata@0.9.0: resolution: {integrity: sha512-q5uwOjR3Um5YD+ZWPOF/1sGHVW9A5rCrRwITQChRXlmPkxDFBqCm4jNTIVdGHNH9OnR+V9MoZVgRhsFb+ARbUw==} - dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + dedent@1.7.0: + resolution: {integrity: sha512-HGFtf8yhuhGhqO07SV79tRp+br4MnbdjeVxotpn1QBl30pcLLCQjX5b2295ll0fv8RKDKsmWYrl05usHM9CewQ==} peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -3924,11 +3954,11 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - discord-api-types@0.37.117: - resolution: {integrity: sha512-d+Z6RKd7v3q22lsil7yASucqMfVVV0s0XSqu3cw7kyHVXiDO/mAnqMzqma26IYnIm2mk3TlupYJDGrdL908ZKA==} + discord-api-types@0.38.30: + resolution: {integrity: sha512-KhAqlBrg+rVK+Ob7INMF5o63yW4/GUzRatG/AjyVsIO8lgcLyR8qCl2HokIVzWwmzkJYG0CEPXsKMOqau3E8NA==} - discord.js@14.17.3: - resolution: {integrity: sha512-8/j8udc3CU7dz3Eqch64UaSHoJtUT6IXK4da5ixjbav4NAXJicloWswD/iwn1ImZEMoAV3LscsdO0zhBh6H+0Q==} + discord.js@14.23.2: + resolution: {integrity: sha512-tU2NFr823X3TXEc8KyR/4m296KLxPai4nirN3q9kHCpY4TKj96n9lHZnyLzRNMui8EbL07jg9hgH2PWWfKMGIg==} engines: {node: '>=18'} dlv@1.1.3: @@ -4648,6 +4678,10 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} + engines: {node: '>=14'} + form-data@4.0.2: resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} engines: {node: '>= 6'} @@ -4974,6 +5008,10 @@ packages: resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} engines: {node: '>= 0.4'} + is-core-module@2.16.1: + resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} + engines: {node: '>= 0.4'} + is-data-view@1.0.1: resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} engines: {node: '>= 0.4'} @@ -5102,8 +5140,8 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + istanbul-reports@3.2.0: + resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} iterator.prototype@1.1.2: @@ -5454,8 +5492,8 @@ packages: resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} engines: {node: '>=12'} - magic-bytes.js@1.10.0: - resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==} + magic-bytes.js@1.12.1: + resolution: {integrity: sha512-ThQLOhN86ZkJ7qemtVRGYM+gRgR8GEXNli9H/PMvpnZsE44Xfh3wx9kGJaldg314v85m+bFW6WBMaVHJc/c3zA==} magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -5825,6 +5863,10 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pirates@4.0.7: + resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} + engines: {node: '>= 6'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -6215,13 +6257,18 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + resolve.exports@2.0.3: + resolution: {integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==} engines: {node: '>=10'} resolve@1.19.0: resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + resolve@1.22.10: + resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} + engines: {node: '>= 0.4'} + hasBin: true + resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -6265,8 +6312,8 @@ packages: vue-tsc: optional: true - rolldown@1.0.0-beta.41: - resolution: {integrity: sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==} + rolldown@1.0.0-beta.43: + resolution: {integrity: sha512-6RcqyRx0tY1MlRLnjXPp/849Rl/CPFhzpGGwNPEPjKwqBMqPq/Rbbkxasa8s0x+IkUk46ty4jazb5skZ/Vgdhw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -6435,6 +6482,11 @@ packages: engines: {node: '>=10'} hasBin: true + semver@7.7.3: + resolution: {integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==} + engines: {node: '>=10'} + hasBin: true + sentence-case@3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} @@ -6444,6 +6496,12 @@ packages: peerDependencies: seroval: ^1.0 + seroval-plugins@1.3.3: + resolution: {integrity: sha512-16OL3NnUBw8JG1jBLUoZJsLnQq0n5Ua6aHalhJK4fMQkz1lqR7Osz1sA30trBtd9VUDc2NgkuRCn8+/pBwqZ+w==} + engines: {node: '>=10'} + peerDependencies: + seroval: ^1.0 + seroval@1.3.2: resolution: {integrity: sha512-RbcPH1n5cfwKrru7v7+zrZvjLurgHhGyso3HTyGtRivGWgYjbOmGuivCQaORNELjNONoK35nj28EoWul9sb1zQ==} engines: {node: '>=10'} @@ -6851,6 +6909,9 @@ packages: tslib@2.7.0: resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + tsup@8.2.4: resolution: {integrity: sha512-akpCPePnBnC/CXgRrcy72ZSntgIEUa1jN0oJbbvpALWKNOz1B7aM+UVDWGRGIO/T/PZugAESWDJUAb5FD48o8Q==} engines: {node: '>=18'} @@ -6993,8 +7054,11 @@ packages: undici-types@6.21.0: resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} - undici@6.19.8: - resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==} + undici-types@7.14.0: + resolution: {integrity: sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==} + + undici@6.21.3: + resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} engines: {node: '>=18.17'} unplugin@2.3.5: @@ -7245,8 +7309,8 @@ packages: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} peerDependencies: bufferutil: ^4.0.1 @@ -7378,6 +7442,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/core@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) + '@babel/helpers': 7.28.4 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + '@jridgewell/remapping': 2.3.5 + convert-source-map: 2.0.0 + debug: 4.4.3 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/eslint-parser@7.25.1(@babel/core@7.25.2)(eslint@8.57.1)': dependencies: '@babel/core': 7.25.2 @@ -7484,6 +7569,16 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/helper-optimise-call-expression@7.27.1': dependencies: '@babel/types': 7.28.1 @@ -7535,6 +7630,12 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.1 + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + optional: true + '@babel/highlight@7.24.7': dependencies: '@babel/helper-validator-identifier': 7.24.7 @@ -7554,45 +7655,45 @@ snapshots: dependencies: '@babel/types': 7.28.4 - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true @@ -7601,51 +7702,57 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.27.1 optional: true @@ -7654,6 +7761,12 @@ snapshots: '@babel/core': 7.28.0 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.0)': dependencies: '@babel/core': 7.28.0 @@ -7722,6 +7835,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/types@7.25.6': dependencies: '@babel/helper-string-parser': 7.24.8 @@ -7743,12 +7869,12 @@ snapshots: '@bufbuild/protobuf@2.6.0': {} - '@discordjs/builders@1.10.0': + '@discordjs/builders@1.12.2': dependencies: - '@discordjs/formatters': 0.6.0 + '@discordjs/formatters': 0.6.1 '@discordjs/util': 1.1.1 '@sapphire/shapeshift': 4.0.0 - discord-api-types: 0.37.117 + discord-api-types: 0.38.30 fast-deep-equal: 3.1.3 ts-mixer: 6.0.4 tslib: 2.7.0 @@ -7757,35 +7883,35 @@ snapshots: '@discordjs/collection@2.1.1': {} - '@discordjs/formatters@0.6.0': + '@discordjs/formatters@0.6.1': dependencies: - discord-api-types: 0.37.117 + discord-api-types: 0.38.30 - '@discordjs/rest@2.4.2': + '@discordjs/rest@2.6.0': dependencies: '@discordjs/collection': 2.1.1 '@discordjs/util': 1.1.1 '@sapphire/async-queue': 1.5.5 '@sapphire/snowflake': 3.5.3 - '@vladfrangu/async_event_emitter': 2.4.6 - discord-api-types: 0.37.117 - magic-bytes.js: 1.10.0 + '@vladfrangu/async_event_emitter': 2.4.7 + discord-api-types: 0.38.30 + magic-bytes.js: 1.12.1 tslib: 2.7.0 - undici: 6.19.8 + undici: 6.21.3 '@discordjs/util@1.1.1': {} - '@discordjs/ws@1.2.0': + '@discordjs/ws@1.2.3': dependencies: '@discordjs/collection': 2.1.1 - '@discordjs/rest': 2.4.2 + '@discordjs/rest': 2.6.0 '@discordjs/util': 1.1.1 '@sapphire/async-queue': 1.5.5 - '@types/ws': 8.5.14 - '@vladfrangu/async_event_emitter': 2.4.6 - discord-api-types: 0.37.117 + '@types/ws': 8.18.1 + '@vladfrangu/async_event_emitter': 2.4.7 + discord-api-types: 0.38.30 tslib: 2.7.0 - ws: 8.18.0 + ws: 8.18.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -7795,17 +7921,17 @@ snapshots: '@emnapi/core@1.5.0': dependencies: '@emnapi/wasi-threads': 1.1.0 - tslib: 2.7.0 + tslib: 2.8.1 optional: true '@emnapi/runtime@1.5.0': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 optional: true '@emnapi/wasi-threads@1.1.0': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 optional: true '@esbuild-kit/core-utils@3.3.2': @@ -8404,7 +8530,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.16.5 + '@types/node': 24.8.1 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -8418,14 +8544,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.5 + '@types/node': 24.8.1 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.16.5) + jest-config: 29.7.0(@types/node@24.8.1) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -8451,7 +8577,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.5 + '@types/node': 24.8.1 jest-mock: 29.7.0 optional: true @@ -8472,7 +8598,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.16.5 + '@types/node': 24.8.1 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -8495,10 +8621,10 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.29 - '@types/node': 20.16.5 + '@jridgewell/trace-mapping': 0.3.31 + '@types/node': 24.8.1 chalk: 4.1.2 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 exit: 0.1.2 glob: 7.2.3 graceful-fs: 4.2.11 @@ -8506,7 +8632,7 @@ snapshots: istanbul-lib-instrument: 6.0.3 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 + istanbul-reports: 3.2.0 jest-message-util: 29.7.0 jest-util: 29.7.0 jest-worker: 29.7.0 @@ -8525,7 +8651,7 @@ snapshots: '@jest/source-map@29.6.3': dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 callsites: 3.1.0 graceful-fs: 4.2.11 optional: true @@ -8535,7 +8661,7 @@ snapshots: '@jest/console': 29.7.0 '@jest/types': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 + collect-v8-coverage: 1.0.3 optional: true '@jest/test-sequencer@29.7.0': @@ -8548,9 +8674,9 @@ snapshots: '@jest/transform@29.7.0': dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 babel-plugin-istanbul: 6.1.1 chalk: 4.1.2 convert-source-map: 2.0.0 @@ -8560,7 +8686,7 @@ snapshots: jest-regex-util: 29.6.3 jest-util: 29.7.0 micromatch: 4.0.8 - pirates: 4.0.6 + pirates: 4.0.7 slash: 3.0.0 write-file-atomic: 4.0.2 transitivePeerDependencies: @@ -8572,7 +8698,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.16.5 + '@types/node': 24.8.1 '@types/yargs': 17.0.33 chalk: 4.1.2 optional: true @@ -8582,12 +8708,24 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + optional: true + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 '@jridgewell/sourcemap-codec': 1.5.0 '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + optional: true + '@jridgewell/resolve-uri@3.1.2': {} '@jridgewell/set-array@1.2.1': {} @@ -8606,6 +8744,12 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + optional: true + '@lukeed/ms@2.0.2': {} '@microsoft/tsdoc-config@0.16.2': @@ -8617,7 +8761,7 @@ snapshots: '@microsoft/tsdoc@0.14.2': {} - '@napi-rs/wasm-runtime@1.0.6': + '@napi-rs/wasm-runtime@1.0.7': dependencies: '@emnapi/core': 1.5.0 '@emnapi/runtime': 1.5.0 @@ -8653,7 +8797,7 @@ snapshots: dependencies: '@noble/hashes': 1.7.1 - '@oxc-project/types@0.93.0': {} + '@oxc-project/types@0.94.0': {} '@petamoriken/float16@3.9.2': {} @@ -9295,53 +9439,53 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@rolldown/binding-android-arm64@1.0.0-beta.41': + '@rolldown/binding-android-arm64@1.0.0-beta.43': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.41': + '@rolldown/binding-darwin-arm64@1.0.0-beta.43': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.41': + '@rolldown/binding-darwin-x64@1.0.0-beta.43': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.41': + '@rolldown/binding-freebsd-x64@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.43': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.43': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.43': optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.43': dependencies: - '@napi-rs/wasm-runtime': 1.0.6 + '@napi-rs/wasm-runtime': 1.0.7 optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.43': optional: true - '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.43': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.43': optional: true '@rolldown/pluginutils@1.0.0-beta.11': {} - '@rolldown/pluginutils@1.0.0-beta.41': {} + '@rolldown/pluginutils@1.0.0-beta.43': {} '@rollup/rollup-android-arm-eabi@4.34.7': optional: true @@ -9696,19 +9840,19 @@ snapshots: '@tybys/wasm-util@0.10.1': dependencies: - tslib: 2.7.0 + tslib: 2.8.1 optional: true '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.4 '@babel/types': 7.28.4 - '@types/babel__generator': 7.6.8 + '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.28.0 optional: true - '@types/babel__generator@7.6.8': + '@types/babel__generator@7.27.0': dependencies: '@babel/types': 7.28.4 optional: true @@ -9719,7 +9863,7 @@ snapshots: '@babel/types': 7.28.4 optional: true - '@types/babel__traverse@7.20.6': + '@types/babel__traverse@7.28.0': dependencies: '@babel/types': 7.28.4 optional: true @@ -9756,7 +9900,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.16.5 + '@types/node': 24.8.1 optional: true '@types/istanbul-lib-coverage@2.0.6': @@ -9799,6 +9943,10 @@ snapshots: dependencies: undici-types: 6.21.0 + '@types/node@24.8.1': + dependencies: + undici-types: 7.14.0 + '@types/normalize-package-data@2.4.4': {} '@types/pg@8.11.11': @@ -9835,9 +9983,9 @@ snapshots: '@types/methods': 1.1.4 '@types/superagent': 8.1.9 - '@types/ws@8.5.14': + '@types/ws@8.18.1': dependencies: - '@types/node': 20.16.5 + '@types/node': 24.8.1 '@types/yargs-parser@21.0.3': optional: true @@ -10069,7 +10217,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vercel/style-guide@5.2.0(@next/eslint-plugin-next@14.2.11)(eslint@8.57.1)(jest@29.7.0(@types/node@20.16.5))(prettier@3.6.2)(typescript@5.8.3)': + '@vercel/style-guide@5.2.0(@next/eslint-plugin-next@14.2.11)(eslint@8.57.1)(jest@29.7.0(@types/node@24.8.1))(prettier@3.6.2)(typescript@5.8.3)': dependencies: '@babel/core': 7.25.2 '@babel/eslint-parser': 7.25.1(@babel/core@7.25.2)(eslint@8.57.1) @@ -10081,9 +10229,9 @@ snapshots: eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-plugin-import@2.30.0)(eslint@8.57.1) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) eslint-plugin-import: 2.30.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.16.5))(typescript@5.8.3) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.8.1))(typescript@5.8.3) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) - eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.16.5))(typescript@5.8.3))(eslint@8.57.1) + eslint-plugin-playwright: 0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.8.1))(typescript@5.8.3))(eslint@8.57.1) eslint-plugin-react: 7.36.1(eslint@8.57.1) eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) eslint-plugin-testing-library: 6.3.0(eslint@8.57.1)(typescript@5.8.3) @@ -10150,7 +10298,7 @@ snapshots: loupe: 3.1.3 tinyrainbow: 2.0.0 - '@vladfrangu/async_event_emitter@2.4.6': {} + '@vladfrangu/async_event_emitter@2.4.7': {} abstract-logging@2.0.1: {} @@ -10361,13 +10509,13 @@ snapshots: transitivePeerDependencies: - supports-color - babel-jest@29.7.0(@babel/core@7.28.0): + babel-jest@29.7.0(@babel/core@7.28.4): dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.28.0) + babel-preset-jest: 29.6.3(@babel/core@7.28.4) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -10391,34 +10539,34 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.4 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.28.0 optional: true - babel-preset-current-node-syntax@1.1.0(@babel/core@7.28.0): + babel-preset-current-node-syntax@1.2.0(@babel/core@7.28.4): dependencies: - '@babel/core': 7.28.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.28.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) - optional: true - - babel-preset-jest@29.6.3(@babel/core@7.28.0): + '@babel/core': 7.28.4 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.4) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.4) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.4) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.4) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.4) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.4) + optional: true + + babel-preset-jest@29.6.3(@babel/core@7.28.4): dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) optional: true balanced-match@1.0.2: {} @@ -10576,7 +10724,7 @@ snapshots: ci-info@3.9.0: {} - cjs-module-lexer@1.4.1: + cjs-module-lexer@1.4.3: optional: true class-variance-authority@0.7.1: @@ -10611,7 +10759,7 @@ snapshots: co@4.6.0: optional: true - collect-v8-coverage@1.0.2: + collect-v8-coverage@1.0.3: optional: true color-convert@1.9.3: @@ -10660,13 +10808,13 @@ snapshots: cookiejar@2.1.4: {} - create-jest@29.7.0(@types/node@20.16.5): + create-jest@29.7.0(@types/node@24.8.1): dependencies: '@jest/types': 29.6.3 chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.16.5) + jest-config: 29.7.0(@types/node@24.8.1) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -10768,7 +10916,7 @@ snapshots: decode-formdata@0.9.0: {} - dedent@1.5.3: + dedent@1.7.0: optional: true deep-eql@5.0.2: {} @@ -10848,22 +10996,23 @@ snapshots: dependencies: path-type: 4.0.0 - discord-api-types@0.37.117: {} + discord-api-types@0.38.30: {} - discord.js@14.17.3: + discord.js@14.23.2: dependencies: - '@discordjs/builders': 1.10.0 + '@discordjs/builders': 1.12.2 '@discordjs/collection': 1.5.3 - '@discordjs/formatters': 0.6.0 - '@discordjs/rest': 2.4.2 + '@discordjs/formatters': 0.6.1 + '@discordjs/rest': 2.6.0 '@discordjs/util': 1.1.1 - '@discordjs/ws': 1.2.0 + '@discordjs/ws': 1.2.3 '@sapphire/snowflake': 3.5.3 - discord-api-types: 0.37.117 + discord-api-types: 0.38.30 fast-deep-equal: 3.1.3 lodash.snakecase: 4.1.1 + magic-bytes.js: 1.12.1 tslib: 2.7.0 - undici: 6.19.8 + undici: 6.21.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -11327,13 +11476,13 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.16.5))(typescript@5.8.3): + eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.8.1))(typescript@5.8.3): dependencies: '@typescript-eslint/utils': 5.62.0(eslint@8.57.1)(typescript@5.8.3) eslint: 8.57.1 optionalDependencies: '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3) - jest: 29.7.0(@types/node@20.16.5) + jest: 29.7.0(@types/node@24.8.1) transitivePeerDependencies: - supports-color - typescript @@ -11360,11 +11509,11 @@ snapshots: eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.16.5))(typescript@5.8.3))(eslint@8.57.1): + eslint-plugin-playwright@0.16.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.8.1))(typescript@5.8.3))(eslint@8.57.1): dependencies: eslint: 8.57.1 optionalDependencies: - eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@20.16.5))(typescript@5.8.3) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(typescript@5.8.3))(eslint@8.57.1)(jest@29.7.0(@types/node@24.8.1))(typescript@5.8.3) eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): dependencies: @@ -11707,6 +11856,12 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + optional: true + form-data@4.0.2: dependencies: asynckit: 0.4.0 @@ -11826,7 +11981,7 @@ snapshots: glob@10.3.10: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 2.3.6 minimatch: 9.0.5 minipass: 7.1.2 @@ -12057,6 +12212,11 @@ snapshots: dependencies: hasown: 2.0.2 + is-core-module@2.16.1: + dependencies: + hasown: 2.0.2 + optional: true + is-data-view@1.0.1: dependencies: is-typed-array: 1.1.13 @@ -12147,7 +12307,7 @@ snapshots: istanbul-lib-instrument@5.2.1: dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -12158,11 +12318,11 @@ snapshots: istanbul-lib-instrument@6.0.3: dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/parser': 7.28.4 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color optional: true @@ -12183,7 +12343,7 @@ snapshots: - supports-color optional: true - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 @@ -12227,10 +12387,10 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.5 + '@types/node': 24.8.1 chalk: 4.1.2 co: 4.6.0 - dedent: 1.5.3 + dedent: 1.7.0 is-generator-fn: 2.1.0 jest-each: 29.7.0 jest-matcher-utils: 29.7.0 @@ -12248,16 +12408,16 @@ snapshots: - supports-color optional: true - jest-cli@29.7.0(@types/node@20.16.5): + jest-cli@29.7.0(@types/node@24.8.1): dependencies: '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.16.5) + create-jest: 29.7.0(@types/node@24.8.1) exit: 0.1.2 import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.16.5) + jest-config: 29.7.0(@types/node@24.8.1) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -12268,12 +12428,12 @@ snapshots: - ts-node optional: true - jest-config@29.7.0(@types/node@20.16.5): + jest-config@29.7.0(@types/node@24.8.1): dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.28.0) + babel-jest: 29.7.0(@babel/core@7.28.4) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -12293,7 +12453,7 @@ snapshots: slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: - '@types/node': 20.16.5 + '@types/node': 24.8.1 transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -12326,7 +12486,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.5 + '@types/node': 24.8.1 jest-mock: 29.7.0 jest-util: 29.7.0 optional: true @@ -12338,7 +12498,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.16.5 + '@types/node': 24.8.1 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -12381,7 +12541,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.16.5 + '@types/node': 24.8.1 jest-util: 29.7.0 optional: true @@ -12409,8 +12569,8 @@ snapshots: jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) jest-util: 29.7.0 jest-validate: 29.7.0 - resolve: 1.22.8 - resolve.exports: 2.0.2 + resolve: 1.22.10 + resolve.exports: 2.0.3 slash: 3.0.0 optional: true @@ -12421,7 +12581,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.5 + '@types/node': 24.8.1 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -12450,10 +12610,10 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.5 + '@types/node': 24.8.1 chalk: 4.1.2 - cjs-module-lexer: 1.4.1 - collect-v8-coverage: 1.0.2 + cjs-module-lexer: 1.4.3 + collect-v8-coverage: 1.0.3 glob: 7.2.3 graceful-fs: 4.2.11 jest-haste-map: 29.7.0 @@ -12471,15 +12631,15 @@ snapshots: jest-snapshot@29.7.0: dependencies: - '@babel/core': 7.28.0 + '@babel/core': 7.28.4 '@babel/generator': 7.28.3 - '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.0) - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.0) + '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) '@babel/types': 7.28.4 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.1.0(@babel/core@7.28.0) + babel-preset-current-node-syntax: 1.2.0(@babel/core@7.28.4) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -12490,7 +12650,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.2 + semver: 7.7.3 transitivePeerDependencies: - supports-color optional: true @@ -12498,7 +12658,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.16.5 + '@types/node': 24.8.1 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -12519,7 +12679,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.16.5 + '@types/node': 24.8.1 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -12529,18 +12689,18 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.16.5 + '@types/node': 24.8.1 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 optional: true - jest@29.7.0(@types/node@20.16.5): + jest@29.7.0(@types/node@24.8.1): dependencies: '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.16.5) + jest-cli: 29.7.0(@types/node@24.8.1) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -12734,7 +12894,7 @@ snapshots: luxon@3.5.0: {} - magic-bytes.js@1.10.0: {} + magic-bytes.js@1.12.1: {} magic-string@0.30.17: dependencies: @@ -12746,7 +12906,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.2 + semver: 7.7.3 optional: true makeerror@1.0.12: @@ -13100,6 +13260,9 @@ snapshots: pirates@4.0.6: {} + pirates@4.0.7: + optional: true + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -13411,7 +13574,7 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve.exports@2.0.2: + resolve.exports@2.0.3: optional: true resolve@1.19.0: @@ -13419,6 +13582,13 @@ snapshots: is-core-module: 2.15.1 path-parse: 1.0.7 + resolve@1.22.10: + dependencies: + is-core-module: 2.16.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + optional: true + resolve@1.22.8: dependencies: is-core-module: 2.15.1 @@ -13441,7 +13611,7 @@ snapshots: dependencies: glob: 7.2.3 - rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.41)(typescript@5.5.4): + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.43)(typescript@5.5.4): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -13452,14 +13622,14 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.10.1 magic-string: 0.30.19 - rolldown: 1.0.0-beta.41 + rolldown: 1.0.0-beta.43 optionalDependencies: typescript: 5.5.4 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.41)(typescript@5.8.3): + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.43)(typescript@5.8.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -13470,33 +13640,33 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.10.1 magic-string: 0.30.19 - rolldown: 1.0.0-beta.41 + rolldown: 1.0.0-beta.43 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: - oxc-resolver - supports-color - rolldown@1.0.0-beta.41: + rolldown@1.0.0-beta.43: dependencies: - '@oxc-project/types': 0.93.0 - '@rolldown/pluginutils': 1.0.0-beta.41 + '@oxc-project/types': 0.94.0 + '@rolldown/pluginutils': 1.0.0-beta.43 ansis: 4.2.0 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.41 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.41 - '@rolldown/binding-darwin-x64': 1.0.0-beta.41 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.41 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.41 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.41 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.41 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.41 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.41 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.41 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.41 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.41 - '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.41 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.41 + '@rolldown/binding-android-arm64': 1.0.0-beta.43 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.43 + '@rolldown/binding-darwin-x64': 1.0.0-beta.43 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.43 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.43 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.43 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.43 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.43 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.43 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.43 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.43 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.43 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.43 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.43 rollup@4.34.7: dependencies: @@ -13672,6 +13842,9 @@ snapshots: semver@7.7.2: {} + semver@7.7.3: + optional: true + sentence-case@3.0.4: dependencies: no-case: 3.0.4 @@ -13682,6 +13855,10 @@ snapshots: dependencies: seroval: 1.3.2 + seroval-plugins@1.3.3(seroval@1.3.2): + dependencies: + seroval: 1.3.2 + seroval@1.3.2: {} set-cookie-parser@2.7.1: {} @@ -13769,7 +13946,7 @@ snapshots: dependencies: csstype: 3.1.3 seroval: 1.3.2 - seroval-plugins: 1.3.2(seroval@1.3.2) + seroval-plugins: 1.3.3(seroval@1.3.2) sonic-boom@4.2.0: dependencies: @@ -14126,8 +14303,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.41 - rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.41)(typescript@5.5.4) + rolldown: 1.0.0-beta.43 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.43)(typescript@5.5.4) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 @@ -14151,8 +14328,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.41 - rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.41)(typescript@5.8.3) + rolldown: 1.0.0-beta.43 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.43)(typescript@5.8.3) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 @@ -14171,6 +14348,9 @@ snapshots: tslib@2.7.0: {} + tslib@2.8.1: + optional: true + tsup@8.2.4(@swc/core@1.12.14)(jiti@2.6.1)(postcss@8.5.6)(tsx@4.19.2)(typescript@5.5.4)(yaml@2.5.1): dependencies: bundle-require: 5.0.0(esbuild@0.23.1) @@ -14354,7 +14534,9 @@ snapshots: undici-types@6.21.0: {} - undici@6.19.8: {} + undici-types@7.14.0: {} + + undici@6.21.3: {} unplugin@2.3.5: dependencies: @@ -14411,7 +14593,7 @@ snapshots: v8-to-istanbul@9.3.0: dependencies: - '@jridgewell/trace-mapping': 0.3.29 + '@jridgewell/trace-mapping': 0.3.31 '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 optional: true @@ -14634,7 +14816,7 @@ snapshots: signal-exit: 3.0.7 optional: true - ws@8.18.0: {} + ws@8.18.3: {} xtend@4.0.2: {}