From 3cc14fa681a8c1c4bc5d97dbe5ad73e59cf98a1c Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 12:02:35 -0400 Subject: [PATCH 001/107] feat: initialize Pulumi infrastructure for Pathfinder app - Added core infrastructure files including `index.ts`, `Pulumi.yaml`, and `package.json`. - Created modules for building, configuring, networking, and managing containers, databases, and scaling. - Implemented GitHub OIDC integration for CI/CD. - Set up monitoring and logging with CloudWatch. - Included a `.gitignore` file to exclude unnecessary files. - Documented setup and deployment instructions in `README.md`. --- apps/infra/.gitignore | 8 + apps/infra/Pulumi.yaml | 10 + apps/infra/README.md | 98 ++++ apps/infra/buildspecs/app.yml | 77 +++ apps/infra/index.ts | 162 +++++++ apps/infra/legacy/index.backup.ts | 755 +++++++++++++++++++++++++++++ apps/infra/legacy/index.public.ts | 587 ++++++++++++++++++++++ apps/infra/legacy/index.ts | 607 +++++++++++++++++++++++ apps/infra/modules/build.ts | 241 +++++++++ apps/infra/modules/config.ts | 217 +++++++++ apps/infra/modules/container.ts | 309 ++++++++++++ apps/infra/modules/database.ts | 241 +++++++++ apps/infra/modules/github-oidc.ts | 236 +++++++++ apps/infra/modules/loadbalancer.ts | 41 ++ apps/infra/modules/monitoring.ts | 403 +++++++++++++++ apps/infra/modules/networking.ts | 480 ++++++++++++++++++ apps/infra/modules/scaling.ts | 176 +++++++ apps/infra/modules/tailscale.ts | 293 +++++++++++ apps/infra/package.json | 18 + apps/infra/tsconfig.json | 18 + apps/infra/types.ts | 335 +++++++++++++ 21 files changed, 5312 insertions(+) create mode 100644 apps/infra/.gitignore create mode 100644 apps/infra/Pulumi.yaml create mode 100644 apps/infra/README.md create mode 100644 apps/infra/buildspecs/app.yml create mode 100644 apps/infra/index.ts create mode 100644 apps/infra/legacy/index.backup.ts create mode 100644 apps/infra/legacy/index.public.ts create mode 100644 apps/infra/legacy/index.ts create mode 100644 apps/infra/modules/build.ts create mode 100644 apps/infra/modules/config.ts create mode 100644 apps/infra/modules/container.ts create mode 100644 apps/infra/modules/database.ts create mode 100644 apps/infra/modules/github-oidc.ts create mode 100644 apps/infra/modules/loadbalancer.ts create mode 100644 apps/infra/modules/monitoring.ts create mode 100644 apps/infra/modules/networking.ts create mode 100644 apps/infra/modules/scaling.ts create mode 100644 apps/infra/modules/tailscale.ts create mode 100644 apps/infra/package.json create mode 100644 apps/infra/tsconfig.json create mode 100644 apps/infra/types.ts diff --git a/apps/infra/.gitignore b/apps/infra/.gitignore new file mode 100644 index 000000000..7614bd035 --- /dev/null +++ b/apps/infra/.gitignore @@ -0,0 +1,8 @@ +node_modules/ +bin/ +Pulumi.*.yaml +!Pulumi.yaml +.pulumi/ + +# Debug directory for temporary files +.debug/ diff --git a/apps/infra/Pulumi.yaml b/apps/infra/Pulumi.yaml new file mode 100644 index 000000000..16cbfb174 --- /dev/null +++ b/apps/infra/Pulumi.yaml @@ -0,0 +1,10 @@ +name: comp-infra +description: Comp AI Infrastructure +runtime: + name: nodejs + options: + packagemanager: pnpm +config: + pulumi:tags: + value: + pulumi:template: aws-typescript diff --git a/apps/infra/README.md b/apps/infra/README.md new file mode 100644 index 000000000..a1c6a8e65 --- /dev/null +++ b/apps/infra/README.md @@ -0,0 +1,98 @@ +# Pathfinder Infrastructure + +This directory contains the Pulumi infrastructure code for deploying the Pathfinder app to AWS ECS Fargate. + +## Structure + +The infrastructure is kept separate from the main application to: + +- Keep deployment dependencies isolated from runtime dependencies +- Reduce Docker image size by excluding infrastructure packages +- Allow independent versioning and updates + +## Package Manager + +**Note:** This directory uses `pnpm` instead of Bun because Pulumi doesn't support Bun as a package manager yet. The rest of the monorepo uses Bun. + +## Setup + +1. Install dependencies: + + ```bash + pnpm install + # or from the root directory: + bun run infra:install + ``` + +2. Configure AWS credentials: + + ```bash + export AWS_PROFILE=your-profile + # or + export AWS_ACCESS_KEY_ID=... + export AWS_SECRET_ACCESS_KEY=... + ``` + +3. Deploy: + ```bash + pulumi up + # or from the root directory: + bun run infra:up + ``` + +## Available Commands + +From the root directory: + +- `bun run infra:install` - Install infrastructure dependencies +- `bun run infra:preview` - Preview infrastructure changes +- `bun run infra:up` - Deploy infrastructure +- `bun run infra:destroy` - Destroy infrastructure + +## What Gets Deployed + +- VPC with default configuration +- ECS Cluster +- Fargate Service with: + - 2-10 instances (auto-scaling based on CPU) + - Application Load Balancer + - Docker image built from the root Dockerfile + +## Troubleshooting + +### Docker Build Issues + +If you encounter issues during `pulumi up`: + +1. **"Cannot connect to Docker daemon"** + + ```bash + # Make sure Docker is running + docker ps + ``` + +2. **"No AWS credentials found"** + + ```bash + # Configure AWS credentials + aws configure + # Or use environment variables: + export AWS_ACCESS_KEY_ID=... + export AWS_SECRET_ACCESS_KEY=... + ``` + +3. **"ECR authorization failed"** + + - Ensure your AWS user has ECR permissions + - Check AWS region matches your config + +4. **"Platform mismatch" warnings** + - The `platform: "linux/amd64"` ensures compatibility + - Ignore warnings if building on Apple Silicon + +### Deployment Flow + +1. `pulumi up` triggers the build +2. Docker builds the image locally +3. Image is pushed to ECR +4. ECS pulls from ECR when deploying diff --git a/apps/infra/buildspecs/app.yml b/apps/infra/buildspecs/app.yml new file mode 100644 index 000000000..9aa1fa5f3 --- /dev/null +++ b/apps/infra/buildspecs/app.yml @@ -0,0 +1,77 @@ +version: 0.2 + +# ========================================== +# APPLICATION BUILD SPECIFICATION +# ========================================== +# This buildspec is used by CodeBuild to build and deploy the Pathfinder application +# It runs within the VPC and has access to the private database for SSG builds + +env: + variables: + NODE_ENV: "production" + BUILD_MODE: "production" + DOCKER_BUILDKIT: "1" + parameter-store: + DATABASE_URL: "/pathfinder/database/connection-string" + ECR_REPOSITORY_URI: "/pathfinder/ecr/repository-uri" + ECS_CLUSTER_NAME: "/pathfinder/ecs/cluster-name" + ECS_SERVICE_NAME: "/pathfinder/ecs/service-name" + +phases: + install: + runtime-versions: + nodejs: 18 + docker: 20 + commands: + - echo "Installing dependencies and logging into ECR..." + - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REPOSITORY_URI + + pre_build: + commands: + - echo "Retrieving database credentials for build-time queries..." + - | + DB_SECRET=$(aws secretsmanager get-secret-value --secret-id $DATABASE_SECRET_ARN --query SecretString --output text) + export DATABASE_URL=$(echo $DB_SECRET | jq -r '.database_url') + - echo "Setting up build environment..." + - cd apps/web + - npm ci --production=false + + build: + commands: + - echo "Building Next.js application with database access..." + - npm run build + - echo "Building Docker image..." + - docker build -t $ECR_REPOSITORY_URI:$IMAGE_TAG . + - docker tag $ECR_REPOSITORY_URI:$IMAGE_TAG $ECR_REPOSITORY_URI:latest + + post_build: + commands: + - echo "Pushing Docker image to ECR..." + - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG + - docker push $ECR_REPOSITORY_URI:latest + - echo "Build completed at $(date)" + +cache: + paths: + - 'apps/web/node_modules/**/*' + - 'apps/web/.next/cache/**/*' + - '/root/.docker/**/*' + +# Artifacts for deployment tracking +artifacts: + files: + - deployment-manifest.json + - task-def.json + - updated-task-def.json + name: application-artifacts + +# Build reports +reports: + jest-reports: + files: + - 'coverage/clover.xml' + file-format: 'CLOVERXML' + eslint-reports: + files: + - 'eslint-report.xml' + file-format: 'CHECKSTYLEXR' \ No newline at end of file diff --git a/apps/infra/index.ts b/apps/infra/index.ts new file mode 100644 index 000000000..181e10c8c --- /dev/null +++ b/apps/infra/index.ts @@ -0,0 +1,162 @@ +import * as pulumi from '@pulumi/pulumi'; +// import * as tailscale from "@pulumi/tailscale"; // Available for future Tailscale provider usage +import * as dotenv from 'dotenv'; +import { createBuildSystem } from './modules/build'; +import { createConfig } from './modules/config'; +import { createContainer } from './modules/container'; +import { createDatabase } from './modules/database'; +import { createGithubOidc } from './modules/github-oidc'; +import { createLoadBalancer } from './modules/loadbalancer'; +import { createMonitoring } from './modules/monitoring'; +import { createNetworking } from './modules/networking'; +import { createScaling } from './modules/scaling'; +import { createTailscale } from './modules/tailscale'; + +// Load environment variables from .env file +dotenv.config(); + +if (!process.env.PULUMI_PROJECT_NAME) { + throw new Error('PULUMI_PROJECT_NAME is not set'); +} + +const projectName = process.env.PULUMI_PROJECT_NAME; + +// ========================================== +// FEATURE CONFIGURATION +// ========================================== +const pathfinderConfig = new pulumi.Config(projectName); +const enableTailscale = pathfinderConfig.getBoolean('enableTailscale') ?? false; +const enableBetterStack = pathfinderConfig.getBoolean('enableBetterStack') ?? false; +const enableDetailedMonitoring = pathfinderConfig.getBoolean('enableDetailedMonitoring') ?? false; + +// ========================================== +// INFRASTRUCTURE CONFIGURATION +// ========================================== +const config = createConfig(projectName); + +// ========================================== +// CORE INFRASTRUCTURE (ALWAYS DEPLOYED) +// ========================================== + +// 1. Foundation Layer - VPC, Subnets, Security Groups +const network = createNetworking(config); + +// 2. Data Layer - Private RDS PostgreSQL +const database = createDatabase(config, network); + +// 3. Load Balancing - ALB with Health Checks (create target group first) +const loadBalancer = createLoadBalancer(config, network); + +// 4. Container Platform - ECR, ECS Cluster (with load balancer integration) +const container = createContainer(config, network, database, loadBalancer); + +// 5. Build System - CodeBuild with VPC Database Access +const build = createBuildSystem(config, network, database, container); + +// 6. Auto-scaling - ECS Service Scaling +const scaling = createScaling(config, container, loadBalancer); + +// 7. GitHub OIDC - For GitHub Actions authentication +const githubOidc = createGithubOidc(config); + +// ========================================== +// OPTIONAL INFRASTRUCTURE (FEATURE-GATED) +// ========================================== + +// 8. Development Access - Tailscale Subnet Router (Optional) +const tailscale = enableTailscale ? createTailscale(config, network, database) : undefined; + +// 9. Observability - Better Stack + CloudWatch (Optional/Configurable) +const monitoring = createMonitoring(config, database, container, loadBalancer, { + enableBetterStack, + enableDetailedMonitoring, +}); + +// ========================================== +// MULTI-APPLICATION DEPLOYMENT +// ========================================== + +const applications = [ + { + name: 'pathfinder-web', + contextPath: '../web', + requiresDatabaseAccess: true, + dependsOnMigrations: true, + buildCommand: 'npm run build', + healthCheckPath: '/health', + environmentVariables: { + NODE_ENV: 'production', + HOSTNAME: '0.0.0.0', + PORT: '3000', + }, + resourceRequirements: { + cpu: 1024, + memory: 2048, + }, + scaling: { + minInstances: 2, + maxInstances: 10, + targetCpuPercent: 60, + }, + }, +]; + +// Deploy configured applications +// TODO: Implement createApplicationDeployment in build module +const deployments = applications.map((app) => + build.createApplicationDeployment(app, database, container), +); + +// ========================================== +// STACK OUTPUTS (COMPREHENSIVE AS PER PROPOSAL) +// ========================================== + +// Core application URLs +export const url = loadBalancer.applicationUrl; +export const albDns = loadBalancer.albDnsName; +export const applicationUrl = loadBalancer.applicationUrl; + +// Infrastructure details +export const ecrRepositoryUrl = container.repositoryUrl; +export const ecsClusterName = container.clusterName; +export const ecsServiceName = container.serviceName; + +// Database connection information +export const database_endpoint = database.endpoint; +export const database_port = pulumi.output(5432); +export const database_name = database.dbName; +export const database_username = database.username; + +// Tailscale-accessible database information (if Tailscale enabled) +export const tailscale_enabled = enableTailscale; +export const tailscale_database_host = enableTailscale ? database.endpoint : undefined; +export const tailscale_database_url = enableTailscale + ? pulumi.interpolate`postgresql://${database.username}:${database.password}@${database.endpoint}:5432/${database.dbName}?sslmode=require` + : undefined; +export const tailscale_router_ip = enableTailscale ? tailscale?.instancePrivateIp : undefined; +export const tailscale_connection_guide = enableTailscale + ? pulumi.interpolate` +# Connect to database through Tailscale: +# 1. Ensure you're connected to Tailscale network +# 2. Use this connection string: postgresql://${database.username}:[PASSWORD]@${database.endpoint}:5432/${database.dbName}?sslmode=require +# 3. Get password with: pulumi stack output database_password --show-secrets +` + : 'Tailscale not enabled for this environment'; + +// Better Stack information (if enabled) +export const betterstack_enabled = enableBetterStack; +export const betterstack_lambda_arn = enableBetterStack + ? monitoring.logForwarderFunctionArn + : undefined; + +// Repository and cluster information +export const ecr_repository_url = container.repositoryUrl; +export const ecs_cluster_name = container.clusterName; +export const repositoryUrl = container.repositoryUrl; +export const databaseEndpoint = database.endpoint; + +// Security outputs (marked as secrets) +export const database_password = pulumi.secret(database.password); +export const tailscale_auth_key = enableTailscale + ? pulumi.secret(tailscale?.authSecretArn) + : undefined; diff --git a/apps/infra/legacy/index.backup.ts b/apps/infra/legacy/index.backup.ts new file mode 100644 index 000000000..cfa2a579e --- /dev/null +++ b/apps/infra/legacy/index.backup.ts @@ -0,0 +1,755 @@ +import * as aws from "@pulumi/aws"; +import * as awsx from "@pulumi/awsx"; +import * as command from "@pulumi/command"; +import * as pulumi from "@pulumi/pulumi"; +import * as random from "@pulumi/random"; +import * as dotenv from "dotenv"; + +// Load environment variables from .env file +dotenv.config(); + +// ========================================== +// CONFIGURATION & SHARED SETTINGS +// ========================================== + +// Common tags for all resources +const commonTags = { + Project: "pathfinder", + Environment: pulumi.getStack(), // Will be "dev", "staging", "production" etc. + ManagedBy: "pulumi", + Owner: "platform-team", + CreatedDate: new Date().toISOString().split("T")[0], // YYYY-MM-DD +}; + +// ========================================== +// NETWORKING LAYER +// VPC, Subnets, Security Groups +// ========================================== + +// VPC with public subnets for ALB and private subnets for containers +const vpc = new awsx.ec2.Vpc("pathfinder-vpc", { + tags: { + ...commonTags, + Name: "pathfinder-vpc", + }, +}); + +// Security Groups +// ALB: Allow HTTP from internet +const albSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-alb-sg", { + vpcId: vpc.vpcId, + ingress: [ + { + protocol: "tcp", + fromPort: 80, + toPort: 80, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + egress: [ + { + protocol: "-1", + fromPort: 0, + toPort: 0, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-alb-sg", + Type: "load-balancer", + }, +}); + +// Service: Only accept traffic from ALB (not directly from internet) +const serviceSecurityGroup = new aws.ec2.SecurityGroup( + "pathfinder-service-sg", + { + vpcId: vpc.vpcId, + ingress: [ + { + protocol: "tcp", + fromPort: 3000, // Next.js port + toPort: 3000, + securityGroups: [albSecurityGroup.id], + }, + ], + egress: [ + { + protocol: "-1", + fromPort: 0, + toPort: 0, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-service-sg", + Type: "ecs-service", + }, + } +); + +// Database Security Group - allow public access since DB is publicly accessible +const dbSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-db-sg", { + vpcId: vpc.vpcId, + ingress: [ + { + protocol: "tcp", + fromPort: 5432, + toPort: 5432, + cidrBlocks: ["0.0.0.0/0"], // Allow from anywhere - database is publicly accessible + description: "Allow PostgreSQL access from anywhere (public database)", + }, + ], + egress: [ + { + protocol: "-1", + fromPort: 0, + toPort: 0, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-db-sg", + Type: "database", + }, +}); + +// No complex security groups needed with public database! + +// Database is publicly accessible - no additional rules needed! + +// ========================================== +// DATABASE LAYER +// RDS PostgreSQL with auto-scaling storage +// ========================================== + +// RDS Subnet Group - keep in private subnets (can't change while DB is running) +const dbSubnetGroup = new aws.rds.SubnetGroup("pathfinder-db-subnet-group", { + subnetIds: vpc.privateSubnetIds, // Keep in private subnets for now + tags: { + ...commonTags, + Name: "pathfinder-db-subnet-group", + }, +}); + +// Generate a secure random password for the database +const dbPassword = new random.RandomPassword("pathfinder-db-password-v2", { + length: 32, + special: true, + overrideSpecial: "!#$%&*()-_=+[]{}<>:?", // RDS doesn't allow: / @ " space +}); + +// RDS PostgreSQL Instance - publicly accessible for simplicity +const db = new aws.rds.Instance("pathfinder-db", { + engine: "postgres", + engineVersion: "15.13", // Updated to latest available version + instanceClass: "db.t3.small", // Upgraded from micro: 2 vCPU, 2 GB RAM + allocatedStorage: 50, // 50 GB (up from 20 GB) + maxAllocatedStorage: 1000, // Auto-scale storage up to 1 TB as needed + storageType: "gp3", + storageEncrypted: true, // Enable encryption at rest + dbName: "pathfinder", + username: "pathfinder_admin", + password: dbPassword.result, // Use the generated secure password + vpcSecurityGroupIds: [dbSecurityGroup.id], + dbSubnetGroupName: dbSubnetGroup.name, + + // Make database publicly accessible - this solves SSG build issues! + publiclyAccessible: true, + + // Use default parameter group (requires SSL - AWS best practice) + applyImmediately: true, // Apply parameter changes immediately (requires restart) + + skipFinalSnapshot: true, // For dev - set to false in production + deletionProtection: false, // For dev - set to true in production + backupRetentionPeriod: 7, // Keep backups for 7 days + backupWindow: "03:00-04:00", // 3-4 AM UTC + maintenanceWindow: "sun:04:00-sun:05:00", // Sunday 4-5 AM UTC + enabledCloudwatchLogsExports: ["postgresql"], // Export logs to CloudWatch + tags: { + ...commonTags, + Name: "pathfinder-db", + Engine: "postgresql", + Tier: "database", + }, +}); + +// ========================================== +// MONITORING & OBSERVABILITY +// CloudWatch Alarms for proactive monitoring +// ========================================== + +// Database Monitoring +const dbHighCPUAlarm = new aws.cloudwatch.MetricAlarm( + "pathfinder-db-high-cpu", + { + comparisonOperator: "GreaterThanThreshold", + evaluationPeriods: 2, + metricName: "CPUUtilization", + namespace: "AWS/RDS", + period: 300, // 5 minutes + statistic: "Average", + threshold: 80, + alarmDescription: "Triggers when database CPU exceeds 80% for 10 minutes", + dimensions: { + DBInstanceIdentifier: db.id, + }, + tags: { + ...commonTags, + Name: "pathfinder-db-high-cpu-alarm", + Type: "monitoring", + }, + } +); + +const dbHighConnectionsAlarm = new aws.cloudwatch.MetricAlarm( + "pathfinder-db-high-connections", + { + comparisonOperator: "GreaterThanThreshold", + evaluationPeriods: 2, + metricName: "DatabaseConnections", + namespace: "AWS/RDS", + period: 300, // 5 minutes + statistic: "Average", + threshold: 80, // db.t3.small has max ~100 connections, so 80 is 80% + alarmDescription: "Triggers when database connections exceed 80", + dimensions: { + DBInstanceIdentifier: db.id, + }, + tags: { + ...commonTags, + Name: "pathfinder-db-high-connections-alarm", + Type: "monitoring", + }, + } +); + +const dbLowStorageAlarm = new aws.cloudwatch.MetricAlarm( + "pathfinder-db-low-storage", + { + comparisonOperator: "LessThanThreshold", + evaluationPeriods: 1, + metricName: "FreeStorageSpace", + namespace: "AWS/RDS", + period: 300, // 5 minutes + statistic: "Average", + threshold: 5 * 1024 * 1024 * 1024, // 5 GB in bytes + alarmDescription: "Triggers when free storage drops below 5 GB", + dimensions: { + DBInstanceIdentifier: db.id, + }, + tags: { + ...commonTags, + Name: "pathfinder-db-low-storage-alarm", + Type: "monitoring", + }, + } +); + +// ========================================== +// LOAD BALANCING & TRAFFIC MANAGEMENT +// Application Load Balancer with health checks +// ========================================== + +const lb = new awsx.lb.ApplicationLoadBalancer("pathfinder-lb", { + subnetIds: vpc.publicSubnetIds, + securityGroups: [albSecurityGroup.id], + tags: { + ...commonTags, + Name: "pathfinder-lb", + Type: "application-load-balancer", + }, + defaultTargetGroup: { + port: 3000, + protocol: "HTTP", + targetType: "ip", // Required for Fargate + healthCheck: { + enabled: true, + path: "/", + healthyThreshold: 2, + unhealthyThreshold: 3, + timeout: 30, + interval: 60, + matcher: "200", + }, + }, +}); + +// ========================================== +// CONTAINER INFRASTRUCTURE +// ECR, ECS Service, IAM Roles, Logging +// ========================================== + +// ECS Cluster +const cluster = new aws.ecs.Cluster("pathfinder-cluster", { + tags: { + ...commonTags, + Name: "pathfinder-cluster", + }, +}); + +// Logging +const logGroup = new aws.cloudwatch.LogGroup("pathfinder-logs", { + retentionInDays: 7, + tags: { + ...commonTags, + Name: "pathfinder-logs", + Type: "application-logs", + }, +}); + +// ECS needs this role to pull images and write logs +const executionRole = new aws.iam.Role("pathfinder-execution-role", { + assumeRolePolicy: `{ + "Version": "2012-10-17", + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "ecs-tasks.amazonaws.com" + } + } + ] + }`, +}); + +new aws.iam.RolePolicyAttachment("pathfinder-execution-role-policy", { + role: executionRole.name, + policyArn: + "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy", +}); + +// No CodeBuild needed - building locally with Pulumi! + +// ECR for storing Docker images +const repo = new awsx.ecr.Repository("pathfinder-repo", { + forceDelete: true, // Allow deletion even if images exist + tags: { + ...commonTags, + Name: "pathfinder-repo", + Type: "container-registry", + }, +}); + +// Build image directly in Pulumi with unique tag - this automatically triggers ECS restart +const appImage = new awsx.ecr.Image("pathfinder-app-image", { + repositoryUrl: repo.url, + context: "../web", // Build from web directory + platform: "linux/amd64", + // Pass database URL for build-time SSG + args: { + DATABASE_URL: pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}`, + }, +}); + +// Migration image for running database migrations +const migrationImage = new awsx.ecr.Image("pathfinder-migration-image", { + repositoryUrl: repo.url, + context: "../web", + platform: "linux/amd64", + dockerfile: "../web/Dockerfile.migration", +}); + +// Run migrations as a one-time task during deployment +const runMigrations = new command.local.Command("run-migrations", { + create: pulumi.interpolate` + echo "🚀 Running database migrations..." + + # Run migration container locally with database access + docker run --rm \ + -e DATABASE_URL="postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}" \ + ${migrationImage.imageUri} \ + bun run scripts/run-migrations.ts + + echo "✅ Database migrations completed" + `, +}, { + dependsOn: [migrationImage, db] +}); + +// Simple, clean architecture - no complex build processes! + +// Phase 2: Reference app image (built directly by Pulumi) +// Unique image URI automatically triggers ECS restart - no manual intervention needed! +const imageUri = appImage.imageUri; + +// Fargate Service (migrations already completed during deployment) +const service = new awsx.ecs.FargateService("pathfinder-service", { + cluster: cluster.arn, + networkConfiguration: { + subnets: vpc.privateSubnetIds, + securityGroups: [serviceSecurityGroup.id], + assignPublicIp: true, // Needed to pull images from ECR + }, + desiredCount: 2, + taskDefinitionArgs: { + executionRole: { + roleArn: executionRole.arn, + }, + containers: { + // Main application container (migrations already completed) + "pathfinder-app": { + name: "pathfinder-app", + image: imageUri, + cpu: 1024, // 1 vCPU + memory: 2048, // 2GB + essential: true, + environment: [ + { + name: "HOSTNAME", + value: "0.0.0.0", // Critical: bind to all interfaces, not just localhost + }, + { + name: "PORT", + value: "3000", + }, + { + name: "DATABASE_URL", + value: pulumi.interpolate`postgresql://${db.username}:${db.password}@${db.endpoint}/${db.dbName}`, + }, + { + name: "ENABLE_DEBUG_ENDPOINTS", + value: "true", // Temporary: for debugging environment variables + }, + ], + portMappings: [ + { + containerPort: 3000, + targetGroup: lb.defaultTargetGroup, + }, + ], + logConfiguration: { + logDriver: "awslogs", + options: { + "awslogs-group": logGroup.name, + "awslogs-region": aws.config.region, + "awslogs-stream-prefix": "pathfinder-app", + }, + }, + }, + }, + }, +}, { + dependsOn: [runMigrations] // Wait for migrations to complete before starting the app +}); + +// No Tailscale proxy needed - database is publicly accessible! + +// ========================================== +// AUTO-SCALING CONFIGURATION +// Automatically scale ECS tasks based on CPU +// ========================================== + +const scaling = new aws.appautoscaling.Target("pathfinder-scaling", { + maxCapacity: 10, + minCapacity: 2, + resourceId: pulumi.interpolate`service/${cluster.name}/${service.service.name}`, + scalableDimension: "ecs:service:DesiredCount", + serviceNamespace: "ecs", +}); + +const scalingPolicy = new aws.appautoscaling.Policy( + "pathfinder-scaling-policy", + { + policyType: "TargetTrackingScaling", + resourceId: scaling.resourceId, + scalableDimension: scaling.scalableDimension, + serviceNamespace: scaling.serviceNamespace, + targetTrackingScalingPolicyConfiguration: { + targetValue: 50, // Scale at 50% CPU + predefinedMetricSpecification: { + predefinedMetricType: "ECSServiceAverageCPUUtilization", + }, + }, + } +); + +// ========================================== +// ADDITIONAL MONITORING +// ECS Service and Load Balancer health checks +// ========================================== + +const ecsHighCPUAlarm = new aws.cloudwatch.MetricAlarm( + "pathfinder-ecs-high-cpu", + { + comparisonOperator: "GreaterThanThreshold", + evaluationPeriods: 2, + metricName: "CPUUtilization", + namespace: "AWS/ECS", + period: 300, // 5 minutes + statistic: "Average", + threshold: 80, + alarmDescription: + "Triggers when ECS service CPU exceeds 80% (may trigger auto-scaling)", + dimensions: { + ClusterName: cluster.name, + ServiceName: service.service.name, + }, + tags: { + ...commonTags, + Name: "pathfinder-ecs-high-cpu-alarm", + Type: "monitoring", + }, + } +); + +const albUnhealthyHostsAlarm = new aws.cloudwatch.MetricAlarm( + "pathfinder-alb-unhealthy-hosts", + { + comparisonOperator: "GreaterThanThreshold", + evaluationPeriods: 2, + metricName: "UnHealthyHostCount", + namespace: "AWS/ApplicationELB", + period: 60, // 1 minute + statistic: "Average", + threshold: 0, + alarmDescription: "Triggers when ALB has unhealthy targets", + dimensions: { + LoadBalancer: lb.loadBalancer.arnSuffix, + TargetGroup: lb.defaultTargetGroup.arnSuffix, + }, + treatMissingData: "notBreaching", + tags: { + ...commonTags, + Name: "pathfinder-alb-unhealthy-alarm", + Type: "monitoring", + }, + } +); + +const albResponseTimeAlarm = new aws.cloudwatch.MetricAlarm( + "pathfinder-alb-high-response-time", + { + comparisonOperator: "GreaterThanThreshold", + evaluationPeriods: 3, + metricName: "TargetResponseTime", + namespace: "AWS/ApplicationELB", + period: 60, // 1 minute + statistic: "Average", + threshold: 2, // 2 seconds + alarmDescription: "Triggers when response time exceeds 2 seconds", + dimensions: { + LoadBalancer: lb.loadBalancer.arnSuffix, + }, + treatMissingData: "notBreaching", + tags: { + ...commonTags, + Name: "pathfinder-alb-response-time-alarm", + Type: "monitoring", + }, + } +); + +// ========================================== +// BETTER STACK LOG FORWARDING +// Lambda function to forward CloudWatch logs to Better Stack +// ========================================== + +// IAM role for the Better Stack Lambda function +const betterStackLambdaRole = new aws.iam.Role( + "pathfinder-better-stack-lambda-role", + { + assumeRolePolicy: `{ + "Version": "2012-10-17", + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "lambda.amazonaws.com" + } + } + ] + }`, + tags: { + ...commonTags, + Name: "pathfinder-better-stack-lambda-role", + Type: "iam-role", + }, + } +); + +// Attach basic Lambda execution policy +new aws.iam.RolePolicyAttachment( + "pathfinder-better-stack-lambda-basic-execution", + { + role: betterStackLambdaRole.name, + policyArn: + "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", + } +); + +// Custom policy for reading from CloudWatch Logs +const betterStackLambdaPolicy = new aws.iam.Policy( + "pathfinder-better-stack-lambda-policy", + { + policy: `{ + "Version": "2012-10-17", + "Statement": [ + { + "Effect": "Allow", + "Action": [ + "logs:CreateLogGroup", + "logs:CreateLogStream", + "logs:PutLogEvents" + ], + "Resource": "arn:aws:logs:*:*:*" + } + ] + }`, + tags: { + ...commonTags, + Name: "pathfinder-better-stack-lambda-policy", + Type: "iam-policy", + }, + } +); + +new aws.iam.RolePolicyAttachment( + "pathfinder-better-stack-lambda-policy-attachment", + { + role: betterStackLambdaRole.name, + policyArn: betterStackLambdaPolicy.arn, + } +); + + +// Automatically install Lambda dependencies during deployment +const installLambdaDeps = new command.local.Command("install-lambda-deps", { + create: "npm install --production", + dir: "../../logtail-aws-lambda", + environment: { + NODE_ENV: "production", + }, +}); + +// Create a deployment package for the Lambda function +const betterStackLambdaPackage = new pulumi.asset.FileArchive( + "../../logtail-aws-lambda" +); + +if (!process.env.BETTER_STACK_ENTRYPOINT || !process.env.BETTER_STACK_SOURCE_TOKEN) { + throw new Error("BETTER_STACK_ENTRYPOINT and BETTER_STACK_SOURCE_TOKEN must be set"); +} + +// Better Stack Lambda function +const betterStackLambda = new aws.lambda.Function( + "pathfinder-better-stack-lambda", + { + name: "logtail-aws-lambda", + role: betterStackLambdaRole.arn, + handler: "index.handler", + runtime: "nodejs22.x", + architectures: ["x86_64"], + code: betterStackLambdaPackage, + timeout: 30, + environment: { + variables: { + BETTER_STACK_ENTRYPOINT: + process.env.BETTER_STACK_ENTRYPOINT, + BETTER_STACK_SOURCE_TOKEN: process.env.BETTER_STACK_SOURCE_TOKEN, + }, + }, + tags: { + ...commonTags, + Name: "pathfinder-better-stack-lambda", + Type: "log-forwarder", + }, + }, + { dependsOn: [installLambdaDeps] } +); + +// CloudWatch subscription filters to forward ALL logs to Better Stack +// 1. ECS Application logs +const betterStackECSSubscriptionFilter = + new aws.cloudwatch.LogSubscriptionFilter( + "pathfinder-better-stack-ecs-subscription-filter", + { + logGroup: logGroup.name, + filterPattern: "", // Forward all logs + destinationArn: betterStackLambda.arn, + name: "logtail-aws-lambda-ecs-filter", + } + ); + +// 2. RDS PostgreSQL logs +const rdsLogGroupNameOutput = pulumi.interpolate`/aws/rds/instance/${db.id}/postgresql`; + +// Create the RDS log group explicitly +const rdsLogGroup = new aws.cloudwatch.LogGroup( + "pathfinder-rds-log-group", + { + name: rdsLogGroupNameOutput, + retentionInDays: 7, // Keep logs for 7 days + tags: { + ...commonTags, + Name: "pathfinder-rds-log-group", + Type: "logging", + }, + }, + { dependsOn: [db] } // Ensure RDS is created first +); + +const betterStackRDSSubscriptionFilter = + new aws.cloudwatch.LogSubscriptionFilter( + "pathfinder-better-stack-rds-subscription-filter", + { + logGroup: rdsLogGroup.name, + filterPattern: "", // Forward all logs + destinationArn: betterStackLambda.arn, + name: "logtail-aws-lambda-rds-filter", + }, + { dependsOn: [rdsLogGroup] } // Ensure log group is created first + ); + +// Grant CloudWatch Logs permission to invoke the Lambda function from ECS +const betterStackLambdaPermissionECS = new aws.lambda.Permission( + "pathfinder-better-stack-lambda-permission-ecs", + { + statementId: "AllowExecutionFromCloudWatchLogsECS", + action: "lambda:InvokeFunction", + function: betterStackLambda.name, + principal: "logs.amazonaws.com", + sourceArn: pulumi.interpolate`${logGroup.arn}:*`, + } +); + +// Grant CloudWatch Logs permission to invoke the Lambda function from RDS +const betterStackLambdaPermissionRDS = new aws.lambda.Permission( + "pathfinder-better-stack-lambda-permission-rds", + { + statementId: "AllowExecutionFromCloudWatchLogsRDS", + action: "lambda:InvokeFunction", + function: betterStackLambda.name, + principal: "logs.amazonaws.com", + sourceArn: pulumi.interpolate`${rdsLogGroup.arn}:*`, + } +); + +// ========================================== +// STACK OUTPUTS +// Values accessible after deployment +// ========================================== + +export const url = lb.loadBalancer.dnsName.apply((dns) => `http://${dns}`); +export const dbEndpoint = db.endpoint; +export const dbConnectionString = pulumi.interpolate`postgresql://${db.username}:${db.password}@${db.endpoint}/${db.dbName}`; +// Export password as a secret - only visible via CLI with --show-secrets flag +export const dbPasswordSecret = pulumi.secret(dbPassword.result); +export const dbUsername = db.username; + +// Migration information +export const migrationStatus = runMigrations.stdout; + +// Better Stack logging information +export const betterStackLambdaArn = betterStackLambda.arn; +export const betterStackLambdaName = betterStackLambda.name; +export const logGroupName = logGroup.name; +export const rdsLogGroupName = rdsLogGroup.name; + +// Simplified build - no CodeBuild needed! +export const ecrRepositoryUrl = repo.url; diff --git a/apps/infra/legacy/index.public.ts b/apps/infra/legacy/index.public.ts new file mode 100644 index 000000000..0055a509e --- /dev/null +++ b/apps/infra/legacy/index.public.ts @@ -0,0 +1,587 @@ +import * as aws from "@pulumi/aws"; +import * as awsx from "@pulumi/awsx"; +import * as command from "@pulumi/command"; +import * as pulumi from "@pulumi/pulumi"; +import * as random from "@pulumi/random"; +import * as dotenv from "dotenv"; + +// Load environment variables from .env file +dotenv.config(); + +// ========================================== +// CONFIGURATION & SHARED SETTINGS +// ========================================== + +// Common tags for all resources +const commonTags = { + Project: "pathfinder", + Environment: pulumi.getStack(), // Will be "dev", "staging", "production" etc. + ManagedBy: "pulumi", + Owner: "platform-team", + CreatedDate: new Date().toISOString().split("T")[0], // YYYY-MM-DD +}; + +// ========================================== +// NETWORKING LAYER +// VPC, Subnets, Security Groups +// ========================================== + +// VPC with DNS support for publicly accessible RDS +const vpc = new aws.ec2.Vpc("pathfinder-vpc", { + cidrBlock: "10.0.0.0/16", + enableDnsHostnames: true, // Required for publicly accessible RDS + enableDnsSupport: true, // Required for publicly accessible RDS + tags: { + ...commonTags, + Name: "pathfinder-vpc", + }, +}); + +// Internet Gateway for public subnet access +const igw = new aws.ec2.InternetGateway("pathfinder-igw", { + vpcId: vpc.id, + tags: { + ...commonTags, + Name: "pathfinder-igw", + }, +}); + +// Get availability zones +const azs = aws.getAvailabilityZones({ + state: "available", +}); + +// Public subnets (for ALB and publicly accessible RDS) +const publicSubnet1 = new aws.ec2.Subnet("pathfinder-public-subnet-1", { + vpcId: vpc.id, + cidrBlock: "10.0.1.0/24", + availabilityZone: azs.then(azs => azs.names[0]), + mapPublicIpOnLaunch: true, + tags: { + ...commonTags, + Name: "pathfinder-public-subnet-1", + Type: "public", + }, +}); + +const publicSubnet2 = new aws.ec2.Subnet("pathfinder-public-subnet-2", { + vpcId: vpc.id, + cidrBlock: "10.0.2.0/24", + availabilityZone: azs.then(azs => azs.names[1]), + mapPublicIpOnLaunch: true, + tags: { + ...commonTags, + Name: "pathfinder-public-subnet-2", + Type: "public", + }, +}); + +// Private subnets (for ECS tasks) +const privateSubnet1 = new aws.ec2.Subnet("pathfinder-private-subnet-1", { + vpcId: vpc.id, + cidrBlock: "10.0.10.0/24", + availabilityZone: azs.then(azs => azs.names[0]), + tags: { + ...commonTags, + Name: "pathfinder-private-subnet-1", + Type: "private", + }, +}); + +const privateSubnet2 = new aws.ec2.Subnet("pathfinder-private-subnet-2", { + vpcId: vpc.id, + cidrBlock: "10.0.11.0/24", + availabilityZone: azs.then(azs => azs.names[1]), + tags: { + ...commonTags, + Name: "pathfinder-private-subnet-2", + Type: "private", + }, +}); + +// NAT Gateway for private subnet internet access +const natEip = new aws.ec2.Eip("pathfinder-nat-eip", { + domain: "vpc", + tags: { + ...commonTags, + Name: "pathfinder-nat-eip", + }, +}); + +const natGateway = new aws.ec2.NatGateway("pathfinder-nat-gw", { + allocationId: natEip.id, + subnetId: publicSubnet1.id, + tags: { + ...commonTags, + Name: "pathfinder-nat-gw", + }, +}, { + dependsOn: [igw], +}); + +// Route tables +const publicRouteTable = new aws.ec2.RouteTable("pathfinder-public-rt", { + vpcId: vpc.id, + routes: [ + { + cidrBlock: "0.0.0.0/0", + gatewayId: igw.id, + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-public-rt", + }, +}); + +const privateRouteTable = new aws.ec2.RouteTable("pathfinder-private-rt", { + vpcId: vpc.id, + routes: [ + { + cidrBlock: "0.0.0.0/0", + natGatewayId: natGateway.id, + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-private-rt", + }, +}); + +// Route table associations +const publicRtAssoc1 = new aws.ec2.RouteTableAssociation("pathfinder-public-rt-assoc-1", { + subnetId: publicSubnet1.id, + routeTableId: publicRouteTable.id, +}); + +const publicRtAssoc2 = new aws.ec2.RouteTableAssociation("pathfinder-public-rt-assoc-2", { + subnetId: publicSubnet2.id, + routeTableId: publicRouteTable.id, +}); + +const privateRtAssoc1 = new aws.ec2.RouteTableAssociation("pathfinder-private-rt-assoc-1", { + subnetId: privateSubnet1.id, + routeTableId: privateRouteTable.id, +}); + +const privateRtAssoc2 = new aws.ec2.RouteTableAssociation("pathfinder-private-rt-assoc-2", { + subnetId: privateSubnet2.id, + routeTableId: privateRouteTable.id, +}); + +// Helper arrays for convenience (mimicking awsx.ec2.Vpc interface) +const publicSubnetIds = [publicSubnet1.id, publicSubnet2.id]; +const privateSubnetIds = [privateSubnet1.id, privateSubnet2.id]; + +// Security Groups +// ALB: Allow HTTP from internet +const albSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-alb-sg", { + vpcId: vpc.id, + ingress: [ + { + protocol: "tcp", + fromPort: 80, + toPort: 80, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + egress: [ + { + protocol: "-1", + fromPort: 0, + toPort: 0, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-alb-sg", + Type: "load-balancer", + }, +}); + +// Service: Only accept traffic from ALB (not directly from internet) +const serviceSecurityGroup = new aws.ec2.SecurityGroup( + "pathfinder-service-sg", + { + vpcId: vpc.id, + ingress: [ + { + protocol: "tcp", + fromPort: 3000, // Next.js port + toPort: 3000, + securityGroups: [albSecurityGroup.id], + }, + ], + egress: [ + { + protocol: "-1", + fromPort: 0, + toPort: 0, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-service-sg", + Type: "ecs-service", + }, + } +); + +// Database Security Group - allow controlled public access +const dbSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-db-sg", { + vpcId: vpc.id, + ingress: [ + // Allow access from ECS tasks in private subnets + { + protocol: "tcp", + fromPort: 5432, + toPort: 5432, + securityGroups: [serviceSecurityGroup.id], + description: "Allow PostgreSQL access from ECS service", + }, + // For development/migration access - restrict to specific IPs in production + { + protocol: "tcp", + fromPort: 5432, + toPort: 5432, + cidrBlocks: ["0.0.0.0/0"], // TODO: Replace with specific IP ranges in production + description: "Allow PostgreSQL access for development/migrations (restrict in production)", + }, + ], + egress: [ + { + protocol: "-1", + fromPort: 0, + toPort: 0, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-db-sg", + Type: "database", + }, +}); + +// No complex security groups needed with public database! + +// Database is publicly accessible - no additional rules needed! + +// ========================================== +// DATABASE LAYER +// RDS PostgreSQL with auto-scaling storage +// ========================================== + +// RDS Subnet Group - use PUBLIC subnets for truly public database access +const dbSubnetGroup = new aws.rds.SubnetGroup("pathfinder-db-subnet-group", { + subnetIds: publicSubnetIds, // Use PUBLIC subnets for internet access + tags: { + ...commonTags, + Name: "pathfinder-db-subnet-group", + }, +}, { + dependsOn: [vpc, publicSubnet1, publicSubnet2, igw, publicRouteTable, publicRtAssoc1, publicRtAssoc2], +}); + +// Generate a secure random password for the database +const dbPassword = new random.RandomPassword("pathfinder-db-password-v2", { + length: 32, + special: true, + overrideSpecial: "!#$%&*()-_=+[]{}<>:?", // RDS doesn't allow: / @ " space +}); + +// RDS PostgreSQL Instance - publicly accessible for simplicity +const db = new aws.rds.Instance("pathfinder-db", { + engine: "postgres", + engineVersion: "15.13", // Updated to latest available version + instanceClass: "db.t3.small", // Upgraded from micro: 2 vCPU, 2 GB RAM + allocatedStorage: 50, // 50 GB (up from 20 GB) + maxAllocatedStorage: 1000, // Auto-scale storage up to 1 TB as needed + storageType: "gp3", + storageEncrypted: true, // Enable encryption at rest + dbName: "pathfinder", + username: "pathfinder_admin", + password: dbPassword.result, // Use the generated secure password + vpcSecurityGroupIds: [dbSecurityGroup.id], + dbSubnetGroupName: dbSubnetGroup.name, + + // Make database publicly accessible - this solves SSG build issues! + publiclyAccessible: true, + + // Use default parameter group (requires SSL - AWS best practice) + applyImmediately: true, // Apply parameter changes immediately (requires restart) + + skipFinalSnapshot: true, // For dev - set to false in production + deletionProtection: false, // For dev - set to true in production + backupRetentionPeriod: 7, // Keep backups for 7 days + backupWindow: "03:00-04:00", // 3-4 AM UTC + maintenanceWindow: "sun:04:00-sun:05:00", // Sunday 4-5 AM UTC + // No external logging - keep it simple! + tags: { + ...commonTags, + Name: "pathfinder-db", + Engine: "postgresql", + Tier: "database", + }, +}, { + dependsOn: [vpc, dbSubnetGroup, dbSecurityGroup], +}); + +// No complex monitoring - keep it simple! + +// ========================================== +// LOAD BALANCING & TRAFFIC MANAGEMENT +// Application Load Balancer with health checks +// ========================================== + +const lb = new awsx.lb.ApplicationLoadBalancer("pathfinder-lb", { + subnetIds: publicSubnetIds, + securityGroups: [albSecurityGroup.id], + tags: { + ...commonTags, + Name: "pathfinder-lb", + Type: "application-load-balancer", + }, + defaultTargetGroup: { + port: 3000, + protocol: "HTTP", + targetType: "ip", // Required for Fargate + healthCheck: { + enabled: true, + path: "/", + healthyThreshold: 2, + unhealthyThreshold: 3, + timeout: 30, + interval: 60, + matcher: "200", + }, + }, +}); + +// ========================================== +// CONTAINER INFRASTRUCTURE +// ECR, ECS Service, IAM Roles, Logging +// ========================================== + +// ECS Cluster +const cluster = new aws.ecs.Cluster("pathfinder-cluster", { + tags: { + ...commonTags, + Name: "pathfinder-cluster", + }, +}); + +// Logging +const logGroup = new aws.cloudwatch.LogGroup("pathfinder-logs", { + retentionInDays: 7, + tags: { + ...commonTags, + Name: "pathfinder-logs", + Type: "application-logs", + }, +}); + +// ECS needs this role to pull images and write logs +const executionRole = new aws.iam.Role("pathfinder-execution-role", { + assumeRolePolicy: `{ + "Version": "2012-10-17", + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "ecs-tasks.amazonaws.com" + } + } + ] + }`, +}); + +new aws.iam.RolePolicyAttachment("pathfinder-execution-role-policy", { + role: executionRole.name, + policyArn: + "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy", +}); + +// No CodeBuild needed - building locally with Pulumi! + +// ECR for storing Docker images +const repo = new awsx.ecr.Repository("pathfinder-repo", { + forceDelete: true, // Allow deletion even if images exist + tags: { + ...commonTags, + Name: "pathfinder-repo", + Type: "container-registry", + }, +}); + +// STAGE 1: Migration image (builds first) +const migrationImage = new awsx.ecr.Image("pathfinder-migration-image", { + repositoryUrl: repo.url, + context: "../web", + platform: "linux/amd64", + dockerfile: "../web/Dockerfile.migration", +}); + +// Run migrations - must complete before app image builds +const runMigrations = new command.local.Command("run-migrations", { + create: pulumi.interpolate` + echo "🚀 Running database migrations..." + + # Run migration container locally with database access - pass connection parts separately + docker run --rm \ + -e PGHOST="${db.address}" \ + -e PGPORT="5432" \ + -e PGDATABASE="${db.dbName}" \ + -e PGUSER="${db.username}" \ + -e PGPASSWORD="${dbPassword.result}" \ + -e PGSSLMODE="require" \ + ${migrationImage.imageUri} \ + sh -c 'export DATABASE_URL="postgresql://\$PGUSER:\$PGPASSWORD@\$PGHOST:\$PGPORT/\$PGDATABASE?sslmode=\$PGSSLMODE" && bun run scripts/run-migrations.ts' + + echo "✅ Database migrations completed" + `, +}, { + dependsOn: [migrationImage, db] +}); + +// STAGE 2: App image (builds AFTER migrations succeed) +const appImage = new awsx.ecr.Image("pathfinder-app-image", { + repositoryUrl: repo.url, + context: "../web", // Build from web directory + platform: "linux/amd64", + // CRITICAL: Pass database connection for Next.js SSG at build time - construct URL safely + args: { + PGHOST: db.address, + PGPORT: "5432", + PGDATABASE: db.dbName, + PGUSER: db.username, + PGPASSWORD: dbPassword.result, + PGSSLMODE: "require", + }, +}, { + dependsOn: [runMigrations] // Wait for migrations to complete before building app +}); + +// Clean 2-stage pipeline: +// Stage 1: Migration image → Run migrations ✅ +// Stage 2: App image (with DB access) → Deploy ECS ✅ + +// ECS Service - simple app deployment (migrations already completed) +const service = new awsx.ecs.FargateService("pathfinder-service", { + cluster: cluster.arn, + networkConfiguration: { + subnets: privateSubnetIds, + securityGroups: [serviceSecurityGroup.id], + assignPublicIp: true, // Needed to pull images from ECR + }, + desiredCount: 2, + taskDefinitionArgs: { + executionRole: { + roleArn: executionRole.arn, + }, + containers: { + // Main application container (migrations already completed in build stage) + "pathfinder-app": { + name: "pathfinder-app", + image: appImage.imageUri, + cpu: 1024, // 1 vCPU + memory: 2048, // 2GB + essential: true, + environment: [ + { + name: "HOSTNAME", + value: "0.0.0.0", // Critical: bind to all interfaces, not just localhost + }, + { + name: "PORT", + value: "3000", + }, + { + name: "DATABASE_URL", + value: pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}?sslmode=require`, + }, + { + name: "NODE_ENV", + value: "production", + }, + { + name: "ENABLE_DEBUG_ENDPOINTS", + value: "true", // Temporary: for debugging environment variables + }, + ], + portMappings: [ + { + containerPort: 3000, + targetGroup: lb.defaultTargetGroup, + }, + ], + logConfiguration: { + logDriver: "awslogs", + options: { + "awslogs-group": logGroup.name, + "awslogs-region": aws.getRegionOutput().name, + "awslogs-stream-prefix": "pathfinder-app", + }, + }, + }, + }, + }, +}, { + dependsOn: [appImage] // Wait for app image to be built (which waits for migrations) +}); + +// No Tailscale proxy needed - database is publicly accessible! + +// ========================================== +// AUTO-SCALING CONFIGURATION +// Automatically scale ECS tasks based on CPU +// ========================================== + +const scaling = new aws.appautoscaling.Target("pathfinder-scaling", { + maxCapacity: 10, + minCapacity: 2, + resourceId: pulumi.interpolate`service/${cluster.name}/${service.service.name}`, + scalableDimension: "ecs:service:DesiredCount", + serviceNamespace: "ecs", +}); + +const scalingPolicy = new aws.appautoscaling.Policy( + "pathfinder-scaling-policy", + { + policyType: "TargetTrackingScaling", + resourceId: scaling.resourceId, + scalableDimension: scaling.scalableDimension, + serviceNamespace: scaling.serviceNamespace, + targetTrackingScalingPolicyConfiguration: { + targetValue: 50, // Scale at 50% CPU + predefinedMetricSpecification: { + predefinedMetricType: "ECSServiceAverageCPUUtilization", + }, + }, + } +); + +// No complex monitoring - keep it simple! + +// No external logging complexity - keep it simple! + +// ========================================== +// STACK OUTPUTS +// Values accessible after deployment +// ========================================== + +export const url = lb.loadBalancer.dnsName.apply((dns) => `http://${dns}`); +export const dbEndpoint = db.endpoint; +export const dbConnectionString = pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}?sslmode=require`; +// Export password as a secret - only visible via CLI with --show-secrets flag +export const dbPasswordSecret = pulumi.secret(dbPassword.result); +export const dbUsername = db.username; + +// Migration information - runs during build stage +export const migrationStatus = runMigrations.stdout; + +// Simplified build - no CodeBuild needed! +export const ecrRepositoryUrl = repo.url; diff --git a/apps/infra/legacy/index.ts b/apps/infra/legacy/index.ts new file mode 100644 index 000000000..fc8f0ca43 --- /dev/null +++ b/apps/infra/legacy/index.ts @@ -0,0 +1,607 @@ +import * as aws from "@pulumi/aws"; +import * as awsx from "@pulumi/awsx"; +import * as command from "@pulumi/command"; +import * as pulumi from "@pulumi/pulumi"; +import * as random from "@pulumi/random"; +import * as dotenv from "dotenv"; + +// Load environment variables from .env file +dotenv.config(); + +// ========================================== +// CONFIGURATION & SHARED SETTINGS +// ========================================== + +// Common tags for all resources +const commonTags = { + Project: "pathfinder", + Environment: pulumi.getStack(), // Will be "dev", "staging", "production" etc. + ManagedBy: "pulumi", + Owner: "platform-team", + CreatedDate: new Date().toISOString().split("T")[0], // YYYY-MM-DD +}; + +// ========================================== +// NETWORKING LAYER +// VPC, Subnets, Security Groups +// ========================================== + +// VPC with DNS support for publicly accessible RDS +const vpc = new aws.ec2.Vpc("pathfinder-vpc", { + cidrBlock: "10.0.0.0/16", + enableDnsHostnames: true, // Required for publicly accessible RDS + enableDnsSupport: true, // Required for publicly accessible RDS + tags: { + ...commonTags, + Name: "pathfinder-vpc", + }, +}); + +// Internet Gateway for public subnet access +const igw = new aws.ec2.InternetGateway("pathfinder-igw", { + vpcId: vpc.id, + tags: { + ...commonTags, + Name: "pathfinder-igw", + }, +}); + +// Get availability zones +const azs = aws.getAvailabilityZones({ + state: "available", +}); + +// Public subnets (for ALB and publicly accessible RDS) +const publicSubnet1 = new aws.ec2.Subnet("pathfinder-public-subnet-1", { + vpcId: vpc.id, + cidrBlock: "10.0.1.0/24", + availabilityZone: azs.then(azs => azs.names[0]), + mapPublicIpOnLaunch: true, + tags: { + ...commonTags, + Name: "pathfinder-public-subnet-1", + Type: "public", + }, +}); + +const publicSubnet2 = new aws.ec2.Subnet("pathfinder-public-subnet-2", { + vpcId: vpc.id, + cidrBlock: "10.0.2.0/24", + availabilityZone: azs.then(azs => azs.names[1]), + mapPublicIpOnLaunch: true, + tags: { + ...commonTags, + Name: "pathfinder-public-subnet-2", + Type: "public", + }, +}); + +// Private subnets (for ECS tasks) +const privateSubnet1 = new aws.ec2.Subnet("pathfinder-private-subnet-1", { + vpcId: vpc.id, + cidrBlock: "10.0.10.0/24", + availabilityZone: azs.then(azs => azs.names[0]), + tags: { + ...commonTags, + Name: "pathfinder-private-subnet-1", + Type: "private", + }, +}); + +const privateSubnet2 = new aws.ec2.Subnet("pathfinder-private-subnet-2", { + vpcId: vpc.id, + cidrBlock: "10.0.11.0/24", + availabilityZone: azs.then(azs => azs.names[1]), + tags: { + ...commonTags, + Name: "pathfinder-private-subnet-2", + Type: "private", + }, +}); + +// NAT Gateway for private subnet internet access +const natEip = new aws.ec2.Eip("pathfinder-nat-eip", { + domain: "vpc", + tags: { + ...commonTags, + Name: "pathfinder-nat-eip", + }, +}); + +const natGateway = new aws.ec2.NatGateway("pathfinder-nat-gw", { + allocationId: natEip.id, + subnetId: publicSubnet1.id, + tags: { + ...commonTags, + Name: "pathfinder-nat-gw", + }, +}, { + dependsOn: [igw], +}); + +// Route tables +const publicRouteTable = new aws.ec2.RouteTable("pathfinder-public-rt", { + vpcId: vpc.id, + routes: [ + { + cidrBlock: "0.0.0.0/0", + gatewayId: igw.id, + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-public-rt", + }, +}); + +const privateRouteTable = new aws.ec2.RouteTable("pathfinder-private-rt", { + vpcId: vpc.id, + routes: [ + { + cidrBlock: "0.0.0.0/0", + natGatewayId: natGateway.id, + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-private-rt", + }, +}); + +// Route table associations +const publicRtAssoc1 = new aws.ec2.RouteTableAssociation("pathfinder-public-rt-assoc-1", { + subnetId: publicSubnet1.id, + routeTableId: publicRouteTable.id, +}); + +const publicRtAssoc2 = new aws.ec2.RouteTableAssociation("pathfinder-public-rt-assoc-2", { + subnetId: publicSubnet2.id, + routeTableId: publicRouteTable.id, +}); + +const privateRtAssoc1 = new aws.ec2.RouteTableAssociation("pathfinder-private-rt-assoc-1", { + subnetId: privateSubnet1.id, + routeTableId: privateRouteTable.id, +}); + +const privateRtAssoc2 = new aws.ec2.RouteTableAssociation("pathfinder-private-rt-assoc-2", { + subnetId: privateSubnet2.id, + routeTableId: privateRouteTable.id, +}); + +// Helper arrays for convenience (mimicking awsx.ec2.Vpc interface) +const publicSubnetIds = [publicSubnet1.id, publicSubnet2.id]; +const privateSubnetIds = [privateSubnet1.id, privateSubnet2.id]; + +// Security Groups +// ALB: Allow HTTP from internet +const albSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-alb-sg", { + vpcId: vpc.id, + ingress: [ + { + protocol: "tcp", + fromPort: 80, + toPort: 80, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + egress: [ + { + protocol: "-1", + fromPort: 0, + toPort: 0, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-alb-sg", + Type: "load-balancer", + }, +}); + +// Service: Only accept traffic from ALB (not directly from internet) +const serviceSecurityGroup = new aws.ec2.SecurityGroup( + "pathfinder-service-sg", + { + vpcId: vpc.id, + ingress: [ + { + protocol: "tcp", + fromPort: 3000, // Next.js port + toPort: 3000, + securityGroups: [albSecurityGroup.id], + }, + ], + egress: [ + { + protocol: "-1", + fromPort: 0, + toPort: 0, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-service-sg", + Type: "ecs-service", + }, + } +); + +// Database Security Group - private access only +const dbSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-db-sg", { + vpcId: vpc.id, + ingress: [ + // Allow access from ECS tasks in private subnets + { + protocol: "tcp", + fromPort: 5432, + toPort: 5432, + securityGroups: [serviceSecurityGroup.id], + description: "Allow PostgreSQL access from ECS service", + }, + // Note: No public access - database is now fully private + ], + egress: [ + { + protocol: "-1", + fromPort: 0, + toPort: 0, + cidrBlocks: ["0.0.0.0/0"], + }, + ], + tags: { + ...commonTags, + Name: "pathfinder-db-sg", + Type: "database", + }, +}); + +// Database is now private - only accessible from ECS service! + +// ========================================== +// DATABASE LAYER +// RDS PostgreSQL with auto-scaling storage +// ========================================== + +// RDS Subnet Group - use PRIVATE subnets for secure database access +const dbSubnetGroup = new aws.rds.SubnetGroup("pathfinder-db-subnet-group", { + subnetIds: privateSubnetIds, // Use PRIVATE subnets for security + tags: { + ...commonTags, + Name: "pathfinder-db-subnet-group", + }, +}, { + dependsOn: [vpc, privateSubnet1, privateSubnet2, natGateway, privateRouteTable, privateRtAssoc1, privateRtAssoc2], +}); + +// Generate a secure random password for the database +const dbPassword = new random.RandomPassword("pathfinder-db-password-v2", { + length: 32, + special: true, + overrideSpecial: "!#$%&*()-_=+[]{}<>:?", // RDS doesn't allow: / @ " space +}); + +// RDS PostgreSQL Instance - publicly accessible for simplicity +const db = new aws.rds.Instance("pathfinder-db", { + engine: "postgres", + engineVersion: "15.13", // Updated to latest available version + instanceClass: "db.t3.small", // Upgraded from micro: 2 vCPU, 2 GB RAM + allocatedStorage: 50, // 50 GB (up from 20 GB) + maxAllocatedStorage: 1000, // Auto-scale storage up to 1 TB as needed + storageType: "gp3", + storageEncrypted: true, // Enable encryption at rest + dbName: "pathfinder", + username: "pathfinder_admin", + password: dbPassword.result, // Use the generated secure password + vpcSecurityGroupIds: [dbSecurityGroup.id], + dbSubnetGroupName: dbSubnetGroup.name, + + // Keep database private for security + publiclyAccessible: false, + + // Use default parameter group (requires SSL - AWS best practice) + applyImmediately: true, // Apply parameter changes immediately (requires restart) + + skipFinalSnapshot: true, // For dev - set to false in production + deletionProtection: false, // For dev - set to true in production + backupRetentionPeriod: 7, // Keep backups for 7 days + backupWindow: "03:00-04:00", // 3-4 AM UTC + maintenanceWindow: "sun:04:00-sun:05:00", // Sunday 4-5 AM UTC + // No external logging - keep it simple! + tags: { + ...commonTags, + Name: "pathfinder-db", + Engine: "postgresql", + Tier: "database", + }, +}, { + dependsOn: [vpc, dbSubnetGroup, dbSecurityGroup], +}); + +// No complex monitoring - keep it simple! + +// ========================================== +// LOAD BALANCING & TRAFFIC MANAGEMENT +// Application Load Balancer with health checks +// ========================================== + +const lb = new awsx.lb.ApplicationLoadBalancer("pathfinder-lb", { + subnetIds: publicSubnetIds, + securityGroups: [albSecurityGroup.id], + tags: { + ...commonTags, + Name: "pathfinder-lb", + Type: "application-load-balancer", + }, + defaultTargetGroup: { + port: 3000, + protocol: "HTTP", + targetType: "ip", // Required for Fargate + healthCheck: { + enabled: true, + path: "/", + healthyThreshold: 2, + unhealthyThreshold: 3, + timeout: 30, + interval: 60, + matcher: "200", + }, + }, +}); + +// ========================================== +// CONTAINER INFRASTRUCTURE +// ECR, ECS Service, IAM Roles, Logging +// ========================================== + +// ECS Cluster +const cluster = new aws.ecs.Cluster("pathfinder-cluster", { + tags: { + ...commonTags, + Name: "pathfinder-cluster", + }, +}); + +// Logging +const logGroup = new aws.cloudwatch.LogGroup("pathfinder-logs", { + retentionInDays: 7, + tags: { + ...commonTags, + Name: "pathfinder-logs", + Type: "application-logs", + }, +}); + +// ECS needs this role to pull images and write logs +const executionRole = new aws.iam.Role("pathfinder-execution-role", { + assumeRolePolicy: `{ + "Version": "2012-10-17", + "Statement": [ + { + "Action": "sts:AssumeRole", + "Effect": "Allow", + "Principal": { + "Service": "ecs-tasks.amazonaws.com" + } + } + ] + }`, +}); + +new aws.iam.RolePolicyAttachment("pathfinder-execution-role-policy", { + role: executionRole.name, + policyArn: + "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy", +}); + +// No CodeBuild needed - building locally with Pulumi! + +// ECR for storing Docker images +const repo = new awsx.ecr.Repository("pathfinder-repo", { + forceDelete: true, // Allow deletion even if images exist + tags: { + ...commonTags, + Name: "pathfinder-repo", + Type: "container-registry", + }, +}); + +// STAGE 1: Migration image (builds first) +const migrationImage = new awsx.ecr.Image("pathfinder-migration-image", { + repositoryUrl: repo.url, + context: "../web", + platform: "linux/amd64", + dockerfile: "../web/Dockerfile.migration", +}); + +// Migration Task Definition - runs in private subnet with database access +const migrationTaskDefinition = new aws.ecs.TaskDefinition("pathfinder-migration-task", { + family: "pathfinder-migrations", + networkMode: "awsvpc", + requiresCompatibilities: ["FARGATE"], + cpu: "256", + memory: "512", + executionRoleArn: executionRole.arn, + containerDefinitions: pulumi.jsonStringify([ + { + name: "migration-container", + image: migrationImage.imageUri, + essential: true, + environment: [ + { + name: "DATABASE_URL", + value: pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.address}:5432/${db.dbName}?sslmode=require`, + }, + ], + command: ["bun", "run", "scripts/run-migrations.ts"], + logConfiguration: { + logDriver: "awslogs", + options: { + "awslogs-group": logGroup.name, + "awslogs-region": aws.getRegionOutput().name, + "awslogs-stream-prefix": "migration", + }, + }, + }, + ]), + tags: { + ...commonTags, + Name: "pathfinder-migration-task", + Type: "migration", + }, +}, { + dependsOn: [migrationImage, db, executionRole, logGroup], +}); + +// Run migrations as ECS task in private subnet (has database access) +const runMigrations = new command.local.Command("run-migrations", { + create: pulumi.interpolate` + echo "🚀 Running database migrations via ECS task..." + + # Run migration task in private subnet where it can access the database + aws ecs run-task \ + --cluster ${cluster.name} \ + --task-definition ${migrationTaskDefinition.arn} \ + --launch-type FARGATE \ + --network-configuration 'awsvpcConfiguration={subnets=[${privateSubnet1.id},${privateSubnet2.id}],securityGroups=[${serviceSecurityGroup.id}],assignPublicIp=ENABLED}' \ + --region ${aws.getRegionOutput().name} + + echo "✅ Database migration task started (check ECS console for status)" + `, +}, { + dependsOn: [migrationTaskDefinition, cluster, privateSubnet1, privateSubnet2, serviceSecurityGroup] +}); + +// STAGE 2: App image (builds AFTER migrations succeed) +const appImage = new awsx.ecr.Image("pathfinder-app-image", { + repositoryUrl: repo.url, + context: "../web", // Build from web directory + platform: "linux/amd64", + // No database access during build - app will fetch data at runtime + // (Private database cannot be accessed during local build process) +}, { + dependsOn: [runMigrations] // Wait for migrations to complete before building app +}); + +// Clean 2-stage pipeline: +// Stage 1: Migration image → Run migrations ✅ +// Stage 2: App image (with DB access) → Deploy ECS ✅ + +// ECS Service - simple app deployment (migrations already completed) +const service = new awsx.ecs.FargateService("pathfinder-service", { + cluster: cluster.arn, + networkConfiguration: { + subnets: privateSubnetIds, + securityGroups: [serviceSecurityGroup.id], + assignPublicIp: true, // Needed to pull images from ECR + }, + desiredCount: 2, + taskDefinitionArgs: { + executionRole: { + roleArn: executionRole.arn, + }, + containers: { + // Main application container (migrations already completed in build stage) + "pathfinder-app": { + name: "pathfinder-app", + image: appImage.imageUri, + cpu: 1024, // 1 vCPU + memory: 2048, // 2GB + essential: true, + environment: [ + { + name: "HOSTNAME", + value: "0.0.0.0", // Critical: bind to all interfaces, not just localhost + }, + { + name: "PORT", + value: "3000", + }, + { + name: "DATABASE_URL", + value: pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}?sslmode=require`, + }, + { + name: "NODE_ENV", + value: "production", + }, + { + name: "ENABLE_DEBUG_ENDPOINTS", + value: "true", // Temporary: for debugging environment variables + }, + ], + portMappings: [ + { + containerPort: 3000, + targetGroup: lb.defaultTargetGroup, + }, + ], + logConfiguration: { + logDriver: "awslogs", + options: { + "awslogs-group": logGroup.name, + "awslogs-region": aws.getRegionOutput().name, + "awslogs-stream-prefix": "pathfinder-app", + }, + }, + }, + }, + }, +}, { + dependsOn: [appImage] // Wait for app image to be built (which waits for migrations) +}); + +// Database is private - only accessible from within VPC + +// ========================================== +// AUTO-SCALING CONFIGURATION +// Automatically scale ECS tasks based on CPU +// ========================================== + +const scaling = new aws.appautoscaling.Target("pathfinder-scaling", { + maxCapacity: 10, + minCapacity: 2, + resourceId: pulumi.interpolate`service/${cluster.name}/${service.service.name}`, + scalableDimension: "ecs:service:DesiredCount", + serviceNamespace: "ecs", +}); + +const scalingPolicy = new aws.appautoscaling.Policy( + "pathfinder-scaling-policy", + { + policyType: "TargetTrackingScaling", + resourceId: scaling.resourceId, + scalableDimension: scaling.scalableDimension, + serviceNamespace: scaling.serviceNamespace, + targetTrackingScalingPolicyConfiguration: { + targetValue: 50, // Scale at 50% CPU + predefinedMetricSpecification: { + predefinedMetricType: "ECSServiceAverageCPUUtilization", + }, + }, + } +); + +// No complex monitoring - keep it simple! + +// No external logging complexity - keep it simple! + +// ========================================== +// STACK OUTPUTS +// Values accessible after deployment +// ========================================== + +export const url = lb.loadBalancer.dnsName.apply((dns) => `http://${dns}`); +export const dbEndpoint = db.endpoint; +export const dbConnectionString = pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}?sslmode=require`; +// Export password as a secret - only visible via CLI with --show-secrets flag +export const dbPasswordSecret = pulumi.secret(dbPassword.result); +export const dbUsername = db.username; + +// Migration information - runs during build stage +export const migrationStatus = runMigrations.stdout; + +// Simplified build - no CodeBuild needed! +export const ecrRepositoryUrl = repo.url; diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts new file mode 100644 index 000000000..8bf1f7a4d --- /dev/null +++ b/apps/infra/modules/build.ts @@ -0,0 +1,241 @@ +import * as aws from '@pulumi/aws'; +import * as pulumi from '@pulumi/pulumi'; +import { CommonConfig, ContainerOutputs, DatabaseOutputs, NetworkOutputs } from '../types'; + +export function createBuildSystem( + config: CommonConfig, + network: NetworkOutputs, + database: DatabaseOutputs, + container: ContainerOutputs, +) { + const { commonTags } = config; + + // IAM Service Role for CodeBuild + const codebuildRole = new aws.iam.Role(`${config.projectName}-codebuild-role`, { + name: `${config.projectName}-codebuild-role`, + assumeRolePolicy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Action: 'sts:AssumeRole', + Effect: 'Allow', + Principal: { + Service: 'codebuild.amazonaws.com', + }, + }, + ], + }), + tags: { + ...commonTags, + Name: `${config.projectName}-codebuild-role`, + Type: 'iam-role', + }, + }); + + // CodeBuild policy for basic operations + const codebuildPolicy = new aws.iam.RolePolicy(`${config.projectName}-codebuild-policy`, { + role: codebuildRole.id, + policy: database.secretArn.apply((secretArn) => + JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: ['logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents'], + Resource: 'arn:aws:logs:*:*:*', + }, + { + Effect: 'Allow', + Action: [ + 'ecr:BatchCheckLayerAvailability', + 'ecr:GetDownloadUrlForLayer', + 'ecr:BatchGetImage', + 'ecr:GetAuthorizationToken', + 'ecr:PutImage', + 'ecr:InitiateLayerUpload', + 'ecr:UploadLayerPart', + 'ecr:CompleteLayerUpload', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: [ + 'ec2:CreateNetworkInterface', + 'ec2:DescribeDhcpOptions', + 'ec2:DescribeNetworkInterfaces', + 'ec2:DeleteNetworkInterface', + 'ec2:DescribeSubnets', + 'ec2:DescribeSecurityGroups', + 'ec2:DescribeVpcs', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: ['ec2:CreateNetworkInterfacePermission'], + Resource: '*', + }, + { + Effect: 'Allow', + Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], + Resource: secretArn, + }, + ], + }), + ), + }); + + // CodeBuild project for building application image (requires database access) + const appProject = new aws.codebuild.Project(`${config.projectName}-app-build`, { + name: `${config.projectName}-app-build`, + description: 'Build application Docker image with database access', + serviceRole: codebuildRole.arn, + artifacts: { + type: 'NO_ARTIFACTS', + }, + environment: { + computeType: 'BUILD_GENERAL1_MEDIUM', + image: 'aws/codebuild/standard:7.0', + type: 'LINUX_CONTAINER', + privilegedMode: true, // Required for Docker builds + environmentVariables: [ + { + name: 'AWS_ACCOUNT_ID', + value: aws.getCallerIdentityOutput().accountId, + type: 'PLAINTEXT', + }, + { + name: 'IMAGE_REPO_NAME', + value: config.projectName, + type: 'PLAINTEXT', + }, + { + name: 'DATABASE_URL', + value: database.connectionString, + type: 'PLAINTEXT', + }, + { + name: 'ECR_REPOSITORY_URI', + value: container.repositoryUrl, + type: 'PLAINTEXT', + }, + { + name: 'ECS_CLUSTER_NAME', + value: container.clusterName, + type: 'PLAINTEXT', + }, + { + name: 'ECS_SERVICE_NAME', + value: container.serviceName, + type: 'PLAINTEXT', + }, + { + name: 'AWS_DEFAULT_REGION', + value: config.awsRegion, + type: 'PLAINTEXT', + }, + { + name: 'NODE_ENV', + value: process.env.NODE_ENV || 'production', + type: 'PLAINTEXT', + }, + ], + }, + vpcConfig: { + vpcId: network.vpcId, + subnets: network.privateSubnetIds, + securityGroupIds: [network.securityGroups.codeBuild], + }, + source: { + type: 'GITHUB', + location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, + buildspec: 'apps/web/buildspec.yml', + gitCloneDepth: 1, + }, + tags: { + ...commonTags, + Name: `${config.projectName}-app-build`, + Type: 'codebuild-project', + Purpose: 'application-image-build', + }, + }); + + // Additional IAM permissions for ECS deployment + const ecsDeployPolicy = new aws.iam.RolePolicy(`${config.projectName}-ecs-deploy-policy`, { + role: codebuildRole.id, + policy: pulumi + .all([container.taskExecutionRoleArn, container.taskRoleArn]) + .apply(([taskExecRoleArn, taskRoleArn]: [string, string]) => + JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: [ + 'ecs:UpdateService', + 'ecs:DescribeServices', + 'ecs:DescribeTasks', + 'ecs:DescribeTaskDefinition', + 'ecs:RegisterTaskDefinition', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: ['iam:PassRole'], + Resource: [taskExecRoleArn, taskRoleArn], + }, + ], + }), + ), + }); + + // Application deployment function + function createApplicationDeployment( + app: { + name: string; + contextPath: string; + requiresDatabaseAccess: boolean; + dependsOnMigrations: boolean; + buildCommand: string; + healthCheckPath: string; + environmentVariables: Record; + resourceRequirements: { cpu: number; memory: number }; + scaling: { + minInstances: number; + maxInstances: number; + targetCpuPercent: number; + }; + }, + database: DatabaseOutputs, + container: ContainerOutputs, + ) { + // Return deployment configuration for the application + return { + appName: app.name, + contextPath: app.contextPath, + // Single build command that does everything (migrations + app) + buildCommands: { + // Single step: Run the complete build (migrations + app + deploy) + deployWithMigrations: `aws codebuild start-build --project-name ${appProject.name}`, + }, + // Docker image reference + containerImage: pulumi.interpolate`${container.repositoryUrl}:${app.name}-latest`, + healthCheckPath: app.healthCheckPath, + resourceRequirements: app.resourceRequirements, + scaling: app.scaling, + // Build project reference + buildProject: appProject.name, + }; + } + + return { + appProjectName: appProject.name, + appProjectArn: appProject.arn, + codebuildRoleArn: codebuildRole.arn, + buildInstanceType: 'BUILD_GENERAL1_MEDIUM', + buildTimeout: 20, + createApplicationDeployment, + }; +} diff --git a/apps/infra/modules/config.ts b/apps/infra/modules/config.ts new file mode 100644 index 000000000..5298ab0de --- /dev/null +++ b/apps/infra/modules/config.ts @@ -0,0 +1,217 @@ +import * as pulumi from '@pulumi/pulumi'; +import * as dotenv from 'dotenv'; +import { CommonConfig } from '../types'; + +// Load environment variables from .env file +dotenv.config(); + +export function createConfig(projectName: string): CommonConfig { + if (!process.env.AWS_REGION) { + throw new Error('AWS_REGION is not set'); + } + + if (!process.env.NODE_ENV) { + throw new Error('NODE_ENV is not set'); + } + + if (!process.env.ENABLE_DEBUG_ENDPOINTS) { + throw new Error('ENABLE_DEBUG_ENDPOINTS is not set'); + } + + if (!process.env.GITHUB_ORG) { + throw new Error('GITHUB_ORG is not set'); + } + + if (!process.env.GITHUB_REPO) { + throw new Error('GITHUB_REPO is not set'); + } + + if (!process.env.DOMAIN_NAME) { + throw new Error('DOMAIN_NAME is not set'); + } + + if (!process.env.ENABLE_RDS_READ_REPLICAS) { + throw new Error('ENABLE_RDS_READ_REPLICAS is not set'); + } + + const stack = pulumi.getStack(); // dev, staging, prod + const pulumiConfig = new pulumi.Config(projectName); + + // Feature flags + const enableTailscale = pulumiConfig.getBoolean('enableTailscale') ?? false; + const enableBetterStack = pulumiConfig.getBoolean('enableBetterStack') ?? false; + // const enableDetailedMonitoring = pulumiConfig.getBoolean('enableDetailedMonitoring') ?? false; + + // Base configuration applicable to all environments + const baseConfig = { + projectName, + enableRDSReadReplicas: process.env.ENABLE_RDS_READ_REPLICAS === 'true', + region: process.env.AWS_REGION, + awsRegion: process.env.AWS_REGION, + nodeEnv: process.env.NODE_ENV, + enableDebugEndpoints: process.env.ENABLE_DEBUG_ENDPOINTS === 'true', + domainName: process.env.DOMAIN_NAME, + githubOrg: process.env.GITHUB_ORG, + githubRepo: process.env.GITHUB_REPO, + commonTags: { + Project: projectName, + Environment: stack, + ManagedBy: 'pulumi', + Owner: 'compai', + CreatedDate: new Date().toISOString().split('T')[0], + }, + }; + + // Environment-specific configurations + const environmentConfigs = { + dev: { + database: { + instanceClass: 'db.t3.small', + allocatedStorage: 20, + maxAllocatedStorage: 100, + deletionProtection: false, + backupRetentionPeriod: 3, + }, + scaling: { + minCapacity: 1, + maxCapacity: 3, + targetCpuUtilization: 70, + }, + tailscale: { + instanceType: 't3.nano', + }, + monitoring: { + logRetentionDays: 3, + detailedMonitoring: false, + }, + networking: { + vpcCidr: '10.0.0.0/16', + subnets: { + public: [ + { cidr: '10.0.1.0/24', az: 0 }, + { cidr: '10.0.2.0/24', az: 1 }, + ], + private: [ + { cidr: '10.0.10.0/24', az: 0 }, + { cidr: '10.0.20.0/24', az: 1 }, + ], + }, + }, + security: { + allowedCidrBlocks: ['0.0.0.0/0'], + enableWaf: false, + }, + }, + staging: { + database: { + instanceClass: 'db.t3.small', + allocatedStorage: 50, + maxAllocatedStorage: 200, + deletionProtection: false, + backupRetentionPeriod: 7, + }, + scaling: { + minCapacity: 2, + maxCapacity: 5, + targetCpuUtilization: 60, + }, + tailscale: { + instanceType: 't3.nano', + }, + monitoring: { + logRetentionDays: 7, + detailedMonitoring: true, + }, + networking: { + vpcCidr: '10.1.0.0/16', + subnets: { + public: [ + { cidr: '10.1.1.0/24', az: 0 }, + { cidr: '10.1.2.0/24', az: 1 }, + ], + private: [ + { cidr: '10.1.10.0/24', az: 0 }, + { cidr: '10.1.20.0/24', az: 1 }, + ], + }, + }, + security: { + allowedCidrBlocks: ['0.0.0.0/0'], + enableWaf: true, + }, + }, + prod: { + database: { + instanceClass: 'db.t3.medium', + allocatedStorage: 100, + maxAllocatedStorage: 1000, + deletionProtection: true, + backupRetentionPeriod: 30, + }, + scaling: { + minCapacity: 3, + maxCapacity: 20, + targetCpuUtilization: 50, + }, + tailscale: { + instanceType: 't3.small', // Slightly larger for prod + }, + monitoring: { + logRetentionDays: 30, + detailedMonitoring: true, + }, + networking: { + vpcCidr: '10.2.0.0/16', + subnets: { + public: [ + { cidr: '10.2.1.0/24', az: 0 }, + { cidr: '10.2.2.0/24', az: 1 }, + ], + private: [ + { cidr: '10.2.10.0/24', az: 0 }, + { cidr: '10.2.20.0/24', az: 1 }, + ], + }, + }, + security: { + allowedCidrBlocks: ['0.0.0.0/0'], + enableWaf: true, + }, + }, + }; + + const envConfig = + environmentConfigs[stack as keyof typeof environmentConfigs] || environmentConfigs.dev; + + return { + ...baseConfig, + // Merge environment-specific config directly + dbInstanceClass: envConfig.database.instanceClass, + dbAllocatedStorage: envConfig.database.allocatedStorage, + dbMaxAllocatedStorage: envConfig.database.maxAllocatedStorage, + dbBackupRetentionPeriod: envConfig.database.backupRetentionPeriod, + dbDeletionProtection: envConfig.database.deletionProtection, + logRetentionDays: envConfig.monitoring.logRetentionDays, + networkConfig: envConfig.networking, + securityConfig: envConfig.security, + + // Load sensitive configuration from Pulumi config (only if features enabled) + tailscale: enableTailscale + ? { + apiKey: new pulumi.Config('tailscale').getSecret('apiKey') || pulumi.output('NOT_SET'), + tailnet: new pulumi.Config('tailscale').get('tailnet') || 'NOT_SET', + authKey: new pulumi.Config('tailscale').getSecret('authKey') || pulumi.output('NOT_SET'), + } + : undefined, + betterStack: enableBetterStack + ? { + entrypoint: + new pulumi.Config('betterstack').getSecret('entrypoint') || pulumi.output('NOT_SET'), + sourceToken: + new pulumi.Config('betterstack').getSecret('sourceToken') || pulumi.output('NOT_SET'), + } + : undefined, + }; +} + +// Removed duplicate feature flags - they're now handled in createConfig() function diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts new file mode 100644 index 000000000..92a4f72e7 --- /dev/null +++ b/apps/infra/modules/container.ts @@ -0,0 +1,309 @@ +import * as aws from '@pulumi/aws'; +import * as pulumi from '@pulumi/pulumi'; +import { CommonConfig, DatabaseOutputs, LoadBalancerOutputs, NetworkOutputs } from '../types'; + +export function createContainer( + config: CommonConfig, + network: NetworkOutputs, + database: DatabaseOutputs, + loadBalancer?: LoadBalancerOutputs, +) { + const { commonTags } = config; + + // ECR Repository for container images + const repository = new aws.ecr.Repository(`${config.projectName}-repository`, { + name: config.projectName, + imageTagMutability: 'MUTABLE', + imageScanningConfiguration: { + scanOnPush: true, + }, + encryptionConfigurations: [ + { + encryptionType: 'AES256', + }, + ], + tags: { + ...commonTags, + Name: `${config.projectName}-repository`, + Type: 'ecr-repository', + }, + }); + + // ECR Lifecycle Policy + const lifecyclePolicy = new aws.ecr.LifecyclePolicy(`${config.projectName}-lifecycle-policy`, { + repository: repository.name, + policy: JSON.stringify({ + rules: [ + { + rulePriority: 1, + description: 'Keep last 10 production images', + selection: { + tagStatus: 'tagged', + tagPrefixList: ['prod'], + countType: 'imageCountMoreThan', + countNumber: 10, + }, + action: { + type: 'expire', + }, + }, + { + rulePriority: 2, + description: 'Keep last 5 development images', + selection: { + tagStatus: 'tagged', + tagPrefixList: ['dev'], + countType: 'imageCountMoreThan', + countNumber: 5, + }, + action: { + type: 'expire', + }, + }, + { + rulePriority: 3, + description: 'Delete untagged images older than 1 day', + selection: { + tagStatus: 'untagged', + countType: 'sinceImagePushed', + countUnit: 'days', + countNumber: 1, + }, + action: { + type: 'expire', + }, + }, + ], + }), + }); + + // ECS Cluster + const cluster = new aws.ecs.Cluster(`${config.projectName}-cluster`, { + name: config.projectName, + settings: [ + { + name: 'containerInsights', + value: 'enabled', + }, + ], + tags: { + ...commonTags, + Name: `${config.projectName}-cluster`, + Type: 'ecs-cluster', + }, + }); + + // CloudWatch Log Group for application logs + const logGroup = new aws.cloudwatch.LogGroup(`${config.projectName}-app-logs`, { + name: `/aws/ecs/${config.projectName}`, + retentionInDays: config.logRetentionDays, + tags: { + ...commonTags, + Name: `${config.projectName}-app-logs`, + Type: 'log-group', + }, + }); + + // ECS Task Execution Role + const taskExecutionRole = new aws.iam.Role(`${config.projectName}-task-execution-role`, { + name: `${config.projectName}-ecs-task-execution-role`, + assumeRolePolicy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Action: 'sts:AssumeRole', + Effect: 'Allow', + Principal: { + Service: 'ecs-tasks.amazonaws.com', + }, + }, + ], + }), + tags: { + ...commonTags, + Name: `${config.projectName}-task-execution-role`, + Type: 'iam-role', + }, + }); + + // Attach the ECS task execution role policy + const taskExecutionRolePolicyAttachment = new aws.iam.RolePolicyAttachment( + `${config.projectName}-task-execution-role-policy`, + { + role: taskExecutionRole.name, + policyArn: 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', + }, + ); + + // Add policy for Secrets Manager access to task execution role + const taskExecutionSecretsPolicy = new aws.iam.RolePolicy( + `${config.projectName}-task-execution-secrets-policy`, + { + role: taskExecutionRole.id, + policy: database.secretArn.apply((secretArn) => + JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], + Resource: secretArn, + }, + ], + }), + ), + }, + ); + + // ECS Task Role for application permissions + const taskRole = new aws.iam.Role(`${config.projectName}-task-role`, { + name: `${config.projectName}-ecs-task-role`, + assumeRolePolicy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Action: 'sts:AssumeRole', + Effect: 'Allow', + Principal: { + Service: 'ecs-tasks.amazonaws.com', + }, + }, + ], + }), + tags: { + ...commonTags, + Name: `${config.projectName}-task-role`, + Type: 'iam-role', + }, + }); + + // Task Role Policy for application access + const taskRolePolicy = new aws.iam.RolePolicy(`${config.projectName}-task-role-policy`, { + role: taskRole.id, + policy: logGroup.arn.apply((logGroupArn) => + JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], + Resource: '*', + }, + { + Effect: 'Allow', + Action: ['logs:CreateLogStream', 'logs:PutLogEvents'], + Resource: logGroupArn, + }, + ], + }), + ), + }); + + // ECS Task Definition + const taskDefinition = new aws.ecs.TaskDefinition(`${config.projectName}-task`, { + family: config.projectName, + networkMode: 'awsvpc', + requiresCompatibilities: ['FARGATE'], + cpu: '1024', + memory: '2048', + executionRoleArn: taskExecutionRole.arn, + taskRoleArn: taskRole.arn, + containerDefinitions: pulumi + .all([repository.repositoryUrl, logGroup.name, database.secretArn]) + .apply(([repoUrl, logGroupName, secretArn]: [string, string, string]) => + JSON.stringify([ + { + name: `${config.projectName}-app`, + image: `${repoUrl}:latest`, + essential: true, + portMappings: [ + { + containerPort: 3000, + protocol: 'tcp', + }, + ], + environment: [ + { + name: 'NODE_ENV', + value: 'production', + }, + { + name: 'PORT', + value: '3000', + }, + ], + secrets: [ + { + name: 'DATABASE_URL', + valueFrom: secretArn, + }, + ], + logConfiguration: { + logDriver: 'awslogs', + options: { + 'awslogs-group': logGroupName, + 'awslogs-region': config.awsRegion, + 'awslogs-stream-prefix': 'ecs', + }, + }, + healthCheck: { + command: ['CMD-SHELL', 'curl -f http://localhost:3000/health || exit 1'], + interval: 30, + timeout: 5, + retries: 3, + startPeriod: 60, + }, + }, + ]), + ), + tags: { + ...commonTags, + Name: `${config.projectName}-task`, + Type: 'ecs-task-definition', + }, + }); + + // ECS Service + const service = new aws.ecs.Service(`${config.projectName}-service`, { + name: config.projectName, + cluster: cluster.id, + taskDefinition: taskDefinition.arn, + desiredCount: 2, + launchType: 'FARGATE', + platformVersion: 'LATEST', + networkConfiguration: { + subnets: network.privateSubnetIds, + securityGroups: [network.securityGroups.ecs], + assignPublicIp: false, + }, + enableExecuteCommand: true, + // Attach to load balancer if provided + loadBalancers: loadBalancer + ? [ + { + targetGroupArn: loadBalancer.targetGroupArn, + containerName: `${config.projectName}-app`, + containerPort: 3000, + }, + ] + : undefined, + tags: { + ...commonTags, + Name: `${config.projectName}-service`, + Type: 'ecs-service', + }, + }); + + return { + clusterName: cluster.name, + clusterArn: cluster.arn, + serviceName: service.name, + repositoryUrl: repository.repositoryUrl, + repositoryArn: repository.arn, + taskDefinitionArn: taskDefinition.arn, + logGroupName: logGroup.name, + logGroupArn: logGroup.arn, + taskExecutionRoleArn: taskExecutionRole.arn, + taskRoleArn: taskRole.arn, + }; +} diff --git a/apps/infra/modules/database.ts b/apps/infra/modules/database.ts new file mode 100644 index 000000000..7adafcbf0 --- /dev/null +++ b/apps/infra/modules/database.ts @@ -0,0 +1,241 @@ +import * as aws from '@pulumi/aws'; +import * as pulumi from '@pulumi/pulumi'; +import * as random from '@pulumi/random'; +import { CommonConfig, NetworkOutputs } from '../types'; + +export function createDatabase(config: CommonConfig, network: NetworkOutputs) { + const { commonTags } = config; + + // Generate a secure random password for the database (alphanumeric only - no special chars) + const dbPassword = new random.RandomPassword(`${config.projectName}-db-password`, { + length: 32, + special: false, + upper: true, + lower: true, + numeric: true, + // No override needed - upper/lower/numeric gives us alphanumeric + }); + + // Create AWS Secret for database credentials (will be populated after RDS instance is created) + const dbSecret = new aws.secretsmanager.Secret(`${config.projectName}-db-secret`, { + name: `${config.projectName}/database/master-password`, + description: 'Complete DATABASE_URL for PostgreSQL database', + tags: { + ...commonTags, + Name: `${config.projectName}-db-secret`, + Type: 'secret', + }, + }); + + // Database subnet group in private subnets only + const dbSubnetGroup = new aws.rds.SubnetGroup(`${config.projectName}-db-subnet-group`, { + subnetIds: network.privateSubnetIds, + description: 'Subnet group for private database access', + tags: { + ...commonTags, + Name: `${config.projectName}-db-subnet-group`, + Type: 'db-subnet-group', + }, + }); + + // Enhanced monitoring role for RDS + const enhancedMonitoringRole = new aws.iam.Role(`${config.projectName}-rds-monitoring-role`, { + assumeRolePolicy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Action: 'sts:AssumeRole', + Effect: 'Allow', + Principal: { + Service: 'monitoring.rds.amazonaws.com', + }, + }, + ], + }), + tags: { + ...commonTags, + Name: `${config.projectName}-rds-monitoring-role`, + Type: 'iam-role', + }, + }); + + const enhancedMonitoringRoleAttachment = new aws.iam.RolePolicyAttachment( + `${config.projectName}-rds-monitoring-policy`, + { + role: enhancedMonitoringRole.name, + policyArn: 'arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole', + }, + ); + + // DB parameter group for PostgreSQL optimization + const dbParameterGroup = new aws.rds.ParameterGroup(`${config.projectName}-db-params`, { + family: 'postgres15', + description: 'Custom parameter group for PostgreSQL database', + parameters: [ + { + name: 'shared_preload_libraries', + value: 'pg_stat_statements', + }, + { + name: 'log_statement', + value: 'all', + }, + { + name: 'log_min_duration_statement', + value: '1000', + }, + ], + tags: { + ...commonTags, + Name: `${config.projectName}-db-params`, + Type: 'db-parameter-group', + }, + }); + + // Primary RDS instance in private subnets + const dbInstance = new aws.rds.Instance(`${config.projectName}-database-v2`, { + engine: 'postgres', + engineVersion: '15.8', + instanceClass: config.dbInstanceClass || 'db.t3.micro', + allocatedStorage: config.dbAllocatedStorage || 20, + maxAllocatedStorage: config.dbMaxAllocatedStorage || 100, + storageType: 'gp3', + storageEncrypted: true, + + dbName: `default`, + username: `admin`, + password: dbPassword.result, + + vpcSecurityGroupIds: [network.securityGroups.database], + dbSubnetGroupName: dbSubnetGroup.name, + parameterGroupName: dbParameterGroup.name, + + publiclyAccessible: false, + multiAz: false, + + backupRetentionPeriod: config.dbBackupRetentionPeriod || 7, + backupWindow: '03:00-04:00', + maintenanceWindow: 'Sun:04:00-Sun:05:00', + + deletionProtection: config.dbDeletionProtection || false, + skipFinalSnapshot: !config.dbDeletionProtection, + finalSnapshotIdentifier: config.dbDeletionProtection + ? `${config.projectName}-final-snapshot` + : undefined, + + monitoringInterval: 60, + monitoringRoleArn: enhancedMonitoringRole.arn, + enabledCloudwatchLogsExports: ['postgresql'], + + performanceInsightsEnabled: true, + performanceInsightsRetentionPeriod: 7, + + tags: { + ...commonTags, + Name: `${config.projectName}-database`, + Type: 'rds-instance', + }, + }); + + // Store the complete DATABASE_URL in the secret after instance is created + const dbSecretVersion = new aws.secretsmanager.SecretVersion( + `${config.projectName}-db-secret-version`, + { + secretId: dbSecret.id, + secretString: dbInstance.endpoint.apply( + (endpoint) => + `postgresql://admin:${dbPassword.result}@${endpoint}:5432/default?sslmode=require`, + ), + }, + ); + + // Read replica for production environment + const readReplica = config.enableRDSReadReplicas + ? new aws.rds.Instance(`${config.projectName}-db-read-replica`, { + replicateSourceDb: dbInstance.id, + instanceClass: config.dbInstanceClass || 'db.t3.micro', + publiclyAccessible: false, + + monitoringInterval: 60, + monitoringRoleArn: enhancedMonitoringRole.arn, + + tags: { + ...commonTags, + Name: `${config.projectName}-db-read-replica`, + Type: 'rds-read-replica', + }, + }) + : undefined; + + // CloudWatch log group for database logs + const dbLogGroup = new aws.cloudwatch.LogGroup(`${config.projectName}-db-logs`, { + name: pulumi.interpolate`/aws/rds/instance/${dbInstance.id}/postgresql`, + retentionInDays: config.logRetentionDays || 14, + tags: { + ...commonTags, + Name: `${config.projectName}-db-logs`, + Type: 'log-group', + }, + }); + + // Database connection alarms + const dbConnectionAlarm = new aws.cloudwatch.MetricAlarm( + `${config.projectName}-db-connection-alarm`, + { + name: `${config.projectName}-database-high-connections`, + comparisonOperator: 'GreaterThanThreshold', + evaluationPeriods: 2, + metricName: 'DatabaseConnections', + namespace: 'AWS/RDS', + period: 300, + statistic: 'Average', + threshold: 40, + treatMissingData: 'notBreaching', + dimensions: { + DBInstanceIdentifier: dbInstance.id, + }, + tags: { + ...commonTags, + Name: `${config.projectName}-db-connection-alarm`, + Type: 'cloudwatch-alarm', + }, + }, + ); + + const dbCpuAlarm = new aws.cloudwatch.MetricAlarm(`${config.projectName}-db-cpu-alarm`, { + name: `${config.projectName}-database-high-cpu`, + comparisonOperator: 'GreaterThanThreshold', + evaluationPeriods: 3, + metricName: 'CPUUtilization', + namespace: 'AWS/RDS', + period: 300, + statistic: 'Average', + threshold: 80, + treatMissingData: 'notBreaching', + dimensions: { + DBInstanceIdentifier: dbInstance.id, + }, + tags: { + ...commonTags, + Name: `${config.projectName}-db-cpu-alarm`, + Type: 'cloudwatch-alarm', + }, + }); + + // Return database outputs + return { + instanceId: dbInstance.id, + endpoint: dbInstance.endpoint, + port: dbInstance.port, + dbName: dbInstance.dbName, + username: dbInstance.username, + password: dbPassword.result, + secretArn: dbSecret.arn, + secretId: dbSecret.id, + connectionString: pulumi.interpolate`postgresql://${dbInstance.username}:${dbPassword.result}@${dbInstance.endpoint}/${dbInstance.dbName}?sslmode=require`, + readReplicaEndpoint: readReplica?.endpoint, + logGroupName: dbLogGroup.name, + connectionAlarmArn: dbConnectionAlarm.arn, + cpuAlarmArn: dbCpuAlarm.arn, + }; +} diff --git a/apps/infra/modules/github-oidc.ts b/apps/infra/modules/github-oidc.ts new file mode 100644 index 000000000..82faadb81 --- /dev/null +++ b/apps/infra/modules/github-oidc.ts @@ -0,0 +1,236 @@ +import * as aws from '@pulumi/aws'; +import { CommonConfig } from '../types'; + +export function createGithubOidc(config: CommonConfig) { + const { commonTags } = config; + + // GitHub OIDC Provider for GitHub Actions + const githubOidcProvider = new aws.iam.OpenIdConnectProvider( + `${config.projectName}-github-oidc-provider`, + { + url: 'https://token.actions.githubusercontent.com', + clientIdLists: ['sts.amazonaws.com'], + thumbprintLists: [ + '6938fd4d98bab03faadb97b34396831e3780aea1', // GitHub Actions OIDC thumbprint + '1c58a3a8518e8759bf075b76b750d4f2df264fcd', // Backup thumbprint + ], + tags: { + ...commonTags, + Name: 'github-oidc-provider', + Type: 'oidc-provider', + }, + }, + ); + + // Deployment Role for GitHub Actions (read-write access) + const deploymentRole = new aws.iam.Role('github-deployment-role', { + name: `${config.projectName}-github-deployment-role`, + assumeRolePolicy: githubOidcProvider.arn.apply((providerArn) => + JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Principal: { + Federated: providerArn, + }, + Action: 'sts:AssumeRoleWithWebIdentity', + Condition: { + StringEquals: { + 'token.actions.githubusercontent.com:aud': 'sts.amazonaws.com', + }, + StringLike: { + 'token.actions.githubusercontent.com:sub': `repo:${config.githubOrg}/${config.githubRepo}:*`, + }, + }, + }, + ], + }), + ), + tags: { + ...commonTags, + Name: 'github-deployment-role', + Type: 'iam-role', + Purpose: 'github-deployment', + }, + }); + + // Build Role for GitHub Actions (CodeBuild access) + const buildRole = new aws.iam.Role('github-build-role', { + name: `${config.projectName}-github-build-role`, + assumeRolePolicy: githubOidcProvider.arn.apply((providerArn) => + JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Principal: { + Federated: providerArn, + }, + Action: 'sts:AssumeRoleWithWebIdentity', + Condition: { + StringEquals: { + 'token.actions.githubusercontent.com:aud': 'sts.amazonaws.com', + }, + StringLike: { + 'token.actions.githubusercontent.com:sub': `repo:${config.githubOrg}/${config.githubRepo}:*`, + }, + }, + }, + ], + }), + ), + tags: { + ...commonTags, + Name: 'github-build-role', + Type: 'iam-role', + Purpose: 'github-build', + }, + }); + + // Read-only Role for GitHub Actions (status checks, etc.) + const readOnlyRole = new aws.iam.Role('github-readonly-role', { + name: `${config.projectName}-github-readonly-role`, + assumeRolePolicy: githubOidcProvider.arn.apply((providerArn) => + JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Principal: { + Federated: providerArn, + }, + Action: 'sts:AssumeRoleWithWebIdentity', + Condition: { + StringEquals: { + 'token.actions.githubusercontent.com:aud': 'sts.amazonaws.com', + }, + StringLike: { + 'token.actions.githubusercontent.com:sub': `repo:${config.githubOrg}/${config.githubRepo}:*`, + }, + }, + }, + ], + }), + ), + tags: { + ...commonTags, + Name: 'github-readonly-role', + Type: 'iam-role', + Purpose: 'github-readonly', + }, + }); + + // Deployment Role Policies + const deploymentRolePolicy = new aws.iam.RolePolicy('github-deployment-policy', { + role: deploymentRole.id, + policy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: [ + 'ecs:UpdateService', + 'ecs:DescribeServices', + 'ecs:DescribeTasks', + 'ecs:DescribeTaskDefinition', + 'ecs:RegisterTaskDefinition', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: [ + 'ecr:GetAuthorizationToken', + 'ecr:BatchCheckLayerAvailability', + 'ecr:GetDownloadUrlForLayer', + 'ecr:BatchGetImage', + 'ecr:PutImage', + 'ecr:InitiateLayerUpload', + 'ecr:UploadLayerPart', + 'ecr:CompleteLayerUpload', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: [ + 'logs:CreateLogGroup', + 'logs:CreateLogStream', + 'logs:PutLogEvents', + 'logs:DescribeLogGroups', + 'logs:DescribeLogStreams', + ], + Resource: '*', + }, + ], + }), + }); + + // Build Role Policies + const buildRolePolicy = new aws.iam.RolePolicy('github-build-policy', { + role: buildRole.id, + policy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: [ + 'codebuild:StartBuild', + 'codebuild:BatchGetBuilds', + 'codebuild:BatchGetProjects', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: ['logs:GetLogEvents', 'logs:DescribeLogGroups', 'logs:DescribeLogStreams'], + Resource: '*', + }, + ], + }), + }); + + // Read-only Role Policies + const readOnlyRolePolicy = new aws.iam.RolePolicy('github-readonly-policy', { + role: readOnlyRole.id, + policy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: [ + 'ecs:DescribeServices', + 'ecs:DescribeTasks', + 'ecs:DescribeTaskDefinition', + 'ecs:ListTasks', + 'ecs:ListServices', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: [ + 'cloudwatch:GetMetricStatistics', + 'cloudwatch:DescribeAlarms', + 'cloudwatch:GetDashboard', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: ['logs:DescribeLogGroups', 'logs:DescribeLogStreams', 'logs:GetLogEvents'], + Resource: '*', + }, + ], + }), + }); + + return { + providerArn: githubOidcProvider.arn, + providerUrl: githubOidcProvider.url, + deploymentRoleArn: deploymentRole.arn, + buildRoleArn: buildRole.arn, + readOnlyRoleArn: readOnlyRole.arn, + }; +} diff --git a/apps/infra/modules/loadbalancer.ts b/apps/infra/modules/loadbalancer.ts new file mode 100644 index 000000000..d9b3f5032 --- /dev/null +++ b/apps/infra/modules/loadbalancer.ts @@ -0,0 +1,41 @@ +import * as awsx from '@pulumi/awsx'; +import { CommonConfig, NetworkOutputs } from '../types'; + +export function createLoadBalancer(config: CommonConfig, network: NetworkOutputs) { + const { commonTags } = config; + + // Simple working load balancer (copied from legacy) + const lb = new awsx.lb.ApplicationLoadBalancer(`${config.projectName}-lb`, { + subnetIds: network.publicSubnetIds, + securityGroups: [network.securityGroups.alb], + tags: { + ...commonTags, + Name: `${config.projectName}-lb`, + Type: 'application-load-balancer', + }, + defaultTargetGroup: { + port: 3000, + protocol: 'HTTP', + targetType: 'ip', // Required for Fargate + healthCheck: { + enabled: true, + path: '/', + healthyThreshold: 2, + unhealthyThreshold: 3, + timeout: 30, + interval: 60, + matcher: '200', + }, + }, + }); + + return { + albArn: lb.loadBalancer.arn, + albDnsName: lb.loadBalancer.dnsName, + albZoneId: lb.loadBalancer.zoneId, + targetGroupArn: lb.defaultTargetGroup.arn, + applicationUrl: lb.loadBalancer.dnsName.apply((dns) => `http://${dns}`), + healthCheckUrl: lb.loadBalancer.dnsName.apply((dns) => `http://${dns}/health`), + certificateArn: undefined, + }; +} diff --git a/apps/infra/modules/monitoring.ts b/apps/infra/modules/monitoring.ts new file mode 100644 index 000000000..1fc867731 --- /dev/null +++ b/apps/infra/modules/monitoring.ts @@ -0,0 +1,403 @@ +import * as aws from '@pulumi/aws'; +import * as pulumi from '@pulumi/pulumi'; +import { CommonConfig, ContainerOutputs, DatabaseOutputs, LoadBalancerOutputs } from '../types'; + +interface MonitoringOptions { + enableBetterStack?: boolean; + enableDetailedMonitoring?: boolean; +} + +export function createMonitoring( + config: CommonConfig, + database: DatabaseOutputs, + container: ContainerOutputs, + loadBalancer: LoadBalancerOutputs, + options: MonitoringOptions = {}, +) { + const { commonTags } = config; + const { enableBetterStack = false, enableDetailedMonitoring = true } = options; + + // CloudWatch Dashboard for Application Monitoring + const applicationDashboard = new aws.cloudwatch.Dashboard(`${config.projectName}-app-dashboard`, { + dashboardName: `${config.projectName}-application`, + dashboardBody: JSON.stringify({ + widgets: [ + { + type: 'metric', + x: 0, + y: 0, + width: 12, + height: 6, + properties: { + metrics: [ + ['AWS/ApplicationELB', 'RequestCount', 'LoadBalancer', loadBalancer.albArn], + ['.', 'TargetResponseTime', '.', '.'], + ['.', 'HTTPCode_Target_2XX_Count', '.', '.'], + ['.', 'HTTPCode_Target_4XX_Count', '.', '.'], + ['.', 'HTTPCode_Target_5XX_Count', '.', '.'], + ], + view: 'timeSeries', + stacked: false, + region: config.awsRegion, + title: 'Application Load Balancer Metrics', + period: 300, + }, + }, + { + type: 'metric', + x: 0, + y: 6, + width: 12, + height: 6, + properties: { + metrics: [ + [ + 'AWS/ECS', + 'CPUUtilization', + 'ServiceName', + container.serviceName, + 'ClusterName', + container.clusterName, + ], + ['.', 'MemoryUtilization', '.', '.', '.', '.'], + ], + view: 'timeSeries', + stacked: false, + region: config.awsRegion, + title: 'ECS Service Metrics', + period: 300, + }, + }, + { + type: 'metric', + x: 0, + y: 12, + width: 12, + height: 6, + properties: { + metrics: [ + ['AWS/RDS', 'CPUUtilization', 'DBInstanceIdentifier', database.instanceId], + ['.', 'DatabaseConnections', '.', '.'], + ['.', 'ReadLatency', '.', '.'], + ['.', 'WriteLatency', '.', '.'], + ], + view: 'timeSeries', + stacked: false, + region: config.awsRegion, + title: 'Database Metrics', + period: 300, + }, + }, + ], + }), + }); + + // Infrastructure Dashboard + const infrastructureDashboard = new aws.cloudwatch.Dashboard( + `${config.projectName}-infra-dashboard`, + { + dashboardName: `${config.projectName}-infrastructure`, + dashboardBody: JSON.stringify({ + widgets: [ + { + type: 'metric', + x: 0, + y: 0, + width: 12, + height: 6, + properties: { + metrics: [ + [ + 'AWS/ECS', + 'RunningTaskCount', + 'ServiceName', + container.serviceName, + 'ClusterName', + container.clusterName, + ], + ['.', 'DesiredCount', '.', '.', '.', '.'], + ], + view: 'timeSeries', + stacked: false, + region: config.awsRegion, + title: 'ECS Task Counts', + period: 300, + }, + }, + { + type: 'metric', + x: 0, + y: 6, + width: 12, + height: 6, + properties: { + metrics: [ + [ + 'AWS/ApplicationELB', + 'HealthyHostCount', + 'TargetGroup', + loadBalancer.targetGroupArn, + ], + ['.', 'UnHealthyHostCount', '.', '.'], + ], + view: 'timeSeries', + stacked: false, + region: config.awsRegion, + title: 'Target Group Health', + period: 300, + }, + }, + ], + }), + }, + ); + + // Custom Metrics Lambda Function + const customMetricsRole = new aws.iam.Role(`${config.projectName}-custom-metrics-role`, { + name: `${config.projectName}-custom-metrics-role`, + assumeRolePolicy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Action: 'sts:AssumeRole', + Effect: 'Allow', + Principal: { + Service: 'lambda.amazonaws.com', + }, + }, + ], + }), + tags: { + ...commonTags, + Name: 'custom-metrics-role', + Type: 'iam-role', + }, + }); + + const customMetricsPolicy = new aws.iam.RolePolicy( + `${config.projectName}-custom-metrics-policy`, + { + role: customMetricsRole.id, + policy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: ['logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents'], + Resource: 'arn:aws:logs:*:*:*', + }, + { + Effect: 'Allow', + Action: ['cloudwatch:PutMetricData'], + Resource: '*', + }, + { + Effect: 'Allow', + Action: ['ecs:DescribeServices', 'ecs:DescribeTasks', 'ecs:ListTasks'], + Resource: '*', + }, + { + Effect: 'Allow', + Action: ['rds:DescribeDBInstances'], + Resource: '*', + }, + ], + }), + }, + ); + + const customMetricsFunction = new aws.lambda.Function( + `${config.projectName}-custom-metrics-function`, + { + name: `${config.projectName}-custom-metrics`, + runtime: 'python3.9', + handler: 'index.handler', + role: customMetricsRole.arn, + code: new pulumi.asset.AssetArchive({ + 'index.py': new pulumi.asset.StringAsset(` +import json +import boto3 +import logging + +logger = logging.getLogger() +logger.setLevel(logging.INFO) + +cloudwatch = boto3.client('cloudwatch') +ecs = boto3.client('ecs') +rds = boto3.client('rds') + +def handler(event, context): + try: + # Get ECS service metrics + services = ecs.describe_services( + cluster='${container.clusterName}', + services=['${container.serviceName}'] + ) + + if services['services']: + service = services['services'][0] + running_count = service['runningCount'] + desired_count = service['desiredCount'] + + # Custom metric: Service health ratio + health_ratio = running_count / desired_count if desired_count > 0 else 0 + + cloudwatch.put_metric_data( + Namespace='${config.projectName}/Application', + MetricData=[ + { + 'MetricName': 'ServiceHealthRatio', + 'Value': health_ratio, + 'Unit': 'Percent', + 'Dimensions': [ + { + 'Name': 'Environment', + 'Value': '${config.nodeEnv}' + } + ] + } + ] + ) + + logger.info('Custom metrics published successfully') + return { + 'statusCode': 200, + 'body': json.dumps('Metrics published successfully') + } + + except Exception as e: + logger.error(f'Error publishing metrics: {str(e)}') + return { + 'statusCode': 500, + 'body': json.dumps(f'Error: {str(e)}') + } +`), + }), + timeout: 60, + tags: { + ...commonTags, + Name: 'custom-metrics-function', + Type: 'lambda-function', + }, + }, + ); + + // Schedule custom metrics function + const customMetricsSchedule = new aws.cloudwatch.EventRule( + `${config.projectName}-custom-metrics-schedule`, + { + scheduleExpression: 'rate(5 minutes)', + tags: { + ...commonTags, + Name: 'custom-metrics-schedule', + Type: 'event-rule', + }, + }, + ); + + const customMetricsTarget = new aws.cloudwatch.EventTarget( + `${config.projectName}-custom-metrics-target`, + { + rule: customMetricsSchedule.name, + arn: customMetricsFunction.arn, + }, + ); + + const customMetricsPermission = new aws.lambda.Permission( + `${config.projectName}-custom-metrics-permission`, + { + action: 'lambda:InvokeFunction', + function: customMetricsFunction.name, + principal: 'events.amazonaws.com', + sourceArn: customMetricsSchedule.arn, + }, + ); + + // High Error Rate Alarm + const highErrorRateAlarm = new aws.cloudwatch.MetricAlarm( + `${config.projectName}-high-error-rate-alarm`, + { + name: `${config.projectName}-high-error-rate`, + metricName: 'HTTPCode_Target_5XX_Count', + namespace: 'AWS/ApplicationELB', + statistic: 'Sum', + period: 300, + evaluationPeriods: 2, + threshold: 10, + comparisonOperator: 'GreaterThanThreshold', + dimensions: { + LoadBalancer: loadBalancer.albArn, + }, + tags: { + ...commonTags, + Name: 'high-error-rate-alarm', + Type: 'cloudwatch-alarm', + }, + }, + ); + + // Database Connection Alarm + const databaseConnectionAlarm = new aws.cloudwatch.MetricAlarm( + `${config.projectName}-database-connection-alarm`, + { + name: `${config.projectName}-database-connections`, + metricName: 'DatabaseConnections', + namespace: 'AWS/RDS', + statistic: 'Average', + period: 300, + evaluationPeriods: 2, + threshold: 80, + comparisonOperator: 'GreaterThanThreshold', + dimensions: { + DBInstanceIdentifier: database.instanceId, + }, + tags: { + ...commonTags, + Name: `${config.projectName}-database-connection-alarm`, + Type: 'cloudwatch-alarm', + }, + }, + ); + + // Better Stack Integration (optional) + let betterStackSecret: aws.secretsmanager.Secret | undefined; + let logForwarderFunction: aws.lambda.Function | undefined; + + if (enableBetterStack) { + betterStackSecret = new aws.secretsmanager.Secret(`${config.projectName}-betterstack-secret`, { + name: `${config.projectName}/betterstack/token`, + tags: { + ...commonTags, + Name: `${config.projectName}-betterstack-secret`, + Type: 'secret', + }, + }); + + // Better Stack log forwarder function would go here + // Implementation depends on Better Stack's API + } + + return { + applicationDashboardUrl: applicationDashboard.dashboardName.apply( + (name) => + `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#dashboards:name=${name}`, + ), + infrastructureDashboardUrl: infrastructureDashboard.dashboardName.apply( + (name) => + `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#dashboards:name=${name}`, + ), + applicationLogGroup: container.logGroupName, + logsUrl: container.logGroupName.apply( + (name) => + `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#logsV2:log-groups/log-group/${encodeURIComponent(name)}`, + ), + metricsNamespace: `${config.projectName}/Application`, + customMetricsFunctionArn: customMetricsFunction.arn, + metricsUrl: `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#metricsV2:graph=~();namespace=${config.projectName}/Application`, + highErrorRateAlarmArn: highErrorRateAlarm.arn, + databaseConnectionAlarmArn: databaseConnectionAlarm.arn, + alarmsUrl: `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#alarmsV2:`, + logForwarderFunctionArn: logForwarderFunction?.arn, + betterStackSecretArn: betterStackSecret?.arn, + }; +} diff --git a/apps/infra/modules/networking.ts b/apps/infra/modules/networking.ts new file mode 100644 index 000000000..d5a517b63 --- /dev/null +++ b/apps/infra/modules/networking.ts @@ -0,0 +1,480 @@ +import * as aws from '@pulumi/aws'; +import { CommonConfig } from '../types'; + +export function createNetworking(config: CommonConfig) { + const { commonTags, networkConfig, securityConfig } = config; + + // ========================================== + // VPC AND CORE NETWORKING + // ========================================== + + // VPC with DNS support for RDS and enhanced networking + const vpc = new aws.ec2.Vpc(`${config.projectName}-vpc`, { + cidrBlock: networkConfig.vpcCidr, + enableDnsHostnames: true, // Required for RDS and ALB + enableDnsSupport: true, // Required for RDS and ALB + tags: { + ...commonTags, + Name: `${config.projectName}-vpc`, + Type: 'vpc', + }, + }); + + // Internet Gateway for public subnet access + const internetGateway = new aws.ec2.InternetGateway(`${config.projectName}-igw`, { + vpcId: vpc.id, + tags: { + ...commonTags, + Name: `${config.projectName}-igw`, + Type: 'internet-gateway', + }, + }); + + // Get availability zones dynamically + const availabilityZones = aws.getAvailabilityZonesOutput({ + state: 'available', + }); + + // ========================================== + // SUBNETS + // ========================================== + + // Public subnets (for ALB, NAT Gateway, and Tailscale) + const publicSubnets = networkConfig.subnets.public.map( + (subnet, index) => + new aws.ec2.Subnet(`${config.projectName}-public-subnet-${index + 1}`, { + vpcId: vpc.id, + cidrBlock: subnet.cidr, + availabilityZone: availabilityZones.apply((azs) => azs.names[subnet.az]), + mapPublicIpOnLaunch: true, + tags: { + ...commonTags, + Name: `${config.projectName}-public-subnet-${index + 1}`, + Type: 'public', + Tier: 'public', + }, + }), + ); + + // Private subnets (for RDS, ECS, and internal services) + const privateSubnets = networkConfig.subnets.private.map( + (subnet, index) => + new aws.ec2.Subnet(`${config.projectName}-private-subnet-${index + 1}`, { + vpcId: vpc.id, + cidrBlock: subnet.cidr, + availabilityZone: availabilityZones.apply((azs) => azs.names[subnet.az]), + mapPublicIpOnLaunch: false, // Private subnets don't auto-assign public IPs + tags: { + ...commonTags, + Name: `${config.projectName}-private-subnet-${index + 1}`, + Type: 'private', + Tier: 'private', + }, + }), + ); + + // Extract subnet IDs for use in other resources + const publicSubnetIds = publicSubnets.map((subnet) => subnet.id); + const privateSubnetIds = privateSubnets.map((subnet) => subnet.id); + + // ========================================== + // NAT GATEWAY FOR PRIVATE SUBNET INTERNET ACCESS + // ========================================== + + // Elastic IP for NAT Gateway + const natEip = new aws.ec2.Eip(`${config.projectName}-nat-eip`, { + domain: 'vpc', + tags: { + ...commonTags, + Name: `${config.projectName}-nat-eip`, + }, + }); + + // NAT Gateway in first public subnet + const natGateway = new aws.ec2.NatGateway(`${config.projectName}-nat-gateway`, { + allocationId: natEip.id, + subnetId: publicSubnets[0].id, + tags: { + ...commonTags, + Name: `${config.projectName}-nat-gateway`, + }, + }); + + // ========================================== + // ROUTE TABLES + // ========================================== + + // Public route table + const publicRouteTable = new aws.ec2.RouteTable(`${config.projectName}-public-rt`, { + vpcId: vpc.id, + tags: { + ...commonTags, + Name: `${config.projectName}-public-rt`, + Type: 'route-table', + Tier: 'public', + }, + }); + + // Route for public internet access via Internet Gateway + const publicRoute = new aws.ec2.Route(`${config.projectName}-public-route`, { + routeTableId: publicRouteTable.id, + destinationCidrBlock: '0.0.0.0/0', + gatewayId: internetGateway.id, + }); + + // Associate public subnets with public route table + publicSubnets.map( + (subnet, index) => + new aws.ec2.RouteTableAssociation(`${config.projectName}-public-rta-${index + 1}`, { + subnetId: subnet.id, + routeTableId: publicRouteTable.id, + }), + ); + + // Private route table + const privateRouteTable = new aws.ec2.RouteTable(`${config.projectName}-private-rt`, { + vpcId: vpc.id, + tags: { + ...commonTags, + Name: `${config.projectName}-private-rt`, + Type: 'route-table', + Tier: 'private', + }, + }); + + // Route for private internet access via NAT Gateway + const privateRoute = new aws.ec2.Route(`${config.projectName}-private-route`, { + routeTableId: privateRouteTable.id, + destinationCidrBlock: '0.0.0.0/0', + natGatewayId: natGateway.id, + }); + + // Associate private subnets with private route table + privateSubnets.map( + (subnet, index) => + new aws.ec2.RouteTableAssociation(`${config.projectName}-private-rta-${index + 1}`, { + subnetId: subnet.id, + routeTableId: privateRouteTable.id, + }), + ); + + // ========================================== + // SECURITY GROUPS + // ========================================== + + // ALB Security Group + const albSecurityGroup = new aws.ec2.SecurityGroup(`${config.projectName}-alb-sg`, { + vpcId: vpc.id, + description: 'Security group for Application Load Balancer', + ingress: [ + { + protocol: 'tcp', + fromPort: 80, + toPort: 80, + cidrBlocks: ['0.0.0.0/0'], + description: 'HTTP access from internet', + }, + { + protocol: 'tcp', + fromPort: 443, + toPort: 443, + cidrBlocks: ['0.0.0.0/0'], + description: 'HTTPS access from internet', + }, + ], + egress: [ + { + protocol: '-1', + fromPort: 0, + toPort: 0, + cidrBlocks: ['0.0.0.0/0'], + description: 'All outbound traffic', + }, + ], + tags: { + ...commonTags, + Name: `${config.projectName}-alb-sg`, + Type: 'security-group', + Tier: 'public', + }, + }); + + // ECS Security Group + const ecsSecurityGroup = new aws.ec2.SecurityGroup(`${config.projectName}-ecs-sg`, { + vpcId: vpc.id, + description: 'Security group for ECS services', + ingress: [ + { + protocol: 'tcp', + fromPort: 3000, + toPort: 3000, + securityGroups: [albSecurityGroup.id], + description: 'HTTP access from ALB only', + }, + ], + egress: [ + { + protocol: '-1', + fromPort: 0, + toPort: 0, + cidrBlocks: ['0.0.0.0/0'], + description: 'All outbound traffic', + }, + ], + tags: { + ...commonTags, + Name: `${config.projectName}-ecs-sg`, + Type: 'security-group', + Tier: 'private', + }, + }); + + // Database Security Group + const databaseSecurityGroup = new aws.ec2.SecurityGroup(`${config.projectName}-db-sg`, { + vpcId: vpc.id, + description: 'Security group for RDS database', + ingress: [ + { + protocol: 'tcp', + fromPort: 5432, + toPort: 5432, + securityGroups: [ecsSecurityGroup.id], + description: 'PostgreSQL access from ECS only', + }, + ], + egress: [ + { + protocol: '-1', + fromPort: 0, + toPort: 0, + cidrBlocks: ['0.0.0.0/0'], + description: 'Outbound traffic for updates and maintenance', + }, + ], + tags: { + ...commonTags, + Name: `${config.projectName}-db-sg`, + Type: 'security-group', + Tier: 'private', + }, + }); + + // CodeBuild Security Group + const codeBuildSecurityGroup = new aws.ec2.SecurityGroup(`${config.projectName}-codebuild-sg`, { + vpcId: vpc.id, + description: 'Security group for CodeBuild projects', + egress: [ + { + protocol: '-1', + fromPort: 0, + toPort: 0, + cidrBlocks: ['0.0.0.0/0'], + description: 'Full outbound access for builds', + }, + ], + tags: { + ...commonTags, + Name: `${config.projectName}-codebuild-sg`, + Type: 'security-group', + Tier: 'private', + }, + }); + + // Allow CodeBuild to access database + const buildDatabaseAccess = new aws.ec2.SecurityGroupRule( + `${config.projectName}-build-database-access`, + { + type: 'ingress', + fromPort: 5432, + toPort: 5432, + protocol: 'tcp', + sourceSecurityGroupId: codeBuildSecurityGroup.id, + securityGroupId: databaseSecurityGroup.id, + description: 'Allow CodeBuild to access database for builds', + }, + ); + + // Tailscale Security Group + const tailscaleSecurityGroup = new aws.ec2.SecurityGroup(`${config.projectName}-tailscale-sg`, { + vpcId: vpc.id, + description: 'Security group for Tailscale subnet router', + ingress: [ + { + protocol: 'tcp', + fromPort: 22, + toPort: 22, + cidrBlocks: securityConfig.allowedCidrBlocks, + description: 'SSH access from allowed IPs', + }, + { + protocol: 'udp', + fromPort: 41641, + toPort: 41641, + cidrBlocks: ['0.0.0.0/0'], + description: 'Tailscale UDP traffic', + }, + ], + egress: [ + { + protocol: '-1', + fromPort: 0, + toPort: 0, + cidrBlocks: ['0.0.0.0/0'], + description: 'All outbound traffic', + }, + ], + tags: { + ...commonTags, + Name: `${config.projectName}-tailscale-sg`, + Type: 'security-group', + Tier: 'public', + }, + }); + + // Allow Tailscale to access database + const tailscaleDatabaseAccess = new aws.ec2.SecurityGroupRule( + `${config.projectName}-tailscale-database-access`, + { + type: 'ingress', + fromPort: 5432, + toPort: 5432, + protocol: 'tcp', + sourceSecurityGroupId: tailscaleSecurityGroup.id, + securityGroupId: databaseSecurityGroup.id, + description: 'Allow Tailscale router to access database for development', + }, + ); + + // ========================================== + // VPC ENDPOINTS + // ========================================== + + // S3 VPC Endpoint + const s3VpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-s3-endpoint`, { + vpcId: vpc.id, + serviceName: `com.amazonaws.${config.awsRegion}.s3`, + vpcEndpointType: 'Gateway', + routeTableIds: [privateRouteTable.id], + tags: { + ...commonTags, + Name: `${config.projectName}-s3-endpoint`, + Type: 'vpc-endpoint', + }, + }); + + // Shared security group for VPC endpoints (allows both ECS and CodeBuild access) + const vpcEndpointSecurityGroup = new aws.ec2.SecurityGroup( + `${config.projectName}-vpc-endpoint-sg`, + { + vpcId: vpc.id, + description: 'Security group for VPC endpoints (ECR, CodeBuild, CloudWatch)', + ingress: [ + { + protocol: 'tcp', + fromPort: 443, + toPort: 443, + securityGroups: [ecsSecurityGroup.id, codeBuildSecurityGroup.id], + description: 'HTTPS access from ECS and CodeBuild', + }, + ], + egress: [ + { + protocol: '-1', + fromPort: 0, + toPort: 0, + cidrBlocks: ['0.0.0.0/0'], + description: 'All outbound traffic', + }, + ], + tags: { + ...commonTags, + Name: `${config.projectName}-vpc-endpoint-sg`, + Type: 'security-group', + }, + }, + ); + + // ECR API VPC Endpoint (for ECS in private subnets) + const ecrApiVpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-ecr-api-endpoint`, { + vpcId: vpc.id, + serviceName: `com.amazonaws.${config.awsRegion}.ecr.api`, + vpcEndpointType: 'Interface', + subnetIds: privateSubnetIds, + securityGroupIds: [vpcEndpointSecurityGroup.id], + tags: { + ...commonTags, + Name: `${config.projectName}-ecr-api-endpoint`, + Type: 'vpc-endpoint', + }, + }); + + // ECR DKR VPC Endpoint (for ECS in private subnets) + const ecrDkrVpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-ecr-dkr-endpoint`, { + vpcId: vpc.id, + serviceName: `com.amazonaws.${config.awsRegion}.ecr.dkr`, + vpcEndpointType: 'Interface', + subnetIds: privateSubnetIds, + securityGroupIds: [vpcEndpointSecurityGroup.id], + tags: { + ...commonTags, + Name: `${config.projectName}-ecr-dkr-endpoint`, + Type: 'vpc-endpoint', + }, + }); + + // CodeBuild VPC Endpoint (essential for CodeBuild to work in VPC) + const codebuildVpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-codebuild-endpoint`, { + vpcId: vpc.id, + serviceName: `com.amazonaws.${config.awsRegion}.codebuild`, + vpcEndpointType: 'Interface', + subnetIds: publicSubnetIds, + securityGroupIds: [vpcEndpointSecurityGroup.id], + tags: { + ...commonTags, + Name: `${config.projectName}-codebuild-endpoint`, + Type: 'vpc-endpoint', + }, + }); + + // CloudWatch Logs VPC Endpoint (for CodeBuild logging) + const logsVpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-logs-endpoint`, { + vpcId: vpc.id, + serviceName: `com.amazonaws.${config.awsRegion}.logs`, + vpcEndpointType: 'Interface', + subnetIds: publicSubnetIds, + securityGroupIds: [vpcEndpointSecurityGroup.id], + tags: { + ...commonTags, + Name: `${config.projectName}-logs-endpoint`, + Type: 'vpc-endpoint', + }, + }); + + return { + vpcId: vpc.id, + vpcCidr: vpc.cidrBlock, + internetGatewayId: internetGateway.id, + natGatewayId: natGateway.id, + publicSubnetIds, + privateSubnetIds, + availabilityZones: availabilityZones.apply((azs) => azs.names), + securityGroups: { + alb: albSecurityGroup.id, + ecs: ecsSecurityGroup.id, + database: databaseSecurityGroup.id, + codeBuild: codeBuildSecurityGroup.id, + tailscale: tailscaleSecurityGroup.id, + }, + routeTableIds: { + public: publicRouteTable.id, + private: privateRouteTable.id, + }, + vpcEndpoints: { + s3: s3VpcEndpoint.id, + ecrApi: ecrApiVpcEndpoint.id, + ecrDkr: ecrDkrVpcEndpoint.id, + codebuild: codebuildVpcEndpoint.id, + logs: logsVpcEndpoint.id, + }, + }; +} diff --git a/apps/infra/modules/scaling.ts b/apps/infra/modules/scaling.ts new file mode 100644 index 000000000..018818737 --- /dev/null +++ b/apps/infra/modules/scaling.ts @@ -0,0 +1,176 @@ +import * as aws from '@pulumi/aws'; +import * as pulumi from '@pulumi/pulumi'; +import { CommonConfig, ContainerOutputs, LoadBalancerOutputs } from '../types'; + +export function createScaling( + config: CommonConfig, + container: ContainerOutputs, + loadBalancer: LoadBalancerOutputs, +) { + const { commonTags } = config; + + // Auto Scaling Target for ECS Service + const ecsTarget = new aws.appautoscaling.Target(`${config.projectName}-ecs-target`, { + maxCapacity: 10, + minCapacity: 2, + resourceId: pulumi.interpolate`service/${container.clusterName}/${container.serviceName}`, + scalableDimension: 'ecs:service:DesiredCount', + serviceNamespace: 'ecs', + tags: { + ...commonTags, + Name: `${config.projectName}-ecs-target`, + Type: 'autoscaling-target', + }, + }); + + // CPU-based Auto Scaling Policy + const cpuScalingPolicy = new aws.appautoscaling.Policy(`${config.projectName}-cpu-scaling`, { + name: `${config.projectName}-cpu-scaling`, + policyType: 'TargetTrackingScaling', + resourceId: ecsTarget.resourceId, + scalableDimension: ecsTarget.scalableDimension, + serviceNamespace: ecsTarget.serviceNamespace, + targetTrackingScalingPolicyConfiguration: { + targetValue: 70.0, // Target 70% CPU utilization + predefinedMetricSpecification: { + predefinedMetricType: 'ECSServiceAverageCPUUtilization', + }, + scaleOutCooldown: 300, // 5 minutes + scaleInCooldown: 300, // 5 minutes + }, + }); + + // Memory-based Auto Scaling Policy + const memoryScalingPolicy = new aws.appautoscaling.Policy( + `${config.projectName}-memory-scaling`, + { + name: `${config.projectName}-memory-scaling`, + policyType: 'TargetTrackingScaling', + resourceId: ecsTarget.resourceId, + scalableDimension: ecsTarget.scalableDimension, + serviceNamespace: ecsTarget.serviceNamespace, + targetTrackingScalingPolicyConfiguration: { + targetValue: 80.0, // Target 80% memory utilization + predefinedMetricSpecification: { + predefinedMetricType: 'ECSServiceAverageMemoryUtilization', + }, + scaleOutCooldown: 300, + scaleInCooldown: 600, // Longer cooldown for memory + }, + }, + ); + + // ALB Request Count Scaling Policy + const requestCountScalingPolicy = new aws.appautoscaling.Policy( + `${config.projectName}-request-count-scaling`, + { + name: `${config.projectName}-request-count-scaling`, + policyType: 'TargetTrackingScaling', + resourceId: ecsTarget.resourceId, + scalableDimension: ecsTarget.scalableDimension, + serviceNamespace: ecsTarget.serviceNamespace, + targetTrackingScalingPolicyConfiguration: { + targetValue: 1000.0, // Target 1000 requests per target per minute + predefinedMetricSpecification: { + predefinedMetricType: 'ALBRequestCountPerTarget', + resourceLabel: pulumi + .all([loadBalancer.albArn, loadBalancer.targetGroupArn]) + .apply(([albArn, tgArn]: [string, string]) => { + // ALB ARN: arn:aws:elasticloadbalancing:region:account:loadbalancer/app/load-balancer-name/1234567890123456 + // Target Group ARN: arn:aws:elasticloadbalancing:region:account:targetgroup/target-group-name/1234567890123456 + // Required format: app/load-balancer-name/1234567890123456/targetgroup/target-group-name/1234567890123456 + const albParts = albArn.split('/'); + const tgParts = tgArn.split('/'); + return `${albParts.slice(-3).join('/')}/targetgroup/${tgParts.slice(-2).join('/')}`; + }), + }, + scaleOutCooldown: 300, + scaleInCooldown: 300, + }, + }, + ); + + // Scheduled Scaling for predictable load patterns + const scheduledScalingUp = new aws.appautoscaling.ScheduledAction( + `${config.projectName}-scale-up-business-hours`, + { + name: `${config.projectName}-scale-up-business-hours`, + serviceNamespace: ecsTarget.serviceNamespace, + resourceId: ecsTarget.resourceId, + scalableDimension: ecsTarget.scalableDimension, + schedule: 'cron(0 9 ? * MON-FRI *)', // 9 AM UTC on weekdays + scalableTargetAction: { + minCapacity: 3, + maxCapacity: 10, + }, + }, + ); + + const scheduledScalingDown = new aws.appautoscaling.ScheduledAction( + `${config.projectName}-scale-down-off-hours`, + { + name: `${config.projectName}-scale-down-off-hours`, + serviceNamespace: ecsTarget.serviceNamespace, + resourceId: ecsTarget.resourceId, + scalableDimension: ecsTarget.scalableDimension, + schedule: 'cron(0 18 ? * MON-FRI *)', // 6 PM UTC on weekdays + scalableTargetAction: { + minCapacity: 2, + maxCapacity: 5, + }, + }, + ); + + // CloudWatch Alarms for scaling monitoring + const scaleOutAlarm = new aws.cloudwatch.MetricAlarm(`${config.projectName}-scale-out-alarm`, { + name: `${config.projectName}-scale-out-triggered`, + metricName: 'CPUUtilization', + namespace: 'AWS/ECS', + statistic: 'Average', + period: 300, + evaluationPeriods: 2, + threshold: 75, + comparisonOperator: 'GreaterThanThreshold', + dimensions: pulumi + .all([container.serviceName, container.clusterName]) + .apply(([serviceName, clusterName]: [string, string]) => ({ + ServiceName: serviceName, + ClusterName: clusterName, + })), + tags: { + ...commonTags, + Name: `${config.projectName}-scale-out-alarm`, + Type: 'cloudwatch-alarm', + }, + }); + + const scaleInAlarm = new aws.cloudwatch.MetricAlarm(`${config.projectName}-scale-in-alarm`, { + name: `${config.projectName}-scale-in-triggered`, + metricName: 'CPUUtilization', + namespace: 'AWS/ECS', + statistic: 'Average', + period: 600, + evaluationPeriods: 3, + threshold: 25, + comparisonOperator: 'LessThanThreshold', + dimensions: pulumi + .all([container.serviceName, container.clusterName]) + .apply(([serviceName, clusterName]: [string, string]) => ({ + ServiceName: serviceName, + ClusterName: clusterName, + })), + tags: { + ...commonTags, + Name: `${config.projectName}-scale-in-alarm`, + Type: 'cloudwatch-alarm', + }, + }); + + return { + minCapacity: ecsTarget.minCapacity, + maxCapacity: ecsTarget.maxCapacity, + cpuScaleUpThreshold: 70, + cpuScaleDownThreshold: 25, + memoryScaleUpThreshold: 80, + }; +} diff --git a/apps/infra/modules/tailscale.ts b/apps/infra/modules/tailscale.ts new file mode 100644 index 000000000..c6170a101 --- /dev/null +++ b/apps/infra/modules/tailscale.ts @@ -0,0 +1,293 @@ +import * as aws from '@pulumi/aws'; +import { CommonConfig, DatabaseOutputs, NetworkOutputs } from '../types'; + +export function createTailscale( + config: CommonConfig, + network: NetworkOutputs, + database: DatabaseOutputs, +) { + const { commonTags } = config; + + // Tailscale Auth Key Secret + const tailscaleAuthSecret = new aws.secretsmanager.Secret( + `${config.projectName}-tailscale-auth-secret`, + { + name: `${config.projectName}/tailscale/auth-key`, + description: 'Tailscale auth key for subnet router', + tags: { + ...commonTags, + Name: `${config.projectName}-tailscale-auth-secret`, + Type: 'secret', + }, + }, + ); + + // Store the auth key version from configuration + const tailscaleAuthSecretVersion = new aws.secretsmanager.SecretVersion( + `${config.projectName}-tailscale-auth-secret-version`, + { + secretId: tailscaleAuthSecret.id, + secretString: + config.tailscale?.authKey.apply((key) => + JSON.stringify({ + authKey: key || 'tskey-auth-xxxxxx-REPLACE_WITH_REAL_KEY', + instructions: + key === 'NOT_SET' + ? 'Replace with real Tailscale auth key from https://login.tailscale.com/admin/settings/keys' + : 'Configured via Pulumi config', + }), + ) || + JSON.stringify({ + authKey: 'tskey-auth-xxxxxx-REPLACE_WITH_REAL_KEY', + instructions: + 'Replace with real Tailscale auth key from https://login.tailscale.com/admin/settings/keys', + }), + }, + ); + + // IAM Role for Tailscale EC2 instance + const tailscaleRole = new aws.iam.Role(`${config.projectName}-tailscale-instance-role`, { + name: `${config.projectName}-tailscale-instance-role`, + assumeRolePolicy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Action: 'sts:AssumeRole', + Effect: 'Allow', + Principal: { + Service: 'ec2.amazonaws.com', + }, + }, + ], + }), + tags: { + ...commonTags, + Name: 'tailscale-instance-role', + Type: 'iam-role', + }, + }); + + // IAM Policy for Tailscale instance + const tailscalePolicy = new aws.iam.RolePolicy( + `${config.projectName}-tailscale-instance-policy`, + { + role: tailscaleRole.id, + policy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], + Resource: tailscaleAuthSecret.arn, + }, + { + Effect: 'Allow', + Action: [ + 'ec2:DescribeRouteTables', + 'ec2:CreateRoute', + 'ec2:DeleteRoute', + 'ec2:ReplaceRoute', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: [ + 'logs:CreateLogGroup', + 'logs:CreateLogStream', + 'logs:PutLogEvents', + 'logs:DescribeLogGroups', + 'logs:DescribeLogStreams', + ], + Resource: '*', + }, + ], + }), + }, + ); + + // Instance Profile for Tailscale EC2 instance + const tailscaleInstanceProfile = new aws.iam.InstanceProfile( + `${config.projectName}-tailscale-instance-profile`, + { + name: `${config.projectName}-tailscale-instance-profile`, + role: tailscaleRole.name, + tags: { + ...commonTags, + Name: `${config.projectName}-tailscale-instance-profile`, + Type: 'instance-profile', + }, + }, + ); + + // User data script for Tailscale setup + const userData = `#!/bin/bash +set -e + +# Update system +yum update -y + +# Install Tailscale +curl -fsSL https://tailscale.com/install.sh | sh + +# Install AWS CLI and jq +yum install -y aws-cli jq + +# Create tailscale service log group +aws logs create-log-group --log-group-name /tailscale/${config.projectName} --region ${config.awsRegion} || true + +# Get Tailscale auth key from Secrets Manager +AUTH_KEY=$(aws secretsmanager get-secret-value --secret-id ${tailscaleAuthSecret.arn} --region ${config.awsRegion} --query SecretString --output text | jq -r .authKey) + +# Start Tailscale as subnet router +tailscale up --authkey=$AUTH_KEY --advertise-routes=${network.vpcCidr} --accept-routes --snat-subnet-routes=false + +# Enable IP forwarding +echo 'net.ipv4.ip_forward = 1' | tee -a /etc/sysctl.conf +echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.conf +sysctl -p + +# Install CloudWatch agent for monitoring +yum install -y amazon-cloudwatch-agent + +# Configure CloudWatch agent +cat > /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json << 'EOF' +{ + "logs": { + "logs_collected": { + "files": { + "collect_list": [ + { + "file_path": "/var/log/tailscaled.log", + "log_group_name": "/tailscale/${config.projectName}", + "log_stream_name": "tailscaled" + } + ] + } + } + }, + "metrics": { + "namespace": "Tailscale/${config.projectName}", + "metrics_collected": { + "cpu": { + "measurement": ["cpu_usage_idle", "cpu_usage_iowait"], + "metrics_collection_interval": 60 + }, + "disk": { + "measurement": ["used_percent"], + "metrics_collection_interval": 60, + "resources": ["*"] + }, + "mem": { + "measurement": ["mem_used_percent"], + "metrics_collection_interval": 60 + }, + "net": { + "measurement": ["bytes_sent", "bytes_recv"], + "metrics_collection_interval": 60 + } + } + } +} +EOF + +# Start CloudWatch agent +/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json -s + +# Create health check script +cat > /usr/local/bin/tailscale-health.sh << 'EOF' +#!/bin/bash +# Health check for Tailscale subnet router +tailscale status --json | jq -e '.BackendState == "Running"' > /dev/null +EOF + +chmod +x /usr/local/bin/tailscale-health.sh + +# Setup cron for periodic health checks +echo "*/5 * * * * /usr/local/bin/tailscale-health.sh || systemctl restart tailscaled" | crontab - + +echo "Tailscale subnet router setup completed" +`; + + // Tailscale EC2 instance + const tailscaleInstance = new aws.ec2.Instance(`${config.projectName}-tailscale-subnet-router`, { + instanceType: 't3.nano', // Small instance for routing + ami: aws.ec2 + .getAmi({ + mostRecent: true, + owners: ['amazon'], + filters: [ + { + name: 'name', + values: ['amzn2-ami-hvm-*-x86_64-gp2'], + }, + ], + }) + .then((ami) => ami.id), + // keyName: `${config.projectName}-key`, // Uncomment and set if key pair exists + vpcSecurityGroupIds: [network.securityGroups.tailscale], + subnetId: network.privateSubnetIds[0], // Deploy in private subnet + iamInstanceProfile: tailscaleInstanceProfile.name, + sourceDestCheck: false, // Required for routing + userData: Buffer.from(userData).toString('base64'), + tags: { + ...commonTags, + Name: `${config.projectName}-tailscale-subnet-router`, + Type: 'ec2-instance', + Purpose: 'tailscale-router', + }, + }); + + // CloudWatch Log Group for Tailscale + const tailscaleLogGroup = new aws.cloudwatch.LogGroup(`${config.projectName}-tailscale-logs`, { + name: `/tailscale/${config.projectName}`, + retentionInDays: config.logRetentionDays, + tags: { + ...commonTags, + Name: `${config.projectName}-tailscale-logs`, + Type: 'log-group', + }, + }); + + // CloudWatch Alarm for Tailscale health + const tailscaleHealthAlarm = new aws.cloudwatch.MetricAlarm( + `${config.projectName}-tailscale-health-alarm`, + { + name: `${config.projectName}-tailscale-health`, + metricName: 'StatusCheckFailed', + namespace: 'AWS/EC2', + statistic: 'Maximum', + period: 60, + evaluationPeriods: 2, + threshold: 1, + comparisonOperator: 'GreaterThanOrEqualToThreshold', + dimensions: { + InstanceId: tailscaleInstance.id, + }, + tags: { + ...commonTags, + Name: `${config.projectName}-tailscale-health-alarm`, + Type: 'cloudwatch-alarm', + }, + }, + ); + + return { + instanceId: tailscaleInstance.id, + instancePrivateIp: tailscaleInstance.privateIp, + subnetRoutes: [network.vpcCidr], + vpcCidr: network.vpcCidr, + authSecretArn: tailscaleAuthSecret.arn, + healthAlarmArn: tailscaleHealthAlarm.arn, + databaseConnectionInfo: { + databaseHost: database.endpoint, + databasePort: database.port, + steps: [ + '1. Connect to Tailscale network', + '2. Access database via Tailscale subnet router', + `3. Connect to ${database.endpoint}:${database.port}`, + '4. Use database credentials from Secrets Manager', + ], + }, + }; +} diff --git a/apps/infra/package.json b/apps/infra/package.json new file mode 100644 index 000000000..e2daece49 --- /dev/null +++ b/apps/infra/package.json @@ -0,0 +1,18 @@ +{ + "name": "@comp/infra", + "main": "index.ts", + "devDependencies": { + "@types/node": "^24.0.3", + "typescript": "^5.8.3" + }, + "dependencies": { + "@pulumi/aws": "^6.83.0", + "@pulumi/awsx": "^2.22.0", + "@pulumi/command": "^1.1.0", + "@pulumi/docker-build": "^0.0.12", + "@pulumi/pulumi": "^3.181.0", + "@pulumi/random": "^4.18.2", + "@pulumi/tailscale": "^0.17.0", + "dotenv": "^17.2.0" + } +} diff --git a/apps/infra/tsconfig.json b/apps/infra/tsconfig.json new file mode 100644 index 000000000..f960d5171 --- /dev/null +++ b/apps/infra/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "strict": true, + "outDir": "bin", + "target": "es2020", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "experimentalDecorators": true, + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "forceConsistentCasingInFileNames": true + }, + "files": [ + "index.ts" + ] +} diff --git a/apps/infra/types.ts b/apps/infra/types.ts new file mode 100644 index 000000000..580faf931 --- /dev/null +++ b/apps/infra/types.ts @@ -0,0 +1,335 @@ +import * as pulumi from '@pulumi/pulumi'; + +// ========================================== +// COMMON CONFIGURATION TYPES +// ========================================== + +export interface ResourceTags { + [key: string]: string | undefined; +} + +export interface CommonConfig { + projectName: string; + enableRDSReadReplicas: boolean; + region: string; + awsRegion: string; + nodeEnv: string; + enableDebugEndpoints: boolean; + domainName?: string; + githubOrg: string; + githubRepo: string; + commonTags: ResourceTags; + networkConfig: NetworkConfig; + securityConfig: SecurityConfig; + dbInstanceClass: string; + dbAllocatedStorage: number; + dbMaxAllocatedStorage: number; + dbBackupRetentionPeriod: number; + dbDeletionProtection: boolean; + logRetentionDays: number; + // Optional feature configurations + tailscale?: { + apiKey: pulumi.Output; + tailnet: string; + authKey: pulumi.Output; + }; + betterStack?: { + entrypoint: pulumi.Output; + sourceToken: pulumi.Output; + }; +} + +export interface FeatureFlags { + enableCodeBuild: boolean; + enableTailscale: boolean; + enableBetterStack: boolean; + enableDetailedMonitoring: boolean; + enableAutoScaling: boolean; + enableBackups: boolean; + enableSSL: boolean; +} + +export interface EnvironmentConfig { + dbInstanceClass: string; + dbAllocatedStorage: number; + dbMaxAllocatedStorage: number; + dbBackupRetentionPeriod: number; + dbDeletionProtection: boolean; + ecsCpu: number; + ecsMemory: number; + ecsDesiredCount: number; + ecsMinCapacity: number; + ecsMaxCapacity: number; + logRetentionDays: number; + codeBuildInstanceType: string; + codeBuildTimeout: number; +} + +export interface NetworkConfig { + vpcCidr: string; + subnets: { + public: Array<{ cidr: string; az: number }>; + private: Array<{ cidr: string; az: number }>; + }; +} + +export interface SecurityConfig { + allowedCidrBlocks: string[]; + sslCertificateArn?: string; + enableWaf: boolean; +} + +// ========================================== +// INFRASTRUCTURE OUTPUT TYPES +// ========================================== + +export interface NetworkOutputs { + vpcId: pulumi.Output; + vpcCidr: pulumi.Output; + internetGatewayId: pulumi.Output; + natGatewayId: pulumi.Output; + publicSubnetIds: pulumi.Output[]; + privateSubnetIds: pulumi.Output[]; + availabilityZones: pulumi.Output; + securityGroups: { + alb: pulumi.Output; + ecs: pulumi.Output; + database: pulumi.Output; + codeBuild: pulumi.Output; + tailscale: pulumi.Output; + }; + routeTableIds: { + public: pulumi.Output; + private: pulumi.Output; + }; + vpcEndpoints: { + s3: pulumi.Output; + ecrApi: pulumi.Output; + ecrDkr: pulumi.Output; + codebuild: pulumi.Output; + logs: pulumi.Output; + }; +} + +export interface DatabaseOutputs { + instanceId: pulumi.Output; + endpoint: pulumi.Output; + port: pulumi.Output; + dbName: pulumi.Output; + username: pulumi.Output; + password: pulumi.Output; + secretArn: pulumi.Output; + secretId: pulumi.Output; + connectionString: pulumi.Output; + readReplicaEndpoint?: pulumi.Output; +} + +export interface ContainerOutputs { + clusterName: pulumi.Output; + clusterArn: pulumi.Output; + serviceName: pulumi.Output; + repositoryUrl: pulumi.Output; + repositoryArn: pulumi.Output; + taskDefinitionArn: pulumi.Output; + logGroupName: pulumi.Output; + logGroupArn: pulumi.Output; + taskExecutionRoleArn: pulumi.Output; + taskRoleArn: pulumi.Output; +} + +export interface LoadBalancerOutputs { + albArn: pulumi.Output; + albDnsName: pulumi.Output; + albZoneId: pulumi.Output; + targetGroupArn: pulumi.Output; + applicationUrl: pulumi.Output; + healthCheckUrl: pulumi.Output; + certificateArn?: string; +} + +export interface GithubOidcOutputs { + providerArn: pulumi.Output; + providerUrl: pulumi.Output; + deploymentRoleArn: pulumi.Output; + buildRoleArn: pulumi.Output; + readOnlyRoleArn: pulumi.Output; +} + +export interface BuildSystemOutputs { + appProjectName: pulumi.Output; + appProjectArn: pulumi.Output; + codebuildRoleArn: pulumi.Output; + buildInstanceType: string; + buildTimeout: number; + createApplicationDeployment: ( + app: ApplicationConfig, + database: DatabaseOutputs, + container: ContainerOutputs, + ) => ApplicationDeployment; +} + +export interface ApplicationDeployment { + appName: string; + contextPath: string; + buildCommands: { + deployWithMigrations: string; + }; + containerImage: pulumi.Output; + healthCheckPath: string; + resourceRequirements: { cpu: number; memory: number }; + scaling: { + minInstances: number; + maxInstances: number; + targetCpuPercent: number; + }; + buildProject: pulumi.Output; +} + +export interface TailscaleOutputs { + instanceId: pulumi.Output; + instancePrivateIp: pulumi.Output; + subnetRoutes: pulumi.Output; + vpcCidr: pulumi.Output; + authSecretArn: pulumi.Output; + healthAlarmArn: pulumi.Output; + databaseConnectionInfo: { + databaseHost: pulumi.Output; + databasePort: pulumi.Output; + steps: string[]; + }; +} + +export interface MonitoringOutputs { + applicationDashboardUrl: pulumi.Output; + infrastructureDashboardUrl: pulumi.Output; + applicationLogGroup: pulumi.Output; + logsUrl: pulumi.Output; + metricsNamespace: string; + customMetricsFunctionArn: pulumi.Output; + metricsUrl: pulumi.Output; + highErrorRateAlarmArn: pulumi.Output; + databaseConnectionAlarmArn: pulumi.Output; + alarmsUrl: pulumi.Output; + logForwarderFunctionArn?: pulumi.Output; + betterStackSecretArn?: pulumi.Output; +} + +export interface ScalingOutputs { + minCapacity: pulumi.Output; + maxCapacity: pulumi.Output; + cpuScaleUpThreshold: number; + cpuScaleDownThreshold: number; + memoryScaleUpThreshold: number; +} + +// ========================================== +// APPLICATION CONFIGURATION TYPES +// ========================================== + +export interface ApplicationConfig { + name: string; + contextPath: string; + requiresDatabaseAccess: boolean; + dependsOnMigrations: boolean; + buildCommand?: string; + healthCheckPath: string; + environmentVariables: Record; + resourceRequirements: { + cpu: number; + memory: number; + }; + scaling: { + minInstances: number; + maxInstances: number; + targetCpuPercent: number; + }; +} + +// Duplicate ResourceTags interface removed - using the one at the top of the file + +// ========================================== +// BUILD SYSTEM TYPES +// ========================================== + +export interface BuildSpecConfig { + version: string; + env: { + variables: Record; + 'parameter-store'?: Record; + 'secrets-manager'?: Record; + }; + phases: { + pre_build?: { + commands: string[]; + }; + build: { + commands: string[]; + }; + post_build?: { + commands: string[]; + }; + }; + cache?: { + paths: string[]; + }; + artifacts?: { + files: string[]; + name?: string; + }; +} + +// ========================================== +// MONITORING AND ALERTING TYPES +// ========================================== + +export interface MetricConfig { + name: string; + namespace: string; + dimensions: Record; + statistic: 'Average' | 'Sum' | 'Maximum' | 'Minimum'; + period: number; + evaluationPeriods: number; + threshold: number; + comparisonOperator: + | 'GreaterThanThreshold' + | 'LessThanThreshold' + | 'GreaterThanOrEqualToThreshold' + | 'LessThanOrEqualToThreshold'; +} + +export interface AlarmConfig extends MetricConfig { + alarmDescription: string; + treatMissingData: 'breaching' | 'notBreaching' | 'ignore' | 'missing'; + actions?: pulumi.Output[]; +} + +// ========================================== +// SECURITY AND ACCESS TYPES +// ========================================== + +export interface SecurityGroupRule { + type: 'ingress' | 'egress'; + fromPort: number; + toPort: number; + protocol: string; + cidrBlocks?: string[]; + securityGroups?: pulumi.Output[]; + description: string; +} + +export interface IAMPolicyDocument { + Version: string; + Statement: IAMPolicyStatement[]; +} + +export interface IAMPolicyStatement { + Effect: 'Allow' | 'Deny'; + Action: string | string[]; + Resource?: string | string[]; + Principal?: { + Service?: string | string[]; + AWS?: string | string[]; + Federated?: string | string[]; + }; + Condition?: Record>; +} From 133e98c198a59a46df7cf10abcbb3763f332f17f Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 12:04:32 -0400 Subject: [PATCH 002/107] refactor: update application configuration in index.ts - Changed application name to include project name for better context. - Updated context path to point to the new app directory. --- apps/infra/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/infra/index.ts b/apps/infra/index.ts index 181e10c8c..21a882000 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -78,8 +78,8 @@ const monitoring = createMonitoring(config, database, container, loadBalancer, { const applications = [ { - name: 'pathfinder-web', - contextPath: '../web', + name: `${config.projectName}-app`, + contextPath: '../app', requiresDatabaseAccess: true, dependsOnMigrations: true, buildCommand: 'npm run build', From ddffce3c76fb17ac91fc73faec7321c0597b1b1f Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 12:05:59 -0400 Subject: [PATCH 003/107] chore: update dependencies and add new Pulumi infrastructure for ECS and SSO - Added new application configuration for the `@comp/infra` module in `bun.lock`. - Updated `yarn.lock` with new versions for `@aws-sdk/client-ecs` and `@aws-sdk/client-sso`. - Included additional dependencies for AWS SDK and Pulumi in the infrastructure setup. --- bun.lock | 635 +++++++++++++++++++++- yarn.lock | 1505 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 2108 insertions(+), 32 deletions(-) diff --git a/bun.lock b/bun.lock index 4cea18a2b..d00c0c3ab 100644 --- a/bun.lock +++ b/bun.lock @@ -204,6 +204,23 @@ "react-hook-form": "^7.58.1", }, }, + "apps/infra": { + "name": "@comp/infra", + "dependencies": { + "@pulumi/aws": "^6.83.0", + "@pulumi/awsx": "^2.22.0", + "@pulumi/command": "^1.1.0", + "@pulumi/docker-build": "^0.0.12", + "@pulumi/pulumi": "^3.181.0", + "@pulumi/random": "^4.18.2", + "@pulumi/tailscale": "^0.17.0", + "dotenv": "^17.2.0", + }, + "devDependencies": { + "@types/node": "^24.0.3", + "typescript": "^5.8.3", + }, + }, "apps/portal": { "name": "@comp/portal", "version": "0.1.0", @@ -478,6 +495,8 @@ "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "^3.222.0", "@smithy/util-utf8": "^2.0.0", "tslib": "^2.6.2" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="], + "@aws-sdk/client-ecs": ["@aws-sdk/client-ecs@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/credential-provider-node": "3.848.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "@smithy/util-waiter": "^4.0.6", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-9Fp8bv8FbQe+vjF0iBAGiS2eaEkHihvQ5SwiJ+4UYAqnoNxlWuOWXjALHaMjsybtPzz//TAveTK5qusmTeT7rQ=="], + "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.837.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.835.0", "@aws-sdk/credential-provider-node": "3.835.0", "@aws-sdk/middleware-bucket-endpoint": "3.830.0", "@aws-sdk/middleware-expect-continue": "3.821.0", "@aws-sdk/middleware-flexible-checksums": "3.835.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-location-constraint": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", "@aws-sdk/middleware-sdk-s3": "3.835.0", "@aws-sdk/middleware-ssec": "3.821.0", "@aws-sdk/middleware-user-agent": "3.835.0", "@aws-sdk/region-config-resolver": "3.821.0", "@aws-sdk/signature-v4-multi-region": "3.835.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@aws-sdk/util-user-agent-browser": "3.821.0", "@aws-sdk/util-user-agent-node": "3.835.0", "@aws-sdk/xml-builder": "3.821.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.5.3", "@smithy/eventstream-serde-browser": "^4.0.4", "@smithy/eventstream-serde-config-resolver": "^4.1.2", "@smithy/eventstream-serde-node": "^4.0.4", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/hash-blob-browser": "^4.0.4", "@smithy/hash-node": "^4.0.4", "@smithy/hash-stream-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/md5-js": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.12", "@smithy/middleware-retry": "^4.1.13", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.0.6", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.20", "@smithy/util-defaults-mode-node": "^4.0.20", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-stream": "^4.2.2", "@smithy/util-utf8": "^4.0.0", "@smithy/util-waiter": "^4.0.5", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-sBjPPG30HIfNwpzWuajCDf7agb4YAxPFFpsp3kwgptJF8PEi0HzQg64bskquMzjqLC2tXsn5rKtDVpQOvs29MQ=="], "@aws-sdk/client-securityhub": ["@aws-sdk/client-securityhub@3.835.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.835.0", "@aws-sdk/credential-provider-node": "3.835.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", "@aws-sdk/middleware-user-agent": "3.835.0", "@aws-sdk/region-config-resolver": "3.821.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@aws-sdk/util-user-agent-browser": "3.821.0", "@aws-sdk/util-user-agent-node": "3.835.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.5.3", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.12", "@smithy/middleware-retry": "^4.1.13", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.0.6", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.20", "@smithy/util-defaults-mode-node": "^4.0.20", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-B1k30XTVP3edrDuG2nzsiAt8BR0ZkeFVIQBkHVSYPucl6009ck6zLmuB9jH4FIiyES1ZqRRX/xWZMaa4xBKf2w=="], @@ -670,6 +689,8 @@ "@comp/framework-editor": ["@comp/framework-editor@workspace:apps/framework-editor"], + "@comp/infra": ["@comp/infra@workspace:apps/infra"], + "@comp/integrations": ["@comp/integrations@workspace:packages/integrations"], "@comp/kv": ["@comp/kv@workspace:packages/kv"], @@ -906,6 +927,8 @@ "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], + "@isaacs/string-locale-compare": ["@isaacs/string-locale-compare@1.1.0", "", {}, "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], @@ -922,6 +945,8 @@ "@levischuck/tiny-cbor": ["@levischuck/tiny-cbor@0.2.11", "", {}, "sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow=="], + "@logdna/tail-file": ["@logdna/tail-file@2.2.0", "", {}, "sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng=="], + "@lottiefiles/dotlottie-react": ["@lottiefiles/dotlottie-react@0.14.2", "", { "dependencies": { "@lottiefiles/dotlottie-web": "0.47.0" }, "peerDependencies": { "react": "^17 || ^18 || ^19" } }, "sha512-RR4r0HrKQbOAw6iS6C3mRARS2iu+yI+G1vICoUsRMHzlUUk1/26l3WyAjhcG+KoaGoKmORx8FgHjTNr4Sr/2Ug=="], "@lottiefiles/dotlottie-web": ["@lottiefiles/dotlottie-web@0.47.0", "", {}, "sha512-YN6wSB4iYZBYEAFKEs/taufrPH3rfNlUA632Ib61WoR58TALAJ1ZX8yDIGUBT28byMJhZR4+xdpRX4v7X8OeBQ=="], @@ -984,6 +1009,34 @@ "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], + "@npmcli/agent": ["@npmcli/agent@2.2.2", "", { "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.1", "lru-cache": "^10.0.1", "socks-proxy-agent": "^8.0.3" } }, "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og=="], + + "@npmcli/arborist": ["@npmcli/arborist@7.5.4", "", { "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^3.1.1", "@npmcli/installed-package-contents": "^2.1.0", "@npmcli/map-workspaces": "^3.0.2", "@npmcli/metavuln-calculator": "^7.1.1", "@npmcli/name-from-folder": "^2.0.0", "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.1.0", "@npmcli/query": "^3.1.0", "@npmcli/redact": "^2.0.0", "@npmcli/run-script": "^8.1.0", "bin-links": "^4.0.4", "cacache": "^18.0.3", "common-ancestor-path": "^1.0.1", "hosted-git-info": "^7.0.2", "json-parse-even-better-errors": "^3.0.2", "json-stringify-nice": "^1.1.4", "lru-cache": "^10.2.2", "minimatch": "^9.0.4", "nopt": "^7.2.1", "npm-install-checks": "^6.2.0", "npm-package-arg": "^11.0.2", "npm-pick-manifest": "^9.0.1", "npm-registry-fetch": "^17.0.1", "pacote": "^18.0.6", "parse-conflict-json": "^3.0.0", "proc-log": "^4.2.0", "proggy": "^2.0.0", "promise-all-reject-late": "^1.0.0", "promise-call-limit": "^3.0.1", "read-package-json-fast": "^3.0.2", "semver": "^7.3.7", "ssri": "^10.0.6", "treeverse": "^3.0.0", "walk-up-path": "^3.0.1" }, "bin": { "arborist": "bin/index.js" } }, "sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g=="], + + "@npmcli/fs": ["@npmcli/fs@3.1.1", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg=="], + + "@npmcli/git": ["@npmcli/git@5.0.8", "", { "dependencies": { "@npmcli/promise-spawn": "^7.0.0", "ini": "^4.1.3", "lru-cache": "^10.0.1", "npm-pick-manifest": "^9.0.0", "proc-log": "^4.0.0", "promise-inflight": "^1.0.1", "promise-retry": "^2.0.1", "semver": "^7.3.5", "which": "^4.0.0" } }, "sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ=="], + + "@npmcli/installed-package-contents": ["@npmcli/installed-package-contents@2.1.0", "", { "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "bin": { "installed-package-contents": "bin/index.js" } }, "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w=="], + + "@npmcli/map-workspaces": ["@npmcli/map-workspaces@3.0.6", "", { "dependencies": { "@npmcli/name-from-folder": "^2.0.0", "glob": "^10.2.2", "minimatch": "^9.0.0", "read-package-json-fast": "^3.0.0" } }, "sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA=="], + + "@npmcli/metavuln-calculator": ["@npmcli/metavuln-calculator@7.1.1", "", { "dependencies": { "cacache": "^18.0.0", "json-parse-even-better-errors": "^3.0.0", "pacote": "^18.0.0", "proc-log": "^4.1.0", "semver": "^7.3.5" } }, "sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g=="], + + "@npmcli/name-from-folder": ["@npmcli/name-from-folder@2.0.0", "", {}, "sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg=="], + + "@npmcli/node-gyp": ["@npmcli/node-gyp@3.0.0", "", {}, "sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA=="], + + "@npmcli/package-json": ["@npmcli/package-json@5.2.1", "", { "dependencies": { "@npmcli/git": "^5.0.0", "glob": "^10.2.2", "hosted-git-info": "^7.0.0", "json-parse-even-better-errors": "^3.0.0", "normalize-package-data": "^6.0.0", "proc-log": "^4.0.0", "semver": "^7.5.3" } }, "sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ=="], + + "@npmcli/promise-spawn": ["@npmcli/promise-spawn@7.0.2", "", { "dependencies": { "which": "^4.0.0" } }, "sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ=="], + + "@npmcli/query": ["@npmcli/query@3.1.0", "", { "dependencies": { "postcss-selector-parser": "^6.0.10" } }, "sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ=="], + + "@npmcli/redact": ["@npmcli/redact@2.0.1", "", {}, "sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw=="], + + "@npmcli/run-script": ["@npmcli/run-script@8.1.0", "", { "dependencies": { "@npmcli/node-gyp": "^3.0.0", "@npmcli/package-json": "^5.0.0", "@npmcli/promise-spawn": "^7.0.0", "node-gyp": "^10.0.0", "proc-log": "^4.0.0", "which": "^4.0.0" } }, "sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg=="], + "@number-flow/react": ["@number-flow/react@0.5.10", "", { "dependencies": { "esm-env": "^1.1.4", "number-flow": "0.5.8" }, "peerDependencies": { "react": "^18 || ^19", "react-dom": "^18 || ^19" } }, "sha512-a8Wh5eNITn7Km4xbddAH7QH8eNmnduR6k34ER1hkHSGO4H2yU1DDnuAWLQM99vciGInFODemSc0tdxrXkJEpbA=="], "@octokit/auth-token": ["@octokit/auth-token@6.0.0", "", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="], @@ -1012,9 +1065,9 @@ "@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.52.1", "", { "dependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-qnSqB2DQ9TPP96dl8cDubDvrUyWc0/sK81xHTK8eSUspzDM3bsewX903qclQFvVhgStjRWdC5bLb3kQqMkfV5A=="], - "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.25.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ=="], + "@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.30.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA=="], - "@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + "@opentelemetry/core": ["@opentelemetry/core@1.30.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ=="], "@opentelemetry/exporter-logs-otlp-http": ["@opentelemetry/exporter-logs-otlp-http@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", "@opentelemetry/otlp-transformer": "0.52.1", "@opentelemetry/sdk-logs": "0.52.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA=="], @@ -1024,21 +1077,23 @@ "@opentelemetry/exporter-trace-otlp-proto": ["@opentelemetry/exporter-trace-otlp-proto@0.52.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", "@opentelemetry/otlp-transformer": "0.52.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ=="], - "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw=="], + "@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA=="], "@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.57.2", "", { "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg=="], + "@opentelemetry/instrumentation-grpc": ["@opentelemetry/instrumentation-grpc@0.55.0", "", { "dependencies": { "@opentelemetry/instrumentation": "0.55.0", "@opentelemetry/semantic-conventions": "1.27.0" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-n2ZH4pRwOy0Vhag/3eKqiyDBwcpUnGgJI9iiIRX7vivE0FMncaLazWphNFezRRaM/LuKwq1TD8pVUvieP68mow=="], + "@opentelemetry/otlp-exporter-base": ["@opentelemetry/otlp-exporter-base@0.52.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-transformer": "0.52.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-z175NXOtX5ihdlshtYBe5RpGeBoTXVCKPPLiQlD6FHvpM4Ch+p2B0yWKYSrBfLH24H9zjJiBdTrtD+hLlfnXEQ=="], "@opentelemetry/otlp-grpc-exporter-base": ["@opentelemetry/otlp-grpc-exporter-base@0.52.1", "", { "dependencies": { "@grpc/grpc-js": "^1.7.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/otlp-exporter-base": "0.52.1", "@opentelemetry/otlp-transformer": "0.52.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-zo/YrSDmKMjG+vPeA9aBBrsQM9Q/f2zo6N04WMB3yNldJRsgpRBeLLwvAt/Ba7dpehDLOEFBd1i2JCoaFtpCoQ=="], "@opentelemetry/otlp-transformer": ["@opentelemetry/otlp-transformer@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-logs": "0.52.1", "@opentelemetry/sdk-metrics": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "protobufjs": "^7.3.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg=="], - "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A=="], + "@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ=="], - "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA=="], + "@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg=="], - "@opentelemetry/resources": ["@opentelemetry/resources@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ=="], + "@opentelemetry/resources": ["@opentelemetry/resources@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA=="], "@opentelemetry/sdk-logs": ["@opentelemetry/sdk-logs@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.4.0 <1.10.0" } }, "sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA=="], @@ -1046,9 +1101,9 @@ "@opentelemetry/sdk-node": ["@opentelemetry/sdk-node@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/exporter-trace-otlp-grpc": "0.52.1", "@opentelemetry/exporter-trace-otlp-http": "0.52.1", "@opentelemetry/exporter-trace-otlp-proto": "0.52.1", "@opentelemetry/exporter-zipkin": "1.25.1", "@opentelemetry/instrumentation": "0.52.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-logs": "0.52.1", "@opentelemetry/sdk-metrics": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/sdk-trace-node": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.3.0 <1.10.0" } }, "sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA=="], - "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw=="], + "@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.30.1", "", { "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg=="], - "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@1.25.1", "", { "dependencies": { "@opentelemetry/context-async-hooks": "1.25.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/propagator-b3": "1.25.1", "@opentelemetry/propagator-jaeger": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ=="], + "@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@1.30.1", "", { "dependencies": { "@opentelemetry/context-async-hooks": "1.30.1", "@opentelemetry/core": "1.30.1", "@opentelemetry/propagator-b3": "1.30.1", "@opentelemetry/propagator-jaeger": "1.30.1", "@opentelemetry/sdk-trace-base": "1.30.1", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ=="], "@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.25.1", "", {}, "sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ=="], @@ -1148,6 +1203,22 @@ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.0", "", {}, "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw=="], + "@pulumi/aws": ["@pulumi/aws@6.83.0", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0", "mime": "^2.0.0" } }, "sha512-uYpYSA5aaDERFuxy3D+FDWiwH7YYNHSwGLpHVuARAzBfQ/SQDkS/tfJI5NNo7/+KCmje3rloKE2enUK/Q9bVBg=="], + + "@pulumi/awsx": ["@pulumi/awsx@2.22.0", "", { "dependencies": { "@aws-sdk/client-ecs": "^3.405.0", "@pulumi/aws": "^6.66.3", "@pulumi/docker": "^4.6.0", "@pulumi/docker-build": "^0.0.8", "@pulumi/pulumi": "^3.142.0", "@types/aws-lambda": "^8.10.23", "docker-classic": "npm:@pulumi/docker@3.6.1", "mime": "^2.0.0" } }, "sha512-uajrWX6zkk8G9DCCkCkRaH2yzeGRkCElkC8FOE9viUtb9WyVt01EbNqJkje+QwYq4g055jWqcq2YRn7xT1Y44w=="], + + "@pulumi/command": ["@pulumi/command@1.1.0", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0" } }, "sha512-ovVec+gXeqpcm76xwYYZvfJym8bG9NRvlBGQWbn0+c0fKQziZIjiv5V+AxTKfb+dLWKe7Otyt206L1IWq41hyw=="], + + "@pulumi/docker": ["@pulumi/docker@4.8.0", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0", "semver": "^5.4.0" } }, "sha512-R1jDAokbz71VbljF6TJ4yNA4Tp1Gd+ISgIQmrcsUf/gNCP1hoA7putyTIta5q0zzy83aPeeeySYwx54iOfHrvQ=="], + + "@pulumi/docker-build": ["@pulumi/docker-build@0.0.12", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0" } }, "sha512-NCN9pboxGT/qKkv9c2/7b+S3y/3hZI6FI1+luP4faQeGFmvT4C4GSAw+uKSbayw8EQWqQfavKo9zq2SKrLbxhQ=="], + + "@pulumi/pulumi": ["@pulumi/pulumi@3.185.0", "", { "dependencies": { "@grpc/grpc-js": "^1.10.1", "@logdna/tail-file": "^2.0.6", "@npmcli/arborist": "^7.3.1", "@opentelemetry/api": "^1.9", "@opentelemetry/exporter-zipkin": "^1.28", "@opentelemetry/instrumentation": "^0.55", "@opentelemetry/instrumentation-grpc": "^0.55", "@opentelemetry/resources": "^1.28", "@opentelemetry/sdk-trace-base": "^1.28", "@opentelemetry/sdk-trace-node": "^1.28", "@types/google-protobuf": "^3.15.5", "@types/semver": "^7.5.6", "@types/tmp": "^0.2.6", "execa": "^5.1.0", "fdir": "^6.1.1", "google-protobuf": "^3.5.0", "got": "^11.8.6", "ini": "^2.0.0", "js-yaml": "^3.14.0", "minimist": "^1.2.6", "normalize-package-data": "^6.0.0", "picomatch": "^3.0.1", "pkg-dir": "^7.0.0", "require-from-string": "^2.0.1", "semver": "^7.5.2", "source-map-support": "^0.5.6", "tmp": "^0.2.1", "upath": "^1.1.0" }, "peerDependencies": { "ts-node": ">= 7.0.1 < 12", "typescript": ">= 3.8.3 < 6" }, "optionalPeers": ["ts-node", "typescript"] }, "sha512-J8Ha8EDxw503hMmVu1i+qd7atQRJkB6VD0En5ibUgm+B4453AfWclGTHoFcz/QLCneYRQhH+SUS2zy1+sqggdw=="], + + "@pulumi/random": ["@pulumi/random@4.18.2", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0" } }, "sha512-jC0HfgkFKwgUGmocM7Tw6UyOrpLFXGO8kYfV6f5Q9R/yziaVxEVPQ0Uup2HfosDh926EZHJrt2EUIJHWCyOvFA=="], + + "@pulumi/tailscale": ["@pulumi/tailscale@0.17.5", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0" } }, "sha512-QGWCUam6WykikNIuBNR5UAicwhw9RZTSZX/M8oOyUkBSiKSmy3ksdl4VxNdpNZJ9C76ZoXzZL/LlLy5J+sUjfw=="], + "@puppeteer/browsers": ["@puppeteer/browsers@2.10.5", "", { "dependencies": { "debug": "^4.4.1", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.2", "tar-fs": "^3.0.8", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w=="], "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], @@ -1388,6 +1459,18 @@ "@semantic-release/release-notes-generator": ["@semantic-release/release-notes-generator@14.0.3", "", { "dependencies": { "conventional-changelog-angular": "^8.0.0", "conventional-changelog-writer": "^8.0.0", "conventional-commits-filter": "^5.0.0", "conventional-commits-parser": "^6.0.0", "debug": "^4.0.0", "get-stream": "^7.0.0", "import-from-esm": "^2.0.0", "into-stream": "^7.0.0", "lodash-es": "^4.17.21", "read-package-up": "^11.0.0" }, "peerDependencies": { "semantic-release": ">=20.1.0" } }, "sha512-XxAZRPWGwO5JwJtS83bRdoIhCiYIx8Vhr+u231pQAsdFIAbm19rSVJLdnBN+Avvk7CKvNQE/nJ4y7uqKH6WTiw=="], + "@sigstore/bundle": ["@sigstore/bundle@2.3.2", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.3.2" } }, "sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA=="], + + "@sigstore/core": ["@sigstore/core@1.1.0", "", {}, "sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg=="], + + "@sigstore/protobuf-specs": ["@sigstore/protobuf-specs@0.3.3", "", {}, "sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ=="], + + "@sigstore/sign": ["@sigstore/sign@2.3.2", "", { "dependencies": { "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", "@sigstore/protobuf-specs": "^0.3.2", "make-fetch-happen": "^13.0.1", "proc-log": "^4.2.0", "promise-retry": "^2.0.1" } }, "sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA=="], + + "@sigstore/tuf": ["@sigstore/tuf@2.3.4", "", { "dependencies": { "@sigstore/protobuf-specs": "^0.3.2", "tuf-js": "^2.2.1" } }, "sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw=="], + + "@sigstore/verify": ["@sigstore/verify@1.2.1", "", { "dependencies": { "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.1.0", "@sigstore/protobuf-specs": "^0.3.2" } }, "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g=="], + "@simplewebauthn/browser": ["@simplewebauthn/browser@13.1.0", "", {}, "sha512-WuHZ/PYvyPJ9nxSzgHtOEjogBhwJfC8xzYkPC+rR/+8chl/ft4ngjiK8kSU5HtRJfczupyOh33b25TjYbvwAcg=="], "@simplewebauthn/server": ["@simplewebauthn/server@13.1.1", "", { "dependencies": { "@hexagon/base64": "^1.1.27", "@levischuck/tiny-cbor": "^0.2.2", "@peculiar/asn1-android": "^2.3.10", "@peculiar/asn1-ecc": "^2.3.8", "@peculiar/asn1-rsa": "^2.3.8", "@peculiar/asn1-schema": "^2.3.8", "@peculiar/asn1-x509": "^2.3.8" } }, "sha512-1hsLpRHfSuMB9ee2aAdh0Htza/X3f4djhYISrggqGe3xopNjOcePiSDkDDoPzDYaaMCrbqGP1H2TYU7bgL9PmA=="], @@ -1518,6 +1601,8 @@ "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], + "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="], + "@t3-oss/env-core": ["@t3-oss/env-core@0.13.8", "", { "peerDependencies": { "arktype": "^2.1.0", "typescript": ">=5.0.0", "valibot": "^1.0.0-beta.7 || ^1.0.0", "zod": "^3.24.0 || ^4.0.0-beta.0" }, "optionalPeers": ["arktype", "typescript", "valibot", "zod"] }, "sha512-L1inmpzLQyYu4+Q1DyrXsGJYCXbtXjC4cICw1uAKv0ppYPQv656lhZPU91Qd1VS6SO/bou1/q5ufVzBGbNsUpw=="], "@t3-oss/env-nextjs": ["@t3-oss/env-nextjs@0.13.8", "", { "dependencies": { "@t3-oss/env-core": "0.13.8" }, "peerDependencies": { "arktype": "^2.1.0", "typescript": ">=5.0.0", "valibot": "^1.0.0-beta.7 || ^1.0.0", "zod": "^3.24.0 || ^4.0.0-beta.0" }, "optionalPeers": ["arktype", "typescript", "valibot", "zod"] }, "sha512-QmTLnsdQJ8BiQad2W2nvV6oUpH4oMZMqnFEjhVpzU0h3sI9hn8zb8crjWJ1Amq453mGZs6A4v4ihIeBFDOrLeQ=="], @@ -1674,6 +1759,10 @@ "@tsconfig/node16": ["@tsconfig/node16@1.0.4", "", {}, "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA=="], + "@tufjs/canonical-json": ["@tufjs/canonical-json@2.0.0", "", {}, "sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA=="], + + "@tufjs/models": ["@tufjs/models@2.0.1", "", { "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.4" } }, "sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg=="], + "@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="], "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], @@ -1682,6 +1771,8 @@ "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="], + "@types/aws-lambda": ["@types/aws-lambda@8.10.152", "", {}, "sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw=="], + "@types/babel__core": ["@types/babel__core@7.20.5", "", { "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA=="], "@types/babel__generator": ["@types/babel__generator@7.27.0", "", { "dependencies": { "@babel/types": "^7.0.0" } }, "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg=="], @@ -1694,6 +1785,8 @@ "@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="], + "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="], + "@types/canvas-confetti": ["@types/canvas-confetti@1.9.0", "", {}, "sha512-aBGj/dULrimR1XDZLtG9JwxX1b4HPRF6CX9Yfwh3NvstZEm1ZL7RBnel4keCPSqs1ANRu1u2Aoz9R+VmtjYuTg=="], "@types/chai": ["@types/chai@5.2.2", "", { "dependencies": { "@types/deep-eql": "*" } }, "sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg=="], @@ -1784,8 +1877,12 @@ "@types/geojson": ["@types/geojson@7946.0.16", "", {}, "sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg=="], + "@types/google-protobuf": ["@types/google-protobuf@3.15.12", "", {}, "sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ=="], + "@types/hast": ["@types/hast@3.0.4", "", { "dependencies": { "@types/unist": "*" } }, "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ=="], + "@types/http-cache-semantics": ["@types/http-cache-semantics@4.0.4", "", {}, "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA=="], + "@types/http-errors": ["@types/http-errors@2.0.5", "", {}, "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg=="], "@types/is-stream": ["@types/is-stream@1.1.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg=="], @@ -1800,6 +1897,8 @@ "@types/jszip": ["@types/jszip@3.4.1", "", { "dependencies": { "jszip": "*" } }, "sha512-TezXjmf3lj+zQ651r6hPqvSScqBLvyPI9FxdXBqpEwBijNGQ2NXpaFW/7joGzveYkKQUil7iiDHLo6LV71Pc0A=="], + "@types/keyv": ["@types/keyv@3.1.4", "", { "dependencies": { "@types/node": "*" } }, "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg=="], + "@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="], "@types/lodash": ["@types/lodash@4.17.19", "", {}, "sha512-NYqRyg/hIQrYPT9lbOeYc3kIRabJDn/k4qQHIXUpx88CBDww2fD15Sg5kbXlW86zm2XEW4g0QxkTI3/Kfkc7xQ=="], @@ -1840,8 +1939,12 @@ "@types/readdir-glob": ["@types/readdir-glob@1.1.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-raiuEPUYqXu+nvtY2Pe8s8FEmZ3x5yAH4VkLdihcPdalvsHltomrRC9BzuStrJ9yk06470hS0Crw0f1pXqD+Hg=="], + "@types/responselike": ["@types/responselike@1.0.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw=="], + "@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="], + "@types/semver": ["@types/semver@7.7.0", "", {}, "sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA=="], + "@types/send": ["@types/send@0.17.5", "", { "dependencies": { "@types/mime": "^1", "@types/node": "*" } }, "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w=="], "@types/serve-static": ["@types/serve-static@1.15.8", "", { "dependencies": { "@types/http-errors": "*", "@types/node": "*", "@types/send": "*" } }, "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg=="], @@ -1852,6 +1955,8 @@ "@types/three": ["@types/three@0.177.0", "", { "dependencies": { "@dimforge/rapier3d-compat": "~0.12.0", "@tweenjs/tween.js": "~23.1.3", "@types/stats.js": "*", "@types/webxr": "*", "@webgpu/types": "*", "fflate": "~0.8.2", "meshoptimizer": "~0.18.1" } }, "sha512-/ZAkn4OLUijKQySNci47lFO+4JLE1TihEjsGWPUT+4jWqxtwOPPEwJV1C3k5MEx0mcBPCdkFjzRzDOnHEI1R+A=="], + "@types/tmp": ["@types/tmp@0.2.6", "", {}, "sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA=="], + "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], "@types/tsscmp": ["@types/tsscmp@1.0.2", "", {}, "sha512-cy7BRSU8GYYgxjcx0Py+8lo5MthuDhlyu076KUcYzVNXL23luYgRHkMG2fIFEc6neckeh/ntP82mw+U4QjZq+g=="], @@ -1978,7 +2083,7 @@ "JSONStream": ["JSONStream@1.3.5", "", { "dependencies": { "jsonparse": "^1.2.0", "through": ">=2.2.7 <3" }, "bin": { "JSONStream": "./bin.js" } }, "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ=="], - "abbrev": ["abbrev@1.1.1", "", {}, "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="], + "abbrev": ["abbrev@2.0.0", "", {}, "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ=="], "abort-controller": ["abort-controller@3.0.0", "", { "dependencies": { "event-target-shim": "^5.0.0" } }, "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg=="], @@ -2122,6 +2227,8 @@ "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="], + "bin-links": ["bin-links@4.0.4", "", { "dependencies": { "cmd-shim": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "read-cmd-shim": "^4.0.0", "write-file-atomic": "^5.0.0" } }, "sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA=="], + "binary-extensions": ["binary-extensions@2.3.0", "", {}, "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw=="], "block-stream": ["block-stream@0.0.9", "", { "dependencies": { "inherits": "~2.0.0" } }, "sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ=="], @@ -2144,6 +2251,8 @@ "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="], + "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], + "bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="], "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], @@ -2156,6 +2265,12 @@ "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + "cacache": ["cacache@18.0.4", "", { "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", "glob": "^10.2.2", "lru-cache": "^10.0.1", "minipass": "^7.0.3", "minipass-collect": "^2.0.1", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" } }, "sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ=="], + + "cacheable-lookup": ["cacheable-lookup@5.0.4", "", {}, "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA=="], + + "cacheable-request": ["cacheable-request@7.0.4", "", { "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", "http-cache-semantics": "^4.0.0", "keyv": "^4.0.0", "lowercase-keys": "^2.0.0", "normalize-url": "^6.0.1", "responselike": "^2.0.0" } }, "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg=="], + "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], @@ -2220,8 +2335,12 @@ "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], + "clone-response": ["clone-response@1.0.3", "", { "dependencies": { "mimic-response": "^1.0.0" } }, "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA=="], + "clsx": ["clsx@2.1.1", "", {}, "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA=="], + "cmd-shim": ["cmd-shim@6.0.3", "", {}, "sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA=="], + "cmdk": ["cmdk@1.0.4", "", { "dependencies": { "@radix-ui/react-dialog": "^1.1.2", "@radix-ui/react-id": "^1.1.0", "@radix-ui/react-primitive": "^2.0.0", "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "react-dom": "^18 || ^19 || ^19.0.0-rc" } }, "sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg=="], "code-point-at": ["code-point-at@1.1.0", "", {}, "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA=="], @@ -2240,6 +2359,8 @@ "commander": ["commander@13.1.0", "", {}, "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw=="], + "common-ancestor-path": ["common-ancestor-path@1.0.1", "", {}, "sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w=="], + "compare-func": ["compare-func@2.0.0", "", { "dependencies": { "array-ify": "^1.0.0", "dot-prop": "^5.1.0" } }, "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA=="], "compress-commons": ["compress-commons@6.0.2", "", { "dependencies": { "crc-32": "^1.2.0", "crc32-stream": "^6.0.0", "is-stream": "^2.0.1", "normalize-path": "^3.0.0", "readable-stream": "^4.0.0" } }, "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg=="], @@ -2412,6 +2533,8 @@ "decode-named-character-reference": ["decode-named-character-reference@1.2.0", "", { "dependencies": { "character-entities": "^2.0.0" } }, "sha512-c6fcElNV6ShtZXmsgNgFFV5tVX2PaV4g+MOAkb8eXHvn6sryJBrZa9r0zV6+dtTyoCKxtDy5tyQ5ZwQuidtd+Q=="], + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], + "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], @@ -2424,6 +2547,8 @@ "default-browser-id": ["default-browser-id@5.0.0", "", {}, "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA=="], + "defer-to-connect": ["defer-to-connect@2.0.1", "", {}, "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg=="], + "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], "define-lazy-prop": ["define-lazy-prop@3.0.0", "", {}, "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="], @@ -2472,6 +2597,8 @@ "dnd-core": ["dnd-core@16.0.1", "", { "dependencies": { "@react-dnd/asap": "^5.0.1", "@react-dnd/invariant": "^4.0.1", "redux": "^4.2.0" } }, "sha512-HK294sl7tbw6F6IeuK16YSBUoorvHpY8RHO+9yFfaJyCDVb6n7PRcezrOEOa2SBCqiYpemh5Jx20ZcjKdFAVng=="], + "docker-classic": ["@pulumi/docker@3.6.1", "", { "dependencies": { "@pulumi/pulumi": "^3.0.0", "semver": "^5.4.0" } }, "sha512-BZME50QkT556v+LvmTXPT8ssB2xxNkp9+msB5xYFEnUnWcdGAx5yUysQw70RJCb+U0GbkJSbxtlgMJgOQf/now=="], + "doctrine": ["doctrine@2.1.0", "", { "dependencies": { "esutils": "^2.0.2" } }, "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw=="], "dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], @@ -2490,6 +2617,8 @@ "dot-prop": ["dot-prop@5.3.0", "", { "dependencies": { "is-obj": "^2.0.0" } }, "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q=="], + "dotenv": ["dotenv@17.2.0", "", {}, "sha512-Q4sgBT60gzd0BB0lSyYD3xM4YxrXA9y4uBDof1JNYGzOXrQdQ6yX+7XIAqoFOGQFOTK1D3Hts5OllpxMDZFONQ=="], + "draco3d": ["draco3d@1.5.7", "", {}, "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ=="], "dub": ["dub@0.63.6", "", { "peerDependencies": { "@modelcontextprotocol/sdk": ">=1.5.0 <1.10.0", "zod": ">= 3" }, "optionalPeers": ["@modelcontextprotocol/sdk"], "bin": { "mcp": "bin/mcp-server.js" } }, "sha512-4iAJvOtj5MegRqsSpUc2H9Prvgh95vidGGEHXYrJO6bLUQ4TSfQwoRei+WdKJohV0t4klhEj4ruQx2olefMzuA=="], @@ -2522,6 +2651,8 @@ "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + "encoding": ["encoding@0.1.13", "", { "dependencies": { "iconv-lite": "^0.6.2" } }, "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A=="], + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], "engine.io": ["engine.io@6.6.4", "", { "dependencies": { "@types/cors": "^2.8.12", "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", "ws": "~8.17.1" } }, "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g=="], @@ -2542,6 +2673,8 @@ "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], + "err-code": ["err-code@2.0.3", "", {}, "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA=="], + "error-ex": ["error-ex@1.3.2", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g=="], "error-stack-parser": ["error-stack-parser@2.1.4", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ=="], @@ -2636,6 +2769,8 @@ "expect-type": ["expect-type@1.2.1", "", {}, "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw=="], + "exponential-backoff": ["exponential-backoff@3.1.2", "", {}, "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA=="], + "express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], @@ -2734,6 +2869,8 @@ "fs-extra": ["fs-extra@11.3.0", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew=="], + "fs-minipass": ["fs-minipass@3.0.3", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw=="], + "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], "fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], @@ -2796,8 +2933,12 @@ "glsl-noise": ["glsl-noise@0.0.0", "", {}, "sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w=="], + "google-protobuf": ["google-protobuf@3.21.4", "", {}, "sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ=="], + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], + "got": ["got@11.8.6", "", { "dependencies": { "@sindresorhus/is": "^4.0.0", "@szmarczak/http-timer": "^4.0.5", "@types/cacheable-request": "^6.0.1", "@types/responselike": "^1.0.0", "cacheable-lookup": "^5.0.3", "cacheable-request": "^7.0.2", "decompress-response": "^6.0.0", "http2-wrapper": "^1.0.0-beta.5.2", "lowercase-keys": "^2.0.0", "p-cancelable": "^2.0.0", "responselike": "^2.0.0" } }, "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g=="], + "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], "graphemer": ["graphemer@1.4.0", "", {}, "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="], @@ -2848,12 +2989,16 @@ "htmlparser2": ["htmlparser2@8.0.2", "", { "dependencies": { "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1", "entities": "^4.4.0" } }, "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA=="], + "http-cache-semantics": ["http-cache-semantics@4.2.0", "", {}, "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ=="], + "http-errors": ["http-errors@2.0.0", "", { "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": "2.0.1", "toidentifier": "1.0.1" } }, "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ=="], "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="], "http-signature": ["http-signature@1.2.0", "", { "dependencies": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", "sshpk": "^1.7.0" } }, "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ=="], + "http2-wrapper": ["http2-wrapper@1.0.3", "", { "dependencies": { "quick-lru": "^5.1.1", "resolve-alpn": "^1.0.0" } }, "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg=="], + "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "4" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="], "human-signals": ["human-signals@2.1.0", "", {}, "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="], @@ -2872,6 +3017,8 @@ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "ignore-walk": ["ignore-walk@6.0.5", "", { "dependencies": { "minimatch": "^9.0.0" } }, "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A=="], + "immediate": ["immediate@3.0.6", "", {}, "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ=="], "import-fresh": ["import-fresh@3.3.1", "", { "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ=="], @@ -2892,7 +3039,7 @@ "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], - "ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + "ini": ["ini@2.0.0", "", {}, "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA=="], "inline-style-parser": ["inline-style-parser@0.2.4", "", {}, "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q=="], @@ -2962,6 +3109,8 @@ "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], + "is-lambda": ["is-lambda@1.0.1", "", {}, "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ=="], + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], @@ -3050,7 +3199,7 @@ "json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + "json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], @@ -3058,6 +3207,8 @@ "json-stable-stringify-without-jsonify": ["json-stable-stringify-without-jsonify@1.0.1", "", {}, "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="], + "json-stringify-nice": ["json-stringify-nice@1.1.4", "", {}, "sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw=="], + "json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="], "json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], @@ -3078,6 +3229,10 @@ "jszip": ["jszip@3.10.1", "", { "dependencies": { "lie": "~3.3.0", "pako": "~1.0.2", "readable-stream": "~2.3.6", "setimmediate": "^1.0.5" } }, "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g=="], + "just-diff": ["just-diff@6.0.2", "", {}, "sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA=="], + + "just-diff-apply": ["just-diff-apply@5.5.0", "", {}, "sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw=="], + "jwa": ["jwa@1.4.2", "", { "dependencies": { "buffer-equal-constant-time": "^1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "^5.0.1" } }, "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw=="], "jws": ["jws@3.2.2", "", { "dependencies": { "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } }, "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA=="], @@ -3194,6 +3349,8 @@ "loupe": ["loupe@3.1.4", "", {}, "sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg=="], + "lowercase-keys": ["lowercase-keys@2.0.0", "", {}, "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA=="], + "lowlight": ["lowlight@3.3.0", "", { "dependencies": { "@types/hast": "^3.0.0", "devlop": "^1.0.0", "highlight.js": "~11.11.0" } }, "sha512-0JNhgFoPvP6U6lE/UdVsSq99tn6DhjjpAj5MxG49ewd2mOBVtwWYIT8ClyABhq198aXXODMU6Ox8DrGy/CpTZQ=="], "lru-cache": ["lru-cache@10.4.3", "", {}, "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ=="], @@ -3210,6 +3367,8 @@ "make-error": ["make-error@1.3.6", "", {}, "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw=="], + "make-fetch-happen": ["make-fetch-happen@13.0.1", "", { "dependencies": { "@npmcli/agent": "^2.0.0", "cacache": "^18.0.0", "http-cache-semantics": "^4.1.1", "is-lambda": "^1.0.1", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "negotiator": "^0.6.3", "proc-log": "^4.2.0", "promise-retry": "^2.0.1", "ssri": "^10.0.0" } }, "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA=="], + "markdown-it": ["markdown-it@14.1.0", "", { "dependencies": { "argparse": "^2.0.1", "entities": "^4.4.0", "linkify-it": "^5.0.0", "mdurl": "^2.0.0", "punycode.js": "^2.3.1", "uc.micro": "^2.1.0" }, "bin": { "markdown-it": "bin/markdown-it.mjs" } }, "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg=="], "markdown-table": ["markdown-table@3.0.4", "", {}, "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw=="], @@ -3342,6 +3501,8 @@ "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], "minimal-polyfills": ["minimal-polyfills@2.2.3", "", {}, "sha512-oxdmJ9cL+xV72h0xYxp4tP2d5/fTBpP45H8DIOn9pASuF8a3IYTf+25fMGDYGiWW+MFsuog6KD6nfmhZJQ+uUw=="], @@ -3352,6 +3513,16 @@ "minipass": ["minipass@7.1.2", "", {}, "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw=="], + "minipass-collect": ["minipass-collect@2.0.1", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw=="], + + "minipass-fetch": ["minipass-fetch@3.0.5", "", { "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", "minizlib": "^2.1.2" }, "optionalDependencies": { "encoding": "^0.1.13" } }, "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg=="], + + "minipass-flush": ["minipass-flush@1.0.5", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw=="], + + "minipass-pipeline": ["minipass-pipeline@1.2.4", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A=="], + + "minipass-sized": ["minipass-sized@1.0.3", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g=="], + "minizlib": ["minizlib@3.0.2", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA=="], "mitt": ["mitt@3.0.1", "", {}, "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="], @@ -3422,7 +3593,7 @@ "node-releases": ["node-releases@2.0.19", "", {}, "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw=="], - "nopt": ["nopt@3.0.6", "", { "dependencies": { "abbrev": "1" }, "bin": { "nopt": "./bin/nopt.js" } }, "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg=="], + "nopt": ["nopt@7.2.1", "", { "dependencies": { "abbrev": "^2.0.0" }, "bin": { "nopt": "bin/nopt.js" } }, "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w=="], "normalize-package-data": ["normalize-package-data@6.0.2", "", { "dependencies": { "hosted-git-info": "^7.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" } }, "sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g=="], @@ -3434,8 +3605,20 @@ "npm": ["npm@10.9.3", "", { "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/arborist": "^8.0.1", "@npmcli/config": "^9.0.0", "@npmcli/fs": "^4.0.0", "@npmcli/map-workspaces": "^4.0.2", "@npmcli/package-json": "^6.2.0", "@npmcli/promise-spawn": "^8.0.2", "@npmcli/redact": "^3.2.2", "@npmcli/run-script": "^9.1.0", "@sigstore/tuf": "^3.1.1", "abbrev": "^3.0.1", "archy": "~1.0.0", "cacache": "^19.0.1", "chalk": "^5.4.1", "ci-info": "^4.2.0", "cli-columns": "^4.0.0", "fastest-levenshtein": "^1.0.16", "fs-minipass": "^3.0.3", "glob": "^10.4.5", "graceful-fs": "^4.2.11", "hosted-git-info": "^8.1.0", "ini": "^5.0.0", "init-package-json": "^7.0.2", "is-cidr": "^5.1.1", "json-parse-even-better-errors": "^4.0.0", "libnpmaccess": "^9.0.0", "libnpmdiff": "^7.0.1", "libnpmexec": "^9.0.1", "libnpmfund": "^6.0.1", "libnpmhook": "^11.0.0", "libnpmorg": "^7.0.0", "libnpmpack": "^8.0.1", "libnpmpublish": "^10.0.1", "libnpmsearch": "^8.0.0", "libnpmteam": "^7.0.0", "libnpmversion": "^7.0.0", "make-fetch-happen": "^14.0.3", "minimatch": "^9.0.5", "minipass": "^7.1.1", "minipass-pipeline": "^1.2.4", "ms": "^2.1.2", "node-gyp": "^11.2.0", "nopt": "^8.1.0", "normalize-package-data": "^7.0.0", "npm-audit-report": "^6.0.0", "npm-install-checks": "^7.1.1", "npm-package-arg": "^12.0.2", "npm-pick-manifest": "^10.0.0", "npm-profile": "^11.0.1", "npm-registry-fetch": "^18.0.2", "npm-user-validate": "^3.0.0", "p-map": "^7.0.3", "pacote": "^19.0.1", "parse-conflict-json": "^4.0.0", "proc-log": "^5.0.0", "qrcode-terminal": "^0.12.0", "read": "^4.1.0", "semver": "^7.7.2", "spdx-expression-parse": "^4.0.0", "ssri": "^12.0.0", "supports-color": "^9.4.0", "tar": "^6.2.1", "text-table": "~0.2.0", "tiny-relative-date": "^1.3.0", "treeverse": "^3.0.0", "validate-npm-package-name": "^6.0.1", "which": "^5.0.0", "write-file-atomic": "^6.0.0" }, "bin": { "npm": "bin/npm-cli.js", "npx": "bin/npx-cli.js" } }, "sha512-6Eh1u5Q+kIVXeA8e7l2c/HpnFFcwrkt37xDMujD5be1gloWa9p6j3Fsv3mByXXmqJHy+2cElRMML8opNT7xIJQ=="], + "npm-bundled": ["npm-bundled@3.0.1", "", { "dependencies": { "npm-normalize-package-bin": "^3.0.0" } }, "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ=="], + + "npm-install-checks": ["npm-install-checks@6.3.0", "", { "dependencies": { "semver": "^7.1.1" } }, "sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw=="], + + "npm-normalize-package-bin": ["npm-normalize-package-bin@3.0.1", "", {}, "sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ=="], + "npm-package-arg": ["npm-package-arg@12.0.2", "", { "dependencies": { "hosted-git-info": "^8.0.0", "proc-log": "^5.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^6.0.0" } }, "sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA=="], + "npm-packlist": ["npm-packlist@8.0.2", "", { "dependencies": { "ignore-walk": "^6.0.4" } }, "sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA=="], + + "npm-pick-manifest": ["npm-pick-manifest@9.1.0", "", { "dependencies": { "npm-install-checks": "^6.0.0", "npm-normalize-package-bin": "^3.0.0", "npm-package-arg": "^11.0.0", "semver": "^7.3.5" } }, "sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA=="], + + "npm-registry-fetch": ["npm-registry-fetch@17.1.0", "", { "dependencies": { "@npmcli/redact": "^2.0.0", "jsonparse": "^1.3.1", "make-fetch-happen": "^13.0.0", "minipass": "^7.0.2", "minipass-fetch": "^3.0.0", "minizlib": "^2.1.2", "npm-package-arg": "^11.0.0", "proc-log": "^4.0.0" } }, "sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA=="], + "npm-run-path": ["npm-run-path@4.0.1", "", { "dependencies": { "path-key": "^3.0.0" } }, "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="], "npmlog": ["npmlog@4.1.2", "", { "dependencies": { "are-we-there-yet": "~1.1.2", "console-control-strings": "~1.1.0", "gauge": "~2.7.3", "set-blocking": "~2.0.0" } }, "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg=="], @@ -3490,6 +3673,8 @@ "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + "p-cancelable": ["p-cancelable@2.1.1", "", {}, "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg=="], + "p-each-series": ["p-each-series@3.0.0", "", {}, "sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw=="], "p-filter": ["p-filter@4.1.0", "", { "dependencies": { "p-map": "^7.0.1" } }, "sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw=="], @@ -3520,10 +3705,14 @@ "package-json-from-dist": ["package-json-from-dist@1.0.1", "", {}, "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw=="], + "pacote": ["pacote@18.0.6", "", { "dependencies": { "@npmcli/git": "^5.0.0", "@npmcli/installed-package-contents": "^2.0.1", "@npmcli/package-json": "^5.1.0", "@npmcli/promise-spawn": "^7.0.0", "@npmcli/run-script": "^8.0.0", "cacache": "^18.0.0", "fs-minipass": "^3.0.0", "minipass": "^7.0.2", "npm-package-arg": "^11.0.0", "npm-packlist": "^8.0.0", "npm-pick-manifest": "^9.0.0", "npm-registry-fetch": "^17.0.0", "proc-log": "^4.0.0", "promise-retry": "^2.0.1", "sigstore": "^2.2.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, "bin": { "pacote": "bin/index.js" } }, "sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A=="], + "pako": ["pako@1.0.11", "", {}, "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="], "parent-module": ["parent-module@1.0.1", "", { "dependencies": { "callsites": "^3.0.0" } }, "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="], + "parse-conflict-json": ["parse-conflict-json@3.0.1", "", { "dependencies": { "json-parse-even-better-errors": "^3.0.0", "just-diff": "^6.0.0", "just-diff-apply": "^5.2.0" } }, "sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw=="], + "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], @@ -3588,6 +3777,8 @@ "pkg-conf": ["pkg-conf@2.1.0", "", { "dependencies": { "find-up": "^2.0.0", "load-json-file": "^4.0.0" } }, "sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g=="], + "pkg-dir": ["pkg-dir@7.0.0", "", { "dependencies": { "find-up": "^6.3.0" } }, "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA=="], + "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], "playwright": ["playwright@1.53.1", "", { "dependencies": { "playwright-core": "1.53.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw=="], @@ -3650,8 +3841,18 @@ "process-nextick-args": ["process-nextick-args@2.0.1", "", {}, "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="], + "proggy": ["proggy@2.0.0", "", {}, "sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A=="], + "progress": ["progress@2.0.3", "", {}, "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA=="], + "promise-all-reject-late": ["promise-all-reject-late@1.0.1", "", {}, "sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw=="], + + "promise-call-limit": ["promise-call-limit@3.0.2", "", {}, "sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw=="], + + "promise-inflight": ["promise-inflight@1.0.1", "", {}, "sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g=="], + + "promise-retry": ["promise-retry@2.0.1", "", { "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" } }, "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g=="], + "promise-worker-transferable": ["promise-worker-transferable@1.0.4", "", { "dependencies": { "is-promise": "^2.1.0", "lie": "^3.0.2" } }, "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw=="], "promise.allsettled": ["promise.allsettled@1.0.7", "", { "dependencies": { "array.prototype.map": "^1.0.5", "call-bind": "^1.0.2", "define-properties": "^1.2.0", "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1", "iterate-value": "^1.0.2" } }, "sha512-hezvKvQQmsFkOdrZfYxUxkyxl8mgFQeT259Ajj9PXdbg9VzBCWrItOev72JyWxkCD5VSSqAeHmlN3tWx4DlmsA=="], @@ -3728,6 +3929,8 @@ "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + "quick-lru": ["quick-lru@5.1.1", "", {}, "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA=="], + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], "raw-body": ["raw-body@2.5.2", "", { "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA=="], @@ -3800,6 +4003,10 @@ "read-cache": ["read-cache@1.0.0", "", { "dependencies": { "pify": "^2.3.0" } }, "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA=="], + "read-cmd-shim": ["read-cmd-shim@4.0.0", "", {}, "sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q=="], + + "read-package-json-fast": ["read-package-json-fast@3.0.2", "", { "dependencies": { "json-parse-even-better-errors": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" } }, "sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw=="], + "read-package-up": ["read-package-up@11.0.0", "", { "dependencies": { "find-up-simple": "^1.0.0", "read-pkg": "^9.0.0", "type-fest": "^4.6.0" } }, "sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ=="], "read-pkg": ["read-pkg@9.0.1", "", { "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", "parse-json": "^8.0.0", "type-fest": "^4.6.0", "unicorn-magic": "^0.1.0" } }, "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA=="], @@ -3848,10 +4055,14 @@ "resolve": ["resolve@1.22.10", "", { "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w=="], + "resolve-alpn": ["resolve-alpn@1.2.1", "", {}, "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g=="], + "resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="], "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + "responselike": ["responselike@2.0.1", "", { "dependencies": { "lowercase-keys": "^2.0.0" } }, "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw=="], + "responsive-react-email": ["responsive-react-email@0.0.5", "", { "peerDependencies": { "react": "18.x", "react-email": "1.x" } }, "sha512-r+Z6Yp6G3Sm9eKmttsb8GVij25rXJGN2eoQ9OfMcuVMfBfq1NdytIFLBo/6wdMW1zw+ko1FEUG/zgRyK9UuYLw=="], "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], @@ -3966,6 +4177,8 @@ "signale": ["signale@1.4.0", "", { "dependencies": { "chalk": "^2.3.2", "figures": "^2.0.0", "pkg-conf": "^2.1.0" } }, "sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w=="], + "sigstore": ["sigstore@2.3.1", "", { "dependencies": { "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.0.0", "@sigstore/protobuf-specs": "^0.3.2", "@sigstore/sign": "^2.3.2", "@sigstore/tuf": "^2.3.4", "@sigstore/verify": "^1.2.1" } }, "sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ=="], + "simple-swizzle": ["simple-swizzle@0.2.2", "", { "dependencies": { "is-arrayish": "^0.3.1" } }, "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg=="], "sirv": ["sirv@3.0.1", "", { "dependencies": { "@polka/url": "^1.0.0-next.24", "mrmime": "^2.0.0", "totalist": "^3.0.0" } }, "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A=="], @@ -3998,6 +4211,8 @@ "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], + "source-map-support": ["source-map-support@0.5.21", "", { "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w=="], + "space-separated-tokens": ["space-separated-tokens@2.0.2", "", {}, "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q=="], "spawn-error-forwarder": ["spawn-error-forwarder@1.0.0", "", {}, "sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g=="], @@ -4018,6 +4233,8 @@ "sshpk": ["sshpk@1.18.0", "", { "dependencies": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", "bcrypt-pbkdf": "^1.0.0", "dashdash": "^1.12.0", "ecc-jsbn": "~0.1.1", "getpass": "^0.1.1", "jsbn": "~0.1.0", "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, "bin": { "sshpk-conv": "bin/sshpk-conv", "sshpk-sign": "bin/sshpk-sign", "sshpk-verify": "bin/sshpk-verify" } }, "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ=="], + "ssri": ["ssri@10.0.6", "", { "dependencies": { "minipass": "^7.0.3" } }, "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ=="], + "stable-hash": ["stable-hash@0.0.5", "", {}, "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA=="], "stack-generator": ["stack-generator@2.0.10", "", { "dependencies": { "stackframe": "^1.3.4" } }, "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ=="], @@ -4184,6 +4401,8 @@ "tldts-core": ["tldts-core@6.1.86", "", {}, "sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA=="], + "tmp": ["tmp@0.2.3", "", {}, "sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w=="], + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "toggle-selection": ["toggle-selection@1.0.6", "", {}, "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ=="], @@ -4200,6 +4419,8 @@ "tree-kill": ["tree-kill@1.2.2", "", { "bin": { "tree-kill": "cli.js" } }, "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A=="], + "treeverse": ["treeverse@3.0.0", "", {}, "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ=="], + "trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="], "troika-three-text": ["troika-three-text@0.52.4", "", { "dependencies": { "bidi-js": "^1.0.2", "troika-three-utils": "^0.52.4", "troika-worker-utils": "^0.52.0", "webgl-sdf-generator": "1.1.1" }, "peerDependencies": { "three": ">=0.125.0" } }, "sha512-V50EwcYGruV5rUZ9F4aNsrytGdKcXKALjEtQXIOBfhVoZU9VAqZNIoGQ3TMiooVqFAbR1w15T+f+8gkzoFzawg=="], @@ -4236,6 +4457,8 @@ "tsup": ["tsup@8.5.0", "", { "dependencies": { "bundle-require": "^5.1.0", "cac": "^6.7.14", "chokidar": "^4.0.3", "consola": "^3.4.0", "debug": "^4.4.0", "esbuild": "^0.25.0", "fix-dts-default-cjs-exports": "^1.0.0", "joycon": "^3.1.1", "picocolors": "^1.1.1", "postcss-load-config": "^6.0.1", "resolve-from": "^5.0.0", "rollup": "^4.34.8", "source-map": "0.8.0-beta.0", "sucrase": "^3.35.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.11", "tree-kill": "^1.2.2" }, "peerDependencies": { "@microsoft/api-extractor": "^7.36.0", "@swc/core": "^1", "postcss": "^8.4.12", "typescript": ">=4.5.0" }, "optionalPeers": ["@microsoft/api-extractor", "@swc/core", "postcss", "typescript"], "bin": { "tsup": "dist/cli-default.js", "tsup-node": "dist/cli-node.js" } }, "sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ=="], + "tuf-js": ["tuf-js@2.2.1", "", { "dependencies": { "@tufjs/models": "2.0.1", "debug": "^4.3.4", "make-fetch-happen": "^13.0.1" } }, "sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA=="], + "tunnel": ["tunnel@0.0.6", "", {}, "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg=="], "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], @@ -4300,6 +4523,10 @@ "unified": ["unified@11.0.5", "", { "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA=="], + "unique-filename": ["unique-filename@3.0.0", "", { "dependencies": { "unique-slug": "^4.0.0" } }, "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g=="], + + "unique-slug": ["unique-slug@4.0.0", "", { "dependencies": { "imurmurhash": "^0.1.4" } }, "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ=="], + "unique-string": ["unique-string@3.0.0", "", { "dependencies": { "crypto-random-string": "^4.0.0" } }, "sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ=="], "unist-util-is": ["unist-util-is@6.0.0", "", { "dependencies": { "@types/unist": "^3.0.0" } }, "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw=="], @@ -4320,6 +4547,8 @@ "unrs-resolver": ["unrs-resolver@1.9.2", "", { "dependencies": { "napi-postinstall": "^0.2.4" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.9.2", "@unrs/resolver-binding-android-arm64": "1.9.2", "@unrs/resolver-binding-darwin-arm64": "1.9.2", "@unrs/resolver-binding-darwin-x64": "1.9.2", "@unrs/resolver-binding-freebsd-x64": "1.9.2", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.2", "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.2", "@unrs/resolver-binding-linux-arm64-gnu": "1.9.2", "@unrs/resolver-binding-linux-arm64-musl": "1.9.2", "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.2", "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.2", "@unrs/resolver-binding-linux-riscv64-musl": "1.9.2", "@unrs/resolver-binding-linux-s390x-gnu": "1.9.2", "@unrs/resolver-binding-linux-x64-gnu": "1.9.2", "@unrs/resolver-binding-linux-x64-musl": "1.9.2", "@unrs/resolver-binding-wasm32-wasi": "1.9.2", "@unrs/resolver-binding-win32-arm64-msvc": "1.9.2", "@unrs/resolver-binding-win32-ia32-msvc": "1.9.2", "@unrs/resolver-binding-win32-x64-msvc": "1.9.2" } }, "sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA=="], + "upath": ["upath@1.2.0", "", {}, "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="], + "update-browserslist-db": ["update-browserslist-db@1.1.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw=="], "uploadthing": ["uploadthing@7.7.3", "", { "dependencies": { "@effect/platform": "0.85.2", "@standard-schema/spec": "1.0.0-beta.4", "@uploadthing/mime-types": "0.3.5", "@uploadthing/shared": "7.1.9", "effect": "3.16.8" }, "peerDependencies": { "express": "*", "h3": "*", "tailwindcss": "^3.0.0 || ^4.0.0-beta.0" }, "optionalPeers": ["express", "h3", "tailwindcss"] }, "sha512-jmPMVoqM+fWP1EXiwP6VBLTJykZ8z4ryrUr1N8yc87T+cxZw2vyvX2ReCaLhfjdbielPjHm486VCHtO2gYBFQA=="], @@ -4382,6 +4611,8 @@ "w3c-xmlserializer": ["w3c-xmlserializer@5.0.0", "", { "dependencies": { "xml-name-validator": "^5.0.0" } }, "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA=="], + "walk-up-path": ["walk-up-path@3.0.1", "", {}, "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA=="], + "web-streams-polyfill": ["web-streams-polyfill@4.0.0-beta.3", "", {}, "sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug=="], "web-vitals": ["web-vitals@4.2.4", "", {}, "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw=="], @@ -4424,6 +4655,8 @@ "wrappy": ["wrappy@1.0.2", "", {}, "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="], + "write-file-atomic": ["write-file-atomic@5.0.1", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw=="], + "ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], @@ -4480,6 +4713,46 @@ "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], + "@aws-sdk/client-ecs/@aws-sdk/core": ["@aws-sdk/core@3.846.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@aws-sdk/xml-builder": "3.821.0", "@smithy/core": "^3.7.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/signature-v4": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-utf8": "^4.0.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.848.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.846.0", "@aws-sdk/credential-provider-http": "3.846.0", "@aws-sdk/credential-provider-ini": "3.848.0", "@aws-sdk/credential-provider-process": "3.846.0", "@aws-sdk/credential-provider-sso": "3.848.0", "@aws-sdk/credential-provider-web-identity": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g=="], + + "@aws-sdk/client-ecs/@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg=="], + + "@aws-sdk/client-ecs/@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA=="], + + "@aws-sdk/client-ecs/@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g=="], + + "@aws-sdk/client-ecs/@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@smithy/core": "^3.7.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA=="], + + "@aws-sdk/client-ecs/@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA=="], + + "@aws-sdk/client-ecs/@aws-sdk/types": ["@aws-sdk/types@3.840.0", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA=="], + + "@aws-sdk/client-ecs/@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.848.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-endpoints": "^3.0.6", "tslib": "^2.6.2" } }, "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww=="], + + "@aws-sdk/client-ecs/@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ=="], + + "@aws-sdk/client-ecs/@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.848.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw=="], + + "@aws-sdk/client-ecs/@smithy/core": ["@smithy/core@3.7.1", "", { "dependencies": { "@smithy/middleware-serde": "^4.0.8", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-stream": "^4.2.3", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-ExRCsHnXFtBPnM7MkfKBPcBBdHw1h/QS/cbNw4ho95qnyNHvnpmGbR39MIAv9KggTr5qSPxRSEL+hRXlyGyGQw=="], + + "@aws-sdk/client-ecs/@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.1.0", "", { "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ=="], + + "@aws-sdk/client-ecs/@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.1.16", "", { "dependencies": { "@smithy/core": "^3.7.1", "@smithy/middleware-serde": "^4.0.8", "@smithy/node-config-provider": "^4.1.3", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-plpa50PIGLqzMR2ANKAw2yOW5YKS626KYKqae3atwucbz4Ve4uQ9K9BEZxDLIFmCu7hKLcrq2zmj4a+PfmUV5w=="], + + "@aws-sdk/client-ecs/@smithy/middleware-retry": ["@smithy/middleware-retry@4.1.17", "", { "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/service-error-classification": "^4.0.6", "@smithy/smithy-client": "^4.4.8", "@smithy/types": "^4.3.1", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-gsCimeG6BApj0SBecwa1Be+Z+JOJe46iy3B3m3A8jKJHf7eIihP76Is4LwLrbJ1ygoS7Vg73lfqzejmLOrazUA=="], + + "@aws-sdk/client-ecs/@smithy/node-http-handler": ["@smithy/node-http-handler@4.1.0", "", { "dependencies": { "@smithy/abort-controller": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg=="], + + "@aws-sdk/client-ecs/@smithy/smithy-client": ["@smithy/smithy-client@4.4.8", "", { "dependencies": { "@smithy/core": "^3.7.1", "@smithy/middleware-endpoint": "^4.1.16", "@smithy/middleware-stack": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-pcW691/lx7V54gE+dDGC26nxz8nrvnvRSCJaIYD6XLPpOInEZeKdV/SpSux+wqeQ4Ine7LJQu8uxMvobTIBK0w=="], + + "@aws-sdk/client-ecs/@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.0.24", "", { "dependencies": { "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.8", "@smithy/types": "^4.3.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UkQNgaQ+bidw1MgdgPO1z1k95W/v8Ej/5o/T/Is8PiVUYPspl/ZxV6WO/8DrzZQu5ULnmpB9CDdMSRwgRc21AA=="], + + "@aws-sdk/client-ecs/@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.0.24", "", { "dependencies": { "@smithy/config-resolver": "^4.1.4", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.8", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-phvGi/15Z4MpuQibTLOYIumvLdXb+XIJu8TA55voGgboln85jytA3wiD7CkUE8SNcWqkkb+uptZKPiuFouX/7g=="], + + "@aws-sdk/client-ecs/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], + "@aws-sdk/client-s3/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], "@aws-sdk/client-securityhub/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], @@ -4564,16 +4837,120 @@ "@next/third-parties/next": ["next@15.3.4", "", { "dependencies": { "@next/env": "15.3.4", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.4", "@next/swc-darwin-x64": "15.3.4", "@next/swc-linux-arm64-gnu": "15.3.4", "@next/swc-linux-arm64-musl": "15.3.4", "@next/swc-linux-x64-gnu": "15.3.4", "@next/swc-linux-x64-musl": "15.3.4", "@next/swc-win32-arm64-msvc": "15.3.4", "@next/swc-win32-x64-msvc": "15.3.4", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA=="], + "@npmcli/arborist/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "@npmcli/arborist/npm-package-arg": ["npm-package-arg@11.0.3", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], + + "@npmcli/arborist/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "@npmcli/git/ini": ["ini@4.1.3", "", {}, "sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg=="], + + "@npmcli/git/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "@npmcli/git/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + + "@npmcli/map-workspaces/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "@npmcli/metavuln-calculator/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "@npmcli/package-json/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "@npmcli/package-json/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "@npmcli/package-json/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "@npmcli/promise-spawn/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + + "@npmcli/query/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + + "@npmcli/run-script/node-gyp": ["node-gyp@10.3.1", "", { "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", "glob": "^10.3.10", "graceful-fs": "^4.2.6", "make-fetch-happen": "^13.0.0", "nopt": "^7.0.0", "proc-log": "^4.1.0", "semver": "^7.3.5", "tar": "^6.2.1", "which": "^4.0.0" }, "bin": { "node-gyp": "bin/node-gyp.js" } }, "sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ=="], + + "@npmcli/run-script/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "@npmcli/run-script/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], + + "@opentelemetry/core/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], + + "@opentelemetry/exporter-logs-otlp-http/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@opentelemetry/resources": ["@opentelemetry/resources@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ=="], + + "@opentelemetry/exporter-trace-otlp-grpc/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw=="], + + "@opentelemetry/exporter-trace-otlp-http/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@opentelemetry/exporter-trace-otlp-http/@opentelemetry/resources": ["@opentelemetry/resources@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ=="], + + "@opentelemetry/exporter-trace-otlp-http/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw=="], + + "@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/resources": ["@opentelemetry/resources@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ=="], + + "@opentelemetry/exporter-trace-otlp-proto/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw=="], + + "@opentelemetry/exporter-zipkin/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], + "@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.57.2", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A=="], + "@opentelemetry/instrumentation-grpc/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.55.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.55.0", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ=="], + + "@opentelemetry/instrumentation-grpc/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.27.0", "", {}, "sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg=="], + + "@opentelemetry/otlp-exporter-base/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@opentelemetry/otlp-grpc-exporter-base/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@opentelemetry/otlp-transformer/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@opentelemetry/otlp-transformer/@opentelemetry/resources": ["@opentelemetry/resources@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ=="], + + "@opentelemetry/otlp-transformer/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw=="], + + "@opentelemetry/resources/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], + + "@opentelemetry/sdk-logs/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@opentelemetry/sdk-logs/@opentelemetry/resources": ["@opentelemetry/resources@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ=="], + + "@opentelemetry/sdk-metrics/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@opentelemetry/sdk-metrics/@opentelemetry/resources": ["@opentelemetry/resources@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ=="], + + "@opentelemetry/sdk-node/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@opentelemetry/sdk-node/@opentelemetry/exporter-zipkin": ["@opentelemetry/exporter-zipkin@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0" } }, "sha512-RmOwSvkimg7ETwJbUOPTMhJm9A9bG1U8s7Zo3ajDh4zM7eYcycQ0dM7FbLD6NXWbI2yj7UY4q8BKinKYBQksyw=="], + "@opentelemetry/sdk-node/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@types/shimmer": "^1.0.2", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw=="], + "@opentelemetry/sdk-node/@opentelemetry/resources": ["@opentelemetry/resources@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ=="], + + "@opentelemetry/sdk-node/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw=="], + + "@opentelemetry/sdk-node/@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@1.25.1", "", { "dependencies": { "@opentelemetry/context-async-hooks": "1.25.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/propagator-b3": "1.25.1", "@opentelemetry/propagator-jaeger": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ=="], + + "@opentelemetry/sdk-trace-base/@opentelemetry/semantic-conventions": ["@opentelemetry/semantic-conventions@1.28.0", "", {}, "sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA=="], + "@parcel/watcher/detect-libc": ["detect-libc@1.0.3", "", { "bin": { "detect-libc": "./bin/detect-libc.js" } }, "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg=="], "@playwright/experimental-ct-core/vite": ["vite@6.3.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", "picomatch": "^4.0.2", "postcss": "^8.5.3", "rollup": "^4.34.9", "tinyglobby": "^0.2.13" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ=="], "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], + "@pulumi/aws/mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], + + "@pulumi/awsx/@pulumi/docker-build": ["@pulumi/docker-build@0.0.8", "", { "dependencies": { "@pulumi/pulumi": "^3.136.0" } }, "sha512-tS6UUgmDjQ+LVekMXGC/6ND7riY75h3oO9fLiVOrvNafCBumxK+Cjm6ZZ9tUChLYvw6H+rZRExZEhfC8F/SQgQ=="], + + "@pulumi/awsx/mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], + + "@pulumi/docker/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + + "@pulumi/pulumi/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.55.0", "", { "dependencies": { "@opentelemetry/api-logs": "0.55.0", "@types/shimmer": "^1.2.0", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ=="], + + "@pulumi/pulumi/picomatch": ["picomatch@3.0.1", "", {}, "sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag=="], + "@react-email/components/@react-email/render": ["@react-email/render@1.1.2", "", { "dependencies": { "html-to-text": "^9.0.5", "prettier": "^3.5.3", "react-promise-suspense": "^0.3.4" }, "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-RnRehYN3v9gVlNMehHPHhyp2RQo7+pSkHDtXPvg3s0GbzM9SQMW4Qrf8GRNvtpLC4gsI+Wt0VatNRUFqjvevbw=="], "@react-three/fiber/scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], @@ -4590,6 +4967,8 @@ "@semantic-release/npm/execa": ["execa@9.6.0", "", { "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", "cross-spawn": "^7.0.6", "figures": "^6.1.0", "get-stream": "^9.0.0", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", "pretty-ms": "^9.2.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", "yoctocolors": "^2.1.1" } }, "sha512-jpWzZ1ZhwUmeWRhS7Qv3mhpOhLfwI+uAX4e5fOcXqwMR7EcJ0pj2kV1CVzHVMX/LphnKWD3LObjZCoJ71lKpHw=="], + "@sigstore/sign/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + "@slack/bolt/@slack/web-api": ["@slack/web-api@6.13.0", "", { "dependencies": { "@slack/logger": "^3.0.0", "@slack/types": "^2.11.0", "@types/is-stream": "^1.1.0", "@types/node": ">=12.0.0", "axios": "^1.7.4", "eventemitter3": "^3.1.0", "form-data": "^2.5.0", "is-electron": "2.2.2", "is-stream": "^1.1.0", "p-queue": "^6.6.1", "p-retry": "^4.0.0" } }, "sha512-dv65crIgdh9ZYHrevLU6XFHTQwTyDmNqEqzuIrV+Vqe/vgiG6w37oex5ePDU1RGm2IJ90H8iOvHFvzdEO/vB+g=="], "@slack/oauth/@slack/logger": ["@slack/logger@3.0.0", "", { "dependencies": { "@types/node": ">=12.0.0" } }, "sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA=="], @@ -4622,6 +5001,12 @@ "@trigger.dev/core/@opentelemetry/instrumentation": ["@opentelemetry/instrumentation@0.52.1", "", { "dependencies": { "@opentelemetry/api-logs": "0.52.1", "@types/shimmer": "^1.0.2", "import-in-the-middle": "^1.8.1", "require-in-the-middle": "^7.1.1", "semver": "^7.5.2", "shimmer": "^1.2.1" }, "peerDependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw=="], + "@trigger.dev/core/@opentelemetry/resources": ["@opentelemetry/resources@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ=="], + + "@trigger.dev/core/@opentelemetry/sdk-trace-base": ["@opentelemetry/sdk-trace-base@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1", "@opentelemetry/resources": "1.25.1", "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw=="], + + "@trigger.dev/core/@opentelemetry/sdk-trace-node": ["@opentelemetry/sdk-trace-node@1.25.1", "", { "dependencies": { "@opentelemetry/context-async-hooks": "1.25.1", "@opentelemetry/core": "1.25.1", "@opentelemetry/propagator-b3": "1.25.1", "@opentelemetry/propagator-jaeger": "1.25.1", "@opentelemetry/sdk-trace-base": "1.25.1", "semver": "^7.5.2" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ=="], + "@trigger.dev/core/execa": ["execa@8.0.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^8.0.1", "human-signals": "^5.0.0", "is-stream": "^3.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^5.1.0", "onetime": "^6.0.0", "signal-exit": "^4.1.0", "strip-final-newline": "^3.0.0" } }, "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg=="], "@trigger.dev/core/zod": ["zod@3.23.8", "", {}, "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g=="], @@ -4652,6 +5037,16 @@ "body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + "cacache/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "cacache/p-map": ["p-map@4.0.0", "", { "dependencies": { "aggregate-error": "^3.0.0" } }, "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ=="], + + "cacache/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + + "cacheable-request/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], + + "cacheable-request/normalize-url": ["normalize-url@6.1.0", "", {}, "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A=="], + "chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "chalk-template/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], @@ -4662,6 +5057,10 @@ "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "clone-response/mimic-response": ["mimic-response@1.0.1", "", {}, "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ=="], + + "config-chain/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + "cosmiconfig/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], "cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], @@ -4672,6 +5071,8 @@ "d3-dsv/commander": ["commander@7.2.0", "", {}, "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw=="], + "docker-classic/semver": ["semver@5.7.2", "", { "bin": { "semver": "bin/semver" } }, "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g=="], + "dom-serializer/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], "duplexer2/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], @@ -4780,6 +5181,8 @@ "lowlight/highlight.js": ["highlight.js@11.11.1", "", {}, "sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w=="], + "make-fetch-happen/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + "markdown-it/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "markdown-it/entities": ["entities@4.5.0", "", {}, "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="], @@ -4792,6 +5195,14 @@ "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], + "minipass-fetch/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "minipass-flush/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-pipeline/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-sized/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + "nano-css/stylis": ["stylis@4.3.6", "", {}, "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ=="], "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], @@ -4804,6 +5215,8 @@ "node-gyp/mkdirp": ["mkdirp@0.5.6", "", { "dependencies": { "minimist": "^1.2.6" }, "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw=="], + "node-gyp/nopt": ["nopt@3.0.6", "", { "dependencies": { "abbrev": "1" }, "bin": { "nopt": "./bin/nopt.js" } }, "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg=="], + "node-gyp/rimraf": ["rimraf@2.7.1", "", { "dependencies": { "glob": "^7.1.3" }, "bin": { "rimraf": "./bin.js" } }, "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w=="], "node-gyp/semver": ["semver@5.3.0", "", { "bin": { "semver": "./bin/semver" } }, "sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw=="], @@ -5170,6 +5583,14 @@ "npm/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "npm-pick-manifest/npm-package-arg": ["npm-package-arg@11.0.3", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], + + "npm-registry-fetch/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "npm-registry-fetch/npm-package-arg": ["npm-package-arg@11.0.3", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], + + "npm-registry-fetch/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + "ora/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], "ora/log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], @@ -5178,6 +5599,12 @@ "p-queue/eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="], + "pacote/npm-package-arg": ["npm-package-arg@11.0.3", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], + + "pacote/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "pacote/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], "parse-json/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], @@ -5192,6 +5619,8 @@ "pkg-conf/find-up": ["find-up@2.1.0", "", { "dependencies": { "locate-path": "^2.0.0" } }, "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ=="], + "pkg-dir/find-up": ["find-up@6.3.0", "", { "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" } }, "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw=="], + "postcss-nested/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], "pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], @@ -5200,12 +5629,16 @@ "pretty-format/react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="], + "promise-retry/retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], + "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], "proxy-agent/lru-cache": ["lru-cache@7.18.3", "", {}, "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA=="], "raw-body/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], + "rc/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + "react-dropzone/file-selector": ["file-selector@2.1.2", "", { "dependencies": { "tslib": "^2.7.0" } }, "sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig=="], "react-email/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], @@ -5286,6 +5719,8 @@ "source-map/whatwg-url": ["whatwg-url@7.1.0", "", { "dependencies": { "lodash.sortby": "^4.7.0", "tr46": "^1.0.1", "webidl-conversions": "^4.0.2" } }, "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg=="], + "source-map-support/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], + "stacktrace-gps/source-map": ["source-map@0.5.6", "", {}, "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA=="], "stats-gl/three": ["three@0.170.0", "", {}, "sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ=="], @@ -5346,6 +5781,8 @@ "wrap-ansi-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "write-file-atomic/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], + "yauzl/buffer-crc32": ["buffer-crc32@0.2.13", "", {}, "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ=="], "@aws-crypto/sha1-browser/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], @@ -5354,6 +5791,24 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], + "@aws-sdk/client-ecs/@aws-sdk/core/fast-xml-parser": ["fast-xml-parser@5.2.5", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.846.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.846.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", "@smithy/property-provider": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/credential-provider-env": "3.846.0", "@aws-sdk/credential-provider-http": "3.846.0", "@aws-sdk/credential-provider-process": "3.846.0", "@aws-sdk/credential-provider-sso": "3.848.0", "@aws-sdk/credential-provider-web-identity": "3.848.0", "@aws-sdk/nested-clients": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.846.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.848.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.848.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/token-providers": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/nested-clients": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw=="], + + "@aws-sdk/client-ecs/@smithy/core/@smithy/util-stream": ["@smithy/util-stream@4.2.3", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg=="], + + "@aws-sdk/client-ecs/@smithy/smithy-client/@smithy/util-stream": ["@smithy/util-stream@4.2.3", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg=="], + "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], "@browserbasehq/sdk/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], @@ -5414,8 +5869,38 @@ "@next/third-parties/next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], + "@npmcli/arborist/npm-package-arg/validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], + + "@npmcli/git/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "@npmcli/map-workspaces/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "@npmcli/map-workspaces/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "@npmcli/package-json/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "@npmcli/package-json/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "@npmcli/promise-spawn/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "@npmcli/run-script/node-gyp/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + + "@npmcli/run-script/node-gyp/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + + "@npmcli/run-script/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + + "@opentelemetry/instrumentation-grpc/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.55.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg=="], + + "@opentelemetry/sdk-node/@opentelemetry/sdk-trace-node/@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.25.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ=="], + + "@opentelemetry/sdk-node/@opentelemetry/sdk-trace-node/@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A=="], + + "@opentelemetry/sdk-node/@opentelemetry/sdk-trace-node/@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA=="], + "@playwright/experimental-ct-core/vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], + "@pulumi/pulumi/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.55.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg=="], + "@semantic-release/github/aggregate-error/clean-stack": ["clean-stack@5.2.0", "", { "dependencies": { "escape-string-regexp": "5.0.0" } }, "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ=="], "@semantic-release/github/aggregate-error/indent-string": ["indent-string@5.0.0", "", {}, "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg=="], @@ -5460,6 +5945,18 @@ "@testing-library/jest-dom/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], + "@trigger.dev/core/@opentelemetry/resources/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@trigger.dev/core/@opentelemetry/sdk-trace-base/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@trigger.dev/core/@opentelemetry/sdk-trace-node/@opentelemetry/context-async-hooks": ["@opentelemetry/context-async-hooks@1.25.1", "", { "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ=="], + + "@trigger.dev/core/@opentelemetry/sdk-trace-node/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], + + "@trigger.dev/core/@opentelemetry/sdk-trace-node/@opentelemetry/propagator-b3": ["@opentelemetry/propagator-b3@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-p6HFscpjrv7//kE+7L+3Vn00VEDUJB0n6ZrjkTYHrJ58QZ8B3ajSJhRbCcY6guQ3PDjTbxWklyvIN2ojVbIb1A=="], + + "@trigger.dev/core/@opentelemetry/sdk-trace-node/@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA=="], + "@trigger.dev/core/execa/get-stream": ["get-stream@8.0.1", "", {}, "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA=="], "@trigger.dev/core/execa/human-signals": ["human-signals@5.0.0", "", {}, "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ=="], @@ -5490,6 +5987,22 @@ "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], + "cacache/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "cacache/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "cacache/tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "cacache/tar/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "cacache/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "cacache/tar/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "cacache/tar/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "cacache/tar/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "cli-highlight/yargs/cliui": ["cliui@7.0.4", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ=="], "cli-highlight/yargs/yargs-parser": ["yargs-parser@20.2.9", "", {}, "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w=="], @@ -5498,6 +6011,8 @@ "cosmiconfig/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "cosmiconfig/parse-json/json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + "duplexer2/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "duplexer2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], @@ -5572,6 +6087,16 @@ "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "minipass-fetch/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "minipass-fetch/minizlib/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "minipass-flush/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "minipass-pipeline/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "minipass-sized/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "next-safe-action/next/@next/env": ["@next/env@15.3.4", "", {}, "sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ=="], "next-safe-action/next/@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg=="], @@ -5598,6 +6123,22 @@ "node-gyp/glob/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], + "node-gyp/nopt/abbrev": ["abbrev@1.1.1", "", {}, "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q=="], + + "npm-pick-manifest/npm-package-arg/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "npm-pick-manifest/npm-package-arg/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + + "npm-pick-manifest/npm-package-arg/validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], + + "npm-registry-fetch/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "npm-registry-fetch/minizlib/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + + "npm-registry-fetch/npm-package-arg/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "npm-registry-fetch/npm-package-arg/validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], + "npm/@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "npm/@isaacs/cliui/strip-ansi": ["strip-ansi@7.1.0", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ=="], @@ -5636,8 +6177,28 @@ "ora/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="], + "pacote/npm-package-arg/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + + "pacote/npm-package-arg/validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], + + "pacote/tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "pacote/tar/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "pacote/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "pacote/tar/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "pacote/tar/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "pacote/tar/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "pkg-conf/find-up/locate-path": ["locate-path@2.0.0", "", { "dependencies": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA=="], + "pkg-dir/find-up/locate-path": ["locate-path@7.2.0", "", { "dependencies": { "p-locate": "^6.0.0" } }, "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA=="], + + "pkg-dir/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], + "react-email/next/@next/env": ["@next/env@15.3.4", "", {}, "sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ=="], "react-email/next/@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg=="], @@ -5728,6 +6289,18 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], + "@aws-sdk/client-ecs/@aws-sdk/core/fast-xml-parser/strnum": ["strnum@2.1.1", "", {}, "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http/@smithy/util-stream": ["@smithy/util-stream@4.2.3", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/nested-clients": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg=="], + + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg=="], + "@calcom/atoms/tailwindcss/chokidar/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "@calcom/atoms/tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], @@ -5782,6 +6355,22 @@ "@dub/embed-react/vite/esbuild/@esbuild/win32-x64": ["@esbuild/win32-x64@0.20.2", "", { "os": "win32", "cpu": "x64" }, "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ=="], + "@npmcli/run-script/node-gyp/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="], + + "@npmcli/run-script/node-gyp/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], + + "@npmcli/run-script/node-gyp/tar/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + + "@npmcli/run-script/node-gyp/tar/fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + + "@npmcli/run-script/node-gyp/tar/minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + + "@npmcli/run-script/node-gyp/tar/minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + + "@npmcli/run-script/node-gyp/tar/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + + "@npmcli/run-script/node-gyp/tar/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "@semantic-release/github/aggregate-error/clean-stack/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "@semantic-release/npm/aggregate-error/clean-stack/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], @@ -5798,6 +6387,12 @@ "@trigger.dev/core/execa/onetime/mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + "babel-plugin-macros/cosmiconfig/parse-json/json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + + "cacache/tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "cacache/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + "cli-highlight/yargs/cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], "env-ci/execa/npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], @@ -5834,10 +6429,16 @@ "npm/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], + "pacote/tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "pacote/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + "pkg-conf/find-up/locate-path/p-locate": ["p-locate@2.0.0", "", { "dependencies": { "p-limit": "^1.1.0" } }, "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg=="], "pkg-conf/find-up/locate-path/path-exists": ["path-exists@3.0.0", "", {}, "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ=="], + "pkg-dir/find-up/locate-path/p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="], + "semantic-release/aggregate-error/clean-stack/escape-string-regexp": ["escape-string-regexp@5.0.0", "", {}, "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw=="], "semantic-release/execa/npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], @@ -5846,10 +6447,16 @@ "signale/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], + "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg=="], + "@calcom/atoms/tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "@commitlint/top-level/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], + "@npmcli/run-script/node-gyp/tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + + "@npmcli/run-script/node-gyp/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + "@slack/bolt/@slack/web-api/form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], "@slack/oauth/@slack/web-api/form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], @@ -5862,8 +6469,12 @@ "pkg-conf/find-up/locate-path/p-locate/p-limit": ["p-limit@1.3.0", "", { "dependencies": { "p-try": "^1.0.0" } }, "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q=="], + "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], + "signale/chalk/ansi-styles/color-convert/color-name": ["color-name@1.1.3", "", {}, "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="], "@commitlint/top-level/find-up/locate-path/p-locate/p-limit/yocto-queue": ["yocto-queue@1.2.1", "", {}, "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg=="], + + "pkg-dir/find-up/locate-path/p-locate/p-limit/yocto-queue": ["yocto-queue@1.2.1", "", {}, "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg=="], } } diff --git a/yarn.lock b/yarn.lock index b7af2eb5c..b40b4d0bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -151,6 +151,54 @@ "@smithy/util-utf8" "^2.0.0" tslib "^2.6.2" +"@aws-sdk/client-ecs@^3.405.0": + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-ecs/-/client-ecs-3.848.0.tgz" + integrity sha512-9Fp8bv8FbQe+vjF0iBAGiS2eaEkHihvQ5SwiJ+4UYAqnoNxlWuOWXjALHaMjsybtPzz//TAveTK5qusmTeT7rQ== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.846.0" + "@aws-sdk/credential-provider-node" "3.848.0" + "@aws-sdk/middleware-host-header" "3.840.0" + "@aws-sdk/middleware-logger" "3.840.0" + "@aws-sdk/middleware-recursion-detection" "3.840.0" + "@aws-sdk/middleware-user-agent" "3.848.0" + "@aws-sdk/region-config-resolver" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-endpoints" "3.848.0" + "@aws-sdk/util-user-agent-browser" "3.840.0" + "@aws-sdk/util-user-agent-node" "3.848.0" + "@smithy/config-resolver" "^4.1.4" + "@smithy/core" "^3.7.0" + "@smithy/fetch-http-handler" "^5.1.0" + "@smithy/hash-node" "^4.0.4" + "@smithy/invalid-dependency" "^4.0.4" + "@smithy/middleware-content-length" "^4.0.4" + "@smithy/middleware-endpoint" "^4.1.15" + "@smithy/middleware-retry" "^4.1.16" + "@smithy/middleware-serde" "^4.0.8" + "@smithy/middleware-stack" "^4.0.4" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/node-http-handler" "^4.1.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/smithy-client" "^4.4.7" + "@smithy/types" "^4.3.1" + "@smithy/url-parser" "^4.0.4" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.23" + "@smithy/util-defaults-mode-node" "^4.0.23" + "@smithy/util-endpoints" "^3.0.6" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-retry" "^4.0.6" + "@smithy/util-utf8" "^4.0.0" + "@smithy/util-waiter" "^4.0.6" + "@types/uuid" "^9.0.1" + tslib "^2.6.2" + uuid "^9.0.1" + "@aws-sdk/client-s3@^3.806.0": version "3.837.0" resolved "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.837.0.tgz" @@ -306,6 +354,50 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" +"@aws-sdk/client-sso@3.848.0": + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.848.0.tgz" + integrity sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.846.0" + "@aws-sdk/middleware-host-header" "3.840.0" + "@aws-sdk/middleware-logger" "3.840.0" + "@aws-sdk/middleware-recursion-detection" "3.840.0" + "@aws-sdk/middleware-user-agent" "3.848.0" + "@aws-sdk/region-config-resolver" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-endpoints" "3.848.0" + "@aws-sdk/util-user-agent-browser" "3.840.0" + "@aws-sdk/util-user-agent-node" "3.848.0" + "@smithy/config-resolver" "^4.1.4" + "@smithy/core" "^3.7.0" + "@smithy/fetch-http-handler" "^5.1.0" + "@smithy/hash-node" "^4.0.4" + "@smithy/invalid-dependency" "^4.0.4" + "@smithy/middleware-content-length" "^4.0.4" + "@smithy/middleware-endpoint" "^4.1.15" + "@smithy/middleware-retry" "^4.1.16" + "@smithy/middleware-serde" "^4.0.8" + "@smithy/middleware-stack" "^4.0.4" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/node-http-handler" "^4.1.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/smithy-client" "^4.4.7" + "@smithy/types" "^4.3.1" + "@smithy/url-parser" "^4.0.4" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.23" + "@smithy/util-defaults-mode-node" "^4.0.23" + "@smithy/util-endpoints" "^3.0.6" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-retry" "^4.0.6" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + "@aws-sdk/client-sts@^3.808.0": version "3.835.0" resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.835.0.tgz" @@ -372,6 +464,27 @@ fast-xml-parser "4.4.1" tslib "^2.6.2" +"@aws-sdk/core@3.846.0": + version "3.846.0" + resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.846.0.tgz" + integrity sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA== + dependencies: + "@aws-sdk/types" "3.840.0" + "@aws-sdk/xml-builder" "3.821.0" + "@smithy/core" "^3.7.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/property-provider" "^4.0.4" + "@smithy/protocol-http" "^5.1.2" + "@smithy/signature-v4" "^5.1.2" + "@smithy/smithy-client" "^4.4.7" + "@smithy/types" "^4.3.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-utf8" "^4.0.0" + fast-xml-parser "5.2.5" + tslib "^2.6.2" + "@aws-sdk/credential-provider-env@3.835.0": version "3.835.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.835.0.tgz" @@ -383,6 +496,17 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-env@3.846.0": + version "3.846.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.846.0.tgz" + integrity sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg== + dependencies: + "@aws-sdk/core" "3.846.0" + "@aws-sdk/types" "3.840.0" + "@smithy/property-provider" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-http@3.835.0": version "3.835.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.835.0.tgz" @@ -399,6 +523,22 @@ "@smithy/util-stream" "^4.2.2" tslib "^2.6.2" +"@aws-sdk/credential-provider-http@3.846.0": + version "3.846.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.846.0.tgz" + integrity sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw== + dependencies: + "@aws-sdk/core" "3.846.0" + "@aws-sdk/types" "3.840.0" + "@smithy/fetch-http-handler" "^5.1.0" + "@smithy/node-http-handler" "^4.1.0" + "@smithy/property-provider" "^4.0.4" + "@smithy/protocol-http" "^5.1.2" + "@smithy/smithy-client" "^4.4.7" + "@smithy/types" "^4.3.1" + "@smithy/util-stream" "^4.2.3" + tslib "^2.6.2" + "@aws-sdk/credential-provider-ini@3.835.0": version "3.835.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.835.0.tgz" @@ -418,6 +558,25 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-ini@3.848.0": + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.848.0.tgz" + integrity sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw== + dependencies: + "@aws-sdk/core" "3.846.0" + "@aws-sdk/credential-provider-env" "3.846.0" + "@aws-sdk/credential-provider-http" "3.846.0" + "@aws-sdk/credential-provider-process" "3.846.0" + "@aws-sdk/credential-provider-sso" "3.848.0" + "@aws-sdk/credential-provider-web-identity" "3.848.0" + "@aws-sdk/nested-clients" "3.848.0" + "@aws-sdk/types" "3.840.0" + "@smithy/credential-provider-imds" "^4.0.6" + "@smithy/property-provider" "^4.0.4" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-node@3.835.0": version "3.835.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.835.0.tgz" @@ -436,6 +595,24 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-node@3.848.0": + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.848.0.tgz" + integrity sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g== + dependencies: + "@aws-sdk/credential-provider-env" "3.846.0" + "@aws-sdk/credential-provider-http" "3.846.0" + "@aws-sdk/credential-provider-ini" "3.848.0" + "@aws-sdk/credential-provider-process" "3.846.0" + "@aws-sdk/credential-provider-sso" "3.848.0" + "@aws-sdk/credential-provider-web-identity" "3.848.0" + "@aws-sdk/types" "3.840.0" + "@smithy/credential-provider-imds" "^4.0.6" + "@smithy/property-provider" "^4.0.4" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-process@3.835.0": version "3.835.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.835.0.tgz" @@ -448,6 +625,18 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-process@3.846.0": + version "3.846.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.846.0.tgz" + integrity sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg== + dependencies: + "@aws-sdk/core" "3.846.0" + "@aws-sdk/types" "3.840.0" + "@smithy/property-provider" "^4.0.4" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-sso@3.835.0": version "3.835.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.835.0.tgz" @@ -462,6 +651,20 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-sso@3.848.0": + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.848.0.tgz" + integrity sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg== + dependencies: + "@aws-sdk/client-sso" "3.848.0" + "@aws-sdk/core" "3.846.0" + "@aws-sdk/token-providers" "3.848.0" + "@aws-sdk/types" "3.840.0" + "@smithy/property-provider" "^4.0.4" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/credential-provider-web-identity@3.835.0": version "3.835.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.835.0.tgz" @@ -474,6 +677,18 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/credential-provider-web-identity@3.848.0": + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.848.0.tgz" + integrity sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw== + dependencies: + "@aws-sdk/core" "3.846.0" + "@aws-sdk/nested-clients" "3.848.0" + "@aws-sdk/types" "3.840.0" + "@smithy/property-provider" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/middleware-bucket-endpoint@3.830.0": version "3.830.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.830.0.tgz" @@ -526,6 +741,16 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/middleware-host-header@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz" + integrity sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/middleware-location-constraint@3.821.0": version "3.821.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.821.0.tgz" @@ -544,6 +769,15 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/middleware-logger@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.840.0.tgz" + integrity sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/middleware-recursion-detection@3.821.0": version "3.821.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.821.0.tgz" @@ -554,6 +788,16 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/middleware-recursion-detection@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz" + integrity sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/middleware-sdk-s3@3.835.0": version "3.835.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.835.0.tgz" @@ -596,6 +840,19 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/middleware-user-agent@3.848.0": + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.848.0.tgz" + integrity sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA== + dependencies: + "@aws-sdk/core" "3.846.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-endpoints" "3.848.0" + "@smithy/core" "^3.7.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/nested-clients@3.835.0": version "3.835.0" resolved "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.835.0.tgz" @@ -640,6 +897,50 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" +"@aws-sdk/nested-clients@3.848.0": + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.848.0.tgz" + integrity sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg== + dependencies: + "@aws-crypto/sha256-browser" "5.2.0" + "@aws-crypto/sha256-js" "5.2.0" + "@aws-sdk/core" "3.846.0" + "@aws-sdk/middleware-host-header" "3.840.0" + "@aws-sdk/middleware-logger" "3.840.0" + "@aws-sdk/middleware-recursion-detection" "3.840.0" + "@aws-sdk/middleware-user-agent" "3.848.0" + "@aws-sdk/region-config-resolver" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-endpoints" "3.848.0" + "@aws-sdk/util-user-agent-browser" "3.840.0" + "@aws-sdk/util-user-agent-node" "3.848.0" + "@smithy/config-resolver" "^4.1.4" + "@smithy/core" "^3.7.0" + "@smithy/fetch-http-handler" "^5.1.0" + "@smithy/hash-node" "^4.0.4" + "@smithy/invalid-dependency" "^4.0.4" + "@smithy/middleware-content-length" "^4.0.4" + "@smithy/middleware-endpoint" "^4.1.15" + "@smithy/middleware-retry" "^4.1.16" + "@smithy/middleware-serde" "^4.0.8" + "@smithy/middleware-stack" "^4.0.4" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/node-http-handler" "^4.1.0" + "@smithy/protocol-http" "^5.1.2" + "@smithy/smithy-client" "^4.4.7" + "@smithy/types" "^4.3.1" + "@smithy/url-parser" "^4.0.4" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-body-length-node" "^4.0.0" + "@smithy/util-defaults-mode-browser" "^4.0.23" + "@smithy/util-defaults-mode-node" "^4.0.23" + "@smithy/util-endpoints" "^3.0.6" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-retry" "^4.0.6" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + "@aws-sdk/region-config-resolver@3.821.0": version "3.821.0" resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.821.0.tgz" @@ -652,6 +953,18 @@ "@smithy/util-middleware" "^4.0.4" tslib "^2.6.2" +"@aws-sdk/region-config-resolver@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz" + integrity sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/types" "^4.3.1" + "@smithy/util-config-provider" "^4.0.0" + "@smithy/util-middleware" "^4.0.4" + tslib "^2.6.2" + "@aws-sdk/s3-request-presigner@^3.832.0": version "3.837.0" resolved "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.837.0.tgz" @@ -691,6 +1004,19 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/token-providers@3.848.0": + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.848.0.tgz" + integrity sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg== + dependencies: + "@aws-sdk/core" "3.846.0" + "@aws-sdk/nested-clients" "3.848.0" + "@aws-sdk/types" "3.840.0" + "@smithy/property-provider" "^4.0.4" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/types@3.821.0", "@aws-sdk/types@^3.222.0": version "3.821.0" resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.821.0.tgz" @@ -699,6 +1025,14 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/types@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz" + integrity sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA== + dependencies: + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/util-arn-parser@3.804.0": version "3.804.0" resolved "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz" @@ -716,6 +1050,17 @@ "@smithy/util-endpoints" "^3.0.6" tslib "^2.6.2" +"@aws-sdk/util-endpoints@3.848.0": + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz" + integrity sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/types" "^4.3.1" + "@smithy/url-parser" "^4.0.4" + "@smithy/util-endpoints" "^3.0.6" + tslib "^2.6.2" + "@aws-sdk/util-format-url@3.821.0": version "3.821.0" resolved "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.821.0.tgz" @@ -743,6 +1088,16 @@ bowser "^2.11.0" tslib "^2.6.2" +"@aws-sdk/util-user-agent-browser@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz" + integrity sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ== + dependencies: + "@aws-sdk/types" "3.840.0" + "@smithy/types" "^4.3.1" + bowser "^2.11.0" + tslib "^2.6.2" + "@aws-sdk/util-user-agent-node@3.835.0": version "3.835.0" resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.835.0.tgz" @@ -754,6 +1109,17 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@aws-sdk/util-user-agent-node@3.848.0": + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.848.0.tgz" + integrity sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw== + dependencies: + "@aws-sdk/middleware-user-agent" "3.848.0" + "@aws-sdk/types" "3.840.0" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@aws-sdk/xml-builder@3.821.0": version "3.821.0" resolved "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz" @@ -1464,6 +1830,22 @@ tippy.js "^6.3.7" zod "3.25.67" +"@comp/infra@^workspace:apps/infra": + version "workspace:apps/infra" + resolved "workspace:apps/infra" + devDependencies: + "@types/node" "^24.0.3" + typescript "^5.8.3" + dependencies: + "@pulumi/aws" "^6.83.0" + "@pulumi/awsx" "^2.22.0" + "@pulumi/command" "^1.1.0" + "@pulumi/docker-build" "^0.0.12" + "@pulumi/pulumi" "^3.181.0" + "@pulumi/random" "^4.18.2" + "@pulumi/tailscale" "^0.17.0" + dotenv "^17.2.0" + "@comp/integrations@^workspace:packages/integrations": version "workspace:packages/integrations" resolved "workspace:packages/integrations" @@ -2290,7 +2672,7 @@ resolved "https://registry.npmjs.org/@google-cloud/precise-date/-/precise-date-4.0.0.tgz" integrity sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA== -"@grpc/grpc-js@^1.7.1": +"@grpc/grpc-js@^1.10.1", "@grpc/grpc-js@^1.7.1": version "1.13.4" resolved "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.13.4.tgz" integrity sha512-GsFaMXCkMqkKIvwCQjCrwH+GHbPKBjhwo/8ZuUkWHqbI73Kky9I+pQltrlT0+MWpedCoosda53lgjYfyEPgxBg== @@ -2562,6 +2944,11 @@ resolved "https://registry.npmjs.org/@levischuck/tiny-cbor/-/tiny-cbor-0.2.11.tgz" integrity sha512-llBRm4dT4Z89aRsm6u2oEZ8tfwL/2l6BwpZ7JcyieouniDECM5AqNgr/y08zalEIvW3RSK4upYyybDcmjXqAow== +"@logdna/tail-file@^2.0.6": + version "2.2.0" + resolved "https://registry.npmjs.org/@logdna/tail-file/-/tail-file-2.2.0.tgz" + integrity sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng== + "@lottiefiles/dotlottie-react@^0.14.2": version "0.14.2" resolved "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.14.2.tgz" @@ -2791,6 +3178,17 @@ resolved "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz" integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== +"@npmcli/agent@^2.0.0": + version "2.2.2" + resolved "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz" + integrity sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== + dependencies: + agent-base "^7.1.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" + socks-proxy-agent "^8.0.3" + "@npmcli/agent@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz" @@ -2802,6 +3200,47 @@ lru-cache "^10.0.1" socks-proxy-agent "^8.0.3" +"@npmcli/arborist@^7.3.1": + version "7.5.4" + resolved "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz" + integrity sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g== + dependencies: + "@isaacs/string-locale-compare" "^1.1.0" + "@npmcli/fs" "^3.1.1" + "@npmcli/installed-package-contents" "^2.1.0" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/metavuln-calculator" "^7.1.1" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^5.1.0" + "@npmcli/query" "^3.1.0" + "@npmcli/redact" "^2.0.0" + "@npmcli/run-script" "^8.1.0" + bin-links "^4.0.4" + cacache "^18.0.3" + common-ancestor-path "^1.0.1" + hosted-git-info "^7.0.2" + json-parse-even-better-errors "^3.0.2" + json-stringify-nice "^1.1.4" + lru-cache "^10.2.2" + minimatch "^9.0.4" + nopt "^7.2.1" + npm-install-checks "^6.2.0" + npm-package-arg "^11.0.2" + npm-pick-manifest "^9.0.1" + npm-registry-fetch "^17.0.1" + pacote "^18.0.6" + parse-conflict-json "^3.0.0" + proc-log "^4.2.0" + proggy "^2.0.0" + promise-all-reject-late "^1.0.0" + promise-call-limit "^3.0.1" + read-package-json-fast "^3.0.2" + semver "^7.3.7" + ssri "^10.0.6" + treeverse "^3.0.0" + walk-up-path "^3.0.1" + "@npmcli/arborist@^8.0.1": version "8.0.1" resolved "https://registry.npmjs.org/@npmcli/arborist/-/arborist-8.0.1.tgz" @@ -2857,6 +3296,13 @@ semver "^7.3.5" walk-up-path "^3.0.1" +"@npmcli/fs@^3.1.0", "@npmcli/fs@^3.1.1": + version "3.1.1" + resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz" + integrity sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg== + dependencies: + semver "^7.3.5" + "@npmcli/fs@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@npmcli/fs/-/fs-4.0.0.tgz" @@ -2864,6 +3310,21 @@ dependencies: semver "^7.3.5" +"@npmcli/git@^5.0.0": + version "5.0.8" + resolved "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz" + integrity sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ== + dependencies: + "@npmcli/promise-spawn" "^7.0.0" + ini "^4.1.3" + lru-cache "^10.0.1" + npm-pick-manifest "^9.0.0" + proc-log "^4.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^4.0.0" + "@npmcli/git@^6.0.0", "@npmcli/git@^6.0.1": version "6.0.3" resolved "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz" @@ -2878,6 +3339,14 @@ semver "^7.3.5" which "^5.0.0" +"@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz" + integrity sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w== + dependencies: + npm-bundled "^3.0.0" + npm-normalize-package-bin "^3.0.0" + "@npmcli/installed-package-contents@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-3.0.0.tgz" @@ -2886,6 +3355,16 @@ npm-bundled "^4.0.0" npm-normalize-package-bin "^4.0.0" +"@npmcli/map-workspaces@^3.0.2": + version "3.0.6" + resolved "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz" + integrity sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA== + dependencies: + "@npmcli/name-from-folder" "^2.0.0" + glob "^10.2.2" + minimatch "^9.0.0" + read-package-json-fast "^3.0.0" + "@npmcli/map-workspaces@^4.0.1", "@npmcli/map-workspaces@^4.0.2": version "4.0.2" resolved "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-4.0.2.tgz" @@ -2896,6 +3375,17 @@ glob "^10.2.2" minimatch "^9.0.0" +"@npmcli/metavuln-calculator@^7.1.1": + version "7.1.1" + resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz" + integrity sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g== + dependencies: + cacache "^18.0.0" + json-parse-even-better-errors "^3.0.0" + pacote "^18.0.0" + proc-log "^4.1.0" + semver "^7.3.5" + "@npmcli/metavuln-calculator@^8.0.0": version "8.0.1" resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-8.0.1.tgz" @@ -2907,16 +3397,39 @@ proc-log "^5.0.0" semver "^7.3.5" +"@npmcli/name-from-folder@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-2.0.0.tgz" + integrity sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg== + "@npmcli/name-from-folder@^3.0.0": version "3.0.0" resolved "https://registry.npmjs.org/@npmcli/name-from-folder/-/name-from-folder-3.0.0.tgz" integrity sha512-61cDL8LUc9y80fXn+lir+iVt8IS0xHqEKwPu/5jCjxQTVoSCmkXvw4vbMrzAMtmghz3/AkiBjhHkDKUH+kf7kA== +"@npmcli/node-gyp@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-3.0.0.tgz" + integrity sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA== + "@npmcli/node-gyp@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-4.0.0.tgz" integrity sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA== +"@npmcli/package-json@^5.0.0", "@npmcli/package-json@^5.1.0": + version "5.2.1" + resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz" + integrity sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ== + dependencies: + "@npmcli/git" "^5.0.0" + glob "^10.2.2" + hosted-git-info "^7.0.0" + json-parse-even-better-errors "^3.0.0" + normalize-package-data "^6.0.0" + proc-log "^4.0.0" + semver "^7.5.3" + "@npmcli/package-json@^6.0.0", "@npmcli/package-json@^6.0.1", "@npmcli/package-json@^6.2.0": version "6.2.0" resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-6.2.0.tgz" @@ -2930,6 +3443,13 @@ semver "^7.5.3" validate-npm-package-license "^3.0.4" +"@npmcli/promise-spawn@^7.0.0": + version "7.0.2" + resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-7.0.2.tgz" + integrity sha512-xhfYPXoV5Dy4UkY0D+v2KkwvnDfiA/8Mt3sWCGI/hM03NsYIH8ZaG6QzS9x7pje5vHZBZJ2v6VRFVTWACnqcmQ== + dependencies: + which "^4.0.0" + "@npmcli/promise-spawn@^8.0.0", "@npmcli/promise-spawn@^8.0.2": version "8.0.2" resolved "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-8.0.2.tgz" @@ -2937,6 +3457,13 @@ dependencies: which "^5.0.0" +"@npmcli/query@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@npmcli/query/-/query-3.1.0.tgz" + integrity sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ== + dependencies: + postcss-selector-parser "^6.0.10" + "@npmcli/query@^4.0.0": version "4.0.1" resolved "https://registry.npmjs.org/@npmcli/query/-/query-4.0.1.tgz" @@ -2944,11 +3471,28 @@ dependencies: postcss-selector-parser "^7.0.0" +"@npmcli/redact@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@npmcli/redact/-/redact-2.0.1.tgz" + integrity sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw== + "@npmcli/redact@^3.0.0", "@npmcli/redact@^3.2.2": version "3.2.2" resolved "https://registry.npmjs.org/@npmcli/redact/-/redact-3.2.2.tgz" integrity sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg== +"@npmcli/run-script@^8.0.0", "@npmcli/run-script@^8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz" + integrity sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg== + dependencies: + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^5.0.0" + "@npmcli/promise-spawn" "^7.0.0" + node-gyp "^10.0.0" + proc-log "^4.0.0" + which "^4.0.0" + "@npmcli/run-script@^9.0.0", "@npmcli/run-script@^9.0.1", "@npmcli/run-script@^9.1.0": version "9.1.0" resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz" @@ -3058,7 +3602,7 @@ dependencies: "@octokit/openapi-types" "^25.1.0" -"@opentelemetry/api@1.9.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0", "@opentelemetry/api@>=1.4.0 <1.10.0", "@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.0.1", "@opentelemetry/api@^1.1.0", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.8": +"@opentelemetry/api@1.9.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0", "@opentelemetry/api@>=1.4.0 <1.10.0", "@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.0.1", "@opentelemetry/api@^1.1.0", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.8", "@opentelemetry/api@^1.9": version "1.9.0" resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== @@ -3070,6 +3614,13 @@ dependencies: "@opentelemetry/api" "^1.0.0" +"@opentelemetry/api-logs@0.55.0": + version "0.55.0" + resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.55.0.tgz" + integrity sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg== + dependencies: + "@opentelemetry/api" "^1.3.0" + "@opentelemetry/api-logs@0.57.2": version "0.57.2" resolved "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz" @@ -3082,6 +3633,11 @@ resolved "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.25.1.tgz" integrity sha512-UW/ge9zjvAEmRWVapOP0qyCvPulWU6cQxGxDbWEFfGOj1VBBZAuOqTo3X6yWmDTD3Xe15ysCZChHncr2xFMIfQ== +"@opentelemetry/context-async-hooks@1.30.1": + version "1.30.1" + resolved "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz" + integrity sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA== + "@opentelemetry/core@1.25.1": version "1.25.1" resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-1.25.1.tgz" @@ -3089,6 +3645,13 @@ dependencies: "@opentelemetry/semantic-conventions" "1.25.1" +"@opentelemetry/core@1.30.1": + version "1.30.1" + resolved "https://registry.npmjs.org/@opentelemetry/core/-/core-1.30.1.tgz" + integrity sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ== + dependencies: + "@opentelemetry/semantic-conventions" "1.28.0" + "@opentelemetry/exporter-logs-otlp-http@0.52.1": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.52.1.tgz" @@ -3144,6 +3707,16 @@ "@opentelemetry/sdk-trace-base" "1.25.1" "@opentelemetry/semantic-conventions" "1.25.1" +"@opentelemetry/exporter-zipkin@^1.28": + version "1.30.1" + resolved "https://registry.npmjs.org/@opentelemetry/exporter-zipkin/-/exporter-zipkin-1.30.1.tgz" + integrity sha512-6S2QIMJahIquvFaaxmcwpvQQRD/YFaMTNoIxrfPIPOeITN+a8lfEcPDxNxn8JDAaxkg+4EnXhz8upVDYenoQjA== + dependencies: + "@opentelemetry/core" "1.30.1" + "@opentelemetry/resources" "1.30.1" + "@opentelemetry/sdk-trace-base" "1.30.1" + "@opentelemetry/semantic-conventions" "1.28.0" + "@opentelemetry/instrumentation@0.52.1": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz" @@ -3156,6 +3729,18 @@ semver "^7.5.2" shimmer "^1.2.1" +"@opentelemetry/instrumentation@0.55.0", "@opentelemetry/instrumentation@^0.55": + version "0.55.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz" + integrity sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ== + dependencies: + "@opentelemetry/api-logs" "0.55.0" + "@types/shimmer" "^1.2.0" + import-in-the-middle "^1.8.1" + require-in-the-middle "^7.1.1" + semver "^7.5.2" + shimmer "^1.2.1" + "@opentelemetry/instrumentation@^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0": version "0.57.2" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz" @@ -3168,6 +3753,14 @@ semver "^7.5.2" shimmer "^1.2.1" +"@opentelemetry/instrumentation-grpc@^0.55": + version "0.55.0" + resolved "https://registry.npmjs.org/@opentelemetry/instrumentation-grpc/-/instrumentation-grpc-0.55.0.tgz" + integrity sha512-n2ZH4pRwOy0Vhag/3eKqiyDBwcpUnGgJI9iiIRX7vivE0FMncaLazWphNFezRRaM/LuKwq1TD8pVUvieP68mow== + dependencies: + "@opentelemetry/instrumentation" "0.55.0" + "@opentelemetry/semantic-conventions" "1.27.0" + "@opentelemetry/otlp-exporter-base@0.52.1": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/otlp-exporter-base/-/otlp-exporter-base-0.52.1.tgz" @@ -3206,6 +3799,13 @@ dependencies: "@opentelemetry/core" "1.25.1" +"@opentelemetry/propagator-b3@1.30.1": + version "1.30.1" + resolved "https://registry.npmjs.org/@opentelemetry/propagator-b3/-/propagator-b3-1.30.1.tgz" + integrity sha512-oATwWWDIJzybAZ4pO76ATN5N6FFbOA1otibAVlS8v90B4S1wClnhRUk7K+2CHAwN1JKYuj4jh/lpCEG5BAqFuQ== + dependencies: + "@opentelemetry/core" "1.30.1" + "@opentelemetry/propagator-jaeger@1.25.1": version "1.25.1" resolved "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.25.1.tgz" @@ -3213,6 +3813,13 @@ dependencies: "@opentelemetry/core" "1.25.1" +"@opentelemetry/propagator-jaeger@1.30.1": + version "1.30.1" + resolved "https://registry.npmjs.org/@opentelemetry/propagator-jaeger/-/propagator-jaeger-1.30.1.tgz" + integrity sha512-Pj/BfnYEKIOImirH76M4hDaBSx6HyZ2CXUqk+Kj02m6BB80c/yo4BdWkn/1gDFfU+YPY+bPR2U0DKBfdxCKwmg== + dependencies: + "@opentelemetry/core" "1.30.1" + "@opentelemetry/resources@1.25.1": version "1.25.1" resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.25.1.tgz" @@ -3221,6 +3828,14 @@ "@opentelemetry/core" "1.25.1" "@opentelemetry/semantic-conventions" "1.25.1" +"@opentelemetry/resources@1.30.1", "@opentelemetry/resources@^1.28": + version "1.30.1" + resolved "https://registry.npmjs.org/@opentelemetry/resources/-/resources-1.30.1.tgz" + integrity sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA== + dependencies: + "@opentelemetry/core" "1.30.1" + "@opentelemetry/semantic-conventions" "1.28.0" + "@opentelemetry/sdk-logs@0.52.1": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz" @@ -3267,6 +3882,15 @@ "@opentelemetry/resources" "1.25.1" "@opentelemetry/semantic-conventions" "1.25.1" +"@opentelemetry/sdk-trace-base@1.30.1", "@opentelemetry/sdk-trace-base@^1.28": + version "1.30.1" + resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz" + integrity sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg== + dependencies: + "@opentelemetry/core" "1.30.1" + "@opentelemetry/resources" "1.30.1" + "@opentelemetry/semantic-conventions" "1.28.0" + "@opentelemetry/sdk-trace-node@1.25.1": version "1.25.1" resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz" @@ -3279,11 +3903,33 @@ "@opentelemetry/sdk-trace-base" "1.25.1" semver "^7.5.2" +"@opentelemetry/sdk-trace-node@^1.28": + version "1.30.1" + resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.30.1.tgz" + integrity sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ== + dependencies: + "@opentelemetry/context-async-hooks" "1.30.1" + "@opentelemetry/core" "1.30.1" + "@opentelemetry/propagator-b3" "1.30.1" + "@opentelemetry/propagator-jaeger" "1.30.1" + "@opentelemetry/sdk-trace-base" "1.30.1" + semver "^7.5.2" + "@opentelemetry/semantic-conventions@1.25.1": version "1.25.1" resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz" integrity sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ== +"@opentelemetry/semantic-conventions@1.27.0": + version "1.27.0" + resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz" + integrity sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg== + +"@opentelemetry/semantic-conventions@1.28.0": + version "1.28.0" + resolved "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz" + integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA== + "@parcel/watcher@^2.5.1": version "2.5.1" resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz" @@ -3604,6 +4250,113 @@ resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== +"@pulumi/aws@^6.66.3", "@pulumi/aws@^6.83.0": + version "6.83.0" + resolved "https://registry.npmjs.org/@pulumi/aws/-/aws-6.83.0.tgz" + integrity sha512-uYpYSA5aaDERFuxy3D+FDWiwH7YYNHSwGLpHVuARAzBfQ/SQDkS/tfJI5NNo7/+KCmje3rloKE2enUK/Q9bVBg== + dependencies: + "@pulumi/pulumi" "^3.142.0" + mime "^2.0.0" + +"@pulumi/awsx@^2.22.0": + version "2.22.0" + resolved "https://registry.npmjs.org/@pulumi/awsx/-/awsx-2.22.0.tgz" + integrity sha512-uajrWX6zkk8G9DCCkCkRaH2yzeGRkCElkC8FOE9viUtb9WyVt01EbNqJkje+QwYq4g055jWqcq2YRn7xT1Y44w== + dependencies: + "@aws-sdk/client-ecs" "^3.405.0" + "@pulumi/aws" "^6.66.3" + "@pulumi/docker" "^4.6.0" + "@pulumi/docker-build" "^0.0.8" + "@pulumi/pulumi" "^3.142.0" + "@types/aws-lambda" "^8.10.23" + docker-classic "npm:@pulumi/docker@3.6.1" + mime "^2.0.0" + +"@pulumi/command@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@pulumi/command/-/command-1.1.0.tgz" + integrity sha512-ovVec+gXeqpcm76xwYYZvfJym8bG9NRvlBGQWbn0+c0fKQziZIjiv5V+AxTKfb+dLWKe7Otyt206L1IWq41hyw== + dependencies: + "@pulumi/pulumi" "^3.142.0" + +"@pulumi/docker@npm:@pulumi/docker@3.6.1": + version "3.6.1" + resolved "https://registry.npmjs.org/@pulumi/docker/-/docker-3.6.1.tgz" + integrity sha512-BZME50QkT556v+LvmTXPT8ssB2xxNkp9+msB5xYFEnUnWcdGAx5yUysQw70RJCb+U0GbkJSbxtlgMJgOQf/now== + dependencies: + "@pulumi/pulumi" "^3.0.0" + semver "^5.4.0" + +"@pulumi/docker@^4.6.0": + version "4.8.0" + resolved "https://registry.npmjs.org/@pulumi/docker/-/docker-4.8.0.tgz" + integrity sha512-R1jDAokbz71VbljF6TJ4yNA4Tp1Gd+ISgIQmrcsUf/gNCP1hoA7putyTIta5q0zzy83aPeeeySYwx54iOfHrvQ== + dependencies: + "@pulumi/pulumi" "^3.142.0" + semver "^5.4.0" + +"@pulumi/docker-build@^0.0.8": + version "0.0.8" + resolved "https://registry.npmjs.org/@pulumi/docker-build/-/docker-build-0.0.8.tgz" + integrity sha512-tS6UUgmDjQ+LVekMXGC/6ND7riY75h3oO9fLiVOrvNafCBumxK+Cjm6ZZ9tUChLYvw6H+rZRExZEhfC8F/SQgQ== + dependencies: + "@pulumi/pulumi" "^3.136.0" + +"@pulumi/docker-build@^0.0.12": + version "0.0.12" + resolved "https://registry.npmjs.org/@pulumi/docker-build/-/docker-build-0.0.12.tgz" + integrity sha512-NCN9pboxGT/qKkv9c2/7b+S3y/3hZI6FI1+luP4faQeGFmvT4C4GSAw+uKSbayw8EQWqQfavKo9zq2SKrLbxhQ== + dependencies: + "@pulumi/pulumi" "^3.142.0" + +"@pulumi/pulumi@^3.0.0", "@pulumi/pulumi@^3.136.0", "@pulumi/pulumi@^3.142.0", "@pulumi/pulumi@^3.181.0": + version "3.185.0" + resolved "https://registry.npmjs.org/@pulumi/pulumi/-/pulumi-3.185.0.tgz" + integrity sha512-J8Ha8EDxw503hMmVu1i+qd7atQRJkB6VD0En5ibUgm+B4453AfWclGTHoFcz/QLCneYRQhH+SUS2zy1+sqggdw== + dependencies: + "@grpc/grpc-js" "^1.10.1" + "@logdna/tail-file" "^2.0.6" + "@npmcli/arborist" "^7.3.1" + "@opentelemetry/api" "^1.9" + "@opentelemetry/exporter-zipkin" "^1.28" + "@opentelemetry/instrumentation" "^0.55" + "@opentelemetry/instrumentation-grpc" "^0.55" + "@opentelemetry/resources" "^1.28" + "@opentelemetry/sdk-trace-base" "^1.28" + "@opentelemetry/sdk-trace-node" "^1.28" + "@types/google-protobuf" "^3.15.5" + "@types/semver" "^7.5.6" + "@types/tmp" "^0.2.6" + execa "^5.1.0" + fdir "^6.1.1" + google-protobuf "^3.5.0" + got "^11.8.6" + ini "^2.0.0" + js-yaml "^3.14.0" + minimist "^1.2.6" + normalize-package-data "^6.0.0" + picomatch "^3.0.1" + pkg-dir "^7.0.0" + require-from-string "^2.0.1" + semver "^7.5.2" + source-map-support "^0.5.6" + tmp "^0.2.1" + upath "^1.1.0" + +"@pulumi/random@^4.18.2": + version "4.18.2" + resolved "https://registry.npmjs.org/@pulumi/random/-/random-4.18.2.tgz" + integrity sha512-jC0HfgkFKwgUGmocM7Tw6UyOrpLFXGO8kYfV6f5Q9R/yziaVxEVPQ0Uup2HfosDh926EZHJrt2EUIJHWCyOvFA== + dependencies: + "@pulumi/pulumi" "^3.142.0" + +"@pulumi/tailscale@^0.17.0": + version "0.17.5" + resolved "https://registry.npmjs.org/@pulumi/tailscale/-/tailscale-0.17.5.tgz" + integrity sha512-QGWCUam6WykikNIuBNR5UAicwhw9RZTSZX/M8oOyUkBSiKSmy3ksdl4VxNdpNZJ9C76ZoXzZL/LlLy5J+sUjfw== + dependencies: + "@pulumi/pulumi" "^3.142.0" + "@puppeteer/browsers@2.10.5": version "2.10.5" resolved "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.5.tgz" @@ -4673,6 +5426,13 @@ lodash-es "^4.17.21" read-package-up "^11.0.0" +"@sigstore/bundle@^2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@sigstore/bundle/-/bundle-2.3.2.tgz" + integrity sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA== + dependencies: + "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/bundle@^3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@sigstore/bundle/-/bundle-3.1.0.tgz" @@ -4680,16 +5440,38 @@ dependencies: "@sigstore/protobuf-specs" "^0.4.0" +"@sigstore/core@^1.0.0", "@sigstore/core@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@sigstore/core/-/core-1.1.0.tgz" + integrity sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg== + "@sigstore/core@^2.0.0": version "2.0.0" resolved "https://registry.npmjs.org/@sigstore/core/-/core-2.0.0.tgz" integrity sha512-nYxaSb/MtlSI+JWcwTHQxyNmWeWrUXJJ/G4liLrGG7+tS4vAz6LF3xRXqLH6wPIVUoZQel2Fs4ddLx4NCpiIYg== +"@sigstore/protobuf-specs@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.3.3.tgz" + integrity sha512-RpacQhBlwpBWd7KEJsRKcBQalbV28fvkxwTOJIqhIuDysMMaJW47V4OqW30iJB9uRpqOSxxEAQFdr8tTattReQ== + "@sigstore/protobuf-specs@^0.4.0", "@sigstore/protobuf-specs@^0.4.1": version "0.4.3" resolved "https://registry.npmjs.org/@sigstore/protobuf-specs/-/protobuf-specs-0.4.3.tgz" integrity sha512-fk2zjD9117RL9BjqEwF7fwv7Q/P9yGsMV4MUJZ/DocaQJ6+3pKr+syBq1owU5Q5qGw5CUbXzm+4yJ2JVRDQeSA== +"@sigstore/sign@^2.3.2": + version "2.3.2" + resolved "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz" + integrity sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.2" + make-fetch-happen "^13.0.1" + proc-log "^4.2.0" + promise-retry "^2.0.1" + "@sigstore/sign@^3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@sigstore/sign/-/sign-3.1.0.tgz" @@ -4702,6 +5484,14 @@ proc-log "^5.0.0" promise-retry "^2.0.1" +"@sigstore/tuf@^2.3.4": + version "2.3.4" + resolved "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz" + integrity sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw== + dependencies: + "@sigstore/protobuf-specs" "^0.3.2" + tuf-js "^2.2.1" + "@sigstore/tuf@^3.1.0", "@sigstore/tuf@^3.1.1": version "3.1.1" resolved "https://registry.npmjs.org/@sigstore/tuf/-/tuf-3.1.1.tgz" @@ -4710,6 +5500,15 @@ "@sigstore/protobuf-specs" "^0.4.1" tuf-js "^3.0.1" +"@sigstore/verify@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz" + integrity sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.1.0" + "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/verify@^2.1.0": version "2.1.1" resolved "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz" @@ -4737,7 +5536,7 @@ "@peculiar/asn1-schema" "^2.3.8" "@peculiar/asn1-x509" "^2.3.8" -"@sindresorhus/is@^4.6.0": +"@sindresorhus/is@^4.0.0", "@sindresorhus/is@^4.6.0": version "4.6.0" resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz" integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== @@ -4900,6 +5699,21 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" +"@smithy/core@^3.7.0", "@smithy/core@^3.7.1": + version "3.7.1" + resolved "https://registry.npmjs.org/@smithy/core/-/core-3.7.1.tgz" + integrity sha512-ExRCsHnXFtBPnM7MkfKBPcBBdHw1h/QS/cbNw4ho95qnyNHvnpmGbR39MIAv9KggTr5qSPxRSEL+hRXlyGyGQw== + dependencies: + "@smithy/middleware-serde" "^4.0.8" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-body-length-browser" "^4.0.0" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-stream" "^4.2.3" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + "@smithy/credential-provider-imds@^4.0.6": version "4.0.6" resolved "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.6.tgz" @@ -4967,6 +5781,17 @@ "@smithy/util-base64" "^4.0.0" tslib "^2.6.2" +"@smithy/fetch-http-handler@^5.1.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz" + integrity sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ== + dependencies: + "@smithy/protocol-http" "^5.1.2" + "@smithy/querystring-builder" "^4.0.4" + "@smithy/types" "^4.3.1" + "@smithy/util-base64" "^4.0.0" + tslib "^2.6.2" + "@smithy/hash-blob-browser@^4.0.4": version "4.0.4" resolved "https://registry.npmjs.org/@smithy/hash-blob-browser/-/hash-blob-browser-4.0.4.tgz" @@ -5050,6 +5875,20 @@ "@smithy/util-middleware" "^4.0.4" tslib "^2.6.2" +"@smithy/middleware-endpoint@^4.1.15", "@smithy/middleware-endpoint@^4.1.16": + version "4.1.16" + resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.16.tgz" + integrity sha512-plpa50PIGLqzMR2ANKAw2yOW5YKS626KYKqae3atwucbz4Ve4uQ9K9BEZxDLIFmCu7hKLcrq2zmj4a+PfmUV5w== + dependencies: + "@smithy/core" "^3.7.1" + "@smithy/middleware-serde" "^4.0.8" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/shared-ini-file-loader" "^4.0.4" + "@smithy/types" "^4.3.1" + "@smithy/url-parser" "^4.0.4" + "@smithy/util-middleware" "^4.0.4" + tslib "^2.6.2" + "@smithy/middleware-retry@^4.1.13": version "4.1.14" resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.14.tgz" @@ -5058,7 +5897,22 @@ "@smithy/node-config-provider" "^4.1.3" "@smithy/protocol-http" "^5.1.2" "@smithy/service-error-classification" "^4.0.6" - "@smithy/smithy-client" "^4.4.5" + "@smithy/smithy-client" "^4.4.5" + "@smithy/types" "^4.3.1" + "@smithy/util-middleware" "^4.0.4" + "@smithy/util-retry" "^4.0.6" + tslib "^2.6.2" + uuid "^9.0.1" + +"@smithy/middleware-retry@^4.1.16": + version "4.1.17" + resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.17.tgz" + integrity sha512-gsCimeG6BApj0SBecwa1Be+Z+JOJe46iy3B3m3A8jKJHf7eIihP76Is4LwLrbJ1ygoS7Vg73lfqzejmLOrazUA== + dependencies: + "@smithy/node-config-provider" "^4.1.3" + "@smithy/protocol-http" "^5.1.2" + "@smithy/service-error-classification" "^4.0.6" + "@smithy/smithy-client" "^4.4.8" "@smithy/types" "^4.3.1" "@smithy/util-middleware" "^4.0.4" "@smithy/util-retry" "^4.0.6" @@ -5103,6 +5957,17 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/node-http-handler@^4.1.0": + version "4.1.0" + resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz" + integrity sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg== + dependencies: + "@smithy/abort-controller" "^4.0.4" + "@smithy/protocol-http" "^5.1.2" + "@smithy/querystring-builder" "^4.0.4" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@smithy/property-provider@^4.0.4": version "4.0.4" resolved "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.4.tgz" @@ -5178,6 +6043,19 @@ "@smithy/util-stream" "^4.2.2" tslib "^2.6.2" +"@smithy/smithy-client@^4.4.7", "@smithy/smithy-client@^4.4.8": + version "4.4.8" + resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.8.tgz" + integrity sha512-pcW691/lx7V54gE+dDGC26nxz8nrvnvRSCJaIYD6XLPpOInEZeKdV/SpSux+wqeQ4Ine7LJQu8uxMvobTIBK0w== + dependencies: + "@smithy/core" "^3.7.1" + "@smithy/middleware-endpoint" "^4.1.16" + "@smithy/middleware-stack" "^4.0.4" + "@smithy/protocol-http" "^5.1.2" + "@smithy/types" "^4.3.1" + "@smithy/util-stream" "^4.2.3" + tslib "^2.6.2" + "@smithy/types@^4.3.1": version "4.3.1" resolved "https://registry.npmjs.org/@smithy/types/-/types-4.3.1.tgz" @@ -5251,6 +6129,17 @@ bowser "^2.11.0" tslib "^2.6.2" +"@smithy/util-defaults-mode-browser@^4.0.23": + version "4.0.24" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.24.tgz" + integrity sha512-UkQNgaQ+bidw1MgdgPO1z1k95W/v8Ej/5o/T/Is8PiVUYPspl/ZxV6WO/8DrzZQu5ULnmpB9CDdMSRwgRc21AA== + dependencies: + "@smithy/property-provider" "^4.0.4" + "@smithy/smithy-client" "^4.4.8" + "@smithy/types" "^4.3.1" + bowser "^2.11.0" + tslib "^2.6.2" + "@smithy/util-defaults-mode-node@^4.0.20": version "4.0.21" resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.21.tgz" @@ -5264,6 +6153,19 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" +"@smithy/util-defaults-mode-node@^4.0.23": + version "4.0.24" + resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.24.tgz" + integrity sha512-phvGi/15Z4MpuQibTLOYIumvLdXb+XIJu8TA55voGgboln85jytA3wiD7CkUE8SNcWqkkb+uptZKPiuFouX/7g== + dependencies: + "@smithy/config-resolver" "^4.1.4" + "@smithy/credential-provider-imds" "^4.0.6" + "@smithy/node-config-provider" "^4.1.3" + "@smithy/property-provider" "^4.0.4" + "@smithy/smithy-client" "^4.4.8" + "@smithy/types" "^4.3.1" + tslib "^2.6.2" + "@smithy/util-endpoints@^3.0.6": version "3.0.6" resolved "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.6.tgz" @@ -5311,6 +6213,20 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" +"@smithy/util-stream@^4.2.3": + version "4.2.3" + resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz" + integrity sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg== + dependencies: + "@smithy/fetch-http-handler" "^5.1.0" + "@smithy/node-http-handler" "^4.1.0" + "@smithy/types" "^4.3.1" + "@smithy/util-base64" "^4.0.0" + "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-hex-encoding" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" + "@smithy/util-uri-escape@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz" @@ -5334,7 +6250,7 @@ "@smithy/util-buffer-from" "^4.0.0" tslib "^2.6.2" -"@smithy/util-waiter@^4.0.5": +"@smithy/util-waiter@^4.0.5", "@smithy/util-waiter@^4.0.6": version "4.0.6" resolved "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.6.tgz" integrity sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg== @@ -5375,6 +6291,13 @@ dependencies: tslib "^2.8.0" +"@szmarczak/http-timer@^4.0.5": + version "4.0.6" + resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz" + integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== + dependencies: + defer-to-connect "^2.0.0" + "@t3-oss/env-core@0.13.8": version "0.13.8" resolved "https://registry.npmjs.org/@t3-oss/env-core/-/env-core-0.13.8.tgz" @@ -5950,6 +6873,14 @@ resolved "https://registry.npmjs.org/@tufjs/canonical-json/-/canonical-json-2.0.0.tgz" integrity sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== +"@tufjs/models@2.0.1": + version "2.0.1" + resolved "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz" + integrity sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg== + dependencies: + "@tufjs/canonical-json" "2.0.0" + minimatch "^9.0.4" + "@tufjs/models@3.0.1": version "3.0.1" resolved "https://registry.npmjs.org/@tufjs/models/-/models-3.0.1.tgz" @@ -5982,6 +6913,11 @@ resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz" integrity sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw== +"@types/aws-lambda@^8.10.23": + version "8.10.152" + resolved "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.152.tgz" + integrity sha512-soT/c2gYBnT5ygwiHPmd9a1bftj462NWVk2tKCc1PYHSIacB2UwbTS2zYG4jzag1mRDuzg/OjtxQjQ2NKRB6Rw== + "@types/babel__core@^7.20.5": version "7.20.5" resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" @@ -6030,6 +6966,16 @@ dependencies: bun-types "1.2.17" +"@types/cacheable-request@^6.0.1": + version "6.0.3" + resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz" + integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== + dependencies: + "@types/http-cache-semantics" "*" + "@types/keyv" "^3.1.4" + "@types/node" "*" + "@types/responselike" "^1.0.0" + "@types/canvas-confetti@^1.9.0": version "1.9.0" resolved "https://registry.npmjs.org/@types/canvas-confetti/-/canvas-confetti-1.9.0.tgz" @@ -6332,6 +7278,11 @@ resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.16.tgz" integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== +"@types/google-protobuf@^3.15.5": + version "3.15.12" + resolved "https://registry.npmjs.org/@types/google-protobuf/-/google-protobuf-3.15.12.tgz" + integrity sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ== + "@types/hast@^3.0.0": version "3.0.4" resolved "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz" @@ -6339,6 +7290,11 @@ dependencies: "@types/unist" "*" +"@types/http-cache-semantics@*": + version "4.0.4" + resolved "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== + "@types/http-errors@*": version "2.0.5" resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz" @@ -6380,6 +7336,13 @@ dependencies: jszip "*" +"@types/keyv@^3.1.4": + version "3.1.4" + resolved "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz" + integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== + dependencies: + "@types/node" "*" + "@types/linkify-it@^5": version "5.0.0" resolved "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz" @@ -6501,11 +7464,23 @@ dependencies: "@types/node" "*" +"@types/responselike@^1.0.0": + version "1.0.3" + resolved "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz" + integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== + dependencies: + "@types/node" "*" + "@types/retry@0.12.0": version "0.12.0" resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== +"@types/semver@^7.5.6": + version "7.7.0" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.7.0.tgz" + integrity sha512-k107IF4+Xr7UHjwDc7Cfd6PRQfbdkiRabXGRjo07b4WyPahFBZCZ1sE+BNxYIJPPg73UkfOsVOLwqVc/6ETrIA== + "@types/send@*": version "0.17.5" resolved "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz" @@ -6546,6 +7521,11 @@ fflate "~0.8.2" meshoptimizer "~0.18.1" +"@types/tmp@^0.2.6": + version "0.2.6" + resolved "https://registry.npmjs.org/@types/tmp/-/tmp-0.2.6.tgz" + integrity sha512-chhaNf2oKHlRkDGt+tiKE2Z5aJ6qalm7Z9rlLdBwmOiAAf09YQvvoLXjWK4HWPF1xU/fqvMgfNfpVoBscA/tKA== + "@types/trusted-types@^2.0.7": version "2.0.7" resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz" @@ -6996,6 +7976,11 @@ abbrev@1: resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== +abbrev@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz" + integrity sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ== + abbrev@^3.0.0, abbrev@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/abbrev/-/abbrev-3.0.1.tgz" @@ -7612,6 +8597,16 @@ bidi-js@^1.0.2: dependencies: require-from-string "^2.0.2" +bin-links@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/bin-links/-/bin-links-4.0.4.tgz" + integrity sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA== + dependencies: + cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" + read-cmd-shim "^4.0.0" + write-file-atomic "^5.0.0" + bin-links@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/bin-links/-/bin-links-5.0.0.tgz" @@ -7718,6 +8713,11 @@ buffer-equal-constant-time@^1.0.1: resolved "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz" integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA== +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + bun-types@1.2.17: version "1.2.17" resolved "https://registry.npmjs.org/bun-types/-/bun-types-1.2.17.tgz" @@ -7756,6 +8756,24 @@ cac@^6.7.14: resolved "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz" integrity sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ== +cacache@^18.0.0, cacache@^18.0.3: + version "18.0.4" + resolved "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz" + integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ== + dependencies: + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" + minipass-collect "^2.0.1" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" + cacache@^19.0.0, cacache@^19.0.1: version "19.0.1" resolved "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz" @@ -7774,6 +8792,24 @@ cacache@^19.0.0, cacache@^19.0.1: tar "^7.4.3" unique-filename "^4.0.0" +cacheable-lookup@^5.0.3: + version "5.0.4" + resolved "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz" + integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== + +cacheable-request@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz" + integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" + call-bind@^1.0.2, call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz" @@ -8058,11 +9094,23 @@ cliui@^8.0.1: strip-ansi "^6.0.1" wrap-ansi "^7.0.0" +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + clsx@^2.0.0, clsx@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz" integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== +cmd-shim@^6.0.0: + version "6.0.3" + resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-6.0.3.tgz" + integrity sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA== + cmd-shim@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/cmd-shim/-/cmd-shim-7.0.0.tgz" @@ -8825,6 +9873,13 @@ decode-named-character-reference@^1.0.0: dependencies: character-entities "^2.0.0" +decompress-response@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" + integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== + dependencies: + mimic-response "^3.1.0" + deep-eql@^5.0.1: version "5.0.2" resolved "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz" @@ -8858,6 +9913,11 @@ default-browser-id@^5.0.0: resolved "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz" integrity sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA== +defer-to-connect@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz" + integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== + define-data-property@^1.0.1, define-data-property@^1.1.4: version "1.1.4" resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" @@ -9095,6 +10155,11 @@ dot-prop@^5.1.0: dependencies: is-obj "^2.0.0" +dotenv@^17.2.0: + version "17.2.0" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-17.2.0.tgz" + integrity sha512-Q4sgBT60gzd0BB0lSyYD3xM4YxrXA9y4uBDof1JNYGzOXrQdQ6yX+7XIAqoFOGQFOTK1D3Hts5OllpxMDZFONQ== + draco3d@^1.4.1: version "1.5.7" resolved "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz" @@ -9215,7 +10280,7 @@ encodeurl@~2.0.0: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encoding@^0.1.13: +encoding@^0.1.0, encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -9854,7 +10919,7 @@ evt@^2.4.13: run-exclusive "^2.2.19" tsafe "^1.8.5" -execa@^5.0.0: +execa@^5.0.0, execa@^5.1.0: version "5.1.1" resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== @@ -10058,6 +11123,13 @@ fast-xml-parser@4.4.1: dependencies: strnum "^1.0.5" +fast-xml-parser@5.2.5: + version "5.2.5" + resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz" + integrity sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ== + dependencies: + strnum "^2.1.0" + fastest-levenshtein@^1.0.16: version "1.0.16" resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" @@ -10082,7 +11154,7 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" -fdir@^6.4.4, fdir@^6.4.6: +fdir@^6.1.1, fdir@^6.4.4, fdir@^6.4.6: version "6.4.6" resolved "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz" integrity sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w== @@ -10182,6 +11254,14 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + find-up@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz" @@ -10667,11 +11747,33 @@ glsl-noise@^0.0.0: resolved "https://registry.npmjs.org/glsl-noise/-/glsl-noise-0.0.0.tgz" integrity sha512-b/ZCF6amfAUb7dJM/MxRs7AetQEahYzJ8PtgfrmEdtw6uyGOr+ZSGtgjFm6mfsBkxJ4d2W7kg+Nlqzqvn3Bc0w== +google-protobuf@^3.5.0: + version "3.21.4" + resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.4.tgz" + integrity sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ== + gopd@^1.0.1, gopd@^1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz" integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== +got@^11.8.6: + version "11.8.6" + resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" + integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== + dependencies: + "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" + cacheable-lookup "^5.0.3" + cacheable-request "^7.0.2" + decompress-response "^6.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" + graceful-fs@4.2.10: version "4.2.10" resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz" @@ -10830,7 +11932,7 @@ hook-std@^3.0.0: resolved "https://registry.npmjs.org/hook-std/-/hook-std-3.0.0.tgz" integrity sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw== -hosted-git-info@^7.0.0: +hosted-git-info@^7.0.0, hosted-git-info@^7.0.2: version "7.0.2" resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-7.0.2.tgz" integrity sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w== @@ -10877,7 +11979,7 @@ htmlparser2@^8.0.2: domutils "^3.0.1" entities "^4.4.0" -http-cache-semantics@^4.1.1: +http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: version "4.2.0" resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz" integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== @@ -10910,6 +12012,14 @@ http-signature@~1.2.0: jsprim "^1.2.2" sshpk "^1.7.0" +"http2-wrapper@^1.0.0-beta.5.2": + version "1.0.3" + resolved "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz" + integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== + dependencies: + quick-lru "^5.1.1" + resolve-alpn "^1.0.0" + https-proxy-agent@^7.0.0, https-proxy-agent@^7.0.1, https-proxy-agent@^7.0.6: version "7.0.6" resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz" @@ -10984,6 +12094,13 @@ ignore@^7.0.0, ignore@^7.0.3: resolved "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz" integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== +ignore-walk@^6.0.4: + version "6.0.5" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz" + integrity sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A== + dependencies: + minimatch "^9.0.0" + ignore-walk@^7.0.0: version "7.0.0" resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-7.0.0.tgz" @@ -11065,11 +12182,21 @@ ini@^1.3.4, ini@~1.3.0: resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== +ini@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + ini@4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz" integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== +ini@^4.1.3: + version "4.1.3" + resolved "https://registry.npmjs.org/ini/-/ini-4.1.3.tgz" + integrity sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== + ini@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/ini/-/ini-5.0.0.tgz" @@ -11339,6 +12466,11 @@ is-interactive@^2.0.0: resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz" integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== +is-lambda@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz" + integrity sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ== + is-map@^2.0.2, is-map@^2.0.3: version "2.0.3" resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz" @@ -11626,7 +12758,7 @@ js-tokens@^9.0.1: resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz" integrity sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== -js-yaml@^3.13.1: +js-yaml@^3.13.1, js-yaml@^3.14.0: version "3.14.1" resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== @@ -11697,6 +12829,11 @@ json-parse-even-better-errors@^2.3.0: resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== +json-parse-even-better-errors@^3.0.0, json-parse-even-better-errors@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz" + integrity sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ== + json-parse-even-better-errors@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz" @@ -11852,7 +12989,7 @@ kexec@^1.3.0: dependencies: node-gyp "^3.0.3" -keyv@^4.5.4: +keyv@^4.0.0, keyv@^4.5.4: version "4.5.4" resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -12144,7 +13281,7 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" -locate-path@^7.2.0: +locate-path@^7.1.0, locate-path@^7.2.0: version "7.2.0" resolved "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz" integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== @@ -12299,6 +13436,11 @@ loupe@^3.1.0, loupe@^3.1.4: resolved "https://registry.npmjs.org/loupe/-/loupe-3.1.4.tgz" integrity sha512-wJzkKwJrheKtknCOKNEtDK4iqg/MxmZheEMtSTYvnzRdEYaZzmgH976nenp8WdJRdx5Vc1X/9MO0Oszl6ezeXg== +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + "lowlight@^2 || ^3": version "3.3.0" resolved "https://registry.npmjs.org/lowlight/-/lowlight-3.3.0.tgz" @@ -12367,6 +13509,24 @@ make-error@^1.1.1: resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== +make-fetch-happen@^13.0.0, make-fetch-happen@^13.0.1: + version "13.0.1" + resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz" + integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== + dependencies: + "@npmcli/agent" "^2.0.0" + cacache "^18.0.0" + http-cache-semantics "^4.1.1" + is-lambda "^1.0.1" + minipass "^7.0.2" + minipass-fetch "^3.0.0" + minipass-flush "^1.0.5" + minipass-pipeline "^1.2.4" + negotiator "^0.6.3" + proc-log "^4.2.0" + promise-retry "^2.0.1" + ssri "^10.0.0" + make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.1, make-fetch-happen@^14.0.2, make-fetch-happen@^14.0.3: version "14.0.3" resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz" @@ -12962,6 +14122,11 @@ mime@1.6.0: resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^2.0.0: + version "2.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz" + integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== + mime@^4.0.0: version "4.0.7" resolved "https://registry.npmjs.org/mime/-/mime-4.0.7.tgz" @@ -13006,6 +14171,16 @@ mimic-function@^5.0.0: resolved "https://registry.npmjs.org/mimic-function/-/mimic-function-5.0.1.tgz" integrity sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA== +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" + integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== + +mimic-response@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" + integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== + min-indent@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" @@ -13073,6 +14248,17 @@ minipass-collect@^2.0.1: dependencies: minipass "^7.0.3" +minipass-fetch@^3.0.0: + version "3.0.5" + resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz" + integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== + optionalDependencies: + encoding "^0.1.13" + dependencies: + minipass "^7.0.3" + minipass-sized "^1.0.3" + minizlib "^2.1.2" + minipass-fetch@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz" @@ -13105,7 +14291,7 @@ minipass-sized@^1.0.3: dependencies: minipass "^3.0.0" -minizlib@^2.1.1: +minizlib@^2.1.1, minizlib@^2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== @@ -13276,7 +14462,7 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@0.6.3: +negotiator@0.6.3, negotiator@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== @@ -13400,6 +14586,22 @@ node-gyp@^3.0.3: tar "^2.0.0" which "1" +node-gyp@^10.0.0: + version "10.3.1" + resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz" + integrity sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ== + dependencies: + env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^10.3.10" + graceful-fs "^4.2.6" + make-fetch-happen "^13.0.0" + nopt "^7.0.0" + proc-log "^4.1.0" + semver "^7.3.5" + tar "^6.2.1" + which "^4.0.0" + node-gyp@^11.0.0, node-gyp@^11.2.0: version "11.2.0" resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-11.2.0.tgz" @@ -13435,6 +14637,13 @@ node-releases@^2.0.19: dependencies: abbrev "1" +nopt@^7.0.0, nopt@^7.2.1: + version "7.2.1" + resolved "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz" + integrity sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w== + dependencies: + abbrev "^2.0.0" + nopt@^8.0.0, nopt@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/nopt/-/nopt-8.1.0.tgz" @@ -13470,6 +14679,11 @@ normalize-range@^0.1.2: resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + normalize-url@^8.0.0: version "8.0.2" resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-8.0.2.tgz" @@ -13554,6 +14768,13 @@ npm-audit-report@^6.0.0: resolved "https://registry.npmjs.org/npm-audit-report/-/npm-audit-report-6.0.0.tgz" integrity sha512-Ag6Y1irw/+CdSLqEEAn69T8JBgBThj5mw0vuFIKeP7hATYuQuS5jkMjK6xmVB8pr7U4g5Audbun0lHhBDMIBRA== +npm-bundled@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz" + integrity sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ== + dependencies: + npm-normalize-package-bin "^3.0.0" + npm-bundled@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-4.0.0.tgz" @@ -13561,6 +14782,13 @@ npm-bundled@^4.0.0: dependencies: npm-normalize-package-bin "^4.0.0" +npm-install-checks@^6.0.0, npm-install-checks@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-6.3.0.tgz" + integrity sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw== + dependencies: + semver "^7.1.1" + npm-install-checks@^7.1.0, npm-install-checks@^7.1.1: version "7.1.1" resolved "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-7.1.1.tgz" @@ -13568,11 +14796,26 @@ npm-install-checks@^7.1.0, npm-install-checks@^7.1.1: dependencies: semver "^7.1.1" +npm-normalize-package-bin@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-3.0.1.tgz" + integrity sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ== + npm-normalize-package-bin@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz" integrity sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w== +npm-package-arg@^11.0.0, npm-package-arg@^11.0.2: + version "11.0.3" + resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz" + integrity sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw== + dependencies: + hosted-git-info "^7.0.0" + proc-log "^4.0.0" + semver "^7.3.5" + validate-npm-package-name "^5.0.0" + npm-package-arg@^12.0.0, npm-package-arg@^12.0.2: version "12.0.2" resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz" @@ -13583,6 +14826,13 @@ npm-package-arg@^12.0.0, npm-package-arg@^12.0.2: semver "^7.3.5" validate-npm-package-name "^6.0.0" +npm-packlist@^8.0.0: + version "8.0.2" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-8.0.2.tgz" + integrity sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA== + dependencies: + ignore-walk "^6.0.4" + npm-packlist@^9.0.0: version "9.0.0" resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-9.0.0.tgz" @@ -13590,6 +14840,16 @@ npm-packlist@^9.0.0: dependencies: ignore-walk "^7.0.0" +npm-pick-manifest@^9.0.0, npm-pick-manifest@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz" + integrity sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA== + dependencies: + npm-install-checks "^6.0.0" + npm-normalize-package-bin "^3.0.0" + npm-package-arg "^11.0.0" + semver "^7.3.5" + npm-pick-manifest@^10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz" @@ -13608,6 +14868,20 @@ npm-profile@^11.0.1: npm-registry-fetch "^18.0.0" proc-log "^5.0.0" +npm-registry-fetch@^17.0.0, npm-registry-fetch@^17.0.1: + version "17.1.0" + resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz" + integrity sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA== + dependencies: + "@npmcli/redact" "^2.0.0" + jsonparse "^1.3.1" + make-fetch-happen "^13.0.0" + minipass "^7.0.2" + minipass-fetch "^3.0.0" + minizlib "^2.1.2" + npm-package-arg "^11.0.0" + proc-log "^4.0.0" + npm-registry-fetch@^18.0.0, npm-registry-fetch@^18.0.1, npm-registry-fetch@^18.0.2: version "18.0.2" resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz" @@ -13863,6 +15137,11 @@ own-keys@^1.0.1: object-keys "^1.1.1" safe-push-apply "^1.0.0" +p-cancelable@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz" + integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== + p-each-series@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/p-each-series/-/p-each-series-3.0.0.tgz" @@ -13927,6 +15206,13 @@ p-locate@^6.0.0: dependencies: p-limit "^4.0.0" +p-map@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" + integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== + dependencies: + aggregate-error "^3.0.0" + p-map@^7.0.1, p-map@^7.0.2, p-map@^7.0.3: version "7.0.3" resolved "https://registry.npmjs.org/p-map/-/p-map-7.0.3.tgz" @@ -13997,6 +15283,29 @@ package-json-from-dist@^1.0.0: resolved "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz" integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== +pacote@^18.0.0, pacote@^18.0.6: + version "18.0.6" + resolved "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz" + integrity sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A== + dependencies: + "@npmcli/git" "^5.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/package-json" "^5.1.0" + "@npmcli/promise-spawn" "^7.0.0" + "@npmcli/run-script" "^8.0.0" + cacache "^18.0.0" + fs-minipass "^3.0.0" + minipass "^7.0.2" + npm-package-arg "^11.0.0" + npm-packlist "^8.0.0" + npm-pick-manifest "^9.0.0" + npm-registry-fetch "^17.0.0" + proc-log "^4.0.0" + promise-retry "^2.0.1" + sigstore "^2.2.0" + ssri "^10.0.0" + tar "^6.1.11" + pacote@^19.0.0, pacote@^19.0.1: version "19.0.1" resolved "https://registry.npmjs.org/pacote/-/pacote-19.0.1.tgz" @@ -14055,6 +15364,15 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" +parse-conflict-json@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz" + integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== + dependencies: + json-parse-even-better-errors "^3.0.0" + just-diff "^6.0.0" + just-diff-apply "^5.2.0" + parse-conflict-json@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-4.0.0.tgz" @@ -14308,6 +15626,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== +picomatch@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz" + integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== + "picomatch@^3 || ^4", picomatch@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" @@ -14336,6 +15659,13 @@ pkg-conf@^2.1.0: find-up "^2.0.0" load-json-file "^4.0.0" +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + pkg-types@^1.1.3, pkg-types@^1.3.0: version "1.3.1" resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz" @@ -14428,7 +15758,7 @@ postcss-selector-parser@6.0.10: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2: version "6.1.2" resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz" integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== @@ -14557,6 +15887,11 @@ prismjs@^1.30.0: resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz" integrity sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw== +proc-log@^4.0.0, proc-log@^4.1.0, proc-log@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz" + integrity sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA== + proc-log@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/proc-log/-/proc-log-5.0.0.tgz" @@ -14572,6 +15907,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +proggy@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/proggy/-/proggy-2.0.0.tgz" + integrity sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A== + proggy@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/proggy/-/proggy-3.0.0.tgz" @@ -14592,6 +15932,11 @@ promise-call-limit@^3.0.1: resolved "https://registry.npmjs.org/promise-call-limit/-/promise-call-limit-3.0.2.tgz" integrity sha512-mRPQO2T1QQVw11E7+UdCJu7S61eJVWknzml9sC1heAdj1jxl0fWMBypIt9ZOcLFf8FkG995ZD7RnVk7HH72fZw== +promise-inflight@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz" + integrity sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g== + promise-retry@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz" @@ -14929,6 +16274,11 @@ queue-microtask@^1.2.2: resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +quick-lru@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz" + integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== + range-parser@~1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" @@ -15242,11 +16592,24 @@ read-cache@^1.0.0: dependencies: pify "^2.3.0" +read-cmd-shim@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-4.0.0.tgz" + integrity sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== + read-cmd-shim@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-5.0.0.tgz" integrity sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw== +read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz" + integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== + dependencies: + json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" + read-package-json-fast@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz" @@ -15468,7 +16831,7 @@ require-directory@^2.1.1: resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== -require-from-string@^2.0.2: +require-from-string@^2.0.1, require-from-string@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== @@ -15512,6 +16875,11 @@ resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.4, resolve@^1.22.8: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" +resolve-alpn@^1.0.0: + version "1.2.1" + resolved "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz" + integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== + resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" @@ -15527,6 +16895,13 @@ resolve-pkg-maps@^1.0.0: resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== +responselike@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz" + integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== + dependencies: + lowercase-keys "^2.0.0" + responsive-react-email@^0.0.5: version "0.0.5" resolved "https://registry.npmjs.org/responsive-react-email/-/responsive-react-email-0.0.5.tgz" @@ -15802,6 +17177,11 @@ semver@~5.3.0: resolved "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz" integrity sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw== +semver@^5.4.0: + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" @@ -16031,6 +17411,18 @@ signale@^1.2.1: figures "^2.0.0" pkg-conf "^2.1.0" +sigstore@^2.2.0: + version "2.3.1" + resolved "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz" + integrity sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ== + dependencies: + "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.2" + "@sigstore/sign" "^2.3.2" + "@sigstore/tuf" "^2.3.4" + "@sigstore/verify" "^1.2.1" + sigstore@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/sigstore/-/sigstore-3.1.0.tgz" @@ -16157,7 +17549,7 @@ source-map@^0.5.7: resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== -source-map@^0.6.1: +source-map@^0.6.0, source-map@^0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -16174,6 +17566,14 @@ source-map-js@^1.0.2, source-map-js@^1.2.1: resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz" integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== +source-map-support@^0.5.6: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + space-separated-tokens@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz" @@ -16260,6 +17660,13 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" +ssri@^10.0.0, ssri@^10.0.6: + version "10.0.6" + resolved "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz" + integrity sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ== + dependencies: + minipass "^7.0.3" + ssri@^12.0.0: version "12.0.0" resolved "https://registry.npmjs.org/ssri/-/ssri-12.0.0.tgz" @@ -16576,6 +17983,11 @@ strnum@^1.0.5: resolved "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz" integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA== +strnum@^2.1.0: + version "2.1.1" + resolved "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz" + integrity sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw== + style-to-js@^1.0.0: version "1.1.17" resolved "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.17.tgz" @@ -17017,6 +18429,11 @@ tldts-core@^6.1.86: resolved "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.86.tgz" integrity sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA== +tmp@^0.2.1: + version "0.2.3" + resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + to-regex-range@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" @@ -17138,7 +18555,7 @@ ts-mixer@^6.0.4: resolved "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz" integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== -ts-node@>=9.0.0, ts-node@^10.9.2: +"ts-node@>= 7.0.1 < 12", ts-node@>=9.0.0, ts-node@^10.9.2: version "10.9.2" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== @@ -17229,6 +18646,15 @@ tsup@^8.4.0: tinyglobby "^0.2.11" tree-kill "^1.2.2" +tuf-js@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz" + integrity sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA== + dependencies: + "@tufjs/models" "2.0.1" + debug "^4.3.4" + make-fetch-happen "^13.0.1" + tuf-js@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz" @@ -17389,7 +18815,7 @@ typed-query-selector@^2.12.0: resolved "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz" integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== -typescript@>=2.7, typescript@>=2.9, typescript@>=3.3.1, typescript@>=4.5.0, typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0", typescript@>=4.9.5, typescript@>=5, typescript@>=5.1.0, typescript@>=5.4.5, typescript@^5.0.0, typescript@^5.8.2, typescript@^5.8.3: +"typescript@>= 3.8.3 < 6", typescript@>=2.7, typescript@>=2.9, typescript@>=3.3.1, typescript@>=4.5.0, typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0", typescript@>=4.9.5, typescript@>=5, typescript@>=5.1.0, typescript@>=5.4.5, typescript@^5.0.0, typescript@^5.8.2, typescript@^5.8.3: version "5.8.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz" integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== @@ -17477,6 +18903,13 @@ unified@^11.0.0: trough "^2.0.0" vfile "^6.0.0" +unique-filename@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz" + integrity sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g== + dependencies: + unique-slug "^4.0.0" + unique-filename@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/unique-filename/-/unique-filename-4.0.0.tgz" @@ -17484,6 +18917,13 @@ unique-filename@^4.0.0: dependencies: unique-slug "^5.0.0" +unique-slug@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz" + integrity sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ== + dependencies: + imurmurhash "^0.1.4" + unique-slug@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/unique-slug/-/unique-slug-5.0.0.tgz" @@ -17578,6 +19018,11 @@ unrs-resolver@^1.6.2: dependencies: napi-postinstall "^0.2.4" +upath@^1.1.0: + version "1.2.0" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + update-browserslist-db@^1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz" @@ -17699,6 +19144,11 @@ validate-npm-package-license@^3.0.4: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate-npm-package-name@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz" + integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== + validate-npm-package-name@^6.0.0, validate-npm-package-name@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz" @@ -17957,6 +19407,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +which@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/which/-/which-4.0.0.tgz" + integrity sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg== + dependencies: + isexe "^3.1.1" + which@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/which/-/which-5.0.0.tgz" @@ -18065,6 +19522,14 @@ wrappy@1: resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== +write-file-atomic@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz" + integrity sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^4.0.1" + write-file-atomic@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-6.0.0.tgz" From f1b25a8e7f5499156c7c595fbf2ba2af2d36e7ba Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 12:06:20 -0400 Subject: [PATCH 004/107] chore: add linting and type checking scripts to package.json for @comp/infra --- apps/infra/package.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/infra/package.json b/apps/infra/package.json index e2daece49..bf9b5dcfd 100644 --- a/apps/infra/package.json +++ b/apps/infra/package.json @@ -1,6 +1,10 @@ { "name": "@comp/infra", "main": "index.ts", + "scripts": { + "lint": "echo 'No linting configured for infra'", + "typecheck": "tsc --noEmit" + }, "devDependencies": { "@types/node": "^24.0.3", "typescript": "^5.8.3" From b8939f9f54f0088e1fddc8d13884031b293beb5d Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 12:07:07 -0400 Subject: [PATCH 005/107] chore: clean up documentation and remove deprecated files - Removed unnecessary whitespace from various markdown files for improved readability. - Deleted legacy infrastructure files and build specifications that are no longer in use. - Updated TypeScript configuration for better clarity and consistency. - Adjusted README and contributing guidelines to streamline setup instructions. --- .github/BRANCH_PROTECTION.md | 2 - .github/TESTS_README.md | 1 - CHANGELOG.md | 245 ++++----- CONTRIBUTING.md | 1 - README.md | 4 - apps/infra/README.md | 1 - apps/infra/buildspecs/app.yml | 77 --- apps/infra/legacy/index.backup.ts | 755 --------------------------- apps/infra/legacy/index.public.ts | 587 --------------------- apps/infra/legacy/index.ts | 607 --------------------- apps/infra/tsconfig.json | 30 +- packages/docs/integrations/aws.mdx | 5 - packages/docs/integrations/azure.mdx | 6 - 13 files changed, 127 insertions(+), 2194 deletions(-) delete mode 100644 apps/infra/buildspecs/app.yml delete mode 100644 apps/infra/legacy/index.backup.ts delete mode 100644 apps/infra/legacy/index.public.ts delete mode 100644 apps/infra/legacy/index.ts diff --git a/.github/BRANCH_PROTECTION.md b/.github/BRANCH_PROTECTION.md index 9131632d8..9a8146075 100644 --- a/.github/BRANCH_PROTECTION.md +++ b/.github/BRANCH_PROTECTION.md @@ -16,13 +16,11 @@ Go to **Settings → Branches** in your GitHub repository and add a branch prote ### Must Pass Before Merging: 1. **Quick Checks** (Quick Tests) - - Fast smoke tests that run on every PR - Includes type checking, linting, and critical middleware tests - Should complete in < 5 minutes 2. **Unit Tests** (Unit Tests / app) - - Vitest unit tests for the main app - Tests business logic, utilities, and components diff --git a/.github/TESTS_README.md b/.github/TESTS_README.md index 9ffa31500..38bf1da9f 100644 --- a/.github/TESTS_README.md +++ b/.github/TESTS_README.md @@ -62,7 +62,6 @@ See [BRANCH_PROTECTION.md](BRANCH_PROTECTION.md) for setup instructions. ## Workflow Files - **Testing** - - `test-quick.yml` - Type checking, linting, smoke tests - `unit-tests.yml` - Vitest tests for all apps - `e2e-tests.yml` - Playwright tests (multi-browser) diff --git a/CHANGELOG.md b/CHANGELOG.md index f68995d8f..53389842a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,214 +1,195 @@ # [1.49.0](https://github.com/trycompai/comp/compare/v1.48.1...v1.49.0) (2025-07-03) - ### Bug Fixes -* **onboarding:** update step index and progress calculation in PostPaymentOnboarding component ([a7b3a13](https://github.com/trycompai/comp/commit/a7b3a1378ab45c361769a7c1dfdb3a2edc9180fc)) - +- **onboarding:** update step index and progress calculation in PostPaymentOnboarding component ([a7b3a13](https://github.com/trycompai/comp/commit/a7b3a1378ab45c361769a7c1dfdb3a2edc9180fc)) ### Features -* **e2e:** add tests for middleware onboarding behavior and split onboarding flow ([cb31f22](https://github.com/trycompai/comp/commit/cb31f2234ea84701b6f4a670d735ecc6a0bddc03)) +- **e2e:** add tests for middleware onboarding behavior and split onboarding flow ([cb31f22](https://github.com/trycompai/comp/commit/cb31f2234ea84701b6f4a670d735ecc6a0bddc03)) ## [1.48.1](https://github.com/trycompai/comp/compare/v1.48.0...v1.48.1) (2025-06-30) - ### Bug Fixes -* fixed an issue with uploading files to comments in a policy ([8a3903c](https://github.com/trycompai/comp/commit/8a3903c291770e4da8aa5b55ff0b973330781430)) +- fixed an issue with uploading files to comments in a policy ([8a3903c](https://github.com/trycompai/comp/commit/8a3903c291770e4da8aa5b55ff0b973330781430)) # [1.48.0](https://github.com/trycompai/comp/compare/v1.47.0...v1.48.0) (2025-06-27) - ### Bug Fixes -* **middleware:** refine onboarding redirect logic to check for explicit false value ([93dfa37](https://github.com/trycompai/comp/commit/93dfa379be2cce444acdd8db85e2decd28da958b)) -* **onboarding:** enhance textarea handling and improve localStorage integration ([64821a3](https://github.com/trycompai/comp/commit/64821a3b4484b613177c7887b0824277270192aa)) - +- **middleware:** refine onboarding redirect logic to check for explicit false value ([93dfa37](https://github.com/trycompai/comp/commit/93dfa379be2cce444acdd8db85e2decd28da958b)) +- **onboarding:** enhance textarea handling and improve localStorage integration ([64821a3](https://github.com/trycompai/comp/commit/64821a3b4484b613177c7887b0824277270192aa)) ### Features -* **onboarding:** enhance post-payment onboarding flow with loading state and step tracking ([6b5f055](https://github.com/trycompai/comp/commit/6b5f055188d729240015e0c7e3e6a40404ec5c8a)) -* **onboarding:** implement split onboarding flow and middleware checks ([7346380](https://github.com/trycompai/comp/commit/73463801f7eff32dcf34cf475ac675ea173aedbf)) +- **onboarding:** enhance post-payment onboarding flow with loading state and step tracking ([6b5f055](https://github.com/trycompai/comp/commit/6b5f055188d729240015e0c7e3e6a40404ec5c8a)) +- **onboarding:** implement split onboarding flow and middleware checks ([7346380](https://github.com/trycompai/comp/commit/73463801f7eff32dcf34cf475ac675ea173aedbf)) # [1.47.0](https://github.com/trycompai/comp/compare/v1.46.0...v1.47.0) (2025-06-27) - ### Features -* **slack-notifications:** add Slack integration for Stripe webhook events ([76511b7](https://github.com/trycompai/comp/commit/76511b720ebdabc1c0d5b0a40b09ec036e2c2560)) -* **tracking:** implement unified tracking for onboarding and purchase events ([29bec28](https://github.com/trycompai/comp/commit/29bec2819f7ea7d5ffb24be5476207ab944ddfc6)) +- **slack-notifications:** add Slack integration for Stripe webhook events ([76511b7](https://github.com/trycompai/comp/commit/76511b720ebdabc1c0d5b0a40b09ec036e2c2560)) +- **tracking:** implement unified tracking for onboarding and purchase events ([29bec28](https://github.com/trycompai/comp/commit/29bec2819f7ea7d5ffb24be5476207ab944ddfc6)) # [1.46.0](https://github.com/trycompai/comp/compare/v1.45.1...v1.46.0) (2025-06-26) - ### Features -* add testimonial section and update pricing card layout ([63f3898](https://github.com/trycompai/comp/commit/63f38982bf0b3a2a6e3b3864652b334a1c539c84)) -* add trial badge to pricing card component ([0e4d92b](https://github.com/trycompai/comp/commit/0e4d92bd7a8cf251b64968e89ffd35425f3725fd)) -* update pricing card component with review link ([2164e5f](https://github.com/trycompai/comp/commit/2164e5f3e432327d41f77d9d80b7d7604969cdd3)) +- add testimonial section and update pricing card layout ([63f3898](https://github.com/trycompai/comp/commit/63f38982bf0b3a2a6e3b3864652b334a1c539c84)) +- add trial badge to pricing card component ([0e4d92b](https://github.com/trycompai/comp/commit/0e4d92bd7a8cf251b64968e89ffd35425f3725fd)) +- update pricing card component with review link ([2164e5f](https://github.com/trycompai/comp/commit/2164e5f3e432327d41f77d9d80b7d7604969cdd3)) ## [1.45.1](https://github.com/trycompai/comp/compare/v1.45.0...v1.45.1) (2025-06-26) - ### Bug Fixes -* improve error handling and logging in deploy-test-results workflow ([62f7696](https://github.com/trycompai/comp/commit/62f7696b5108d780f4bfe3dbddc5956d9057f5f4)) +- improve error handling and logging in deploy-test-results workflow ([62f7696](https://github.com/trycompai/comp/commit/62f7696b5108d780f4bfe3dbddc5956d9057f5f4)) # [1.45.0](https://github.com/trycompai/comp/compare/v1.44.0...v1.45.0) (2025-06-26) - ### Bug Fixes -* correct team size placeholder ([f84e79f](https://github.com/trycompai/comp/commit/f84e79fc6bb66a5180a88861be13253d3b3b39c9)) -* enhance billing page subscription checks and display ([9576af2](https://github.com/trycompai/comp/commit/9576af2099c4d24ac4d6e3250b443f9587dc2c1e)) -* update E2E test command in GitHub Actions workflow ([46597c3](https://github.com/trycompai/comp/commit/46597c3873ab32faf6b0200db4759a89977fcf07)) - +- correct team size placeholder ([f84e79f](https://github.com/trycompai/comp/commit/f84e79fc6bb66a5180a88861be13253d3b3b39c9)) +- enhance billing page subscription checks and display ([9576af2](https://github.com/trycompai/comp/commit/9576af2099c4d24ac4d6e3250b443f9587dc2c1e)) +- update E2E test command in GitHub Actions workflow ([46597c3](https://github.com/trycompai/comp/commit/46597c3873ab32faf6b0200db4759a89977fcf07)) ### Features -* add STARTER subscription type to Organization model and migration ([3f9c373](https://github.com/trycompai/comp/commit/3f9c373c5a8dd9d858dc50aa1e5c585b57cbb4ab)) -* update subscription handling and pricing structure ([b566650](https://github.com/trycompai/comp/commit/b566650656d19bdd9818e05c3159774371276024)) +- add STARTER subscription type to Organization model and migration ([3f9c373](https://github.com/trycompai/comp/commit/3f9c373c5a8dd9d858dc50aa1e5c585b57cbb4ab)) +- update subscription handling and pricing structure ([b566650](https://github.com/trycompai/comp/commit/b566650656d19bdd9818e05c3159774371276024)) # [1.44.0](https://github.com/trycompai/comp/compare/v1.43.3...v1.44.0) (2025-06-25) - ### Bug Fixes -* clarify subscription type comments in test-login route ([6d0ebf3](https://github.com/trycompai/comp/commit/6d0ebf3b0cf7a27fe8c230c8acbe7cd1bb00af90)) -* enhance E2E test for simple authentication flow ([7a00333](https://github.com/trycompai/comp/commit/7a00333dff8098dbd2c2a6f7acab36182c527980)) -* improve E2E test for simple authentication flow ([341df0a](https://github.com/trycompai/comp/commit/341df0a3d1ff61676ce2be9c4c743cc9ed8a98eb)) - +- clarify subscription type comments in test-login route ([6d0ebf3](https://github.com/trycompai/comp/commit/6d0ebf3b0cf7a27fe8c230c8acbe7cd1bb00af90)) +- enhance E2E test for simple authentication flow ([7a00333](https://github.com/trycompai/comp/commit/7a00333dff8098dbd2c2a6f7acab36182c527980)) +- improve E2E test for simple authentication flow ([341df0a](https://github.com/trycompai/comp/commit/341df0a3d1ff61676ce2be9c4c743cc9ed8a98eb)) ### Features -* add GitHub Actions workflow for deploying test results ([7d5fb40](https://github.com/trycompai/comp/commit/7d5fb40924dd1c7e00f9fe6d02a7e2dc34248a9e)) -* add testing framework and middleware tests ([1d022c6](https://github.com/trycompai/comp/commit/1d022c640f92fe45214d92bf073c21d6e4a94259)) -* disable Next button on setup form until current step has valid input ([cffae61](https://github.com/trycompai/comp/commit/cffae6140ed0c28ccd360b9199adc7a177bcd40a)) -* enhance testing infrastructure and add Playwright support ([12509ff](https://github.com/trycompai/comp/commit/12509ff1a2e09911f3b138c4ec8c4ee47b7e27a4)) -* implement E2E test for simple authentication flow ([a68f93f](https://github.com/trycompai/comp/commit/a68f93f1fcaed233b59d737f9331a23a6fe9fcb8)) -* implement MockRedis client for E2E testing in CI ([ed3ed8f](https://github.com/trycompai/comp/commit/ed3ed8f0a729c53f105ff0c96bf6e295165439a1)) -* integrate DotLottie animations into compliance components ([3f8bbed](https://github.com/trycompai/comp/commit/3f8bbedcef3a513b93d8ea8d45770cbfb0df548d)) +- add GitHub Actions workflow for deploying test results ([7d5fb40](https://github.com/trycompai/comp/commit/7d5fb40924dd1c7e00f9fe6d02a7e2dc34248a9e)) +- add testing framework and middleware tests ([1d022c6](https://github.com/trycompai/comp/commit/1d022c640f92fe45214d92bf073c21d6e4a94259)) +- disable Next button on setup form until current step has valid input ([cffae61](https://github.com/trycompai/comp/commit/cffae6140ed0c28ccd360b9199adc7a177bcd40a)) +- enhance testing infrastructure and add Playwright support ([12509ff](https://github.com/trycompai/comp/commit/12509ff1a2e09911f3b138c4ec8c4ee47b7e27a4)) +- implement E2E test for simple authentication flow ([a68f93f](https://github.com/trycompai/comp/commit/a68f93f1fcaed233b59d737f9331a23a6fe9fcb8)) +- implement MockRedis client for E2E testing in CI ([ed3ed8f](https://github.com/trycompai/comp/commit/ed3ed8f0a729c53f105ff0c96bf6e295165439a1)) +- integrate DotLottie animations into compliance components ([3f8bbed](https://github.com/trycompai/comp/commit/3f8bbedcef3a513b93d8ea8d45770cbfb0df548d)) ## [1.43.3](https://github.com/trycompai/comp/compare/v1.43.2...v1.43.3) (2025-06-25) - ### Bug Fixes -* fix issue with not being able to select assignee in policy and fix button text ([2dd6d93](https://github.com/trycompai/comp/commit/2dd6d930695523e65a36cee9bc273ef52c0d08ac)) +- fix issue with not being able to select assignee in policy and fix button text ([2dd6d93](https://github.com/trycompai/comp/commit/2dd6d930695523e65a36cee9bc273ef52c0d08ac)) ## [1.43.2](https://github.com/trycompai/comp/compare/v1.43.1...v1.43.2) (2025-06-25) - ### Bug Fixes -* fix bug with undefined theme ([901fa0c](https://github.com/trycompai/comp/commit/901fa0cff57dce3cb08924dd4efbe9b5e87831eb)) -* fix dark mode rendering for dub referral embed ([f1088d1](https://github.com/trycompai/comp/commit/f1088d1907cca32ececd7e09bb2cbbe52e52945b)) -* use email as fallback for name ([7ba3016](https://github.com/trycompai/comp/commit/7ba3016ab4605d5992849567540d62e17b9b50ea)) -* use taildwind theme instead of hardcoding system ([97d257e](https://github.com/trycompai/comp/commit/97d257e54bb31b8549a0e34afe9715b395c64b36)) +- fix bug with undefined theme ([901fa0c](https://github.com/trycompai/comp/commit/901fa0cff57dce3cb08924dd4efbe9b5e87831eb)) +- fix dark mode rendering for dub referral embed ([f1088d1](https://github.com/trycompai/comp/commit/f1088d1907cca32ececd7e09bb2cbbe52e52945b)) +- use email as fallback for name ([7ba3016](https://github.com/trycompai/comp/commit/7ba3016ab4605d5992849567540d62e17b9b50ea)) +- use taildwind theme instead of hardcoding system ([97d257e](https://github.com/trycompai/comp/commit/97d257e54bb31b8549a0e34afe9715b395c64b36)) ## [1.43.1](https://github.com/trycompai/comp/compare/v1.43.0...v1.43.1) (2025-06-24) - ### Bug Fixes -* update formatting and structure in various files ([939bf07](https://github.com/trycompai/comp/commit/939bf07521131891e9acb731a1d5c15aff56fc78)) +- update formatting and structure in various files ([939bf07](https://github.com/trycompai/comp/commit/939bf07521131891e9acb731a1d5c15aff56fc78)) # [1.43.0](https://github.com/trycompai/comp/compare/v1.42.0...v1.43.0) (2025-06-24) - ### Bug Fixes -* correct URL formatting for logo retrieval in getCachedSites function ([87bd99f](https://github.com/trycompai/comp/commit/87bd99fe0426233ff2b8356b05a44e80c4becd79)) - +- correct URL formatting for logo retrieval in getCachedSites function ([87bd99f](https://github.com/trycompai/comp/commit/87bd99fe0426233ff2b8356b05a44e80c4becd79)) ### Features -* add logo existence check to API endpoint for cached websites ([60d8c95](https://github.com/trycompai/comp/commit/60d8c95318197f17996fca6cf2d1a470373f275f)) +- add logo existence check to API endpoint for cached websites ([60d8c95](https://github.com/trycompai/comp/commit/60d8c95318197f17996fca6cf2d1a470373f275f)) # [1.42.0](https://github.com/trycompai/comp/compare/v1.41.1...v1.42.0) (2025-06-24) - ### Bug Fixes -* add back create fleet lable to create org function ([2f1ca1f](https://github.com/trycompai/comp/commit/2f1ca1f7a6685d56afd72e664cf89e9512eb5aa9)) -* add error handling for null hosts ([c76c0bb](https://github.com/trycompai/comp/commit/c76c0bb3591395def2b05689216e080eb1ef5998)) -* add mdm step to agent instructions ([24b0e83](https://github.com/trycompai/comp/commit/24b0e83b4b577b1025247be94c44c7aa9a20ca21)) -* adjust scale of AnimatedGradientBackground in upgrade page for improved visual consistency ([6f8821e](https://github.com/trycompai/comp/commit/6f8821e7442147722a732bd545d3c290c61c3d35)) -* **booking:** remove unnecessary margin from Phone icon in BookingDialog component ([b39c654](https://github.com/trycompai/comp/commit/b39c6543e283ca9d0b9974ad17c90551bc9f9500)) -* cast stripeCustomerId to string before syncing data ([3887f71](https://github.com/trycompai/comp/commit/3887f71a0cb6c2e1b213b1cc88fb70b32656ebc3)) -* **checkout:** refactor CheckoutCompleteDialog to improve plan type handling ([e91f1f0](https://github.com/trycompai/comp/commit/e91f1f045d8e02fdc6f02b7cf95441b4753e3867)) -* fix issue with s3 url sanitization ([9ab26a0](https://github.com/trycompai/comp/commit/9ab26a0022f213fbd1e796c66ed511d4c3ed75b0)) -* fix issue with sanitizing html ([1acccc6](https://github.com/trycompai/comp/commit/1acccc6ad771c5c067e7449a4efa1023e50e6d00)) -* fix issues with roles while inviting users ([a1e7a7d](https://github.com/trycompai/comp/commit/a1e7a7dba83a0cf513391867549b4ebd2b4ae809)) -* **layout:** adjust navbar height for improved layout consistency ([a61b794](https://github.com/trycompai/comp/commit/a61b794a961425ba1ca9cc557275d4e9357aa7a0)) -* move agent logic to client side instead of server side ([3ac4874](https://github.com/trycompai/comp/commit/3ac48744657717f4b5a9f3b3b395090f1b00d9e9)) -* **RecentAuditLogs:** adjust padding for no activity message display ([98c278a](https://github.com/trycompai/comp/commit/98c278acaf7355dacc8262576de66f71bafb57d4)) -* roadmap link on readme ([66afcbd](https://github.com/trycompai/comp/commit/66afcbde132ddadfdf3e6710463c168912877e6a)) -* start download of installer from the browser ([dde4546](https://github.com/trycompai/comp/commit/dde45460db81e02fe6f610fc93858d7ba6adea6e)) -* try catch fetching the device so there's no error ([20b7f14](https://github.com/trycompai/comp/commit/20b7f14720f2039d9ce8981086b216fe0e16e2df)) -* update Stripe customer ID retrieval to use organization ID instead of user ID ([ce4ef80](https://github.com/trycompai/comp/commit/ce4ef80a0503c55877f3d7374d690ef4a9317bec)) -* update subscription data handling and remove unused checkout components ([3a50c55](https://github.com/trycompai/comp/commit/3a50c559b65bdbfed90294233ca711081dae7e58)) -* validate S3 URL host ([d744f74](https://github.com/trycompai/comp/commit/d744f742d4679c7ea5c8e8649c9ec2d0354cb4b6)) - - -### Features - -* add animated pricing banner to upgrade page ([0599fcc](https://github.com/trycompai/comp/commit/0599fccc1668feb8407c435da01f6b2bbb0531d8)) -* add API endpoint to fetch cached published websites from the database ([4792901](https://github.com/trycompai/comp/commit/479290160e1ed059afb696d1f3194d496cce472d)) -* add dub referral tab and embed ([7a5e166](https://github.com/trycompai/comp/commit/7a5e166d31d96de227b2300a1c068ba35c0a174d)) -* add rage mode and scroll rotation effects to AnimatedGradientBackground ([bd516f7](https://github.com/trycompai/comp/commit/bd516f7975ae5db7915dc75ea0ff26e13360c247)) -* add SelectionIndicator component and enhance pricing card interactions ([04835c6](https://github.com/trycompai/comp/commit/04835c69ed99b1e9cf112ac886585a5afe0c2058)) -* add support for windows agent ([f18e8a2](https://github.com/trycompai/comp/commit/f18e8a263bf213f23d12eaa324e03d407b7bf5d7)) -* add tables support in policy editor ([9afd1ed](https://github.com/trycompai/comp/commit/9afd1edde0c803d0247ee43250e42f9d35e165c5)) -* add tables support in policy editor ([9822d95](https://github.com/trycompai/comp/commit/9822d952b7164cecc3d0065dbdd6691ae26b4b58)) -* **api:** add server directive to stripe session generation ([1c9f957](https://github.com/trycompai/comp/commit/1c9f957c9245ee2a3f06788d2d5fd1e22f5a4f28)) -* **api:** enhance Stripe checkout session handling and logging ([3eff9b4](https://github.com/trycompai/comp/commit/3eff9b480a0ae150758adff131b177a0b43de940)) -* **auth:** add session hook to set active organization ([6de3ded](https://github.com/trycompai/comp/commit/6de3ded2322efa912b2972003b5dbe5c14887e95)) -* **auth:** implement organization access checks in layout components ([a1d3ad7](https://github.com/trycompai/comp/commit/a1d3ad7f787ff9165d948f9cc4e36ed99e012cc9)) -* **auth:** refactor authentication page and components for improved user experience ([fb4fa7d](https://github.com/trycompai/comp/commit/fb4fa7d2e9c1b6dd96862eeb724a297a8a9d713c)) -* **billing:** enhance subscription management and UI components ([1cf32c2](https://github.com/trycompai/comp/commit/1cf32c29f9105fa1eb51f3288f680629468f4bab)) -* **checkout:** add CheckoutCompleteDialog component and integrate confetti animation ([4bd6018](https://github.com/trycompai/comp/commit/4bd6018e3e5b18ecd4fa2aac32775f5cf04c0a6a)) -* **checkout:** enhance CheckoutCompleteDialog with updated features and descriptions ([2182c9e](https://github.com/trycompai/comp/commit/2182c9e1e44df54fbf951fb00d7db546aa0f7ebf)) -* **database:** add nanoid function for generating URL-safe unique IDs ([c3608e1](https://github.com/trycompai/comp/commit/c3608e184c15ccf2222d6ab1557b26de589749fa)) -* enhance AnimatedGradientBackground with pulse and glow effects ([7bd80c0](https://github.com/trycompai/comp/commit/7bd80c06406bed1d58ae8121c3c67a7340da9855)) -* enhance onboarding step input with website field ([7062eb3](https://github.com/trycompai/comp/commit/7062eb3c35a7cf5b28afcc9784d60183fa7e9b08)) -* enhance OnboardingStepInput and SelectPills components ([0079556](https://github.com/trycompai/comp/commit/0079556862b948c364e379381c3b61bee735e1b1)) -* enhance Stripe checkout session handling by validating organization membership and managing customer records ([3901d8d](https://github.com/trycompai/comp/commit/3901d8d59b78c57d0ccedde74ad8ceebb2edd5dd)) -* enhance upgrade page with logo marquee and review widget ([a8c6ff1](https://github.com/trycompai/comp/commit/a8c6ff1702bf86f63e18167bc1bf9efee69ad447)) -* **env:** add new Fleet-related environment variables to configuration ([99eb8b1](https://github.com/trycompai/comp/commit/99eb8b1c6be16607872184320ec61cd7e7c1d565)) -* **env:** add optional Stripe subscription price ID to environment variables ([27a2d3d](https://github.com/trycompai/comp/commit/27a2d3d6a75dfffd2c870887d16159ea35acca61)) -* **env:** add Stripe subscription price ID to environment configuration ([f3da9b6](https://github.com/trycompai/comp/commit/f3da9b69a38207ecf314bdd44531b6714119f929)) -* implement middleware for domain-based routing and organization handling ([7be7b9f](https://github.com/trycompai/comp/commit/7be7b9f395c89a7a680ded944373f5157bbb7cf0)) -* implement self-serve subscription option and update pricing details ([69bd082](https://github.com/trycompai/comp/commit/69bd0820204b0c68a2adf0ddbec5c858f5954cb0)) -* improve scroll handling in AnimatedGradientBackground ([cf98196](https://github.com/trycompai/comp/commit/cf98196b57a1c1c88bf2e1b8aeee187e26a7e9eb)) -* integrate Senja Review Widget into pricing cards ([24ecd81](https://github.com/trycompai/comp/commit/24ecd8188bca7c3d509de12dcb29c7662dff63c1)) -* **invite:** implement invitation handling and redirection ([4dccbbc](https://github.com/trycompai/comp/commit/4dccbbcef21eabde1183917d25ab9d40f442c92f)) -* **layout:** wrap main content in Suspense for improved loading handling ([29c7cf2](https://github.com/trycompai/comp/commit/29c7cf27c5dc29c50541efeba40dc67a70993a89)) -* **login:** add option to use another sign-in method after sending magic link ([957c25f](https://github.com/trycompai/comp/commit/957c25f5244bc1bb9d44ea3581b57496b06431cb)) -* **metadata:** add generateMetadata function for Controls, Tasks, and Cloud Tests pages ([221106c](https://github.com/trycompai/comp/commit/221106c388dfad98bf16f79ed339f14fd6640c1f)) -* **middleware:** allow unauthenticated access to invite routes ([04c64d8](https://github.com/trycompai/comp/commit/04c64d86e2d14e60d1e03f6ffbe413f3d88ebc9d)) -* **middleware:** handle old invite route format for direct visits ([8a47db0](https://github.com/trycompai/comp/commit/8a47db04fcdd628cffc856167df1fdff40ac62dd)) -* **middleware:** implement authentication middleware for route protection ([514e007](https://github.com/trycompai/comp/commit/514e00700d674fdc0b0be2300c7c156cd824392e)) -* **middleware:** implement organization session handling in middleware ([5bd53b9](https://github.com/trycompai/comp/commit/5bd53b9d4732ef4171b9baf244655df7fccb8c4e)) -* **policy:** implement content sanitization to remove unsupported marks ([61bdce4](https://github.com/trycompai/comp/commit/61bdce476a69e9fdbc78d3ed33a5ffc0554a2907)) -* **pricing:** add '12-month minimum term' to paid features list in PricingCards component ([1a45ac4](https://github.com/trycompai/comp/commit/1a45ac46c2c48bed96a3571a41cb68f738c0c728)) -* **pricing:** add BookingDialog component to PricingCards for scheduling calls ([63a68b3](https://github.com/trycompai/comp/commit/63a68b35ef4fac2d4db71be7260633f7f521efef)) -* redo portal tasks to be cleaner ([806f07f](https://github.com/trycompai/comp/commit/806f07fe1c5a01b4aa33addc07e03e3ed5a04ad4)) -* refactor subscription handling and introduce self-serve plan ([9b6adfc](https://github.com/trycompai/comp/commit/9b6adfc0cc525d4b642df3dbc6808d8463ce33f9)) -* **setup:** add SetupHeader component to enhance user experience ([3cadc5b](https://github.com/trycompai/comp/commit/3cadc5ba5fa02648cd5122e4e3a64fd341b29ff2)) -* **setup:** enhance framework selection loading state management ([6106974](https://github.com/trycompai/comp/commit/6106974c259150055bcee7f855cd84f56dae3b42)) -* **setup:** enhance onboarding process and organization setup ([b1fdabf](https://github.com/trycompai/comp/commit/b1fdabfe02fda140455b275d3e3afca9b538754f)) -* **setup:** enhance organization setup and upgrade flow ([e1d57d4](https://github.com/trycompai/comp/commit/e1d57d42dfa7e66e439328f5c26bacd26d1968bb)) -* **setup:** implement organization creation and onboarding enhancements ([229744b](https://github.com/trycompai/comp/commit/229744bbaa9c1757102ea48882c5cba51e7aa7c2)) -* **setup:** implement organization setup flow and subscription checks ([b94e7f3](https://github.com/trycompai/comp/commit/b94e7f348035aacdc6a1df613fb31d018ab474f6)) -* **stripe:** add new Stripe integration features ([3749e78](https://github.com/trycompai/comp/commit/3749e7872c6b455d617b7a3c9c80760fce953823)) -* **stripe:** define subscription data type for Stripe synchronization ([5da6c67](https://github.com/trycompai/comp/commit/5da6c670492de5145957fb08d2f932096c6701df)) -* **stripe:** implement subscription data retrieval and cache management ([47815bc](https://github.com/trycompai/comp/commit/47815bc598eeed24bf68e7cf8b16227b5c76a080)) -* **tests:** add layout, loading, and page components for cloud compliance tests ([9c14c28](https://github.com/trycompai/comp/commit/9c14c28ffa1eef9b27fa99f9c381112f1f08600c)) -* update environment variables for Stripe pricing plans ([c61922f](https://github.com/trycompai/comp/commit/c61922fd1d5393116a7ffef4507809accde07e7f)) -* update OrganizationSetupForm and routing logic ([f0c14b9](https://github.com/trycompai/comp/commit/f0c14b9e11a1d55dc949f4ec2932f0de0cce2ff0)) -* update pricing cards with new features and subscription handling ([3753cc5](https://github.com/trycompai/comp/commit/3753cc5510938558b7177cb05c729f2a1195fd45)) +- add back create fleet lable to create org function ([2f1ca1f](https://github.com/trycompai/comp/commit/2f1ca1f7a6685d56afd72e664cf89e9512eb5aa9)) +- add error handling for null hosts ([c76c0bb](https://github.com/trycompai/comp/commit/c76c0bb3591395def2b05689216e080eb1ef5998)) +- add mdm step to agent instructions ([24b0e83](https://github.com/trycompai/comp/commit/24b0e83b4b577b1025247be94c44c7aa9a20ca21)) +- adjust scale of AnimatedGradientBackground in upgrade page for improved visual consistency ([6f8821e](https://github.com/trycompai/comp/commit/6f8821e7442147722a732bd545d3c290c61c3d35)) +- **booking:** remove unnecessary margin from Phone icon in BookingDialog component ([b39c654](https://github.com/trycompai/comp/commit/b39c6543e283ca9d0b9974ad17c90551bc9f9500)) +- cast stripeCustomerId to string before syncing data ([3887f71](https://github.com/trycompai/comp/commit/3887f71a0cb6c2e1b213b1cc88fb70b32656ebc3)) +- **checkout:** refactor CheckoutCompleteDialog to improve plan type handling ([e91f1f0](https://github.com/trycompai/comp/commit/e91f1f045d8e02fdc6f02b7cf95441b4753e3867)) +- fix issue with s3 url sanitization ([9ab26a0](https://github.com/trycompai/comp/commit/9ab26a0022f213fbd1e796c66ed511d4c3ed75b0)) +- fix issue with sanitizing html ([1acccc6](https://github.com/trycompai/comp/commit/1acccc6ad771c5c067e7449a4efa1023e50e6d00)) +- fix issues with roles while inviting users ([a1e7a7d](https://github.com/trycompai/comp/commit/a1e7a7dba83a0cf513391867549b4ebd2b4ae809)) +- **layout:** adjust navbar height for improved layout consistency ([a61b794](https://github.com/trycompai/comp/commit/a61b794a961425ba1ca9cc557275d4e9357aa7a0)) +- move agent logic to client side instead of server side ([3ac4874](https://github.com/trycompai/comp/commit/3ac48744657717f4b5a9f3b3b395090f1b00d9e9)) +- **RecentAuditLogs:** adjust padding for no activity message display ([98c278a](https://github.com/trycompai/comp/commit/98c278acaf7355dacc8262576de66f71bafb57d4)) +- roadmap link on readme ([66afcbd](https://github.com/trycompai/comp/commit/66afcbde132ddadfdf3e6710463c168912877e6a)) +- start download of installer from the browser ([dde4546](https://github.com/trycompai/comp/commit/dde45460db81e02fe6f610fc93858d7ba6adea6e)) +- try catch fetching the device so there's no error ([20b7f14](https://github.com/trycompai/comp/commit/20b7f14720f2039d9ce8981086b216fe0e16e2df)) +- update Stripe customer ID retrieval to use organization ID instead of user ID ([ce4ef80](https://github.com/trycompai/comp/commit/ce4ef80a0503c55877f3d7374d690ef4a9317bec)) +- update subscription data handling and remove unused checkout components ([3a50c55](https://github.com/trycompai/comp/commit/3a50c559b65bdbfed90294233ca711081dae7e58)) +- validate S3 URL host ([d744f74](https://github.com/trycompai/comp/commit/d744f742d4679c7ea5c8e8649c9ec2d0354cb4b6)) + +### Features + +- add animated pricing banner to upgrade page ([0599fcc](https://github.com/trycompai/comp/commit/0599fccc1668feb8407c435da01f6b2bbb0531d8)) +- add API endpoint to fetch cached published websites from the database ([4792901](https://github.com/trycompai/comp/commit/479290160e1ed059afb696d1f3194d496cce472d)) +- add dub referral tab and embed ([7a5e166](https://github.com/trycompai/comp/commit/7a5e166d31d96de227b2300a1c068ba35c0a174d)) +- add rage mode and scroll rotation effects to AnimatedGradientBackground ([bd516f7](https://github.com/trycompai/comp/commit/bd516f7975ae5db7915dc75ea0ff26e13360c247)) +- add SelectionIndicator component and enhance pricing card interactions ([04835c6](https://github.com/trycompai/comp/commit/04835c69ed99b1e9cf112ac886585a5afe0c2058)) +- add support for windows agent ([f18e8a2](https://github.com/trycompai/comp/commit/f18e8a263bf213f23d12eaa324e03d407b7bf5d7)) +- add tables support in policy editor ([9afd1ed](https://github.com/trycompai/comp/commit/9afd1edde0c803d0247ee43250e42f9d35e165c5)) +- add tables support in policy editor ([9822d95](https://github.com/trycompai/comp/commit/9822d952b7164cecc3d0065dbdd6691ae26b4b58)) +- **api:** add server directive to stripe session generation ([1c9f957](https://github.com/trycompai/comp/commit/1c9f957c9245ee2a3f06788d2d5fd1e22f5a4f28)) +- **api:** enhance Stripe checkout session handling and logging ([3eff9b4](https://github.com/trycompai/comp/commit/3eff9b480a0ae150758adff131b177a0b43de940)) +- **auth:** add session hook to set active organization ([6de3ded](https://github.com/trycompai/comp/commit/6de3ded2322efa912b2972003b5dbe5c14887e95)) +- **auth:** implement organization access checks in layout components ([a1d3ad7](https://github.com/trycompai/comp/commit/a1d3ad7f787ff9165d948f9cc4e36ed99e012cc9)) +- **auth:** refactor authentication page and components for improved user experience ([fb4fa7d](https://github.com/trycompai/comp/commit/fb4fa7d2e9c1b6dd96862eeb724a297a8a9d713c)) +- **billing:** enhance subscription management and UI components ([1cf32c2](https://github.com/trycompai/comp/commit/1cf32c29f9105fa1eb51f3288f680629468f4bab)) +- **checkout:** add CheckoutCompleteDialog component and integrate confetti animation ([4bd6018](https://github.com/trycompai/comp/commit/4bd6018e3e5b18ecd4fa2aac32775f5cf04c0a6a)) +- **checkout:** enhance CheckoutCompleteDialog with updated features and descriptions ([2182c9e](https://github.com/trycompai/comp/commit/2182c9e1e44df54fbf951fb00d7db546aa0f7ebf)) +- **database:** add nanoid function for generating URL-safe unique IDs ([c3608e1](https://github.com/trycompai/comp/commit/c3608e184c15ccf2222d6ab1557b26de589749fa)) +- enhance AnimatedGradientBackground with pulse and glow effects ([7bd80c0](https://github.com/trycompai/comp/commit/7bd80c06406bed1d58ae8121c3c67a7340da9855)) +- enhance onboarding step input with website field ([7062eb3](https://github.com/trycompai/comp/commit/7062eb3c35a7cf5b28afcc9784d60183fa7e9b08)) +- enhance OnboardingStepInput and SelectPills components ([0079556](https://github.com/trycompai/comp/commit/0079556862b948c364e379381c3b61bee735e1b1)) +- enhance Stripe checkout session handling by validating organization membership and managing customer records ([3901d8d](https://github.com/trycompai/comp/commit/3901d8d59b78c57d0ccedde74ad8ceebb2edd5dd)) +- enhance upgrade page with logo marquee and review widget ([a8c6ff1](https://github.com/trycompai/comp/commit/a8c6ff1702bf86f63e18167bc1bf9efee69ad447)) +- **env:** add new Fleet-related environment variables to configuration ([99eb8b1](https://github.com/trycompai/comp/commit/99eb8b1c6be16607872184320ec61cd7e7c1d565)) +- **env:** add optional Stripe subscription price ID to environment variables ([27a2d3d](https://github.com/trycompai/comp/commit/27a2d3d6a75dfffd2c870887d16159ea35acca61)) +- **env:** add Stripe subscription price ID to environment configuration ([f3da9b6](https://github.com/trycompai/comp/commit/f3da9b69a38207ecf314bdd44531b6714119f929)) +- implement middleware for domain-based routing and organization handling ([7be7b9f](https://github.com/trycompai/comp/commit/7be7b9f395c89a7a680ded944373f5157bbb7cf0)) +- implement self-serve subscription option and update pricing details ([69bd082](https://github.com/trycompai/comp/commit/69bd0820204b0c68a2adf0ddbec5c858f5954cb0)) +- improve scroll handling in AnimatedGradientBackground ([cf98196](https://github.com/trycompai/comp/commit/cf98196b57a1c1c88bf2e1b8aeee187e26a7e9eb)) +- integrate Senja Review Widget into pricing cards ([24ecd81](https://github.com/trycompai/comp/commit/24ecd8188bca7c3d509de12dcb29c7662dff63c1)) +- **invite:** implement invitation handling and redirection ([4dccbbc](https://github.com/trycompai/comp/commit/4dccbbcef21eabde1183917d25ab9d40f442c92f)) +- **layout:** wrap main content in Suspense for improved loading handling ([29c7cf2](https://github.com/trycompai/comp/commit/29c7cf27c5dc29c50541efeba40dc67a70993a89)) +- **login:** add option to use another sign-in method after sending magic link ([957c25f](https://github.com/trycompai/comp/commit/957c25f5244bc1bb9d44ea3581b57496b06431cb)) +- **metadata:** add generateMetadata function for Controls, Tasks, and Cloud Tests pages ([221106c](https://github.com/trycompai/comp/commit/221106c388dfad98bf16f79ed339f14fd6640c1f)) +- **middleware:** allow unauthenticated access to invite routes ([04c64d8](https://github.com/trycompai/comp/commit/04c64d86e2d14e60d1e03f6ffbe413f3d88ebc9d)) +- **middleware:** handle old invite route format for direct visits ([8a47db0](https://github.com/trycompai/comp/commit/8a47db04fcdd628cffc856167df1fdff40ac62dd)) +- **middleware:** implement authentication middleware for route protection ([514e007](https://github.com/trycompai/comp/commit/514e00700d674fdc0b0be2300c7c156cd824392e)) +- **middleware:** implement organization session handling in middleware ([5bd53b9](https://github.com/trycompai/comp/commit/5bd53b9d4732ef4171b9baf244655df7fccb8c4e)) +- **policy:** implement content sanitization to remove unsupported marks ([61bdce4](https://github.com/trycompai/comp/commit/61bdce476a69e9fdbc78d3ed33a5ffc0554a2907)) +- **pricing:** add '12-month minimum term' to paid features list in PricingCards component ([1a45ac4](https://github.com/trycompai/comp/commit/1a45ac46c2c48bed96a3571a41cb68f738c0c728)) +- **pricing:** add BookingDialog component to PricingCards for scheduling calls ([63a68b3](https://github.com/trycompai/comp/commit/63a68b35ef4fac2d4db71be7260633f7f521efef)) +- redo portal tasks to be cleaner ([806f07f](https://github.com/trycompai/comp/commit/806f07fe1c5a01b4aa33addc07e03e3ed5a04ad4)) +- refactor subscription handling and introduce self-serve plan ([9b6adfc](https://github.com/trycompai/comp/commit/9b6adfc0cc525d4b642df3dbc6808d8463ce33f9)) +- **setup:** add SetupHeader component to enhance user experience ([3cadc5b](https://github.com/trycompai/comp/commit/3cadc5ba5fa02648cd5122e4e3a64fd341b29ff2)) +- **setup:** enhance framework selection loading state management ([6106974](https://github.com/trycompai/comp/commit/6106974c259150055bcee7f855cd84f56dae3b42)) +- **setup:** enhance onboarding process and organization setup ([b1fdabf](https://github.com/trycompai/comp/commit/b1fdabfe02fda140455b275d3e3afca9b538754f)) +- **setup:** enhance organization setup and upgrade flow ([e1d57d4](https://github.com/trycompai/comp/commit/e1d57d42dfa7e66e439328f5c26bacd26d1968bb)) +- **setup:** implement organization creation and onboarding enhancements ([229744b](https://github.com/trycompai/comp/commit/229744bbaa9c1757102ea48882c5cba51e7aa7c2)) +- **setup:** implement organization setup flow and subscription checks ([b94e7f3](https://github.com/trycompai/comp/commit/b94e7f348035aacdc6a1df613fb31d018ab474f6)) +- **stripe:** add new Stripe integration features ([3749e78](https://github.com/trycompai/comp/commit/3749e7872c6b455d617b7a3c9c80760fce953823)) +- **stripe:** define subscription data type for Stripe synchronization ([5da6c67](https://github.com/trycompai/comp/commit/5da6c670492de5145957fb08d2f932096c6701df)) +- **stripe:** implement subscription data retrieval and cache management ([47815bc](https://github.com/trycompai/comp/commit/47815bc598eeed24bf68e7cf8b16227b5c76a080)) +- **tests:** add layout, loading, and page components for cloud compliance tests ([9c14c28](https://github.com/trycompai/comp/commit/9c14c28ffa1eef9b27fa99f9c381112f1f08600c)) +- update environment variables for Stripe pricing plans ([c61922f](https://github.com/trycompai/comp/commit/c61922fd1d5393116a7ffef4507809accde07e7f)) +- update OrganizationSetupForm and routing logic ([f0c14b9](https://github.com/trycompai/comp/commit/f0c14b9e11a1d55dc949f4ec2932f0de0cce2ff0)) +- update pricing cards with new features and subscription handling ([3753cc5](https://github.com/trycompai/comp/commit/3753cc5510938558b7177cb05c729f2a1195fd45)) ## [1.41.1](https://github.com/trycompai/comp/compare/v1.41.0...v1.41.1) (2025-06-12) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4424ca6e3..6fb3bc3e3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -93,7 +93,6 @@ To develop locally: ``` 5. Set up your `.env` file: - - Duplicate `.env.example` to `.env`. - Use `openssl rand -base64 32` to generate a key and add it under `SECRET_KEY` in the `.env` file. - Setup Trigger.dev diff --git a/README.md b/README.md index 55495f902..0960f3be8 100644 --- a/README.md +++ b/README.md @@ -244,7 +244,6 @@ Start and initialize the PostgreSQL database using Docker: ``` 2. Default credentials: - - Database name: `comp` - Username: `postgres` - Password: `postgres` @@ -307,7 +306,6 @@ bun docker:clean If `.env` files don’t load values as expected, you can hard-code the following: - **`comp/packages/kv/src/index.ts`** → Hard-coded Redis client credentials: - - **URL**: The Redis URL needs to start with `https`. Example: ```sh url: "https://default:AXhaAA***MA@charmed-wombat-3**0.upstash.io:6379" @@ -318,7 +316,6 @@ If `.env` files don’t load values as expected, you can hard-code the following ``` - **`comp/packages/db/prisma/schema.prisma`** → Hard-coded `DATABASE_URL`: - - Example: `sh datasource db { @@ -328,7 +325,6 @@ If `.env` files don’t load values as expected, you can hard-code the following ` - **`comp/apps/portal/src/app/lib/auth.ts`** → Hard-coded Google environment variables `clientId`, `clientSecret` under `socialProviders/google`: - - Example: ```js socialProviders: { diff --git a/apps/infra/README.md b/apps/infra/README.md index a1c6a8e65..da383fca1 100644 --- a/apps/infra/README.md +++ b/apps/infra/README.md @@ -82,7 +82,6 @@ If you encounter issues during `pulumi up`: ``` 3. **"ECR authorization failed"** - - Ensure your AWS user has ECR permissions - Check AWS region matches your config diff --git a/apps/infra/buildspecs/app.yml b/apps/infra/buildspecs/app.yml deleted file mode 100644 index 9aa1fa5f3..000000000 --- a/apps/infra/buildspecs/app.yml +++ /dev/null @@ -1,77 +0,0 @@ -version: 0.2 - -# ========================================== -# APPLICATION BUILD SPECIFICATION -# ========================================== -# This buildspec is used by CodeBuild to build and deploy the Pathfinder application -# It runs within the VPC and has access to the private database for SSG builds - -env: - variables: - NODE_ENV: "production" - BUILD_MODE: "production" - DOCKER_BUILDKIT: "1" - parameter-store: - DATABASE_URL: "/pathfinder/database/connection-string" - ECR_REPOSITORY_URI: "/pathfinder/ecr/repository-uri" - ECS_CLUSTER_NAME: "/pathfinder/ecs/cluster-name" - ECS_SERVICE_NAME: "/pathfinder/ecs/service-name" - -phases: - install: - runtime-versions: - nodejs: 18 - docker: 20 - commands: - - echo "Installing dependencies and logging into ECR..." - - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $ECR_REPOSITORY_URI - - pre_build: - commands: - - echo "Retrieving database credentials for build-time queries..." - - | - DB_SECRET=$(aws secretsmanager get-secret-value --secret-id $DATABASE_SECRET_ARN --query SecretString --output text) - export DATABASE_URL=$(echo $DB_SECRET | jq -r '.database_url') - - echo "Setting up build environment..." - - cd apps/web - - npm ci --production=false - - build: - commands: - - echo "Building Next.js application with database access..." - - npm run build - - echo "Building Docker image..." - - docker build -t $ECR_REPOSITORY_URI:$IMAGE_TAG . - - docker tag $ECR_REPOSITORY_URI:$IMAGE_TAG $ECR_REPOSITORY_URI:latest - - post_build: - commands: - - echo "Pushing Docker image to ECR..." - - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG - - docker push $ECR_REPOSITORY_URI:latest - - echo "Build completed at $(date)" - -cache: - paths: - - 'apps/web/node_modules/**/*' - - 'apps/web/.next/cache/**/*' - - '/root/.docker/**/*' - -# Artifacts for deployment tracking -artifacts: - files: - - deployment-manifest.json - - task-def.json - - updated-task-def.json - name: application-artifacts - -# Build reports -reports: - jest-reports: - files: - - 'coverage/clover.xml' - file-format: 'CLOVERXML' - eslint-reports: - files: - - 'eslint-report.xml' - file-format: 'CHECKSTYLEXR' \ No newline at end of file diff --git a/apps/infra/legacy/index.backup.ts b/apps/infra/legacy/index.backup.ts deleted file mode 100644 index cfa2a579e..000000000 --- a/apps/infra/legacy/index.backup.ts +++ /dev/null @@ -1,755 +0,0 @@ -import * as aws from "@pulumi/aws"; -import * as awsx from "@pulumi/awsx"; -import * as command from "@pulumi/command"; -import * as pulumi from "@pulumi/pulumi"; -import * as random from "@pulumi/random"; -import * as dotenv from "dotenv"; - -// Load environment variables from .env file -dotenv.config(); - -// ========================================== -// CONFIGURATION & SHARED SETTINGS -// ========================================== - -// Common tags for all resources -const commonTags = { - Project: "pathfinder", - Environment: pulumi.getStack(), // Will be "dev", "staging", "production" etc. - ManagedBy: "pulumi", - Owner: "platform-team", - CreatedDate: new Date().toISOString().split("T")[0], // YYYY-MM-DD -}; - -// ========================================== -// NETWORKING LAYER -// VPC, Subnets, Security Groups -// ========================================== - -// VPC with public subnets for ALB and private subnets for containers -const vpc = new awsx.ec2.Vpc("pathfinder-vpc", { - tags: { - ...commonTags, - Name: "pathfinder-vpc", - }, -}); - -// Security Groups -// ALB: Allow HTTP from internet -const albSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-alb-sg", { - vpcId: vpc.vpcId, - ingress: [ - { - protocol: "tcp", - fromPort: 80, - toPort: 80, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - egress: [ - { - protocol: "-1", - fromPort: 0, - toPort: 0, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-alb-sg", - Type: "load-balancer", - }, -}); - -// Service: Only accept traffic from ALB (not directly from internet) -const serviceSecurityGroup = new aws.ec2.SecurityGroup( - "pathfinder-service-sg", - { - vpcId: vpc.vpcId, - ingress: [ - { - protocol: "tcp", - fromPort: 3000, // Next.js port - toPort: 3000, - securityGroups: [albSecurityGroup.id], - }, - ], - egress: [ - { - protocol: "-1", - fromPort: 0, - toPort: 0, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-service-sg", - Type: "ecs-service", - }, - } -); - -// Database Security Group - allow public access since DB is publicly accessible -const dbSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-db-sg", { - vpcId: vpc.vpcId, - ingress: [ - { - protocol: "tcp", - fromPort: 5432, - toPort: 5432, - cidrBlocks: ["0.0.0.0/0"], // Allow from anywhere - database is publicly accessible - description: "Allow PostgreSQL access from anywhere (public database)", - }, - ], - egress: [ - { - protocol: "-1", - fromPort: 0, - toPort: 0, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-db-sg", - Type: "database", - }, -}); - -// No complex security groups needed with public database! - -// Database is publicly accessible - no additional rules needed! - -// ========================================== -// DATABASE LAYER -// RDS PostgreSQL with auto-scaling storage -// ========================================== - -// RDS Subnet Group - keep in private subnets (can't change while DB is running) -const dbSubnetGroup = new aws.rds.SubnetGroup("pathfinder-db-subnet-group", { - subnetIds: vpc.privateSubnetIds, // Keep in private subnets for now - tags: { - ...commonTags, - Name: "pathfinder-db-subnet-group", - }, -}); - -// Generate a secure random password for the database -const dbPassword = new random.RandomPassword("pathfinder-db-password-v2", { - length: 32, - special: true, - overrideSpecial: "!#$%&*()-_=+[]{}<>:?", // RDS doesn't allow: / @ " space -}); - -// RDS PostgreSQL Instance - publicly accessible for simplicity -const db = new aws.rds.Instance("pathfinder-db", { - engine: "postgres", - engineVersion: "15.13", // Updated to latest available version - instanceClass: "db.t3.small", // Upgraded from micro: 2 vCPU, 2 GB RAM - allocatedStorage: 50, // 50 GB (up from 20 GB) - maxAllocatedStorage: 1000, // Auto-scale storage up to 1 TB as needed - storageType: "gp3", - storageEncrypted: true, // Enable encryption at rest - dbName: "pathfinder", - username: "pathfinder_admin", - password: dbPassword.result, // Use the generated secure password - vpcSecurityGroupIds: [dbSecurityGroup.id], - dbSubnetGroupName: dbSubnetGroup.name, - - // Make database publicly accessible - this solves SSG build issues! - publiclyAccessible: true, - - // Use default parameter group (requires SSL - AWS best practice) - applyImmediately: true, // Apply parameter changes immediately (requires restart) - - skipFinalSnapshot: true, // For dev - set to false in production - deletionProtection: false, // For dev - set to true in production - backupRetentionPeriod: 7, // Keep backups for 7 days - backupWindow: "03:00-04:00", // 3-4 AM UTC - maintenanceWindow: "sun:04:00-sun:05:00", // Sunday 4-5 AM UTC - enabledCloudwatchLogsExports: ["postgresql"], // Export logs to CloudWatch - tags: { - ...commonTags, - Name: "pathfinder-db", - Engine: "postgresql", - Tier: "database", - }, -}); - -// ========================================== -// MONITORING & OBSERVABILITY -// CloudWatch Alarms for proactive monitoring -// ========================================== - -// Database Monitoring -const dbHighCPUAlarm = new aws.cloudwatch.MetricAlarm( - "pathfinder-db-high-cpu", - { - comparisonOperator: "GreaterThanThreshold", - evaluationPeriods: 2, - metricName: "CPUUtilization", - namespace: "AWS/RDS", - period: 300, // 5 minutes - statistic: "Average", - threshold: 80, - alarmDescription: "Triggers when database CPU exceeds 80% for 10 minutes", - dimensions: { - DBInstanceIdentifier: db.id, - }, - tags: { - ...commonTags, - Name: "pathfinder-db-high-cpu-alarm", - Type: "monitoring", - }, - } -); - -const dbHighConnectionsAlarm = new aws.cloudwatch.MetricAlarm( - "pathfinder-db-high-connections", - { - comparisonOperator: "GreaterThanThreshold", - evaluationPeriods: 2, - metricName: "DatabaseConnections", - namespace: "AWS/RDS", - period: 300, // 5 minutes - statistic: "Average", - threshold: 80, // db.t3.small has max ~100 connections, so 80 is 80% - alarmDescription: "Triggers when database connections exceed 80", - dimensions: { - DBInstanceIdentifier: db.id, - }, - tags: { - ...commonTags, - Name: "pathfinder-db-high-connections-alarm", - Type: "monitoring", - }, - } -); - -const dbLowStorageAlarm = new aws.cloudwatch.MetricAlarm( - "pathfinder-db-low-storage", - { - comparisonOperator: "LessThanThreshold", - evaluationPeriods: 1, - metricName: "FreeStorageSpace", - namespace: "AWS/RDS", - period: 300, // 5 minutes - statistic: "Average", - threshold: 5 * 1024 * 1024 * 1024, // 5 GB in bytes - alarmDescription: "Triggers when free storage drops below 5 GB", - dimensions: { - DBInstanceIdentifier: db.id, - }, - tags: { - ...commonTags, - Name: "pathfinder-db-low-storage-alarm", - Type: "monitoring", - }, - } -); - -// ========================================== -// LOAD BALANCING & TRAFFIC MANAGEMENT -// Application Load Balancer with health checks -// ========================================== - -const lb = new awsx.lb.ApplicationLoadBalancer("pathfinder-lb", { - subnetIds: vpc.publicSubnetIds, - securityGroups: [albSecurityGroup.id], - tags: { - ...commonTags, - Name: "pathfinder-lb", - Type: "application-load-balancer", - }, - defaultTargetGroup: { - port: 3000, - protocol: "HTTP", - targetType: "ip", // Required for Fargate - healthCheck: { - enabled: true, - path: "/", - healthyThreshold: 2, - unhealthyThreshold: 3, - timeout: 30, - interval: 60, - matcher: "200", - }, - }, -}); - -// ========================================== -// CONTAINER INFRASTRUCTURE -// ECR, ECS Service, IAM Roles, Logging -// ========================================== - -// ECS Cluster -const cluster = new aws.ecs.Cluster("pathfinder-cluster", { - tags: { - ...commonTags, - Name: "pathfinder-cluster", - }, -}); - -// Logging -const logGroup = new aws.cloudwatch.LogGroup("pathfinder-logs", { - retentionInDays: 7, - tags: { - ...commonTags, - Name: "pathfinder-logs", - Type: "application-logs", - }, -}); - -// ECS needs this role to pull images and write logs -const executionRole = new aws.iam.Role("pathfinder-execution-role", { - assumeRolePolicy: `{ - "Version": "2012-10-17", - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "ecs-tasks.amazonaws.com" - } - } - ] - }`, -}); - -new aws.iam.RolePolicyAttachment("pathfinder-execution-role-policy", { - role: executionRole.name, - policyArn: - "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy", -}); - -// No CodeBuild needed - building locally with Pulumi! - -// ECR for storing Docker images -const repo = new awsx.ecr.Repository("pathfinder-repo", { - forceDelete: true, // Allow deletion even if images exist - tags: { - ...commonTags, - Name: "pathfinder-repo", - Type: "container-registry", - }, -}); - -// Build image directly in Pulumi with unique tag - this automatically triggers ECS restart -const appImage = new awsx.ecr.Image("pathfinder-app-image", { - repositoryUrl: repo.url, - context: "../web", // Build from web directory - platform: "linux/amd64", - // Pass database URL for build-time SSG - args: { - DATABASE_URL: pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}`, - }, -}); - -// Migration image for running database migrations -const migrationImage = new awsx.ecr.Image("pathfinder-migration-image", { - repositoryUrl: repo.url, - context: "../web", - platform: "linux/amd64", - dockerfile: "../web/Dockerfile.migration", -}); - -// Run migrations as a one-time task during deployment -const runMigrations = new command.local.Command("run-migrations", { - create: pulumi.interpolate` - echo "🚀 Running database migrations..." - - # Run migration container locally with database access - docker run --rm \ - -e DATABASE_URL="postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}" \ - ${migrationImage.imageUri} \ - bun run scripts/run-migrations.ts - - echo "✅ Database migrations completed" - `, -}, { - dependsOn: [migrationImage, db] -}); - -// Simple, clean architecture - no complex build processes! - -// Phase 2: Reference app image (built directly by Pulumi) -// Unique image URI automatically triggers ECS restart - no manual intervention needed! -const imageUri = appImage.imageUri; - -// Fargate Service (migrations already completed during deployment) -const service = new awsx.ecs.FargateService("pathfinder-service", { - cluster: cluster.arn, - networkConfiguration: { - subnets: vpc.privateSubnetIds, - securityGroups: [serviceSecurityGroup.id], - assignPublicIp: true, // Needed to pull images from ECR - }, - desiredCount: 2, - taskDefinitionArgs: { - executionRole: { - roleArn: executionRole.arn, - }, - containers: { - // Main application container (migrations already completed) - "pathfinder-app": { - name: "pathfinder-app", - image: imageUri, - cpu: 1024, // 1 vCPU - memory: 2048, // 2GB - essential: true, - environment: [ - { - name: "HOSTNAME", - value: "0.0.0.0", // Critical: bind to all interfaces, not just localhost - }, - { - name: "PORT", - value: "3000", - }, - { - name: "DATABASE_URL", - value: pulumi.interpolate`postgresql://${db.username}:${db.password}@${db.endpoint}/${db.dbName}`, - }, - { - name: "ENABLE_DEBUG_ENDPOINTS", - value: "true", // Temporary: for debugging environment variables - }, - ], - portMappings: [ - { - containerPort: 3000, - targetGroup: lb.defaultTargetGroup, - }, - ], - logConfiguration: { - logDriver: "awslogs", - options: { - "awslogs-group": logGroup.name, - "awslogs-region": aws.config.region, - "awslogs-stream-prefix": "pathfinder-app", - }, - }, - }, - }, - }, -}, { - dependsOn: [runMigrations] // Wait for migrations to complete before starting the app -}); - -// No Tailscale proxy needed - database is publicly accessible! - -// ========================================== -// AUTO-SCALING CONFIGURATION -// Automatically scale ECS tasks based on CPU -// ========================================== - -const scaling = new aws.appautoscaling.Target("pathfinder-scaling", { - maxCapacity: 10, - minCapacity: 2, - resourceId: pulumi.interpolate`service/${cluster.name}/${service.service.name}`, - scalableDimension: "ecs:service:DesiredCount", - serviceNamespace: "ecs", -}); - -const scalingPolicy = new aws.appautoscaling.Policy( - "pathfinder-scaling-policy", - { - policyType: "TargetTrackingScaling", - resourceId: scaling.resourceId, - scalableDimension: scaling.scalableDimension, - serviceNamespace: scaling.serviceNamespace, - targetTrackingScalingPolicyConfiguration: { - targetValue: 50, // Scale at 50% CPU - predefinedMetricSpecification: { - predefinedMetricType: "ECSServiceAverageCPUUtilization", - }, - }, - } -); - -// ========================================== -// ADDITIONAL MONITORING -// ECS Service and Load Balancer health checks -// ========================================== - -const ecsHighCPUAlarm = new aws.cloudwatch.MetricAlarm( - "pathfinder-ecs-high-cpu", - { - comparisonOperator: "GreaterThanThreshold", - evaluationPeriods: 2, - metricName: "CPUUtilization", - namespace: "AWS/ECS", - period: 300, // 5 minutes - statistic: "Average", - threshold: 80, - alarmDescription: - "Triggers when ECS service CPU exceeds 80% (may trigger auto-scaling)", - dimensions: { - ClusterName: cluster.name, - ServiceName: service.service.name, - }, - tags: { - ...commonTags, - Name: "pathfinder-ecs-high-cpu-alarm", - Type: "monitoring", - }, - } -); - -const albUnhealthyHostsAlarm = new aws.cloudwatch.MetricAlarm( - "pathfinder-alb-unhealthy-hosts", - { - comparisonOperator: "GreaterThanThreshold", - evaluationPeriods: 2, - metricName: "UnHealthyHostCount", - namespace: "AWS/ApplicationELB", - period: 60, // 1 minute - statistic: "Average", - threshold: 0, - alarmDescription: "Triggers when ALB has unhealthy targets", - dimensions: { - LoadBalancer: lb.loadBalancer.arnSuffix, - TargetGroup: lb.defaultTargetGroup.arnSuffix, - }, - treatMissingData: "notBreaching", - tags: { - ...commonTags, - Name: "pathfinder-alb-unhealthy-alarm", - Type: "monitoring", - }, - } -); - -const albResponseTimeAlarm = new aws.cloudwatch.MetricAlarm( - "pathfinder-alb-high-response-time", - { - comparisonOperator: "GreaterThanThreshold", - evaluationPeriods: 3, - metricName: "TargetResponseTime", - namespace: "AWS/ApplicationELB", - period: 60, // 1 minute - statistic: "Average", - threshold: 2, // 2 seconds - alarmDescription: "Triggers when response time exceeds 2 seconds", - dimensions: { - LoadBalancer: lb.loadBalancer.arnSuffix, - }, - treatMissingData: "notBreaching", - tags: { - ...commonTags, - Name: "pathfinder-alb-response-time-alarm", - Type: "monitoring", - }, - } -); - -// ========================================== -// BETTER STACK LOG FORWARDING -// Lambda function to forward CloudWatch logs to Better Stack -// ========================================== - -// IAM role for the Better Stack Lambda function -const betterStackLambdaRole = new aws.iam.Role( - "pathfinder-better-stack-lambda-role", - { - assumeRolePolicy: `{ - "Version": "2012-10-17", - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "lambda.amazonaws.com" - } - } - ] - }`, - tags: { - ...commonTags, - Name: "pathfinder-better-stack-lambda-role", - Type: "iam-role", - }, - } -); - -// Attach basic Lambda execution policy -new aws.iam.RolePolicyAttachment( - "pathfinder-better-stack-lambda-basic-execution", - { - role: betterStackLambdaRole.name, - policyArn: - "arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole", - } -); - -// Custom policy for reading from CloudWatch Logs -const betterStackLambdaPolicy = new aws.iam.Policy( - "pathfinder-better-stack-lambda-policy", - { - policy: `{ - "Version": "2012-10-17", - "Statement": [ - { - "Effect": "Allow", - "Action": [ - "logs:CreateLogGroup", - "logs:CreateLogStream", - "logs:PutLogEvents" - ], - "Resource": "arn:aws:logs:*:*:*" - } - ] - }`, - tags: { - ...commonTags, - Name: "pathfinder-better-stack-lambda-policy", - Type: "iam-policy", - }, - } -); - -new aws.iam.RolePolicyAttachment( - "pathfinder-better-stack-lambda-policy-attachment", - { - role: betterStackLambdaRole.name, - policyArn: betterStackLambdaPolicy.arn, - } -); - - -// Automatically install Lambda dependencies during deployment -const installLambdaDeps = new command.local.Command("install-lambda-deps", { - create: "npm install --production", - dir: "../../logtail-aws-lambda", - environment: { - NODE_ENV: "production", - }, -}); - -// Create a deployment package for the Lambda function -const betterStackLambdaPackage = new pulumi.asset.FileArchive( - "../../logtail-aws-lambda" -); - -if (!process.env.BETTER_STACK_ENTRYPOINT || !process.env.BETTER_STACK_SOURCE_TOKEN) { - throw new Error("BETTER_STACK_ENTRYPOINT and BETTER_STACK_SOURCE_TOKEN must be set"); -} - -// Better Stack Lambda function -const betterStackLambda = new aws.lambda.Function( - "pathfinder-better-stack-lambda", - { - name: "logtail-aws-lambda", - role: betterStackLambdaRole.arn, - handler: "index.handler", - runtime: "nodejs22.x", - architectures: ["x86_64"], - code: betterStackLambdaPackage, - timeout: 30, - environment: { - variables: { - BETTER_STACK_ENTRYPOINT: - process.env.BETTER_STACK_ENTRYPOINT, - BETTER_STACK_SOURCE_TOKEN: process.env.BETTER_STACK_SOURCE_TOKEN, - }, - }, - tags: { - ...commonTags, - Name: "pathfinder-better-stack-lambda", - Type: "log-forwarder", - }, - }, - { dependsOn: [installLambdaDeps] } -); - -// CloudWatch subscription filters to forward ALL logs to Better Stack -// 1. ECS Application logs -const betterStackECSSubscriptionFilter = - new aws.cloudwatch.LogSubscriptionFilter( - "pathfinder-better-stack-ecs-subscription-filter", - { - logGroup: logGroup.name, - filterPattern: "", // Forward all logs - destinationArn: betterStackLambda.arn, - name: "logtail-aws-lambda-ecs-filter", - } - ); - -// 2. RDS PostgreSQL logs -const rdsLogGroupNameOutput = pulumi.interpolate`/aws/rds/instance/${db.id}/postgresql`; - -// Create the RDS log group explicitly -const rdsLogGroup = new aws.cloudwatch.LogGroup( - "pathfinder-rds-log-group", - { - name: rdsLogGroupNameOutput, - retentionInDays: 7, // Keep logs for 7 days - tags: { - ...commonTags, - Name: "pathfinder-rds-log-group", - Type: "logging", - }, - }, - { dependsOn: [db] } // Ensure RDS is created first -); - -const betterStackRDSSubscriptionFilter = - new aws.cloudwatch.LogSubscriptionFilter( - "pathfinder-better-stack-rds-subscription-filter", - { - logGroup: rdsLogGroup.name, - filterPattern: "", // Forward all logs - destinationArn: betterStackLambda.arn, - name: "logtail-aws-lambda-rds-filter", - }, - { dependsOn: [rdsLogGroup] } // Ensure log group is created first - ); - -// Grant CloudWatch Logs permission to invoke the Lambda function from ECS -const betterStackLambdaPermissionECS = new aws.lambda.Permission( - "pathfinder-better-stack-lambda-permission-ecs", - { - statementId: "AllowExecutionFromCloudWatchLogsECS", - action: "lambda:InvokeFunction", - function: betterStackLambda.name, - principal: "logs.amazonaws.com", - sourceArn: pulumi.interpolate`${logGroup.arn}:*`, - } -); - -// Grant CloudWatch Logs permission to invoke the Lambda function from RDS -const betterStackLambdaPermissionRDS = new aws.lambda.Permission( - "pathfinder-better-stack-lambda-permission-rds", - { - statementId: "AllowExecutionFromCloudWatchLogsRDS", - action: "lambda:InvokeFunction", - function: betterStackLambda.name, - principal: "logs.amazonaws.com", - sourceArn: pulumi.interpolate`${rdsLogGroup.arn}:*`, - } -); - -// ========================================== -// STACK OUTPUTS -// Values accessible after deployment -// ========================================== - -export const url = lb.loadBalancer.dnsName.apply((dns) => `http://${dns}`); -export const dbEndpoint = db.endpoint; -export const dbConnectionString = pulumi.interpolate`postgresql://${db.username}:${db.password}@${db.endpoint}/${db.dbName}`; -// Export password as a secret - only visible via CLI with --show-secrets flag -export const dbPasswordSecret = pulumi.secret(dbPassword.result); -export const dbUsername = db.username; - -// Migration information -export const migrationStatus = runMigrations.stdout; - -// Better Stack logging information -export const betterStackLambdaArn = betterStackLambda.arn; -export const betterStackLambdaName = betterStackLambda.name; -export const logGroupName = logGroup.name; -export const rdsLogGroupName = rdsLogGroup.name; - -// Simplified build - no CodeBuild needed! -export const ecrRepositoryUrl = repo.url; diff --git a/apps/infra/legacy/index.public.ts b/apps/infra/legacy/index.public.ts deleted file mode 100644 index 0055a509e..000000000 --- a/apps/infra/legacy/index.public.ts +++ /dev/null @@ -1,587 +0,0 @@ -import * as aws from "@pulumi/aws"; -import * as awsx from "@pulumi/awsx"; -import * as command from "@pulumi/command"; -import * as pulumi from "@pulumi/pulumi"; -import * as random from "@pulumi/random"; -import * as dotenv from "dotenv"; - -// Load environment variables from .env file -dotenv.config(); - -// ========================================== -// CONFIGURATION & SHARED SETTINGS -// ========================================== - -// Common tags for all resources -const commonTags = { - Project: "pathfinder", - Environment: pulumi.getStack(), // Will be "dev", "staging", "production" etc. - ManagedBy: "pulumi", - Owner: "platform-team", - CreatedDate: new Date().toISOString().split("T")[0], // YYYY-MM-DD -}; - -// ========================================== -// NETWORKING LAYER -// VPC, Subnets, Security Groups -// ========================================== - -// VPC with DNS support for publicly accessible RDS -const vpc = new aws.ec2.Vpc("pathfinder-vpc", { - cidrBlock: "10.0.0.0/16", - enableDnsHostnames: true, // Required for publicly accessible RDS - enableDnsSupport: true, // Required for publicly accessible RDS - tags: { - ...commonTags, - Name: "pathfinder-vpc", - }, -}); - -// Internet Gateway for public subnet access -const igw = new aws.ec2.InternetGateway("pathfinder-igw", { - vpcId: vpc.id, - tags: { - ...commonTags, - Name: "pathfinder-igw", - }, -}); - -// Get availability zones -const azs = aws.getAvailabilityZones({ - state: "available", -}); - -// Public subnets (for ALB and publicly accessible RDS) -const publicSubnet1 = new aws.ec2.Subnet("pathfinder-public-subnet-1", { - vpcId: vpc.id, - cidrBlock: "10.0.1.0/24", - availabilityZone: azs.then(azs => azs.names[0]), - mapPublicIpOnLaunch: true, - tags: { - ...commonTags, - Name: "pathfinder-public-subnet-1", - Type: "public", - }, -}); - -const publicSubnet2 = new aws.ec2.Subnet("pathfinder-public-subnet-2", { - vpcId: vpc.id, - cidrBlock: "10.0.2.0/24", - availabilityZone: azs.then(azs => azs.names[1]), - mapPublicIpOnLaunch: true, - tags: { - ...commonTags, - Name: "pathfinder-public-subnet-2", - Type: "public", - }, -}); - -// Private subnets (for ECS tasks) -const privateSubnet1 = new aws.ec2.Subnet("pathfinder-private-subnet-1", { - vpcId: vpc.id, - cidrBlock: "10.0.10.0/24", - availabilityZone: azs.then(azs => azs.names[0]), - tags: { - ...commonTags, - Name: "pathfinder-private-subnet-1", - Type: "private", - }, -}); - -const privateSubnet2 = new aws.ec2.Subnet("pathfinder-private-subnet-2", { - vpcId: vpc.id, - cidrBlock: "10.0.11.0/24", - availabilityZone: azs.then(azs => azs.names[1]), - tags: { - ...commonTags, - Name: "pathfinder-private-subnet-2", - Type: "private", - }, -}); - -// NAT Gateway for private subnet internet access -const natEip = new aws.ec2.Eip("pathfinder-nat-eip", { - domain: "vpc", - tags: { - ...commonTags, - Name: "pathfinder-nat-eip", - }, -}); - -const natGateway = new aws.ec2.NatGateway("pathfinder-nat-gw", { - allocationId: natEip.id, - subnetId: publicSubnet1.id, - tags: { - ...commonTags, - Name: "pathfinder-nat-gw", - }, -}, { - dependsOn: [igw], -}); - -// Route tables -const publicRouteTable = new aws.ec2.RouteTable("pathfinder-public-rt", { - vpcId: vpc.id, - routes: [ - { - cidrBlock: "0.0.0.0/0", - gatewayId: igw.id, - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-public-rt", - }, -}); - -const privateRouteTable = new aws.ec2.RouteTable("pathfinder-private-rt", { - vpcId: vpc.id, - routes: [ - { - cidrBlock: "0.0.0.0/0", - natGatewayId: natGateway.id, - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-private-rt", - }, -}); - -// Route table associations -const publicRtAssoc1 = new aws.ec2.RouteTableAssociation("pathfinder-public-rt-assoc-1", { - subnetId: publicSubnet1.id, - routeTableId: publicRouteTable.id, -}); - -const publicRtAssoc2 = new aws.ec2.RouteTableAssociation("pathfinder-public-rt-assoc-2", { - subnetId: publicSubnet2.id, - routeTableId: publicRouteTable.id, -}); - -const privateRtAssoc1 = new aws.ec2.RouteTableAssociation("pathfinder-private-rt-assoc-1", { - subnetId: privateSubnet1.id, - routeTableId: privateRouteTable.id, -}); - -const privateRtAssoc2 = new aws.ec2.RouteTableAssociation("pathfinder-private-rt-assoc-2", { - subnetId: privateSubnet2.id, - routeTableId: privateRouteTable.id, -}); - -// Helper arrays for convenience (mimicking awsx.ec2.Vpc interface) -const publicSubnetIds = [publicSubnet1.id, publicSubnet2.id]; -const privateSubnetIds = [privateSubnet1.id, privateSubnet2.id]; - -// Security Groups -// ALB: Allow HTTP from internet -const albSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-alb-sg", { - vpcId: vpc.id, - ingress: [ - { - protocol: "tcp", - fromPort: 80, - toPort: 80, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - egress: [ - { - protocol: "-1", - fromPort: 0, - toPort: 0, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-alb-sg", - Type: "load-balancer", - }, -}); - -// Service: Only accept traffic from ALB (not directly from internet) -const serviceSecurityGroup = new aws.ec2.SecurityGroup( - "pathfinder-service-sg", - { - vpcId: vpc.id, - ingress: [ - { - protocol: "tcp", - fromPort: 3000, // Next.js port - toPort: 3000, - securityGroups: [albSecurityGroup.id], - }, - ], - egress: [ - { - protocol: "-1", - fromPort: 0, - toPort: 0, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-service-sg", - Type: "ecs-service", - }, - } -); - -// Database Security Group - allow controlled public access -const dbSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-db-sg", { - vpcId: vpc.id, - ingress: [ - // Allow access from ECS tasks in private subnets - { - protocol: "tcp", - fromPort: 5432, - toPort: 5432, - securityGroups: [serviceSecurityGroup.id], - description: "Allow PostgreSQL access from ECS service", - }, - // For development/migration access - restrict to specific IPs in production - { - protocol: "tcp", - fromPort: 5432, - toPort: 5432, - cidrBlocks: ["0.0.0.0/0"], // TODO: Replace with specific IP ranges in production - description: "Allow PostgreSQL access for development/migrations (restrict in production)", - }, - ], - egress: [ - { - protocol: "-1", - fromPort: 0, - toPort: 0, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-db-sg", - Type: "database", - }, -}); - -// No complex security groups needed with public database! - -// Database is publicly accessible - no additional rules needed! - -// ========================================== -// DATABASE LAYER -// RDS PostgreSQL with auto-scaling storage -// ========================================== - -// RDS Subnet Group - use PUBLIC subnets for truly public database access -const dbSubnetGroup = new aws.rds.SubnetGroup("pathfinder-db-subnet-group", { - subnetIds: publicSubnetIds, // Use PUBLIC subnets for internet access - tags: { - ...commonTags, - Name: "pathfinder-db-subnet-group", - }, -}, { - dependsOn: [vpc, publicSubnet1, publicSubnet2, igw, publicRouteTable, publicRtAssoc1, publicRtAssoc2], -}); - -// Generate a secure random password for the database -const dbPassword = new random.RandomPassword("pathfinder-db-password-v2", { - length: 32, - special: true, - overrideSpecial: "!#$%&*()-_=+[]{}<>:?", // RDS doesn't allow: / @ " space -}); - -// RDS PostgreSQL Instance - publicly accessible for simplicity -const db = new aws.rds.Instance("pathfinder-db", { - engine: "postgres", - engineVersion: "15.13", // Updated to latest available version - instanceClass: "db.t3.small", // Upgraded from micro: 2 vCPU, 2 GB RAM - allocatedStorage: 50, // 50 GB (up from 20 GB) - maxAllocatedStorage: 1000, // Auto-scale storage up to 1 TB as needed - storageType: "gp3", - storageEncrypted: true, // Enable encryption at rest - dbName: "pathfinder", - username: "pathfinder_admin", - password: dbPassword.result, // Use the generated secure password - vpcSecurityGroupIds: [dbSecurityGroup.id], - dbSubnetGroupName: dbSubnetGroup.name, - - // Make database publicly accessible - this solves SSG build issues! - publiclyAccessible: true, - - // Use default parameter group (requires SSL - AWS best practice) - applyImmediately: true, // Apply parameter changes immediately (requires restart) - - skipFinalSnapshot: true, // For dev - set to false in production - deletionProtection: false, // For dev - set to true in production - backupRetentionPeriod: 7, // Keep backups for 7 days - backupWindow: "03:00-04:00", // 3-4 AM UTC - maintenanceWindow: "sun:04:00-sun:05:00", // Sunday 4-5 AM UTC - // No external logging - keep it simple! - tags: { - ...commonTags, - Name: "pathfinder-db", - Engine: "postgresql", - Tier: "database", - }, -}, { - dependsOn: [vpc, dbSubnetGroup, dbSecurityGroup], -}); - -// No complex monitoring - keep it simple! - -// ========================================== -// LOAD BALANCING & TRAFFIC MANAGEMENT -// Application Load Balancer with health checks -// ========================================== - -const lb = new awsx.lb.ApplicationLoadBalancer("pathfinder-lb", { - subnetIds: publicSubnetIds, - securityGroups: [albSecurityGroup.id], - tags: { - ...commonTags, - Name: "pathfinder-lb", - Type: "application-load-balancer", - }, - defaultTargetGroup: { - port: 3000, - protocol: "HTTP", - targetType: "ip", // Required for Fargate - healthCheck: { - enabled: true, - path: "/", - healthyThreshold: 2, - unhealthyThreshold: 3, - timeout: 30, - interval: 60, - matcher: "200", - }, - }, -}); - -// ========================================== -// CONTAINER INFRASTRUCTURE -// ECR, ECS Service, IAM Roles, Logging -// ========================================== - -// ECS Cluster -const cluster = new aws.ecs.Cluster("pathfinder-cluster", { - tags: { - ...commonTags, - Name: "pathfinder-cluster", - }, -}); - -// Logging -const logGroup = new aws.cloudwatch.LogGroup("pathfinder-logs", { - retentionInDays: 7, - tags: { - ...commonTags, - Name: "pathfinder-logs", - Type: "application-logs", - }, -}); - -// ECS needs this role to pull images and write logs -const executionRole = new aws.iam.Role("pathfinder-execution-role", { - assumeRolePolicy: `{ - "Version": "2012-10-17", - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "ecs-tasks.amazonaws.com" - } - } - ] - }`, -}); - -new aws.iam.RolePolicyAttachment("pathfinder-execution-role-policy", { - role: executionRole.name, - policyArn: - "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy", -}); - -// No CodeBuild needed - building locally with Pulumi! - -// ECR for storing Docker images -const repo = new awsx.ecr.Repository("pathfinder-repo", { - forceDelete: true, // Allow deletion even if images exist - tags: { - ...commonTags, - Name: "pathfinder-repo", - Type: "container-registry", - }, -}); - -// STAGE 1: Migration image (builds first) -const migrationImage = new awsx.ecr.Image("pathfinder-migration-image", { - repositoryUrl: repo.url, - context: "../web", - platform: "linux/amd64", - dockerfile: "../web/Dockerfile.migration", -}); - -// Run migrations - must complete before app image builds -const runMigrations = new command.local.Command("run-migrations", { - create: pulumi.interpolate` - echo "🚀 Running database migrations..." - - # Run migration container locally with database access - pass connection parts separately - docker run --rm \ - -e PGHOST="${db.address}" \ - -e PGPORT="5432" \ - -e PGDATABASE="${db.dbName}" \ - -e PGUSER="${db.username}" \ - -e PGPASSWORD="${dbPassword.result}" \ - -e PGSSLMODE="require" \ - ${migrationImage.imageUri} \ - sh -c 'export DATABASE_URL="postgresql://\$PGUSER:\$PGPASSWORD@\$PGHOST:\$PGPORT/\$PGDATABASE?sslmode=\$PGSSLMODE" && bun run scripts/run-migrations.ts' - - echo "✅ Database migrations completed" - `, -}, { - dependsOn: [migrationImage, db] -}); - -// STAGE 2: App image (builds AFTER migrations succeed) -const appImage = new awsx.ecr.Image("pathfinder-app-image", { - repositoryUrl: repo.url, - context: "../web", // Build from web directory - platform: "linux/amd64", - // CRITICAL: Pass database connection for Next.js SSG at build time - construct URL safely - args: { - PGHOST: db.address, - PGPORT: "5432", - PGDATABASE: db.dbName, - PGUSER: db.username, - PGPASSWORD: dbPassword.result, - PGSSLMODE: "require", - }, -}, { - dependsOn: [runMigrations] // Wait for migrations to complete before building app -}); - -// Clean 2-stage pipeline: -// Stage 1: Migration image → Run migrations ✅ -// Stage 2: App image (with DB access) → Deploy ECS ✅ - -// ECS Service - simple app deployment (migrations already completed) -const service = new awsx.ecs.FargateService("pathfinder-service", { - cluster: cluster.arn, - networkConfiguration: { - subnets: privateSubnetIds, - securityGroups: [serviceSecurityGroup.id], - assignPublicIp: true, // Needed to pull images from ECR - }, - desiredCount: 2, - taskDefinitionArgs: { - executionRole: { - roleArn: executionRole.arn, - }, - containers: { - // Main application container (migrations already completed in build stage) - "pathfinder-app": { - name: "pathfinder-app", - image: appImage.imageUri, - cpu: 1024, // 1 vCPU - memory: 2048, // 2GB - essential: true, - environment: [ - { - name: "HOSTNAME", - value: "0.0.0.0", // Critical: bind to all interfaces, not just localhost - }, - { - name: "PORT", - value: "3000", - }, - { - name: "DATABASE_URL", - value: pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}?sslmode=require`, - }, - { - name: "NODE_ENV", - value: "production", - }, - { - name: "ENABLE_DEBUG_ENDPOINTS", - value: "true", // Temporary: for debugging environment variables - }, - ], - portMappings: [ - { - containerPort: 3000, - targetGroup: lb.defaultTargetGroup, - }, - ], - logConfiguration: { - logDriver: "awslogs", - options: { - "awslogs-group": logGroup.name, - "awslogs-region": aws.getRegionOutput().name, - "awslogs-stream-prefix": "pathfinder-app", - }, - }, - }, - }, - }, -}, { - dependsOn: [appImage] // Wait for app image to be built (which waits for migrations) -}); - -// No Tailscale proxy needed - database is publicly accessible! - -// ========================================== -// AUTO-SCALING CONFIGURATION -// Automatically scale ECS tasks based on CPU -// ========================================== - -const scaling = new aws.appautoscaling.Target("pathfinder-scaling", { - maxCapacity: 10, - minCapacity: 2, - resourceId: pulumi.interpolate`service/${cluster.name}/${service.service.name}`, - scalableDimension: "ecs:service:DesiredCount", - serviceNamespace: "ecs", -}); - -const scalingPolicy = new aws.appautoscaling.Policy( - "pathfinder-scaling-policy", - { - policyType: "TargetTrackingScaling", - resourceId: scaling.resourceId, - scalableDimension: scaling.scalableDimension, - serviceNamespace: scaling.serviceNamespace, - targetTrackingScalingPolicyConfiguration: { - targetValue: 50, // Scale at 50% CPU - predefinedMetricSpecification: { - predefinedMetricType: "ECSServiceAverageCPUUtilization", - }, - }, - } -); - -// No complex monitoring - keep it simple! - -// No external logging complexity - keep it simple! - -// ========================================== -// STACK OUTPUTS -// Values accessible after deployment -// ========================================== - -export const url = lb.loadBalancer.dnsName.apply((dns) => `http://${dns}`); -export const dbEndpoint = db.endpoint; -export const dbConnectionString = pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}?sslmode=require`; -// Export password as a secret - only visible via CLI with --show-secrets flag -export const dbPasswordSecret = pulumi.secret(dbPassword.result); -export const dbUsername = db.username; - -// Migration information - runs during build stage -export const migrationStatus = runMigrations.stdout; - -// Simplified build - no CodeBuild needed! -export const ecrRepositoryUrl = repo.url; diff --git a/apps/infra/legacy/index.ts b/apps/infra/legacy/index.ts deleted file mode 100644 index fc8f0ca43..000000000 --- a/apps/infra/legacy/index.ts +++ /dev/null @@ -1,607 +0,0 @@ -import * as aws from "@pulumi/aws"; -import * as awsx from "@pulumi/awsx"; -import * as command from "@pulumi/command"; -import * as pulumi from "@pulumi/pulumi"; -import * as random from "@pulumi/random"; -import * as dotenv from "dotenv"; - -// Load environment variables from .env file -dotenv.config(); - -// ========================================== -// CONFIGURATION & SHARED SETTINGS -// ========================================== - -// Common tags for all resources -const commonTags = { - Project: "pathfinder", - Environment: pulumi.getStack(), // Will be "dev", "staging", "production" etc. - ManagedBy: "pulumi", - Owner: "platform-team", - CreatedDate: new Date().toISOString().split("T")[0], // YYYY-MM-DD -}; - -// ========================================== -// NETWORKING LAYER -// VPC, Subnets, Security Groups -// ========================================== - -// VPC with DNS support for publicly accessible RDS -const vpc = new aws.ec2.Vpc("pathfinder-vpc", { - cidrBlock: "10.0.0.0/16", - enableDnsHostnames: true, // Required for publicly accessible RDS - enableDnsSupport: true, // Required for publicly accessible RDS - tags: { - ...commonTags, - Name: "pathfinder-vpc", - }, -}); - -// Internet Gateway for public subnet access -const igw = new aws.ec2.InternetGateway("pathfinder-igw", { - vpcId: vpc.id, - tags: { - ...commonTags, - Name: "pathfinder-igw", - }, -}); - -// Get availability zones -const azs = aws.getAvailabilityZones({ - state: "available", -}); - -// Public subnets (for ALB and publicly accessible RDS) -const publicSubnet1 = new aws.ec2.Subnet("pathfinder-public-subnet-1", { - vpcId: vpc.id, - cidrBlock: "10.0.1.0/24", - availabilityZone: azs.then(azs => azs.names[0]), - mapPublicIpOnLaunch: true, - tags: { - ...commonTags, - Name: "pathfinder-public-subnet-1", - Type: "public", - }, -}); - -const publicSubnet2 = new aws.ec2.Subnet("pathfinder-public-subnet-2", { - vpcId: vpc.id, - cidrBlock: "10.0.2.0/24", - availabilityZone: azs.then(azs => azs.names[1]), - mapPublicIpOnLaunch: true, - tags: { - ...commonTags, - Name: "pathfinder-public-subnet-2", - Type: "public", - }, -}); - -// Private subnets (for ECS tasks) -const privateSubnet1 = new aws.ec2.Subnet("pathfinder-private-subnet-1", { - vpcId: vpc.id, - cidrBlock: "10.0.10.0/24", - availabilityZone: azs.then(azs => azs.names[0]), - tags: { - ...commonTags, - Name: "pathfinder-private-subnet-1", - Type: "private", - }, -}); - -const privateSubnet2 = new aws.ec2.Subnet("pathfinder-private-subnet-2", { - vpcId: vpc.id, - cidrBlock: "10.0.11.0/24", - availabilityZone: azs.then(azs => azs.names[1]), - tags: { - ...commonTags, - Name: "pathfinder-private-subnet-2", - Type: "private", - }, -}); - -// NAT Gateway for private subnet internet access -const natEip = new aws.ec2.Eip("pathfinder-nat-eip", { - domain: "vpc", - tags: { - ...commonTags, - Name: "pathfinder-nat-eip", - }, -}); - -const natGateway = new aws.ec2.NatGateway("pathfinder-nat-gw", { - allocationId: natEip.id, - subnetId: publicSubnet1.id, - tags: { - ...commonTags, - Name: "pathfinder-nat-gw", - }, -}, { - dependsOn: [igw], -}); - -// Route tables -const publicRouteTable = new aws.ec2.RouteTable("pathfinder-public-rt", { - vpcId: vpc.id, - routes: [ - { - cidrBlock: "0.0.0.0/0", - gatewayId: igw.id, - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-public-rt", - }, -}); - -const privateRouteTable = new aws.ec2.RouteTable("pathfinder-private-rt", { - vpcId: vpc.id, - routes: [ - { - cidrBlock: "0.0.0.0/0", - natGatewayId: natGateway.id, - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-private-rt", - }, -}); - -// Route table associations -const publicRtAssoc1 = new aws.ec2.RouteTableAssociation("pathfinder-public-rt-assoc-1", { - subnetId: publicSubnet1.id, - routeTableId: publicRouteTable.id, -}); - -const publicRtAssoc2 = new aws.ec2.RouteTableAssociation("pathfinder-public-rt-assoc-2", { - subnetId: publicSubnet2.id, - routeTableId: publicRouteTable.id, -}); - -const privateRtAssoc1 = new aws.ec2.RouteTableAssociation("pathfinder-private-rt-assoc-1", { - subnetId: privateSubnet1.id, - routeTableId: privateRouteTable.id, -}); - -const privateRtAssoc2 = new aws.ec2.RouteTableAssociation("pathfinder-private-rt-assoc-2", { - subnetId: privateSubnet2.id, - routeTableId: privateRouteTable.id, -}); - -// Helper arrays for convenience (mimicking awsx.ec2.Vpc interface) -const publicSubnetIds = [publicSubnet1.id, publicSubnet2.id]; -const privateSubnetIds = [privateSubnet1.id, privateSubnet2.id]; - -// Security Groups -// ALB: Allow HTTP from internet -const albSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-alb-sg", { - vpcId: vpc.id, - ingress: [ - { - protocol: "tcp", - fromPort: 80, - toPort: 80, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - egress: [ - { - protocol: "-1", - fromPort: 0, - toPort: 0, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-alb-sg", - Type: "load-balancer", - }, -}); - -// Service: Only accept traffic from ALB (not directly from internet) -const serviceSecurityGroup = new aws.ec2.SecurityGroup( - "pathfinder-service-sg", - { - vpcId: vpc.id, - ingress: [ - { - protocol: "tcp", - fromPort: 3000, // Next.js port - toPort: 3000, - securityGroups: [albSecurityGroup.id], - }, - ], - egress: [ - { - protocol: "-1", - fromPort: 0, - toPort: 0, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-service-sg", - Type: "ecs-service", - }, - } -); - -// Database Security Group - private access only -const dbSecurityGroup = new aws.ec2.SecurityGroup("pathfinder-db-sg", { - vpcId: vpc.id, - ingress: [ - // Allow access from ECS tasks in private subnets - { - protocol: "tcp", - fromPort: 5432, - toPort: 5432, - securityGroups: [serviceSecurityGroup.id], - description: "Allow PostgreSQL access from ECS service", - }, - // Note: No public access - database is now fully private - ], - egress: [ - { - protocol: "-1", - fromPort: 0, - toPort: 0, - cidrBlocks: ["0.0.0.0/0"], - }, - ], - tags: { - ...commonTags, - Name: "pathfinder-db-sg", - Type: "database", - }, -}); - -// Database is now private - only accessible from ECS service! - -// ========================================== -// DATABASE LAYER -// RDS PostgreSQL with auto-scaling storage -// ========================================== - -// RDS Subnet Group - use PRIVATE subnets for secure database access -const dbSubnetGroup = new aws.rds.SubnetGroup("pathfinder-db-subnet-group", { - subnetIds: privateSubnetIds, // Use PRIVATE subnets for security - tags: { - ...commonTags, - Name: "pathfinder-db-subnet-group", - }, -}, { - dependsOn: [vpc, privateSubnet1, privateSubnet2, natGateway, privateRouteTable, privateRtAssoc1, privateRtAssoc2], -}); - -// Generate a secure random password for the database -const dbPassword = new random.RandomPassword("pathfinder-db-password-v2", { - length: 32, - special: true, - overrideSpecial: "!#$%&*()-_=+[]{}<>:?", // RDS doesn't allow: / @ " space -}); - -// RDS PostgreSQL Instance - publicly accessible for simplicity -const db = new aws.rds.Instance("pathfinder-db", { - engine: "postgres", - engineVersion: "15.13", // Updated to latest available version - instanceClass: "db.t3.small", // Upgraded from micro: 2 vCPU, 2 GB RAM - allocatedStorage: 50, // 50 GB (up from 20 GB) - maxAllocatedStorage: 1000, // Auto-scale storage up to 1 TB as needed - storageType: "gp3", - storageEncrypted: true, // Enable encryption at rest - dbName: "pathfinder", - username: "pathfinder_admin", - password: dbPassword.result, // Use the generated secure password - vpcSecurityGroupIds: [dbSecurityGroup.id], - dbSubnetGroupName: dbSubnetGroup.name, - - // Keep database private for security - publiclyAccessible: false, - - // Use default parameter group (requires SSL - AWS best practice) - applyImmediately: true, // Apply parameter changes immediately (requires restart) - - skipFinalSnapshot: true, // For dev - set to false in production - deletionProtection: false, // For dev - set to true in production - backupRetentionPeriod: 7, // Keep backups for 7 days - backupWindow: "03:00-04:00", // 3-4 AM UTC - maintenanceWindow: "sun:04:00-sun:05:00", // Sunday 4-5 AM UTC - // No external logging - keep it simple! - tags: { - ...commonTags, - Name: "pathfinder-db", - Engine: "postgresql", - Tier: "database", - }, -}, { - dependsOn: [vpc, dbSubnetGroup, dbSecurityGroup], -}); - -// No complex monitoring - keep it simple! - -// ========================================== -// LOAD BALANCING & TRAFFIC MANAGEMENT -// Application Load Balancer with health checks -// ========================================== - -const lb = new awsx.lb.ApplicationLoadBalancer("pathfinder-lb", { - subnetIds: publicSubnetIds, - securityGroups: [albSecurityGroup.id], - tags: { - ...commonTags, - Name: "pathfinder-lb", - Type: "application-load-balancer", - }, - defaultTargetGroup: { - port: 3000, - protocol: "HTTP", - targetType: "ip", // Required for Fargate - healthCheck: { - enabled: true, - path: "/", - healthyThreshold: 2, - unhealthyThreshold: 3, - timeout: 30, - interval: 60, - matcher: "200", - }, - }, -}); - -// ========================================== -// CONTAINER INFRASTRUCTURE -// ECR, ECS Service, IAM Roles, Logging -// ========================================== - -// ECS Cluster -const cluster = new aws.ecs.Cluster("pathfinder-cluster", { - tags: { - ...commonTags, - Name: "pathfinder-cluster", - }, -}); - -// Logging -const logGroup = new aws.cloudwatch.LogGroup("pathfinder-logs", { - retentionInDays: 7, - tags: { - ...commonTags, - Name: "pathfinder-logs", - Type: "application-logs", - }, -}); - -// ECS needs this role to pull images and write logs -const executionRole = new aws.iam.Role("pathfinder-execution-role", { - assumeRolePolicy: `{ - "Version": "2012-10-17", - "Statement": [ - { - "Action": "sts:AssumeRole", - "Effect": "Allow", - "Principal": { - "Service": "ecs-tasks.amazonaws.com" - } - } - ] - }`, -}); - -new aws.iam.RolePolicyAttachment("pathfinder-execution-role-policy", { - role: executionRole.name, - policyArn: - "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy", -}); - -// No CodeBuild needed - building locally with Pulumi! - -// ECR for storing Docker images -const repo = new awsx.ecr.Repository("pathfinder-repo", { - forceDelete: true, // Allow deletion even if images exist - tags: { - ...commonTags, - Name: "pathfinder-repo", - Type: "container-registry", - }, -}); - -// STAGE 1: Migration image (builds first) -const migrationImage = new awsx.ecr.Image("pathfinder-migration-image", { - repositoryUrl: repo.url, - context: "../web", - platform: "linux/amd64", - dockerfile: "../web/Dockerfile.migration", -}); - -// Migration Task Definition - runs in private subnet with database access -const migrationTaskDefinition = new aws.ecs.TaskDefinition("pathfinder-migration-task", { - family: "pathfinder-migrations", - networkMode: "awsvpc", - requiresCompatibilities: ["FARGATE"], - cpu: "256", - memory: "512", - executionRoleArn: executionRole.arn, - containerDefinitions: pulumi.jsonStringify([ - { - name: "migration-container", - image: migrationImage.imageUri, - essential: true, - environment: [ - { - name: "DATABASE_URL", - value: pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.address}:5432/${db.dbName}?sslmode=require`, - }, - ], - command: ["bun", "run", "scripts/run-migrations.ts"], - logConfiguration: { - logDriver: "awslogs", - options: { - "awslogs-group": logGroup.name, - "awslogs-region": aws.getRegionOutput().name, - "awslogs-stream-prefix": "migration", - }, - }, - }, - ]), - tags: { - ...commonTags, - Name: "pathfinder-migration-task", - Type: "migration", - }, -}, { - dependsOn: [migrationImage, db, executionRole, logGroup], -}); - -// Run migrations as ECS task in private subnet (has database access) -const runMigrations = new command.local.Command("run-migrations", { - create: pulumi.interpolate` - echo "🚀 Running database migrations via ECS task..." - - # Run migration task in private subnet where it can access the database - aws ecs run-task \ - --cluster ${cluster.name} \ - --task-definition ${migrationTaskDefinition.arn} \ - --launch-type FARGATE \ - --network-configuration 'awsvpcConfiguration={subnets=[${privateSubnet1.id},${privateSubnet2.id}],securityGroups=[${serviceSecurityGroup.id}],assignPublicIp=ENABLED}' \ - --region ${aws.getRegionOutput().name} - - echo "✅ Database migration task started (check ECS console for status)" - `, -}, { - dependsOn: [migrationTaskDefinition, cluster, privateSubnet1, privateSubnet2, serviceSecurityGroup] -}); - -// STAGE 2: App image (builds AFTER migrations succeed) -const appImage = new awsx.ecr.Image("pathfinder-app-image", { - repositoryUrl: repo.url, - context: "../web", // Build from web directory - platform: "linux/amd64", - // No database access during build - app will fetch data at runtime - // (Private database cannot be accessed during local build process) -}, { - dependsOn: [runMigrations] // Wait for migrations to complete before building app -}); - -// Clean 2-stage pipeline: -// Stage 1: Migration image → Run migrations ✅ -// Stage 2: App image (with DB access) → Deploy ECS ✅ - -// ECS Service - simple app deployment (migrations already completed) -const service = new awsx.ecs.FargateService("pathfinder-service", { - cluster: cluster.arn, - networkConfiguration: { - subnets: privateSubnetIds, - securityGroups: [serviceSecurityGroup.id], - assignPublicIp: true, // Needed to pull images from ECR - }, - desiredCount: 2, - taskDefinitionArgs: { - executionRole: { - roleArn: executionRole.arn, - }, - containers: { - // Main application container (migrations already completed in build stage) - "pathfinder-app": { - name: "pathfinder-app", - image: appImage.imageUri, - cpu: 1024, // 1 vCPU - memory: 2048, // 2GB - essential: true, - environment: [ - { - name: "HOSTNAME", - value: "0.0.0.0", // Critical: bind to all interfaces, not just localhost - }, - { - name: "PORT", - value: "3000", - }, - { - name: "DATABASE_URL", - value: pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}?sslmode=require`, - }, - { - name: "NODE_ENV", - value: "production", - }, - { - name: "ENABLE_DEBUG_ENDPOINTS", - value: "true", // Temporary: for debugging environment variables - }, - ], - portMappings: [ - { - containerPort: 3000, - targetGroup: lb.defaultTargetGroup, - }, - ], - logConfiguration: { - logDriver: "awslogs", - options: { - "awslogs-group": logGroup.name, - "awslogs-region": aws.getRegionOutput().name, - "awslogs-stream-prefix": "pathfinder-app", - }, - }, - }, - }, - }, -}, { - dependsOn: [appImage] // Wait for app image to be built (which waits for migrations) -}); - -// Database is private - only accessible from within VPC - -// ========================================== -// AUTO-SCALING CONFIGURATION -// Automatically scale ECS tasks based on CPU -// ========================================== - -const scaling = new aws.appautoscaling.Target("pathfinder-scaling", { - maxCapacity: 10, - minCapacity: 2, - resourceId: pulumi.interpolate`service/${cluster.name}/${service.service.name}`, - scalableDimension: "ecs:service:DesiredCount", - serviceNamespace: "ecs", -}); - -const scalingPolicy = new aws.appautoscaling.Policy( - "pathfinder-scaling-policy", - { - policyType: "TargetTrackingScaling", - resourceId: scaling.resourceId, - scalableDimension: scaling.scalableDimension, - serviceNamespace: scaling.serviceNamespace, - targetTrackingScalingPolicyConfiguration: { - targetValue: 50, // Scale at 50% CPU - predefinedMetricSpecification: { - predefinedMetricType: "ECSServiceAverageCPUUtilization", - }, - }, - } -); - -// No complex monitoring - keep it simple! - -// No external logging complexity - keep it simple! - -// ========================================== -// STACK OUTPUTS -// Values accessible after deployment -// ========================================== - -export const url = lb.loadBalancer.dnsName.apply((dns) => `http://${dns}`); -export const dbEndpoint = db.endpoint; -export const dbConnectionString = pulumi.interpolate`postgresql://${db.username}:${dbPassword.result}@${db.endpoint}/${db.dbName}?sslmode=require`; -// Export password as a secret - only visible via CLI with --show-secrets flag -export const dbPasswordSecret = pulumi.secret(dbPassword.result); -export const dbUsername = db.username; - -// Migration information - runs during build stage -export const migrationStatus = runMigrations.stdout; - -// Simplified build - no CodeBuild needed! -export const ecrRepositoryUrl = repo.url; diff --git a/apps/infra/tsconfig.json b/apps/infra/tsconfig.json index f960d5171..4943671bb 100644 --- a/apps/infra/tsconfig.json +++ b/apps/infra/tsconfig.json @@ -1,18 +1,16 @@ { - "compilerOptions": { - "strict": true, - "outDir": "bin", - "target": "es2020", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "experimentalDecorators": true, - "pretty": true, - "noFallthroughCasesInSwitch": true, - "noImplicitReturns": true, - "forceConsistentCasingInFileNames": true - }, - "files": [ - "index.ts" - ] + "compilerOptions": { + "strict": true, + "outDir": "bin", + "target": "es2020", + "module": "commonjs", + "moduleResolution": "node", + "sourceMap": true, + "experimentalDecorators": true, + "pretty": true, + "noFallthroughCasesInSwitch": true, + "noImplicitReturns": true, + "forceConsistentCasingInFileNames": true + }, + "files": ["index.ts"] } diff --git a/packages/docs/integrations/aws.mdx b/packages/docs/integrations/aws.mdx index 118cfe008..33fa8a693 100644 --- a/packages/docs/integrations/aws.mdx +++ b/packages/docs/integrations/aws.mdx @@ -24,25 +24,21 @@ Before setting up the integration, ensure you have: 1. **Log into your AWS Management Console** 2. **Enable Security Hub** - - Navigate to **Security Hub** in the AWS Console - Click **Get Started** - Enable Security Hub in your **desired regions** - Optionally, enable **default security standards** (like CIS AWS Foundations) 3. **Choose a Region Code** - - Decide which AWS region you want Comp AI to use (e.g., `us-east-1`, `us-west-2`) - Copy this region code — you’ll need it in the Comp AI UI 4. **Create an IAM User for Comp AI** - - Go to **IAM > Users**, then click **Add user** - Enter a name like `CompAIIntegrationUser` - Choose **Programmatic access** (this generates the Access Key ID & Secret) 5. **Set Permissions** - - On the permissions screen, click **Attach policies directly** - Attach the following AWS managed policies: - `SecurityAudit` @@ -51,7 +47,6 @@ Before setting up the integration, ensure you have: _(Or use a custom least-privilege policy — see example below)_ 6. **Create the User** - - Click **Next**, then **Create user** - Copy and securely store the **Access Key ID** and **Secret Access Key** - You will only see the secret once! diff --git a/packages/docs/integrations/azure.mdx b/packages/docs/integrations/azure.mdx index 4bb82eb93..7cbfb0e27 100644 --- a/packages/docs/integrations/azure.mdx +++ b/packages/docs/integrations/azure.mdx @@ -20,11 +20,9 @@ Before setting up the integration, ensure you have: ### Configuration Steps 1. **Log into your Azure Portal** - - Visit [https://portal.azure.com](https://portal.azure.com) 2. **Enable Microsoft Defender for Cloud** - - In the left-hand menu, search for and select **Microsoft Defender for Cloud** - Click **Getting started** - Select the subscription(s) you want to onboard @@ -32,7 +30,6 @@ Before setting up the integration, ensure you have: - Wait for the provisioning to complete (this may take a few minutes) 3. **Register an Application in Azure AD** - - Navigate to **Azure Active Directory > App registrations** - Click **+ New registration** - Name the app (e.g., `CompAIIntegrationApp`) @@ -40,13 +37,11 @@ Before setting up the integration, ensure you have: - Click **Register** 4. **Get the Client ID and Tenant ID** - - After registration, go to the app's **Overview** page - Copy the **Application (client) ID** - Copy the **Directory (tenant) ID** 5. **Create a Client Secret** - - In the app menu, go to **Certificates & secrets** - Under **Client secrets**, click **+ New client secret** - Add a description and set an expiration @@ -54,7 +49,6 @@ Before setting up the integration, ensure you have: - Copy the **Client secret value** — you won’t be able to see it again! 6. **Assign the Application Access to a Subscription** - - Go to **Subscriptions** in the Azure portal - Select the subscription you want to integrate - Copy the **Subscription ID** From 28d5cc35286f34cfb333731e6ced7a8bcf7bcac4 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 12:07:16 -0400 Subject: [PATCH 006/107] chore: reorganize package.json structure for @comp/infra - Moved `main`, `scripts`, and `devDependencies` sections to a more logical order. - Ensured consistency in the structure of the package.json file. --- apps/infra/package.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/apps/infra/package.json b/apps/infra/package.json index bf9b5dcfd..57d12936d 100644 --- a/apps/infra/package.json +++ b/apps/infra/package.json @@ -1,14 +1,5 @@ { "name": "@comp/infra", - "main": "index.ts", - "scripts": { - "lint": "echo 'No linting configured for infra'", - "typecheck": "tsc --noEmit" - }, - "devDependencies": { - "@types/node": "^24.0.3", - "typescript": "^5.8.3" - }, "dependencies": { "@pulumi/aws": "^6.83.0", "@pulumi/awsx": "^2.22.0", @@ -18,5 +9,14 @@ "@pulumi/random": "^4.18.2", "@pulumi/tailscale": "^0.17.0", "dotenv": "^17.2.0" + }, + "devDependencies": { + "@types/node": "^24.0.3", + "typescript": "^5.8.3" + }, + "main": "index.ts", + "scripts": { + "lint": "echo 'No linting configured for infra'", + "typecheck": "tsc --noEmit" } } From 945ecece53135082d0196946ba8eff69a96f2119 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 12:23:28 -0400 Subject: [PATCH 007/107] refactor: simplify configuration and role naming in GitHub OIDC module - Removed the optional domainName property from CommonConfig. - Updated environment variable usage to directly reference config values. - Simplified role naming in the GitHub OIDC module to include project name for better context. - Cleaned up environment-specific configurations by removing unused sections. --- apps/infra/modules/build.ts | 2 +- apps/infra/modules/config.ts | 84 +------------- apps/infra/modules/github-oidc.ts | 176 +++++++++++++++--------------- apps/infra/types.ts | 1 - 4 files changed, 93 insertions(+), 170 deletions(-) diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index 8bf1f7a4d..8fc7ee685 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -137,7 +137,7 @@ export function createBuildSystem( }, { name: 'NODE_ENV', - value: process.env.NODE_ENV || 'production', + value: config.nodeEnv, type: 'PLAINTEXT', }, ], diff --git a/apps/infra/modules/config.ts b/apps/infra/modules/config.ts index 5298ab0de..e30a2a628 100644 --- a/apps/infra/modules/config.ts +++ b/apps/infra/modules/config.ts @@ -26,10 +26,6 @@ export function createConfig(projectName: string): CommonConfig { throw new Error('GITHUB_REPO is not set'); } - if (!process.env.DOMAIN_NAME) { - throw new Error('DOMAIN_NAME is not set'); - } - if (!process.env.ENABLE_RDS_READ_REPLICAS) { throw new Error('ENABLE_RDS_READ_REPLICAS is not set'); } @@ -50,7 +46,6 @@ export function createConfig(projectName: string): CommonConfig { awsRegion: process.env.AWS_REGION, nodeEnv: process.env.NODE_ENV, enableDebugEndpoints: process.env.ENABLE_DEBUG_ENDPOINTS === 'true', - domainName: process.env.DOMAIN_NAME, githubOrg: process.env.GITHUB_ORG, githubRepo: process.env.GITHUB_REPO, commonTags: { @@ -64,82 +59,6 @@ export function createConfig(projectName: string): CommonConfig { // Environment-specific configurations const environmentConfigs = { - dev: { - database: { - instanceClass: 'db.t3.small', - allocatedStorage: 20, - maxAllocatedStorage: 100, - deletionProtection: false, - backupRetentionPeriod: 3, - }, - scaling: { - minCapacity: 1, - maxCapacity: 3, - targetCpuUtilization: 70, - }, - tailscale: { - instanceType: 't3.nano', - }, - monitoring: { - logRetentionDays: 3, - detailedMonitoring: false, - }, - networking: { - vpcCidr: '10.0.0.0/16', - subnets: { - public: [ - { cidr: '10.0.1.0/24', az: 0 }, - { cidr: '10.0.2.0/24', az: 1 }, - ], - private: [ - { cidr: '10.0.10.0/24', az: 0 }, - { cidr: '10.0.20.0/24', az: 1 }, - ], - }, - }, - security: { - allowedCidrBlocks: ['0.0.0.0/0'], - enableWaf: false, - }, - }, - staging: { - database: { - instanceClass: 'db.t3.small', - allocatedStorage: 50, - maxAllocatedStorage: 200, - deletionProtection: false, - backupRetentionPeriod: 7, - }, - scaling: { - minCapacity: 2, - maxCapacity: 5, - targetCpuUtilization: 60, - }, - tailscale: { - instanceType: 't3.nano', - }, - monitoring: { - logRetentionDays: 7, - detailedMonitoring: true, - }, - networking: { - vpcCidr: '10.1.0.0/16', - subnets: { - public: [ - { cidr: '10.1.1.0/24', az: 0 }, - { cidr: '10.1.2.0/24', az: 1 }, - ], - private: [ - { cidr: '10.1.10.0/24', az: 0 }, - { cidr: '10.1.20.0/24', az: 1 }, - ], - }, - }, - security: { - allowedCidrBlocks: ['0.0.0.0/0'], - enableWaf: true, - }, - }, prod: { database: { instanceClass: 'db.t3.medium', @@ -180,8 +99,7 @@ export function createConfig(projectName: string): CommonConfig { }, }; - const envConfig = - environmentConfigs[stack as keyof typeof environmentConfigs] || environmentConfigs.dev; + const envConfig = environmentConfigs.prod; return { ...baseConfig, diff --git a/apps/infra/modules/github-oidc.ts b/apps/infra/modules/github-oidc.ts index 82faadb81..8cdba16d9 100644 --- a/apps/infra/modules/github-oidc.ts +++ b/apps/infra/modules/github-oidc.ts @@ -16,14 +16,14 @@ export function createGithubOidc(config: CommonConfig) { ], tags: { ...commonTags, - Name: 'github-oidc-provider', + Name: `${config.projectName}-github-oidc-provider`, Type: 'oidc-provider', }, }, ); // Deployment Role for GitHub Actions (read-write access) - const deploymentRole = new aws.iam.Role('github-deployment-role', { + const deploymentRole = new aws.iam.Role(`${config.projectName}-github-deployment-role`, { name: `${config.projectName}-github-deployment-role`, assumeRolePolicy: githubOidcProvider.arn.apply((providerArn) => JSON.stringify({ @@ -49,14 +49,14 @@ export function createGithubOidc(config: CommonConfig) { ), tags: { ...commonTags, - Name: 'github-deployment-role', + Name: `${config.projectName}-github-deployment-role`, Type: 'iam-role', Purpose: 'github-deployment', }, }); // Build Role for GitHub Actions (CodeBuild access) - const buildRole = new aws.iam.Role('github-build-role', { + const buildRole = new aws.iam.Role(`${config.projectName}-github-build-role`, { name: `${config.projectName}-github-build-role`, assumeRolePolicy: githubOidcProvider.arn.apply((providerArn) => JSON.stringify({ @@ -82,14 +82,14 @@ export function createGithubOidc(config: CommonConfig) { ), tags: { ...commonTags, - Name: 'github-build-role', + Name: `${config.projectName}-github-build-role`, Type: 'iam-role', Purpose: 'github-build', }, }); // Read-only Role for GitHub Actions (status checks, etc.) - const readOnlyRole = new aws.iam.Role('github-readonly-role', { + const readOnlyRole = new aws.iam.Role(`${config.projectName}-github-readonly-role`, { name: `${config.projectName}-github-readonly-role`, assumeRolePolicy: githubOidcProvider.arn.apply((providerArn) => JSON.stringify({ @@ -115,60 +115,63 @@ export function createGithubOidc(config: CommonConfig) { ), tags: { ...commonTags, - Name: 'github-readonly-role', + Name: `${config.projectName}-github-readonly-role`, Type: 'iam-role', Purpose: 'github-readonly', }, }); // Deployment Role Policies - const deploymentRolePolicy = new aws.iam.RolePolicy('github-deployment-policy', { - role: deploymentRole.id, - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 'ecs:UpdateService', - 'ecs:DescribeServices', - 'ecs:DescribeTasks', - 'ecs:DescribeTaskDefinition', - 'ecs:RegisterTaskDefinition', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: [ - 'ecr:GetAuthorizationToken', - 'ecr:BatchCheckLayerAvailability', - 'ecr:GetDownloadUrlForLayer', - 'ecr:BatchGetImage', - 'ecr:PutImage', - 'ecr:InitiateLayerUpload', - 'ecr:UploadLayerPart', - 'ecr:CompleteLayerUpload', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: [ - 'logs:CreateLogGroup', - 'logs:CreateLogStream', - 'logs:PutLogEvents', - 'logs:DescribeLogGroups', - 'logs:DescribeLogStreams', - ], - Resource: '*', - }, - ], - }), - }); + const deploymentRolePolicy = new aws.iam.RolePolicy( + `${config.projectName}-github-deployment-policy`, + { + role: deploymentRole.id, + policy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: [ + 'ecs:UpdateService', + 'ecs:DescribeServices', + 'ecs:DescribeTasks', + 'ecs:DescribeTaskDefinition', + 'ecs:RegisterTaskDefinition', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: [ + 'ecr:GetAuthorizationToken', + 'ecr:BatchCheckLayerAvailability', + 'ecr:GetDownloadUrlForLayer', + 'ecr:BatchGetImage', + 'ecr:PutImage', + 'ecr:InitiateLayerUpload', + 'ecr:UploadLayerPart', + 'ecr:CompleteLayerUpload', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: [ + 'logs:CreateLogGroup', + 'logs:CreateLogStream', + 'logs:PutLogEvents', + 'logs:DescribeLogGroups', + 'logs:DescribeLogStreams', + ], + Resource: '*', + }, + ], + }), + }, + ); // Build Role Policies - const buildRolePolicy = new aws.iam.RolePolicy('github-build-policy', { + const buildRolePolicy = new aws.iam.RolePolicy(`${config.projectName}-github-build-policy`, { role: buildRole.id, policy: JSON.stringify({ Version: '2012-10-17', @@ -192,39 +195,42 @@ export function createGithubOidc(config: CommonConfig) { }); // Read-only Role Policies - const readOnlyRolePolicy = new aws.iam.RolePolicy('github-readonly-policy', { - role: readOnlyRole.id, - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 'ecs:DescribeServices', - 'ecs:DescribeTasks', - 'ecs:DescribeTaskDefinition', - 'ecs:ListTasks', - 'ecs:ListServices', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: [ - 'cloudwatch:GetMetricStatistics', - 'cloudwatch:DescribeAlarms', - 'cloudwatch:GetDashboard', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['logs:DescribeLogGroups', 'logs:DescribeLogStreams', 'logs:GetLogEvents'], - Resource: '*', - }, - ], - }), - }); + const readOnlyRolePolicy = new aws.iam.RolePolicy( + `${config.projectName}-github-readonly-policy`, + { + role: readOnlyRole.id, + policy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: [ + 'ecs:DescribeServices', + 'ecs:DescribeTasks', + 'ecs:DescribeTaskDefinition', + 'ecs:ListTasks', + 'ecs:ListServices', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: [ + 'cloudwatch:GetMetricStatistics', + 'cloudwatch:DescribeAlarms', + 'cloudwatch:GetDashboard', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: ['logs:DescribeLogGroups', 'logs:DescribeLogStreams', 'logs:GetLogEvents'], + Resource: '*', + }, + ], + }), + }, + ); return { providerArn: githubOidcProvider.arn, diff --git a/apps/infra/types.ts b/apps/infra/types.ts index 580faf931..53ba82534 100644 --- a/apps/infra/types.ts +++ b/apps/infra/types.ts @@ -15,7 +15,6 @@ export interface CommonConfig { awsRegion: string; nodeEnv: string; enableDebugEndpoints: boolean; - domainName?: string; githubOrg: string; githubRepo: string; commonTags: ResourceTags; From 92125894b5ad1637ac2a137690382fe99f0175b2 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 13:16:56 -0400 Subject: [PATCH 008/107] feat: enhance GitHub OIDC module to support existing provider usage - Added functionality to check for an existing GitHub OIDC provider and use it if available. - Simplified the creation of a new OIDC provider with consistent naming and tagging. - Improved configuration management by introducing a flag for using an existing provider. --- apps/infra/modules/github-oidc.ts | 33 ++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/apps/infra/modules/github-oidc.ts b/apps/infra/modules/github-oidc.ts index 8cdba16d9..fd1938d8b 100644 --- a/apps/infra/modules/github-oidc.ts +++ b/apps/infra/modules/github-oidc.ts @@ -1,13 +1,27 @@ import * as aws from '@pulumi/aws'; +import * as pulumi from '@pulumi/pulumi'; import { CommonConfig } from '../types'; export function createGithubOidc(config: CommonConfig) { const { commonTags } = config; - // GitHub OIDC Provider for GitHub Actions - const githubOidcProvider = new aws.iam.OpenIdConnectProvider( - `${config.projectName}-github-oidc-provider`, - { + // Check if we should use existing OIDC provider or create new one + const useExistingOidc = new pulumi.Config().getBoolean('useExistingGithubOidc') ?? false; + + let githubOidcProvider: { arn: pulumi.Output; url: pulumi.Output }; + + if (useExistingOidc) { + // Get the existing GitHub OIDC Provider + const existingProvider = aws.iam.getOpenIdConnectProviderOutput({ + url: 'https://token.actions.githubusercontent.com', + }); + githubOidcProvider = { + arn: existingProvider.arn, + url: existingProvider.url, + }; + } else { + // Create a new GitHub OIDC Provider + const newProvider = new aws.iam.OpenIdConnectProvider('github-actions-oidc-provider', { url: 'https://token.actions.githubusercontent.com', clientIdLists: ['sts.amazonaws.com'], thumbprintLists: [ @@ -16,11 +30,16 @@ export function createGithubOidc(config: CommonConfig) { ], tags: { ...commonTags, - Name: `${config.projectName}-github-oidc-provider`, + Name: 'github-actions-oidc-provider', Type: 'oidc-provider', + Purpose: 'github-actions-authentication', }, - }, - ); + }); + githubOidcProvider = { + arn: newProvider.arn, + url: newProvider.url, + }; + } // Deployment Role for GitHub Actions (read-write access) const deploymentRole = new aws.iam.Role(`${config.projectName}-github-deployment-role`, { From 1722e2eb260dc4eabf3917abc32bf4851d9dc64b Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 15:26:15 -0400 Subject: [PATCH 009/107] feat: add buildspec and deployment scripts for application - Introduced a new buildspec.yml for managing the build process of the application, including Docker image creation and database migrations. - Added a deploy.sh script to automate the deployment process, including infrastructure updates and application builds. - Updated next.config.ts to support standalone output for Docker compatibility. - Enhanced infrastructure configuration to include new database settings and GitHub branch specification. --- apps/app/buildspec.yml | 117 +++++++++++++++++ apps/app/next.config.ts | 1 + apps/infra/deploy.sh | 230 +++++++++++++++++++++++++++++++++ apps/infra/index.ts | 4 +- apps/infra/modules/build.ts | 3 +- apps/infra/modules/config.ts | 11 +- apps/infra/modules/database.ts | 17 ++- apps/infra/types.ts | 3 + 8 files changed, 373 insertions(+), 13 deletions(-) create mode 100644 apps/app/buildspec.yml create mode 100755 apps/infra/deploy.sh diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml new file mode 100644 index 000000000..919dd15c5 --- /dev/null +++ b/apps/app/buildspec.yml @@ -0,0 +1,117 @@ +version: 0.2 + +phases: + pre_build: + commands: + - echo "Logging in to Amazon ECR..." + - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com + - REPOSITORY_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME + - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) + - IMAGE_TAG=${COMMIT_HASH:=latest} + - curl -fsSL https://bun.sh/install | bash + + build: + commands: + - echo "=== BUILD ENVIRONMENT DEBUG ===" + - echo "DATABASE_URL exists:" $(test -n "$DATABASE_URL" && echo "YES" || echo "NO") + - echo "DATABASE_URL length:" ${#DATABASE_URL} + - echo "DATABASE_URL (masked):" $(echo "$DATABASE_URL" | sed 's/:[^@]*@/:***@/') + - echo "NODE_ENV:" $NODE_ENV + - cd apps/app + + - echo "=== INSTALLING DEPENDENCIES ===" + - export PATH="/root/.bun/bin:$PATH" + - export PGSSLMODE=require + - export NEXT_TELEMETRY_DISABLED=1 + - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile + + - echo "=== GENERATING PRISMA CLIENT ===" + - cd ../../packages/db + - bun x prisma generate + - cd ../../apps/app + + - echo "=== TYPE CHECKING ===" + - echo "Running TypeScript type checking..." + - bun run typecheck + - echo "✅ Type checking passed" + + - echo "=== RUNNING DATABASE MIGRATIONS ===" + - echo "Running migrations before build..." + - NODE_TLS_REJECT_UNAUTHORIZED=0 bun run apply-migrations + - echo "✅ Database migrations completed" + + - echo "=== BUILDING NEXT.JS ON CODEBUILD HOST (WITH MIGRATED DATABASE) ===" + - echo "Running Next.js build with database access for SSG..." + - NODE_TLS_REJECT_UNAUTHORIZED=0 bun run build + - echo "✅ Next.js build completed with database access" + + - echo "=== PREPARING STANDALONE BUILD FILES ===" + - echo "Next.js standalone build requires manual copying of static files..." + - cp -r public .next/standalone/ || echo "No public folder found" + - cp -r .next/static .next/standalone/.next/ || echo "No static folder found" + - echo "Copying Prisma client to standalone build..." + - mkdir -p .next/standalone/node_modules/.prisma + - 'mkdir -p ".next/standalone/node_modules/@prisma"' + - cp -r ../../packages/db/node_modules/.prisma/client .next/standalone/node_modules/.prisma/ || cp -r node_modules/.prisma/client .next/standalone/node_modules/.prisma/ || echo "Warning: .prisma client not found" + - 'cp -r "../../packages/db/node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/" || cp -r "node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/" || echo "Warning: @prisma/client not found"' + - echo "✅ Standalone files prepared" + + - echo "=== VERIFYING BUILD ARTIFACTS ===" + - echo "Checking if required files exist..." + - ls -la .next/standalone/ || echo "❌ .next/standalone/ not found" + - ls -la .next/standalone/.next/static/ || echo "❌ .next/standalone/.next/static/ not found" + - ls -la .next/standalone/public/ || echo "❌ .next/standalone/public/ not found" + - ls -la .next/standalone/server.js || echo "❌ server.js not found" + + - echo "=== BUILDING DOCKER RUNTIME IMAGE WITH PRE-BUILT ARTIFACTS ===" + - echo "Creating runtime-only Docker image with build artifacts..." + - | + cat > Dockerfile.runtime << 'EOF' + # Use Node.js Alpine for smaller runtime image + FROM node:18-alpine AS runtime + + WORKDIR /app + + ENV NODE_ENV=production + ENV NEXT_TELEMETRY_DISABLED=1 + ENV PORT=3000 + ENV HOSTNAME="0.0.0.0" + ENV NODE_TLS_REJECT_UNAUTHORIZED=0 + + # Copy the complete standalone build from CodeBuild + COPY .next/standalone ./ + + # Create non-root user for security + RUN addgroup -g 1001 -S nodejs && \ + adduser -S nextjs -u 1001 && \ + chown -R nextjs:nodejs /app + + USER nextjs + + EXPOSE 3000 + + # Use node to run the standalone server.js + CMD ["node", "server.js"] + EOF + - docker build -f Dockerfile.runtime -t $IMAGE_REPO_NAME:$IMAGE_TAG . + - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG + - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:latest + + post_build: + commands: + - echo "Pushing images to ECR..." + - docker push $REPOSITORY_URI:$IMAGE_TAG + - docker push $REPOSITORY_URI:latest + - echo "Updating ECS service to deploy new image..." + - | + if ! aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment; then + echo "❌ Failed to update ECS service" + exit 1 + fi + - echo "Writing image definitions file..." + - 'printf "[{\"name\":\"%s-app\",\"imageUri\":\"%s\"}]" $IMAGE_REPO_NAME $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json' + +artifacts: + files: + - imagedefinitions.json + name: app-build diff --git a/apps/app/next.config.ts b/apps/app/next.config.ts index 82eaa808b..b4f45f29f 100644 --- a/apps/app/next.config.ts +++ b/apps/app/next.config.ts @@ -2,6 +2,7 @@ import type { NextConfig } from 'next'; import './src/env.mjs'; const config: NextConfig = { + output: 'standalone', // Required for Docker builds poweredByHeader: false, reactStrictMode: true, turbopack: { diff --git a/apps/infra/deploy.sh b/apps/infra/deploy.sh new file mode 100755 index 000000000..a57df3342 --- /dev/null +++ b/apps/infra/deploy.sh @@ -0,0 +1,230 @@ +#!/bin/bash +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +# Configuration +AWS_REGION=${AWS_REGION:-us-east-1} +PROJECT_NAME=${PROJECT_NAME:-comp} # Base project name, can be overridden + +# Get the script's directory +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" + +# Determine if we're in the infra directory or project root +if [[ "$SCRIPT_DIR" == *"/apps/infra" ]]; then + # Script is in apps/infra, so we're likely in the right place + INFRA_DIR="$SCRIPT_DIR" + PROJECT_ROOT="$SCRIPT_DIR/../.." +else + # Assume we're in project root + INFRA_DIR="./apps/infra" + PROJECT_ROOT="." +fi + +# Get the current Pulumi stack name to determine environment +cd "$INFRA_DIR" +STACK_NAME=$(pulumi stack --show-name 2>/dev/null || true) +cd "$PROJECT_ROOT" + +# Validate stack name +if [ -z "$STACK_NAME" ]; then + echo -e "${RED}❌ No Pulumi stack selected. Please run 'pulumi stack select' first.${NC}" + exit 1 +fi + +# Extract the environment suffix (e.g., "mariano-test" from "compai/mariano-test") +ENV_NAME=$(echo "$STACK_NAME" | cut -d'/' -f2) + +# Validate environment name +if [ -z "$ENV_NAME" ]; then + echo -e "${RED}❌ Could not determine environment name from stack: $STACK_NAME${NC}" + exit 1 +fi + +# Construct resource names based on environment +PROJECT_PREFIX="${PROJECT_NAME}-${ENV_NAME}" +CLUSTER_NAME="${PROJECT_PREFIX}" +SERVICE_NAME="${PROJECT_PREFIX}" # Service name matches project prefix +APP_PROJECT="${PROJECT_PREFIX}-app-build" + +echo -e "${GREEN}🚀 Starting deployment for environment: ${ENV_NAME}${NC}" +echo -e "${YELLOW}📋 Using resource prefix: ${PROJECT_PREFIX}${NC}" + +# Try to get actual values from Pulumi outputs +ACTUAL_CLUSTER=$(cd "$INFRA_DIR" && pulumi stack output ecsClusterName 2>/dev/null || echo "") +ACTUAL_SERVICE=$(cd "$INFRA_DIR" && pulumi stack output ecsServiceName 2>/dev/null || echo "") + +# Use actual values if available, otherwise use constructed names +CLUSTER_NAME=${ACTUAL_CLUSTER:-$CLUSTER_NAME} +SERVICE_NAME=${ACTUAL_SERVICE:-$SERVICE_NAME} + +echo -e "${YELLOW}📋 Cluster: ${CLUSTER_NAME}${NC}" +echo -e "${YELLOW}📋 Service: ${SERVICE_NAME}${NC}" +echo -e "${YELLOW}📋 CodeBuild Project: ${APP_PROJECT}${NC}" +echo -e "${YELLOW}📋 AWS Region: ${AWS_REGION}${NC}" + +# Confirm deployment +echo -e "${YELLOW}⚠️ This will deploy to the '${ENV_NAME}' environment. Continue? (y/N)${NC}" +read -r response +if [[ ! "$response" =~ ^[Yy]$ ]]; then + echo -e "${RED}❌ Deployment cancelled${NC}" + exit 1 +fi + +# Function to wait for CodeBuild +wait_for_build() { + local build_id=$1 + local project_name=$2 + + echo -e "${YELLOW}⏳ Waiting for $project_name build to complete...${NC}" + + while true; do + status=$(aws codebuild batch-get-builds --ids "$build_id" --query 'builds[0].buildStatus' --output text) + + case $status in + "SUCCEEDED") + echo -e "${GREEN}✅ $project_name build completed successfully${NC}" + return 0 + ;; + "FAILED"|"FAULT"|"STOPPED"|"TIMED_OUT") + echo -e "${RED}❌ $project_name build failed with status: $status${NC}" + return 1 + ;; + "IN_PROGRESS") + echo " Still building..." + sleep 30 + ;; + *) + echo " Status: $status" + sleep 30 + ;; + esac + done +} + +# Step 1: Update Infrastructure +echo -e "${YELLOW}📋 Step 1: Updating infrastructure...${NC}" +cd "$INFRA_DIR" +export NODE_ENV=production +pulumi up --yes +cd "$PROJECT_ROOT" +echo -e "${GREEN}✅ Infrastructure updated${NC}" + +# Step 2: Build and Deploy Application (includes migrations) +echo -e "${YELLOW}🔨 Step 2: Building application (migrations + Next.js + Docker)...${NC}" +app_build_id=$(aws codebuild start-build \ + --project-name "$APP_PROJECT" \ + --query 'build.id' --output text) + +echo "App build ID: $app_build_id" +wait_for_build "$app_build_id" "Application" + +# Step 3: Verify Deployment +echo -e "${YELLOW}🔍 Step 3: Verifying deployment...${NC}" + +# Wait for ECS service to stabilize after the build updated it +echo -e "${YELLOW}⏳ Waiting for ECS deployment to stabilize...${NC}" + +# Set a timeout of 10 minutes (600 seconds) for the wait +# Use a cross-platform timeout implementation +wait_with_timeout() { + local timeout_duration=$1 + shift + local command=("$@") + + # Start the command in the background + "${command[@]}" & + local cmd_pid=$! + + # Wait for either the command to complete or timeout + local count=0 + while kill -0 "$cmd_pid" 2>/dev/null && [ $count -lt $timeout_duration ]; do + sleep 1 + ((count++)) + done + + # Check if command is still running (timed out) + if kill -0 "$cmd_pid" 2>/dev/null; then + kill "$cmd_pid" 2>/dev/null + wait "$cmd_pid" 2>/dev/null + return 1 # Timeout occurred + else + wait "$cmd_pid" + return $? # Return the command's exit status + fi +} + +if ! wait_with_timeout 600 aws ecs wait services-stable \ + --cluster "$CLUSTER_NAME" \ + --services "$SERVICE_NAME"; then + + echo -e "${RED}❌ ECS service failed to stabilize within 10 minutes${NC}" + + # Get the current service status for debugging + echo -e "${RED}Current service status:${NC}" + aws ecs describe-services \ + --cluster "$CLUSTER_NAME" \ + --services "$SERVICE_NAME" \ + --query 'services[0].{desired:desiredCount,running:runningCount,pending:pendingCount,status:status}' \ + --output table + + # Get recent events + echo -e "${RED}Recent service events:${NC}" + aws ecs describe-services \ + --cluster "$CLUSTER_NAME" \ + --services "$SERVICE_NAME" \ + --query 'services[0].events[0:5]' \ + --output json + + # Check for failed tasks + echo -e "${RED}Checking for task failures:${NC}" + TASK_ARNS=$(aws ecs list-tasks \ + --cluster "$CLUSTER_NAME" \ + --service-name "$SERVICE_NAME" \ + --desired-status STOPPED \ + --query 'taskArns[0:3]' \ + --output json) + + if [ "$TASK_ARNS" != "[]" ] && [ -n "$TASK_ARNS" ]; then + aws ecs describe-tasks \ + --cluster "$CLUSTER_NAME" \ + --tasks $TASK_ARNS \ + --query 'tasks[*].{taskArn:taskArn,stoppedReason:stoppedReason}' \ + --output table + fi + + echo -e "${RED}❌ Deployment failed - ECS service is not stable${NC}" + exit 1 +fi + +echo -e "${GREEN}✅ ECS service is stable${NC}" + +# Get ALB DNS name +alb_dns=$(aws elbv2 describe-load-balancers \ + --query "LoadBalancers[?contains(LoadBalancerName, \`${PROJECT_PREFIX}-lb\`)].DNSName" \ + --output text) + +# If not found via AWS CLI, try to get from Pulumi outputs +if [ -z "$alb_dns" ]; then + echo -e "${YELLOW}⚠️ Could not find load balancer via AWS CLI, checking Pulumi outputs...${NC}" + alb_dns=$(cd "$INFRA_DIR" && pulumi stack output albDns 2>/dev/null || echo "") +fi + +if [ -z "$alb_dns" ]; then + echo -e "${RED}❌ Could not find load balancer DNS name${NC}" + exit 1 +fi + +# Health check +if curl -sf "http://$alb_dns/" > /dev/null; then + echo -e "${GREEN}✅ Health check passed${NC}" + echo -e "${GREEN}🎉 Deployment completed successfully!${NC}" + echo -e "${GREEN}🌐 Application URL: http://$alb_dns${NC}" +else + echo -e "${RED}❌ Health check failed${NC}" + exit 1 +fi \ No newline at end of file diff --git a/apps/infra/index.ts b/apps/infra/index.ts index 21a882000..727c6b4a4 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -103,9 +103,7 @@ const applications = [ // Deploy configured applications // TODO: Implement createApplicationDeployment in build module -const deployments = applications.map((app) => - build.createApplicationDeployment(app, database, container), -); +applications.map((app) => build.createApplicationDeployment(app, database, container)); // ========================================== // STACK OUTPUTS (COMPREHENSIVE AS PER PROPOSAL) diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index 8fc7ee685..c81e690ea 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -150,9 +150,10 @@ export function createBuildSystem( source: { type: 'GITHUB', location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, - buildspec: 'apps/web/buildspec.yml', + buildspec: 'apps/app/buildspec.yml', gitCloneDepth: 1, }, + sourceVersion: config.githubBranch, // Specify which branch to build from tags: { ...commonTags, Name: `${config.projectName}-app-build`, diff --git a/apps/infra/modules/config.ts b/apps/infra/modules/config.ts index e30a2a628..81674d3b1 100644 --- a/apps/infra/modules/config.ts +++ b/apps/infra/modules/config.ts @@ -30,9 +30,12 @@ export function createConfig(projectName: string): CommonConfig { throw new Error('ENABLE_RDS_READ_REPLICAS is not set'); } - const stack = pulumi.getStack(); // dev, staging, prod + const stack = pulumi.getStack(); // dev, staging, prod, mariano-test, etc. const pulumiConfig = new pulumi.Config(projectName); + // Use the stack name for resource naming to ensure environment-specific names + const resourcePrefix = `comp-${stack}`; + // Feature flags const enableTailscale = pulumiConfig.getBoolean('enableTailscale') ?? false; const enableBetterStack = pulumiConfig.getBoolean('enableBetterStack') ?? false; @@ -40,7 +43,7 @@ export function createConfig(projectName: string): CommonConfig { // Base configuration applicable to all environments const baseConfig = { - projectName, + projectName: resourcePrefix, // Use stack-based naming for resources enableRDSReadReplicas: process.env.ENABLE_RDS_READ_REPLICAS === 'true', region: process.env.AWS_REGION, awsRegion: process.env.AWS_REGION, @@ -48,6 +51,10 @@ export function createConfig(projectName: string): CommonConfig { enableDebugEndpoints: process.env.ENABLE_DEBUG_ENDPOINTS === 'true', githubOrg: process.env.GITHUB_ORG, githubRepo: process.env.GITHUB_REPO, + githubBranch: pulumiConfig.get('githubBranch') || process.env.GITHUB_BRANCH || 'main', // Pulumi config takes precedence, then env var, then default + // Database configuration + dbName: process.env.DB_NAME || 'compdb', + dbUsername: process.env.DB_USERNAME || 'compadmin', commonTags: { Project: projectName, Environment: stack, diff --git a/apps/infra/modules/database.ts b/apps/infra/modules/database.ts index 7adafcbf0..11d8d464d 100644 --- a/apps/infra/modules/database.ts +++ b/apps/infra/modules/database.ts @@ -18,7 +18,8 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { // Create AWS Secret for database credentials (will be populated after RDS instance is created) const dbSecret = new aws.secretsmanager.Secret(`${config.projectName}-db-secret`, { - name: `${config.projectName}/database/master-password`, + // Use a unique name to avoid conflicts with deleted secrets + namePrefix: `${config.projectName}/database/master-password-`, description: 'Complete DATABASE_URL for PostgreSQL database', tags: { ...commonTags, @@ -102,8 +103,8 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { storageType: 'gp3', storageEncrypted: true, - dbName: `default`, - username: `admin`, + dbName: config.dbName, + username: config.dbUsername, password: dbPassword.result, vpcSecurityGroupIds: [network.securityGroups.database], @@ -142,10 +143,12 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { `${config.projectName}-db-secret-version`, { secretId: dbSecret.id, - secretString: dbInstance.endpoint.apply( - (endpoint) => - `postgresql://admin:${dbPassword.result}@${endpoint}:5432/default?sslmode=require`, - ), + secretString: pulumi + .all([dbInstance.endpoint, dbInstance.username, dbInstance.dbName]) + .apply( + ([endpoint, username, dbName]) => + `postgresql://${username}:${dbPassword.result}@${endpoint}:5432/${dbName}?sslmode=require`, + ), }, ); diff --git a/apps/infra/types.ts b/apps/infra/types.ts index 53ba82534..89d9163c2 100644 --- a/apps/infra/types.ts +++ b/apps/infra/types.ts @@ -17,6 +17,7 @@ export interface CommonConfig { enableDebugEndpoints: boolean; githubOrg: string; githubRepo: string; + githubBranch: string; commonTags: ResourceTags; networkConfig: NetworkConfig; securityConfig: SecurityConfig; @@ -25,6 +26,8 @@ export interface CommonConfig { dbMaxAllocatedStorage: number; dbBackupRetentionPeriod: number; dbDeletionProtection: boolean; + dbName: string; + dbUsername: string; logRetentionDays: number; // Optional feature configurations tailscale?: { From 3d847b52429bb652b6acf497b99b8ddb8ad343d3 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 15:28:06 -0400 Subject: [PATCH 010/107] chore: update yarn.lock to reflect package path changes - Modified package paths in yarn.lock from workspace references to direct package references for better clarity and consistency. - Ensured all affected packages are updated to align with the new structure. --- yarn.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index b40b4d0bd..ecb07d89a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1651,14 +1651,14 @@ "@types/conventional-commits-parser" "^5.0.0" chalk "^5.3.0" -"@comp/analytics@^workspace:packages/analytics": +"@comp/analytics@packages/analytics": version "workspace:packages/analytics" resolved "workspace:packages/analytics" dependencies: posthog-js "^1.236.6" posthog-node "^4.14.0" -"@comp/app@^workspace:apps/app", "@comp/app@workspace:*": +"@comp/app@apps/app", "@comp/app@workspace:*": version "workspace:apps/app" resolved "workspace:apps/app" devDependencies: @@ -1768,7 +1768,7 @@ zaraz-ts "^1.2.0" zustand "^5.0.3" -"@comp/db@^workspace:packages/db", "@comp/db@workspace:*": +"@comp/db@packages/db", "@comp/db@workspace:*": version "workspace:packages/db" resolved "workspace:packages/db" devDependencies: @@ -1780,7 +1780,7 @@ dependencies: "@prisma/client" "6.9.0" -"@comp/email@^workspace:packages/email": +"@comp/email@packages/email": version "workspace:packages/email" resolved "workspace:packages/email" devDependencies: @@ -1800,7 +1800,7 @@ react-email "^4.0.15" responsive-react-email "^0.0.5" -"@comp/framework-editor@^workspace:apps/framework-editor": +"@comp/framework-editor@apps/framework-editor": version "workspace:apps/framework-editor" resolved "workspace:apps/framework-editor" devDependencies: @@ -1830,7 +1830,7 @@ tippy.js "^6.3.7" zod "3.25.67" -"@comp/infra@^workspace:apps/infra": +"@comp/infra@apps/infra": version "workspace:apps/infra" resolved "workspace:apps/infra" devDependencies: @@ -1846,7 +1846,7 @@ "@pulumi/tailscale" "^0.17.0" dotenv "^17.2.0" -"@comp/integrations@^workspace:packages/integrations": +"@comp/integrations@packages/integrations": version "workspace:packages/integrations" resolved "workspace:packages/integrations" devDependencies: @@ -1869,14 +1869,14 @@ stoppable "^1.1.0" zod "3.25.67" -"@comp/kv@^workspace:packages/kv": +"@comp/kv@packages/kv": version "workspace:packages/kv" resolved "workspace:packages/kv" dependencies: "@upstash/redis" "^1.34.2" server-only "0.0.1" -"@comp/portal@^workspace:apps/portal": +"@comp/portal@apps/portal": version "workspace:apps/portal" resolved "workspace:apps/portal" devDependencies: @@ -1907,7 +1907,7 @@ next "15.4.0-canary.85" react-email "^4.0.15" -"@comp/trust@^workspace:apps/trust": +"@comp/trust@apps/trust": version "workspace:apps/trust" resolved "workspace:apps/trust" devDependencies: @@ -1929,11 +1929,11 @@ lucide-react "^0.518.0" next "15.4.0-canary.85" -"@comp/tsconfig@^workspace:packages/tsconfig", "@comp/tsconfig@workspace:*": +"@comp/tsconfig@packages/tsconfig", "@comp/tsconfig@workspace:*": version "workspace:packages/tsconfig" resolved "workspace:packages/tsconfig" -"@comp/ui@^workspace:packages/ui", "@comp/ui@workspace:*": +"@comp/ui@packages/ui", "@comp/ui@workspace:*": version "workspace:packages/ui" resolved "workspace:packages/ui" devDependencies: @@ -2016,7 +2016,7 @@ use-debounce "^10.0.4" vaul "^0.9.6" -"@comp/utils@^workspace:packages/utils", "@comp/utils@workspace:*": +"@comp/utils@packages/utils", "@comp/utils@workspace:*": version "workspace:packages/utils" resolved "workspace:packages/utils" devDependencies: From b8f4fae8b83f94841295a243fe227ef41fbb4db5 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 15:32:08 -0400 Subject: [PATCH 011/107] refactor: streamline Dockerfile generation in buildspec.yml - Replaced multi-line heredoc syntax with echo commands for generating the Dockerfile.runtime, improving readability and maintainability. - Simplified the ECS service update command by using a single line with error handling for better clarity. --- apps/app/buildspec.yml | 59 +++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 33 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 919dd15c5..95d762dba 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -65,34 +65,31 @@ phases: - echo "=== BUILDING DOCKER RUNTIME IMAGE WITH PRE-BUILT ARTIFACTS ===" - echo "Creating runtime-only Docker image with build artifacts..." - - | - cat > Dockerfile.runtime << 'EOF' - # Use Node.js Alpine for smaller runtime image - FROM node:18-alpine AS runtime - - WORKDIR /app - - ENV NODE_ENV=production - ENV NEXT_TELEMETRY_DISABLED=1 - ENV PORT=3000 - ENV HOSTNAME="0.0.0.0" - ENV NODE_TLS_REJECT_UNAUTHORIZED=0 - - # Copy the complete standalone build from CodeBuild - COPY .next/standalone ./ - - # Create non-root user for security - RUN addgroup -g 1001 -S nodejs && \ - adduser -S nextjs -u 1001 && \ - chown -R nextjs:nodejs /app - - USER nextjs - - EXPOSE 3000 - - # Use node to run the standalone server.js - CMD ["node", "server.js"] - EOF + - echo "# Use Node.js Alpine for smaller runtime image" > Dockerfile.runtime + - echo "FROM node:18-alpine AS runtime" >> Dockerfile.runtime + - echo "" >> Dockerfile.runtime + - echo "WORKDIR /app" >> Dockerfile.runtime + - echo "" >> Dockerfile.runtime + - echo "ENV NODE_ENV=production" >> Dockerfile.runtime + - echo "ENV NEXT_TELEMETRY_DISABLED=1" >> Dockerfile.runtime + - echo "ENV PORT=3000" >> Dockerfile.runtime + - echo "ENV HOSTNAME=\"0.0.0.0\"" >> Dockerfile.runtime + - echo "ENV NODE_TLS_REJECT_UNAUTHORIZED=0" >> Dockerfile.runtime + - echo "" >> Dockerfile.runtime + - echo "# Copy the complete standalone build from CodeBuild" >> Dockerfile.runtime + - echo "COPY .next/standalone ./" >> Dockerfile.runtime + - echo "" >> Dockerfile.runtime + - echo "# Create non-root user for security" >> Dockerfile.runtime + - echo "RUN addgroup -g 1001 -S nodejs && \\" >> Dockerfile.runtime + - echo " adduser -S nextjs -u 1001 && \\" >> Dockerfile.runtime + - echo " chown -R nextjs:nodejs /app" >> Dockerfile.runtime + - echo "" >> Dockerfile.runtime + - echo "USER nextjs" >> Dockerfile.runtime + - echo "" >> Dockerfile.runtime + - echo "EXPOSE 3000" >> Dockerfile.runtime + - echo "" >> Dockerfile.runtime + - echo "# Use node to run the standalone server.js" >> Dockerfile.runtime + - echo "CMD [\"node\", \"server.js\"]" >> Dockerfile.runtime - docker build -f Dockerfile.runtime -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:latest @@ -103,11 +100,7 @@ phases: - docker push $REPOSITORY_URI:$IMAGE_TAG - docker push $REPOSITORY_URI:latest - echo "Updating ECS service to deploy new image..." - - | - if ! aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment; then - echo "❌ Failed to update ECS service" - exit 1 - fi + - aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment || (echo "❌ Failed to update ECS service" && exit 1) - echo "Writing image definitions file..." - 'printf "[{\"name\":\"%s-app\",\"imageUri\":\"%s\"}]" $IMAGE_REPO_NAME $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json' From a458015cf0bb5656f383c6371987b0c88474027f Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 15:34:45 -0400 Subject: [PATCH 012/107] fix: resolve YAML syntax error in buildspec.yml - Break down long cp commands into separate steps - Avoid YAML parsing issues with overly long command strings - Maintain same functionality with better readability --- apps/app/buildspec.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 95d762dba..ea7ba809a 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -52,8 +52,10 @@ phases: - echo "Copying Prisma client to standalone build..." - mkdir -p .next/standalone/node_modules/.prisma - 'mkdir -p ".next/standalone/node_modules/@prisma"' - - cp -r ../../packages/db/node_modules/.prisma/client .next/standalone/node_modules/.prisma/ || cp -r node_modules/.prisma/client .next/standalone/node_modules/.prisma/ || echo "Warning: .prisma client not found" - - 'cp -r "../../packages/db/node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/" || cp -r "node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/" || echo "Warning: @prisma/client not found"' + - cp -r ../../packages/db/node_modules/.prisma/client .next/standalone/node_modules/.prisma/ || echo "Trying local .prisma client..." + - cp -r node_modules/.prisma/client .next/standalone/node_modules/.prisma/ || echo "Warning .prisma client not found" + - cp -r "../../packages/db/node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/" || echo "Trying local @prisma/client..." + - cp -r "node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/" || echo "Warning @prisma/client not found" - echo "✅ Standalone files prepared" - echo "=== VERIFYING BUILD ARTIFACTS ===" From 04b155568619dfcbdce12bf6aa234df1c77229a2 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 15:40:58 -0400 Subject: [PATCH 013/107] fix: resolve CodeBuild database connectivity issues - Move CodeBuild VPC endpoint from public to private subnets - Move CloudWatch Logs VPC endpoint to private subnets - Add network debugging to buildspec for connectivity testing - CodeBuild runs in private subnets so endpoints need to be there too --- apps/app/buildspec.yml | 3 +++ apps/infra/modules/networking.ts | 4 ++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index ea7ba809a..d708c2848 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -36,6 +36,9 @@ phases: - echo "✅ Type checking passed" - echo "=== RUNNING DATABASE MIGRATIONS ===" + - echo "Testing database connectivity..." + - echo "DATABASE_URL endpoint:" $(echo "$DATABASE_URL" | sed 's/.*@\([^:]*\):.*/\1/') + - nslookup $(echo "$DATABASE_URL" | sed 's/.*@\([^:]*\):.*/\1/') || echo "DNS lookup failed" - echo "Running migrations before build..." - NODE_TLS_REJECT_UNAUTHORIZED=0 bun run apply-migrations - echo "✅ Database migrations completed" diff --git a/apps/infra/modules/networking.ts b/apps/infra/modules/networking.ts index d5a517b63..1a9735982 100644 --- a/apps/infra/modules/networking.ts +++ b/apps/infra/modules/networking.ts @@ -427,7 +427,7 @@ export function createNetworking(config: CommonConfig) { vpcId: vpc.id, serviceName: `com.amazonaws.${config.awsRegion}.codebuild`, vpcEndpointType: 'Interface', - subnetIds: publicSubnetIds, + subnetIds: privateSubnetIds, // CodeBuild runs in private subnets, so endpoints should be there too securityGroupIds: [vpcEndpointSecurityGroup.id], tags: { ...commonTags, @@ -441,7 +441,7 @@ export function createNetworking(config: CommonConfig) { vpcId: vpc.id, serviceName: `com.amazonaws.${config.awsRegion}.logs`, vpcEndpointType: 'Interface', - subnetIds: publicSubnetIds, + subnetIds: privateSubnetIds, // CodeBuild logs from private subnets, so endpoint should be there too securityGroupIds: [vpcEndpointSecurityGroup.id], tags: { ...commonTags, From 804bcb3e0f6b6a5d85c7dbd613caf7c65d4bc3a3 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 15:48:34 -0400 Subject: [PATCH 014/107] feat: add TCP connectivity debugging to buildspec - Add TCP connection test to database before migrations - Add network debugging information (CodeBuild private IP) - Help diagnose why DNS works but TCP connection fails --- apps/app/buildspec.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index d708c2848..6dae8a5fd 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -39,6 +39,10 @@ phases: - echo "Testing database connectivity..." - echo "DATABASE_URL endpoint:" $(echo "$DATABASE_URL" | sed 's/.*@\([^:]*\):.*/\1/') - nslookup $(echo "$DATABASE_URL" | sed 's/.*@\([^:]*\):.*/\1/') || echo "DNS lookup failed" + - echo "Testing TCP connectivity to database..." + - timeout 10 bash -c " Date: Tue, 22 Jul 2025 15:55:47 -0400 Subject: [PATCH 015/107] fix: add robust database connectivity rules for CodeBuild - Add explicit dependencies to security group rules - Add CIDR-based backup rule for private subnet access to database - Ensure CodeBuild can reach database via multiple rule types - Database IP 10.2.20.143 should be accessible from CodeBuild private subnets --- apps/infra/modules/networking.ts | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/apps/infra/modules/networking.ts b/apps/infra/modules/networking.ts index 1a9735982..f4246d6ac 100644 --- a/apps/infra/modules/networking.ts +++ b/apps/infra/modules/networking.ts @@ -280,7 +280,7 @@ export function createNetworking(config: CommonConfig) { }, }); - // Allow CodeBuild to access database + // Allow CodeBuild to access database - explicit ingress rule const buildDatabaseAccess = new aws.ec2.SecurityGroupRule( `${config.projectName}-build-database-access`, { @@ -292,6 +292,26 @@ export function createNetworking(config: CommonConfig) { securityGroupId: databaseSecurityGroup.id, description: 'Allow CodeBuild to access database for builds', }, + { + dependsOn: [codeBuildSecurityGroup, databaseSecurityGroup], + }, + ); + + // Also allow access from private subnet CIDR as backup (CodeBuild runs in private subnets) + const buildDatabaseCidrAccess = new aws.ec2.SecurityGroupRule( + `${config.projectName}-build-database-cidr-access`, + { + type: 'ingress', + fromPort: 5432, + toPort: 5432, + protocol: 'tcp', + cidrBlocks: [networkConfig.subnets.private[0].cidr, networkConfig.subnets.private[1].cidr], + securityGroupId: databaseSecurityGroup.id, + description: 'Allow access from private subnets (CodeBuild backup rule)', + }, + { + dependsOn: [databaseSecurityGroup], + }, ); // Tailscale Security Group From 951f4622985044669503ca60a21388cc5f9207f5 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 16:02:09 -0400 Subject: [PATCH 016/107] fix: prevent build failure when metadata service is inaccessible - Change curl command to use fallback instead of failing build - Metadata service access is restricted in VPC mode (expected) - TCP connectivity is now working, allow build to continue to migrations --- apps/app/buildspec.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 6dae8a5fd..6806c0d14 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -42,7 +42,7 @@ phases: - echo "Testing TCP connectivity to database..." - timeout 10 bash -c " Date: Tue, 22 Jul 2025 16:02:46 -0400 Subject: [PATCH 017/107] feat: use PULUMI_PROJECT_NAME as environment identifier - Allow PULUMI_PROJECT_NAME to control resource naming - More intuitive: set PULUMI_PROJECT_NAME=mariano-test for comp-mariano-test-* resources - Simplified environment management --- apps/infra/modules/config.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/apps/infra/modules/config.ts b/apps/infra/modules/config.ts index 81674d3b1..e9ad8c2b8 100644 --- a/apps/infra/modules/config.ts +++ b/apps/infra/modules/config.ts @@ -33,8 +33,11 @@ export function createConfig(projectName: string): CommonConfig { const stack = pulumi.getStack(); // dev, staging, prod, mariano-test, etc. const pulumiConfig = new pulumi.Config(projectName); - // Use the stack name for resource naming to ensure environment-specific names - const resourcePrefix = `comp-${stack}`; + // Use PULUMI_PROJECT_NAME as the environment identifier for resource naming + const environmentName = process.env.PULUMI_PROJECT_NAME || stack; + + // Use the environment name for resource naming to ensure environment-specific names + const resourcePrefix = `${environmentName}`; // Feature flags const enableTailscale = pulumiConfig.getBoolean('enableTailscale') ?? false; From 3d10913a1469af86df9b633d11596bd06462fb2d Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 16:10:04 -0400 Subject: [PATCH 018/107] feat: add required Next.js environment variables with proper validation - Add AUTH_SECRET, RESEND_API_KEY, REVALIDATION_SECRET, NEXT_PUBLIC_PORTAL_URL - Follow same pattern as other env vars: validate and fail if not set - No fallback values - deployment will fail if variables are missing - Type-safe configuration following existing conventions --- apps/infra/modules/build.ts | 20 ++++++++++++++++++++ apps/infra/modules/config.ts | 21 +++++++++++++++++++++ apps/infra/types.ts | 4 ++++ 3 files changed, 45 insertions(+) diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index c81e690ea..e2c1d80b7 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -140,6 +140,26 @@ export function createBuildSystem( value: config.nodeEnv, type: 'PLAINTEXT', }, + { + name: 'AUTH_SECRET', + value: config.authSecret, + type: 'PLAINTEXT', + }, + { + name: 'RESEND_API_KEY', + value: config.resendApiKey, + type: 'PLAINTEXT', + }, + { + name: 'REVALIDATION_SECRET', + value: config.revalidationSecret, + type: 'PLAINTEXT', + }, + { + name: 'NEXT_PUBLIC_PORTAL_URL', + value: config.portalUrl, + type: 'PLAINTEXT', + }, ], }, vpcConfig: { diff --git a/apps/infra/modules/config.ts b/apps/infra/modules/config.ts index e9ad8c2b8..d6bd43a8f 100644 --- a/apps/infra/modules/config.ts +++ b/apps/infra/modules/config.ts @@ -30,6 +30,22 @@ export function createConfig(projectName: string): CommonConfig { throw new Error('ENABLE_RDS_READ_REPLICAS is not set'); } + if (!process.env.AUTH_SECRET) { + throw new Error('AUTH_SECRET is not set'); + } + + if (!process.env.RESEND_API_KEY) { + throw new Error('RESEND_API_KEY is not set'); + } + + if (!process.env.REVALIDATION_SECRET) { + throw new Error('REVALIDATION_SECRET is not set'); + } + + if (!process.env.NEXT_PUBLIC_PORTAL_URL) { + throw new Error('NEXT_PUBLIC_PORTAL_URL is not set'); + } + const stack = pulumi.getStack(); // dev, staging, prod, mariano-test, etc. const pulumiConfig = new pulumi.Config(projectName); @@ -55,6 +71,11 @@ export function createConfig(projectName: string): CommonConfig { githubOrg: process.env.GITHUB_ORG, githubRepo: process.env.GITHUB_REPO, githubBranch: pulumiConfig.get('githubBranch') || process.env.GITHUB_BRANCH || 'main', // Pulumi config takes precedence, then env var, then default + // Next.js application configuration + authSecret: process.env.AUTH_SECRET, + resendApiKey: process.env.RESEND_API_KEY, + revalidationSecret: process.env.REVALIDATION_SECRET, + portalUrl: process.env.NEXT_PUBLIC_PORTAL_URL, // Database configuration dbName: process.env.DB_NAME || 'compdb', dbUsername: process.env.DB_USERNAME || 'compadmin', diff --git a/apps/infra/types.ts b/apps/infra/types.ts index 89d9163c2..ae1d1986b 100644 --- a/apps/infra/types.ts +++ b/apps/infra/types.ts @@ -18,6 +18,10 @@ export interface CommonConfig { githubOrg: string; githubRepo: string; githubBranch: string; + authSecret: string; + resendApiKey: string; + revalidationSecret: string; + portalUrl: string; commonTags: ResourceTags; networkConfig: NetworkConfig; securityConfig: SecurityConfig; From 55aa5d607a1f33acec59bf1008e8b7a2604e6957 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 16:13:22 -0400 Subject: [PATCH 019/107] fix: properly separate app env vars from infra env vars - Remove AUTH_SECRET, RESEND_API_KEY, etc. from infrastructure config - Infrastructure deployment no longer requires application environment variables - CodeBuild gets app env vars conditionally (only if set during deployment) - Added validation in buildspec.yml to fail build if app env vars missing - Proper separation: infra env vars for deployment, app env vars for runtime --- apps/app/buildspec.yml | 8 +++++ apps/infra/modules/build.ts | 57 +++++++++++++++++++++++------------- apps/infra/modules/config.ts | 21 ------------- apps/infra/types.ts | 4 --- 4 files changed, 45 insertions(+), 45 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 6806c0d14..ce1dfef7f 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -35,6 +35,14 @@ phases: - bun run typecheck - echo "✅ Type checking passed" + - echo "=== VALIDATING APPLICATION ENVIRONMENT VARIABLES ===" + - echo "Checking required Next.js environment variables..." + - '[ -n "$AUTH_SECRET" ] || { echo "❌ AUTH_SECRET is not set"; exit 1; }' + - '[ -n "$RESEND_API_KEY" ] || { echo "❌ RESEND_API_KEY is not set"; exit 1; }' + - '[ -n "$REVALIDATION_SECRET" ] || { echo "❌ REVALIDATION_SECRET is not set"; exit 1; }' + - '[ -n "$NEXT_PUBLIC_PORTAL_URL" ] || { echo "❌ NEXT_PUBLIC_PORTAL_URL is not set"; exit 1; }' + - echo "✅ All required environment variables are set" + - echo "=== RUNNING DATABASE MIGRATIONS ===" - echo "Testing database connectivity..." - echo "DATABASE_URL endpoint:" $(echo "$DATABASE_URL" | sed 's/.*@\([^:]*\):.*/\1/') diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index e2c1d80b7..cfe441fcc 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -140,26 +140,43 @@ export function createBuildSystem( value: config.nodeEnv, type: 'PLAINTEXT', }, - { - name: 'AUTH_SECRET', - value: config.authSecret, - type: 'PLAINTEXT', - }, - { - name: 'RESEND_API_KEY', - value: config.resendApiKey, - type: 'PLAINTEXT', - }, - { - name: 'REVALIDATION_SECRET', - value: config.revalidationSecret, - type: 'PLAINTEXT', - }, - { - name: 'NEXT_PUBLIC_PORTAL_URL', - value: config.portalUrl, - type: 'PLAINTEXT', - }, + // Application-specific environment variables (passed through from deployment environment) + ...(process.env.AUTH_SECRET + ? [ + { + name: 'AUTH_SECRET', + value: process.env.AUTH_SECRET, + type: 'PLAINTEXT', + }, + ] + : []), + ...(process.env.RESEND_API_KEY + ? [ + { + name: 'RESEND_API_KEY', + value: process.env.RESEND_API_KEY, + type: 'PLAINTEXT', + }, + ] + : []), + ...(process.env.REVALIDATION_SECRET + ? [ + { + name: 'REVALIDATION_SECRET', + value: process.env.REVALIDATION_SECRET, + type: 'PLAINTEXT', + }, + ] + : []), + ...(process.env.NEXT_PUBLIC_PORTAL_URL + ? [ + { + name: 'NEXT_PUBLIC_PORTAL_URL', + value: process.env.NEXT_PUBLIC_PORTAL_URL, + type: 'PLAINTEXT', + }, + ] + : []), ], }, vpcConfig: { diff --git a/apps/infra/modules/config.ts b/apps/infra/modules/config.ts index d6bd43a8f..e9ad8c2b8 100644 --- a/apps/infra/modules/config.ts +++ b/apps/infra/modules/config.ts @@ -30,22 +30,6 @@ export function createConfig(projectName: string): CommonConfig { throw new Error('ENABLE_RDS_READ_REPLICAS is not set'); } - if (!process.env.AUTH_SECRET) { - throw new Error('AUTH_SECRET is not set'); - } - - if (!process.env.RESEND_API_KEY) { - throw new Error('RESEND_API_KEY is not set'); - } - - if (!process.env.REVALIDATION_SECRET) { - throw new Error('REVALIDATION_SECRET is not set'); - } - - if (!process.env.NEXT_PUBLIC_PORTAL_URL) { - throw new Error('NEXT_PUBLIC_PORTAL_URL is not set'); - } - const stack = pulumi.getStack(); // dev, staging, prod, mariano-test, etc. const pulumiConfig = new pulumi.Config(projectName); @@ -71,11 +55,6 @@ export function createConfig(projectName: string): CommonConfig { githubOrg: process.env.GITHUB_ORG, githubRepo: process.env.GITHUB_REPO, githubBranch: pulumiConfig.get('githubBranch') || process.env.GITHUB_BRANCH || 'main', // Pulumi config takes precedence, then env var, then default - // Next.js application configuration - authSecret: process.env.AUTH_SECRET, - resendApiKey: process.env.RESEND_API_KEY, - revalidationSecret: process.env.REVALIDATION_SECRET, - portalUrl: process.env.NEXT_PUBLIC_PORTAL_URL, // Database configuration dbName: process.env.DB_NAME || 'compdb', dbUsername: process.env.DB_USERNAME || 'compadmin', diff --git a/apps/infra/types.ts b/apps/infra/types.ts index ae1d1986b..89d9163c2 100644 --- a/apps/infra/types.ts +++ b/apps/infra/types.ts @@ -18,10 +18,6 @@ export interface CommonConfig { githubOrg: string; githubRepo: string; githubBranch: string; - authSecret: string; - resendApiKey: string; - revalidationSecret: string; - portalUrl: string; commonTags: ResourceTags; networkConfig: NetworkConfig; securityConfig: SecurityConfig; From b49fb1c352f20ad62dece108ad79308fbac6020e Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 16:22:32 -0400 Subject: [PATCH 020/107] feat: read app environment variables from apps/app/.env - Infrastructure now reads app secrets from apps/app/.env instead of process.env - Added .env.example template in apps/app/ for required variables - Cleaner separation: app variables stay with the app - Infrastructure just reads and passes them to CodeBuild - Copy apps/app/.env.example to apps/app/.env and set your actual values --- apps/infra/modules/build.ts | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index cfe441fcc..edc0f5494 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -1,7 +1,13 @@ import * as aws from '@pulumi/aws'; import * as pulumi from '@pulumi/pulumi'; +import * as dotenv from 'dotenv'; +import * as path from 'path'; import { CommonConfig, ContainerOutputs, DatabaseOutputs, NetworkOutputs } from '../types'; +// Load app environment variables from the app's .env file +const appEnvPath = path.resolve(__dirname, '../../app/.env'); +const appEnv = dotenv.config({ path: appEnvPath }).parsed || {}; + export function createBuildSystem( config: CommonConfig, network: NetworkOutputs, @@ -140,39 +146,39 @@ export function createBuildSystem( value: config.nodeEnv, type: 'PLAINTEXT', }, - // Application-specific environment variables (passed through from deployment environment) - ...(process.env.AUTH_SECRET + // Application-specific environment variables (read from apps/app/.env) + ...(appEnv.AUTH_SECRET ? [ { name: 'AUTH_SECRET', - value: process.env.AUTH_SECRET, + value: appEnv.AUTH_SECRET, type: 'PLAINTEXT', }, ] : []), - ...(process.env.RESEND_API_KEY + ...(appEnv.RESEND_API_KEY ? [ { name: 'RESEND_API_KEY', - value: process.env.RESEND_API_KEY, + value: appEnv.RESEND_API_KEY, type: 'PLAINTEXT', }, ] : []), - ...(process.env.REVALIDATION_SECRET + ...(appEnv.REVALIDATION_SECRET ? [ { name: 'REVALIDATION_SECRET', - value: process.env.REVALIDATION_SECRET, + value: appEnv.REVALIDATION_SECRET, type: 'PLAINTEXT', }, ] : []), - ...(process.env.NEXT_PUBLIC_PORTAL_URL + ...(appEnv.NEXT_PUBLIC_PORTAL_URL ? [ { name: 'NEXT_PUBLIC_PORTAL_URL', - value: process.env.NEXT_PUBLIC_PORTAL_URL, + value: appEnv.NEXT_PUBLIC_PORTAL_URL, type: 'PLAINTEXT', }, ] From d9c64e573895b5d87b5ee720b832222eca7737d9 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 16:40:08 -0400 Subject: [PATCH 021/107] refactor: remove unused uploadSchema from schema actions - Deleted the uploadSchema definition as it is no longer needed in the application. - Cleaned up the schema file for better maintainability and clarity. --- apps/app/src/actions/schema.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/apps/app/src/actions/schema.ts b/apps/app/src/actions/schema.ts index 721aa29b0..bf7d07325 100644 --- a/apps/app/src/actions/schema.ts +++ b/apps/app/src/actions/schema.ts @@ -36,11 +36,6 @@ export const subdomainAvailabilitySchema = z.object({ }), }); -export const uploadSchema = z.object({ - file: z.instanceof(File), - organizationId: z.string(), -}); - export const deleteOrganizationSchema = z.object({ id: z.string(), organizationId: z.string(), From 4e11649476f44cbe425c6a5446557083d83d2f9c Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 16:50:33 -0400 Subject: [PATCH 022/107] fix: improve Docker entry point detection for Next.js standalone build - Add comprehensive debugging to show actual file structure in .next/standalone - Check for server.js, index.js, start.js and other entry points - Make Docker CMD flexible to handle different Next.js entry point names - Add package.json inspection to understand intended start script - Should resolve 'Cannot find module /app/server.js' ECS error --- apps/app/buildspec.yml | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index ce1dfef7f..36298d225 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -79,6 +79,12 @@ phases: - ls -la .next/standalone/.next/static/ || echo "❌ .next/standalone/.next/static/ not found" - ls -la .next/standalone/public/ || echo "❌ .next/standalone/public/ not found" - ls -la .next/standalone/server.js || echo "❌ server.js not found" + - echo "Contents of .next/standalone directory:" + - find .next/standalone -type f -name "*.js" | head -20 + - echo "Looking for server entry points:" + - find .next/standalone -name "server.*" -o -name "index.*" -o -name "start.*" | head -10 + - echo "Checking package.json in standalone build:" + - cat .next/standalone/package.json || echo "No package.json found" - echo "=== BUILDING DOCKER RUNTIME IMAGE WITH PRE-BUILT ARTIFACTS ===" - echo "Creating runtime-only Docker image with build artifacts..." @@ -105,8 +111,8 @@ phases: - echo "" >> Dockerfile.runtime - echo "EXPOSE 3000" >> Dockerfile.runtime - echo "" >> Dockerfile.runtime - - echo "# Use node to run the standalone server.js" >> Dockerfile.runtime - - echo "CMD [\"node\", \"server.js\"]" >> Dockerfile.runtime + - echo "# Use node to run the standalone server - try multiple possible entry points" >> Dockerfile.runtime + - echo "CMD [\"sh\", \"-c\", \"if [ -f server.js ]; then node server.js; elif [ -f index.js ]; then node index.js; elif [ -f start.js ]; then node start.js; else echo 'No entry point found' && exit 1; fi\"]" >> Dockerfile.runtime - docker build -f Dockerfile.runtime -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:latest From bb3aecb58c407592a76afa6ca3c197ccd538d56b Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 16:58:26 -0400 Subject: [PATCH 023/107] fix: correct Docker entry point for monorepo structure - Server.js is at apps/app/server.js due to monorepo standalone build - Update Docker CMD to check apps/app/server.js first - Resolves 'Cannot find module /app/server.js' ECS container error - Maintains fallback to standard paths for compatibility --- apps/app/buildspec.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 36298d225..d09a985cc 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -111,8 +111,8 @@ phases: - echo "" >> Dockerfile.runtime - echo "EXPOSE 3000" >> Dockerfile.runtime - echo "" >> Dockerfile.runtime - - echo "# Use node to run the standalone server - try multiple possible entry points" >> Dockerfile.runtime - - echo "CMD [\"sh\", \"-c\", \"if [ -f server.js ]; then node server.js; elif [ -f index.js ]; then node index.js; elif [ -f start.js ]; then node start.js; else echo 'No entry point found' && exit 1; fi\"]" >> Dockerfile.runtime + - echo "# Use node to run the standalone server - handle monorepo structure" >> Dockerfile.runtime + - echo "CMD [\"sh\", \"-c\", \"if [ -f apps/app/server.js ]; then node apps/app/server.js; elif [ -f server.js ]; then node server.js; elif [ -f index.js ]; then node index.js; else echo 'No entry point found' && exit 1; fi\"]" >> Dockerfile.runtime - docker build -f Dockerfile.runtime -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:latest From e2fcd7bfc1afa3cbd6c4eaaa96c602fdc7939c56 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Tue, 22 Jul 2025 17:05:45 -0400 Subject: [PATCH 024/107] refactor: move to static Dockerfile from dynamic generation - Create static Dockerfile in apps/app/ with proper configuration - Remove 24+ lines of echo statements from buildspec.yml - Simplify Docker build to single 'docker build -f Dockerfile' command - Improve maintainability and local development experience - Dockerfile is now version controlled and can be tested locally --- apps/app/Dockerfile | 26 ++++++++++++++++++++++++++ apps/app/buildspec.yml | 27 +-------------------------- 2 files changed, 27 insertions(+), 26 deletions(-) create mode 100644 apps/app/Dockerfile diff --git a/apps/app/Dockerfile b/apps/app/Dockerfile new file mode 100644 index 000000000..a440c12d1 --- /dev/null +++ b/apps/app/Dockerfile @@ -0,0 +1,26 @@ +# Use Node.js Alpine for smaller runtime image +FROM node:18-alpine AS runtime + +WORKDIR /app + +# Set production environment variables +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 +ENV PORT=3000 +ENV HOSTNAME="0.0.0.0" +ENV NODE_TLS_REJECT_UNAUTHORIZED=0 + +# Copy the complete standalone build from CodeBuild +COPY .next/standalone ./ + +# Create non-root user for security +RUN addgroup -g 1001 -S nodejs && \ + adduser -S nextjs -u 1001 && \ + chown -R nextjs:nodejs /app + +USER nextjs + +EXPOSE 3000 + +# Use node to run the standalone server - handle monorepo structure +CMD ["sh", "-c", "if [ -f apps/app/server.js ]; then node apps/app/server.js; elif [ -f server.js ]; then node server.js; elif [ -f index.js ]; then node index.js; else echo 'No entry point found' && exit 1; fi"] \ No newline at end of file diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index d09a985cc..c5c0e4317 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -88,32 +88,7 @@ phases: - echo "=== BUILDING DOCKER RUNTIME IMAGE WITH PRE-BUILT ARTIFACTS ===" - echo "Creating runtime-only Docker image with build artifacts..." - - echo "# Use Node.js Alpine for smaller runtime image" > Dockerfile.runtime - - echo "FROM node:18-alpine AS runtime" >> Dockerfile.runtime - - echo "" >> Dockerfile.runtime - - echo "WORKDIR /app" >> Dockerfile.runtime - - echo "" >> Dockerfile.runtime - - echo "ENV NODE_ENV=production" >> Dockerfile.runtime - - echo "ENV NEXT_TELEMETRY_DISABLED=1" >> Dockerfile.runtime - - echo "ENV PORT=3000" >> Dockerfile.runtime - - echo "ENV HOSTNAME=\"0.0.0.0\"" >> Dockerfile.runtime - - echo "ENV NODE_TLS_REJECT_UNAUTHORIZED=0" >> Dockerfile.runtime - - echo "" >> Dockerfile.runtime - - echo "# Copy the complete standalone build from CodeBuild" >> Dockerfile.runtime - - echo "COPY .next/standalone ./" >> Dockerfile.runtime - - echo "" >> Dockerfile.runtime - - echo "# Create non-root user for security" >> Dockerfile.runtime - - echo "RUN addgroup -g 1001 -S nodejs && \\" >> Dockerfile.runtime - - echo " adduser -S nextjs -u 1001 && \\" >> Dockerfile.runtime - - echo " chown -R nextjs:nodejs /app" >> Dockerfile.runtime - - echo "" >> Dockerfile.runtime - - echo "USER nextjs" >> Dockerfile.runtime - - echo "" >> Dockerfile.runtime - - echo "EXPOSE 3000" >> Dockerfile.runtime - - echo "" >> Dockerfile.runtime - - echo "# Use node to run the standalone server - handle monorepo structure" >> Dockerfile.runtime - - echo "CMD [\"sh\", \"-c\", \"if [ -f apps/app/server.js ]; then node apps/app/server.js; elif [ -f server.js ]; then node server.js; elif [ -f index.js ]; then node index.js; else echo 'No entry point found' && exit 1; fi\"]" >> Dockerfile.runtime - - docker build -f Dockerfile.runtime -t $IMAGE_REPO_NAME:$IMAGE_TAG . + - docker build -f Dockerfile -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:latest From d44cfa364b214fa1457a428123fa3a776526b3ca Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 18:45:36 -0400 Subject: [PATCH 025/107] feat: enhance Prisma client generation and application secrets management - Added steps to regenerate Prisma client in the app context for runtime compatibility. - Improved buildspec.yml with detailed logging for Prisma client generation and verification. - Introduced app secrets management in Pulumi, creating AWS Secrets Manager entries for application credentials. - Updated container creation to include application secrets in the ECS task definition. - Adjusted database connection string to include the password securely from the secrets manager. --- apps/app/Dockerfile | 3 + apps/app/buildspec.yml | 32 +++++++- apps/infra/index.ts | 20 +++-- apps/infra/modules/app-secrets.ts | 36 +++++++++ apps/infra/modules/container.ts | 127 ++++++++++++++++++------------ apps/infra/modules/database.ts | 6 +- apps/infra/modules/github-oidc.ts | 36 +++------ packages/db/prisma/schema.prisma | 2 +- 8 files changed, 173 insertions(+), 89 deletions(-) create mode 100644 apps/infra/modules/app-secrets.ts diff --git a/apps/app/Dockerfile b/apps/app/Dockerfile index a440c12d1..0f4929ac8 100644 --- a/apps/app/Dockerfile +++ b/apps/app/Dockerfile @@ -3,6 +3,9 @@ FROM node:18-alpine AS runtime WORKDIR /app +# Install curl for health checks +RUN apk add --no-cache curl + # Set production environment variables ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index c5c0e4317..343bf965f 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -24,10 +24,15 @@ phases: - export PGSSLMODE=require - export NEXT_TELEMETRY_DISABLED=1 - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile + - echo "Re-generating Prisma client in app context for runtime compatibility..." + - bun x prisma generate --schema=../../packages/db/prisma/schema.prisma - echo "=== GENERATING PRISMA CLIENT ===" - cd ../../packages/db + - echo "Generating Prisma client with all binary targets..." - bun x prisma generate + - echo "Verifying generated binary targets..." + - ls -la node_modules/.prisma/client/ - cd ../../apps/app - echo "=== TYPE CHECKING ===" @@ -67,10 +72,29 @@ phases: - echo "Copying Prisma client to standalone build..." - mkdir -p .next/standalone/node_modules/.prisma - 'mkdir -p ".next/standalone/node_modules/@prisma"' - - cp -r ../../packages/db/node_modules/.prisma/client .next/standalone/node_modules/.prisma/ || echo "Trying local .prisma client..." - - cp -r node_modules/.prisma/client .next/standalone/node_modules/.prisma/ || echo "Warning .prisma client not found" - - cp -r "../../packages/db/node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/" || echo "Trying local @prisma/client..." - - cp -r "node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/" || echo "Warning @prisma/client not found" + - echo "Checking available Prisma client locations..." + - ls -la ../../packages/db/node_modules/.prisma/client/ || echo "No .prisma client in packages/db" + - ls -la node_modules/.prisma/client/ || echo "No .prisma client in apps/app" + - echo "Copying .prisma client directory..." + - if [ -d "../../packages/db/node_modules/.prisma/client" ]; then + cp -r ../../packages/db/node_modules/.prisma/client .next/standalone/node_modules/.prisma/; + elif [ -d "node_modules/.prisma/client" ]; then + cp -r node_modules/.prisma/client .next/standalone/node_modules/.prisma/; + else + echo "❌ No .prisma client found"; exit 1; + fi + - echo "Copying @prisma/client directory..." + - if [ -d "../../packages/db/node_modules/@prisma/client" ]; then + cp -r "../../packages/db/node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/"; + elif [ -d "node_modules/@prisma/client" ]; then + cp -r "node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/"; + else + echo "❌ No @prisma/client found"; exit 1; + fi + - echo "Verifying copied Prisma client binaries..." + - ls -la .next/standalone/node_modules/.prisma/client/ + - echo "Checking for required binary targets..." + - ls -la .next/standalone/node_modules/.prisma/client/ | grep -E "(linux-musl|debian)" || echo "Warning Expected binary targets not found" - echo "✅ Standalone files prepared" - echo "=== VERIFYING BUILD ARTIFACTS ===" diff --git a/apps/infra/index.ts b/apps/infra/index.ts index 727c6b4a4..27553e550 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -1,6 +1,7 @@ import * as pulumi from '@pulumi/pulumi'; // import * as tailscale from "@pulumi/tailscale"; // Available for future Tailscale provider usage import * as dotenv from 'dotenv'; +import { createAppSecrets } from './modules/app-secrets'; import { createBuildSystem } from './modules/build'; import { createConfig } from './modules/config'; import { createContainer } from './modules/container'; @@ -44,29 +45,32 @@ const network = createNetworking(config); // 2. Data Layer - Private RDS PostgreSQL const database = createDatabase(config, network); -// 3. Load Balancing - ALB with Health Checks (create target group first) +// 3. Application Secrets - Separate from database secrets +const appSecrets = createAppSecrets(config); + +// 4. Load Balancing - ALB with Health Checks (create target group first) const loadBalancer = createLoadBalancer(config, network); -// 4. Container Platform - ECR, ECS Cluster (with load balancer integration) -const container = createContainer(config, network, database, loadBalancer); +// 5. Container Platform - ECR, ECS Cluster (with load balancer integration) +const container = createContainer(config, network, database, loadBalancer, appSecrets); -// 5. Build System - CodeBuild with VPC Database Access +// 6. Build System - CodeBuild with VPC Database Access const build = createBuildSystem(config, network, database, container); -// 6. Auto-scaling - ECS Service Scaling +// 7. Auto-scaling - ECS Service Scaling const scaling = createScaling(config, container, loadBalancer); -// 7. GitHub OIDC - For GitHub Actions authentication +// 8. GitHub OIDC - For GitHub Actions authentication const githubOidc = createGithubOidc(config); // ========================================== // OPTIONAL INFRASTRUCTURE (FEATURE-GATED) // ========================================== -// 8. Development Access - Tailscale Subnet Router (Optional) +// 9. Development Access - Tailscale Subnet Router (Optional) const tailscale = enableTailscale ? createTailscale(config, network, database) : undefined; -// 9. Observability - Better Stack + CloudWatch (Optional/Configurable) +// 10. Observability - Better Stack + CloudWatch (Optional/Configurable) const monitoring = createMonitoring(config, database, container, loadBalancer, { enableBetterStack, enableDetailedMonitoring, diff --git a/apps/infra/modules/app-secrets.ts b/apps/infra/modules/app-secrets.ts new file mode 100644 index 000000000..3ee8dca98 --- /dev/null +++ b/apps/infra/modules/app-secrets.ts @@ -0,0 +1,36 @@ +import * as aws from '@pulumi/aws'; +import { CommonConfig } from '../types'; + +export function createAppSecrets(config: CommonConfig) { + const { commonTags } = config; + + // Create AWS Secret for application credentials + const appSecret = new aws.secretsmanager.Secret(`${config.projectName}-app-secret`, { + namePrefix: `${config.projectName}/application/secrets-`, + description: 'Application secrets for AUTH_SECRET, RESEND_API_KEY, etc.', + tags: { + ...commonTags, + Name: `${config.projectName}-app-secret`, + Type: 'secret', + Purpose: 'application-secrets', + }, + }); + + // Store application secrets with placeholder values + const appSecretVersion = new aws.secretsmanager.SecretVersion( + `${config.projectName}-app-secret-version`, + { + secretId: appSecret.id, + secretString: JSON.stringify({ + AUTH_SECRET: 'PLACEHOLDER_SET_IN_AWS_CONSOLE', + RESEND_API_KEY: 'PLACEHOLDER_SET_IN_AWS_CONSOLE', + REVALIDATION_SECRET: 'PLACEHOLDER_SET_IN_AWS_CONSOLE', + }), + }, + ); + + return { + secretArn: appSecret.arn, + secretId: appSecret.id, + }; +} diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index 92a4f72e7..7d0c25c51 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -7,6 +7,7 @@ export function createContainer( network: NetworkOutputs, database: DatabaseOutputs, loadBalancer?: LoadBalancerOutputs, + appSecrets?: { secretArn: pulumi.Output; secretId: pulumi.Output }, ) { const { commonTags } = config; @@ -140,18 +141,20 @@ export function createContainer( `${config.projectName}-task-execution-secrets-policy`, { role: taskExecutionRole.id, - policy: database.secretArn.apply((secretArn) => - JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], - Resource: secretArn, - }, - ], - }), - ), + policy: pulumi + .all([database.secretArn, appSecrets?.secretArn]) + .apply(([dbSecretArn, appSecretArn]) => + JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], + Resource: [dbSecretArn, ...(appSecretArn ? [appSecretArn] : [])], + }, + ], + }), + ), }, ); @@ -209,52 +212,78 @@ export function createContainer( executionRoleArn: taskExecutionRole.arn, taskRoleArn: taskRole.arn, containerDefinitions: pulumi - .all([repository.repositoryUrl, logGroup.name, database.secretArn]) - .apply(([repoUrl, logGroupName, secretArn]: [string, string, string]) => - JSON.stringify([ - { - name: `${config.projectName}-app`, - image: `${repoUrl}:latest`, - essential: true, - portMappings: [ + .all([ + repository.repositoryUrl, + logGroup.name, + database.secretArn, + appSecrets?.secretArn || pulumi.output(''), + ]) + .apply( + ([repoUrl, logGroupName, dbSecretArn, appSecretArn]: [string, string, string, string]) => { + const secrets = [ + { + name: 'DATABASE_URL', + valueFrom: dbSecretArn, + }, + ]; + + if (appSecrets && appSecretArn) { + secrets.push( { - containerPort: 3000, - protocol: 'tcp', + name: 'AUTH_SECRET', + valueFrom: `${appSecretArn}:AUTH_SECRET::`, }, - ], - environment: [ { - name: 'NODE_ENV', - value: 'production', + name: 'RESEND_API_KEY', + valueFrom: `${appSecretArn}:RESEND_API_KEY::`, }, { - name: 'PORT', - value: '3000', + name: 'REVALIDATION_SECRET', + valueFrom: `${appSecretArn}:REVALIDATION_SECRET::`, }, - ], - secrets: [ - { - name: 'DATABASE_URL', - valueFrom: secretArn, + ); + } + + return JSON.stringify([ + { + name: `${config.projectName}-app`, + image: `${repoUrl}:latest`, + essential: true, + portMappings: [ + { + containerPort: 3000, + protocol: 'tcp', + }, + ], + environment: [ + { + name: 'NODE_ENV', + value: 'production', + }, + { + name: 'PORT', + value: '3000', + }, + ], + secrets, + logConfiguration: { + logDriver: 'awslogs', + options: { + 'awslogs-group': logGroupName, + 'awslogs-region': config.awsRegion, + 'awslogs-stream-prefix': 'ecs', + }, }, - ], - logConfiguration: { - logDriver: 'awslogs', - options: { - 'awslogs-group': logGroupName, - 'awslogs-region': config.awsRegion, - 'awslogs-stream-prefix': 'ecs', + healthCheck: { + command: ['CMD-SHELL', 'curl -f http://localhost:3000/health || exit 1'], + interval: 30, + timeout: 5, + retries: 3, + startPeriod: 60, }, }, - healthCheck: { - command: ['CMD-SHELL', 'curl -f http://localhost:3000/health || exit 1'], - interval: 30, - timeout: 5, - retries: 3, - startPeriod: 60, - }, - }, - ]), + ]); + }, ), tags: { ...commonTags, diff --git a/apps/infra/modules/database.ts b/apps/infra/modules/database.ts index 11d8d464d..b2f6991dc 100644 --- a/apps/infra/modules/database.ts +++ b/apps/infra/modules/database.ts @@ -144,10 +144,10 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { { secretId: dbSecret.id, secretString: pulumi - .all([dbInstance.endpoint, dbInstance.username, dbInstance.dbName]) + .all([dbInstance.endpoint, dbInstance.username, dbInstance.dbName, dbPassword.result]) .apply( - ([endpoint, username, dbName]) => - `postgresql://${username}:${dbPassword.result}@${endpoint}:5432/${dbName}?sslmode=require`, + ([endpoint, username, dbName, password]) => + `postgresql://${username}:${password}@${endpoint}:5432/${dbName}?sslmode=require`, ), }, ); diff --git a/apps/infra/modules/github-oidc.ts b/apps/infra/modules/github-oidc.ts index fd1938d8b..63a4778e4 100644 --- a/apps/infra/modules/github-oidc.ts +++ b/apps/infra/modules/github-oidc.ts @@ -1,28 +1,17 @@ import * as aws from '@pulumi/aws'; -import * as pulumi from '@pulumi/pulumi'; import { CommonConfig } from '../types'; export function createGithubOidc(config: CommonConfig) { const { commonTags } = config; - // Check if we should use existing OIDC provider or create new one - const useExistingOidc = new pulumi.Config().getBoolean('useExistingGithubOidc') ?? false; + // GitHub OIDC provider - matches the imported resource from AWS + const githubOidcUrl = 'https://token.actions.githubusercontent.com'; - let githubOidcProvider: { arn: pulumi.Output; url: pulumi.Output }; - - if (useExistingOidc) { - // Get the existing GitHub OIDC Provider - const existingProvider = aws.iam.getOpenIdConnectProviderOutput({ - url: 'https://token.actions.githubusercontent.com', - }); - githubOidcProvider = { - arn: existingProvider.arn, - url: existingProvider.url, - }; - } else { - // Create a new GitHub OIDC Provider - const newProvider = new aws.iam.OpenIdConnectProvider('github-actions-oidc-provider', { - url: 'https://token.actions.githubusercontent.com', + // Create OIDC provider (will use imported state if already imported) + const githubOidcProvider = new aws.iam.OpenIdConnectProvider( + 'github-actions-oidc-provider', + { + url: githubOidcUrl, clientIdLists: ['sts.amazonaws.com'], thumbprintLists: [ '6938fd4d98bab03faadb97b34396831e3780aea1', // GitHub Actions OIDC thumbprint @@ -34,12 +23,11 @@ export function createGithubOidc(config: CommonConfig) { Type: 'oidc-provider', Purpose: 'github-actions-authentication', }, - }); - githubOidcProvider = { - arn: newProvider.arn, - url: newProvider.url, - }; - } + }, + { + protect: true, // Protect from accidental deletion since it's shared across stacks + }, + ); // Deployment Role for GitHub Actions (read-write access) const deploymentRole = new aws.iam.Role(`${config.projectName}-github-deployment-role`, { diff --git a/packages/db/prisma/schema.prisma b/packages/db/prisma/schema.prisma index 2379ccbd4..a738a5cf4 100644 --- a/packages/db/prisma/schema.prisma +++ b/packages/db/prisma/schema.prisma @@ -1,7 +1,7 @@ generator client { provider = "prisma-client-js" previewFeatures = ["driverAdapters", "postgresqlExtensions", "prismaSchemaFolder"] - binaryTargets = ["native", "debian-openssl-3.0.x"] + binaryTargets = ["native", "debian-openssl-3.0.x", "linux-musl-openssl-3.0.x"] } datasource db { From 7276586d25dda1ed91e2d665213e921b2ea348b8 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 18:49:29 -0400 Subject: [PATCH 026/107] feat: optimize build process with parallel processing and enhanced caching - Updated buildspec.yml to utilize parallel processing for dependency installation and TypeScript type checking. - Increased memory allocation for Node.js and optimized Docker build with parallel execution. - Added caching paths to improve build performance and reduce installation time. - Changed build instance type to accommodate larger resource requirements. --- apps/app/buildspec.yml | 19 ++++++++++++++++--- apps/infra/modules/build.ts | 4 ++-- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 343bf965f..5ab17dcc8 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -23,7 +23,9 @@ phases: - export PATH="/root/.bun/bin:$PATH" - export PGSSLMODE=require - export NEXT_TELEMETRY_DISABLED=1 - - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile + - echo "Installing dependencies with parallel processing..." + - echo "Using aggressive caching with 72GB memory..." + - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile --concurrent 36 - echo "Re-generating Prisma client in app context for runtime compatibility..." - bun x prisma generate --schema=../../packages/db/prisma/schema.prisma @@ -36,7 +38,7 @@ phases: - cd ../../apps/app - echo "=== TYPE CHECKING ===" - - echo "Running TypeScript type checking..." + - echo "Running TypeScript type checking with parallel processing..." - bun run typecheck - echo "✅ Type checking passed" @@ -62,6 +64,9 @@ phases: - echo "=== BUILDING NEXT.JS ON CODEBUILD HOST (WITH MIGRATED DATABASE) ===" - echo "Running Next.js build with database access for SSG..." + - echo "Optimizing build for 36 vCPUs..." + - export UV_THREADPOOL_SIZE=36 + - export NODE_OPTIONS="--max-old-space-size=65536" - NODE_TLS_REJECT_UNAUTHORIZED=0 bun run build - echo "✅ Next.js build completed with database access" @@ -112,7 +117,8 @@ phases: - echo "=== BUILDING DOCKER RUNTIME IMAGE WITH PRE-BUILT ARTIFACTS ===" - echo "Creating runtime-only Docker image with build artifacts..." - - docker build -f Dockerfile -t $IMAGE_REPO_NAME:$IMAGE_TAG . + - echo "Using parallel Docker build with 36 cores..." + - docker build --progress=plain --build-arg BUILDKIT_INLINE_CACHE=1 -f Dockerfile -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:latest @@ -126,6 +132,13 @@ phases: - echo "Writing image definitions file..." - 'printf "[{\"name\":\"%s-app\",\"imageUri\":\"%s\"}]" $IMAGE_REPO_NAME $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json' +cache: + paths: + - 'node_modules/**/*' + - 'packages/db/node_modules/**/*' + - '/root/.bun/install/cache/**/*' + - '.next/cache/**/*' + artifacts: files: - imagedefinitions.json diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index edc0f5494..8943efb48 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -101,7 +101,7 @@ export function createBuildSystem( type: 'NO_ARTIFACTS', }, environment: { - computeType: 'BUILD_GENERAL1_MEDIUM', + computeType: 'BUILD_GENERAL1_2XLARGE', image: 'aws/codebuild/standard:7.0', type: 'LINUX_CONTAINER', privilegedMode: true, // Required for Docker builds @@ -278,7 +278,7 @@ export function createBuildSystem( appProjectName: appProject.name, appProjectArn: appProject.arn, codebuildRoleArn: codebuildRole.arn, - buildInstanceType: 'BUILD_GENERAL1_MEDIUM', + buildInstanceType: 'BUILD_GENERAL1_2XLARGE', buildTimeout: 20, createApplicationDeployment, }; From 588af1f564e814531ab1f45aa1d8486df0e1baea Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 18:53:54 -0400 Subject: [PATCH 027/107] chore: update yarn.lock for workspace dependency resolution - Changed dependency references for multiple components to use workspace protocol. - Ensured consistency in versioning across packages for better management in monorepo structure. --- yarn.lock | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/yarn.lock b/yarn.lock index ecb07d89a..b40b4d0bd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1651,14 +1651,14 @@ "@types/conventional-commits-parser" "^5.0.0" chalk "^5.3.0" -"@comp/analytics@packages/analytics": +"@comp/analytics@^workspace:packages/analytics": version "workspace:packages/analytics" resolved "workspace:packages/analytics" dependencies: posthog-js "^1.236.6" posthog-node "^4.14.0" -"@comp/app@apps/app", "@comp/app@workspace:*": +"@comp/app@^workspace:apps/app", "@comp/app@workspace:*": version "workspace:apps/app" resolved "workspace:apps/app" devDependencies: @@ -1768,7 +1768,7 @@ zaraz-ts "^1.2.0" zustand "^5.0.3" -"@comp/db@packages/db", "@comp/db@workspace:*": +"@comp/db@^workspace:packages/db", "@comp/db@workspace:*": version "workspace:packages/db" resolved "workspace:packages/db" devDependencies: @@ -1780,7 +1780,7 @@ dependencies: "@prisma/client" "6.9.0" -"@comp/email@packages/email": +"@comp/email@^workspace:packages/email": version "workspace:packages/email" resolved "workspace:packages/email" devDependencies: @@ -1800,7 +1800,7 @@ react-email "^4.0.15" responsive-react-email "^0.0.5" -"@comp/framework-editor@apps/framework-editor": +"@comp/framework-editor@^workspace:apps/framework-editor": version "workspace:apps/framework-editor" resolved "workspace:apps/framework-editor" devDependencies: @@ -1830,7 +1830,7 @@ tippy.js "^6.3.7" zod "3.25.67" -"@comp/infra@apps/infra": +"@comp/infra@^workspace:apps/infra": version "workspace:apps/infra" resolved "workspace:apps/infra" devDependencies: @@ -1846,7 +1846,7 @@ "@pulumi/tailscale" "^0.17.0" dotenv "^17.2.0" -"@comp/integrations@packages/integrations": +"@comp/integrations@^workspace:packages/integrations": version "workspace:packages/integrations" resolved "workspace:packages/integrations" devDependencies: @@ -1869,14 +1869,14 @@ stoppable "^1.1.0" zod "3.25.67" -"@comp/kv@packages/kv": +"@comp/kv@^workspace:packages/kv": version "workspace:packages/kv" resolved "workspace:packages/kv" dependencies: "@upstash/redis" "^1.34.2" server-only "0.0.1" -"@comp/portal@apps/portal": +"@comp/portal@^workspace:apps/portal": version "workspace:apps/portal" resolved "workspace:apps/portal" devDependencies: @@ -1907,7 +1907,7 @@ next "15.4.0-canary.85" react-email "^4.0.15" -"@comp/trust@apps/trust": +"@comp/trust@^workspace:apps/trust": version "workspace:apps/trust" resolved "workspace:apps/trust" devDependencies: @@ -1929,11 +1929,11 @@ lucide-react "^0.518.0" next "15.4.0-canary.85" -"@comp/tsconfig@packages/tsconfig", "@comp/tsconfig@workspace:*": +"@comp/tsconfig@^workspace:packages/tsconfig", "@comp/tsconfig@workspace:*": version "workspace:packages/tsconfig" resolved "workspace:packages/tsconfig" -"@comp/ui@packages/ui", "@comp/ui@workspace:*": +"@comp/ui@^workspace:packages/ui", "@comp/ui@workspace:*": version "workspace:packages/ui" resolved "workspace:packages/ui" devDependencies: @@ -2016,7 +2016,7 @@ use-debounce "^10.0.4" vaul "^0.9.6" -"@comp/utils@packages/utils", "@comp/utils@workspace:*": +"@comp/utils@^workspace:packages/utils", "@comp/utils@workspace:*": version "workspace:packages/utils" resolved "workspace:packages/utils" devDependencies: From 72925e17aface54c1a94930bbed04c65a6444b74 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 18:56:08 -0400 Subject: [PATCH 028/107] chore: update bun.lock and yarn.lock for dependency versioning - Bumped versions of @ai-sdk/openai, @aws-sdk/client-s3, @aws-sdk/client-securityhub, @aws-sdk/client-sso, @aws-sdk/client-sts, and other AWS SDK packages for improved functionality and security. - Enhanced buildspec.yml with detailed logging and checks for lockfile status during dependency installation. - Improved structure and clarity in the build process by adding echo statements for better visibility of the current working directory and repository structure. --- apps/app/buildspec.yml | 26 +- bun.lock | 868 +++---- yarn.lock | 5583 ++++++++++++++++++---------------------- 3 files changed, 2939 insertions(+), 3538 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 5ab17dcc8..ca9a0ebfc 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -17,20 +17,35 @@ phases: - echo "DATABASE_URL length:" ${#DATABASE_URL} - echo "DATABASE_URL (masked):" $(echo "$DATABASE_URL" | sed 's/:[^@]*@/:***@/') - echo "NODE_ENV:" $NODE_ENV - - cd apps/app - - echo "=== INSTALLING DEPENDENCIES ===" + - echo "Current working directory:" + - pwd + - echo "Repository structure:" + - ls -la + - echo "Navigating to app directory..." + - cd apps/app + - echo "App directory contents:" + - ls -la - export PATH="/root/.bun/bin:$PATH" - export PGSSLMODE=require - export NEXT_TELEMETRY_DISABLED=1 - echo "Installing dependencies with parallel processing..." - echo "Using aggressive caching with 72GB memory..." - - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile --concurrent 36 + - echo "Checking lockfile status..." + - ls -la ../../bun.lock* || echo "No root lockfile found" + - ls -la bun.lock* || echo "No local lockfile found" + - echo "Installing dependencies from monorepo root..." + - cd ../../ + - echo "Attempting frozen lockfile install first..." + - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile --concurrent 36 || (echo "Frozen lockfile failed, installing with updates..." && SKIP_ENV_VALIDATION=true bun install --concurrent 36) + - cd apps/app - echo "Re-generating Prisma client in app context for runtime compatibility..." - - bun x prisma generate --schema=../../packages/db/prisma/schema.prisma + - bun x prisma generate --schema=../packages/db/prisma/schema.prisma - echo "=== GENERATING PRISMA CLIENT ===" - - cd ../../packages/db + - echo "Current directory before Prisma generation:" + - pwd + - cd packages/db - echo "Generating Prisma client with all binary targets..." - bun x prisma generate - echo "Verifying generated binary targets..." @@ -138,6 +153,7 @@ cache: - 'packages/db/node_modules/**/*' - '/root/.bun/install/cache/**/*' - '.next/cache/**/*' + - 'bun.lock' artifacts: files: diff --git a/bun.lock b/bun.lock index d00c0c3ab..6d3fe9378 100644 --- a/bun.lock +++ b/bun.lock @@ -465,7 +465,7 @@ "@ai-sdk/groq": ["@ai-sdk/groq@1.2.9", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-7MoDaxm8yWtiRbD1LipYZG0kBl+Xe0sv/EeyxnHnGPZappXdlgtdOgTZVjjXkT3nWP30jjZi9A45zoVrBMb3Xg=="], - "@ai-sdk/openai": ["@ai-sdk/openai@1.3.22", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-QwA+2EkG0QyjVR+7h6FE7iOu2ivNqAVMm9UJZkVxxTk5OIq5fFJDTEI/zICEMuHImTTXR2JjsL6EirJ28Jc4cw=="], + "@ai-sdk/openai": ["@ai-sdk/openai@1.3.23", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-86U7rFp8yacUAOE/Jz8WbGcwMCqWvjK33wk5DXkfnAOEn3mx2r7tNSJdjukQFZbAK97VMXGPPHxF+aEARDXRXQ=="], "@ai-sdk/provider": ["@ai-sdk/provider@1.1.3", "", { "dependencies": { "json-schema": "^0.4.0" } }, "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg=="], @@ -497,110 +497,112 @@ "@aws-sdk/client-ecs": ["@aws-sdk/client-ecs@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/credential-provider-node": "3.848.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "@smithy/util-waiter": "^4.0.6", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-9Fp8bv8FbQe+vjF0iBAGiS2eaEkHihvQ5SwiJ+4UYAqnoNxlWuOWXjALHaMjsybtPzz//TAveTK5qusmTeT7rQ=="], - "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.837.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.835.0", "@aws-sdk/credential-provider-node": "3.835.0", "@aws-sdk/middleware-bucket-endpoint": "3.830.0", "@aws-sdk/middleware-expect-continue": "3.821.0", "@aws-sdk/middleware-flexible-checksums": "3.835.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-location-constraint": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", "@aws-sdk/middleware-sdk-s3": "3.835.0", "@aws-sdk/middleware-ssec": "3.821.0", "@aws-sdk/middleware-user-agent": "3.835.0", "@aws-sdk/region-config-resolver": "3.821.0", "@aws-sdk/signature-v4-multi-region": "3.835.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@aws-sdk/util-user-agent-browser": "3.821.0", "@aws-sdk/util-user-agent-node": "3.835.0", "@aws-sdk/xml-builder": "3.821.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.5.3", "@smithy/eventstream-serde-browser": "^4.0.4", "@smithy/eventstream-serde-config-resolver": "^4.1.2", "@smithy/eventstream-serde-node": "^4.0.4", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/hash-blob-browser": "^4.0.4", "@smithy/hash-node": "^4.0.4", "@smithy/hash-stream-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/md5-js": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.12", "@smithy/middleware-retry": "^4.1.13", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.0.6", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.20", "@smithy/util-defaults-mode-node": "^4.0.20", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-stream": "^4.2.2", "@smithy/util-utf8": "^4.0.0", "@smithy/util-waiter": "^4.0.5", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-sBjPPG30HIfNwpzWuajCDf7agb4YAxPFFpsp3kwgptJF8PEi0HzQg64bskquMzjqLC2tXsn5rKtDVpQOvs29MQ=="], + "@aws-sdk/client-s3": ["@aws-sdk/client-s3@3.850.0", "", { "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/credential-provider-node": "3.848.0", "@aws-sdk/middleware-bucket-endpoint": "3.840.0", "@aws-sdk/middleware-expect-continue": "3.840.0", "@aws-sdk/middleware-flexible-checksums": "3.846.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-location-constraint": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-sdk-s3": "3.846.0", "@aws-sdk/middleware-ssec": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/signature-v4-multi-region": "3.846.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@aws-sdk/xml-builder": "3.821.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/eventstream-serde-browser": "^4.0.4", "@smithy/eventstream-serde-config-resolver": "^4.1.2", "@smithy/eventstream-serde-node": "^4.0.4", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-blob-browser": "^4.0.4", "@smithy/hash-node": "^4.0.4", "@smithy/hash-stream-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/md5-js": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-stream": "^4.2.3", "@smithy/util-utf8": "^4.0.0", "@smithy/util-waiter": "^4.0.6", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-tX5bUfqiLOh6jtAlaiAuOUKFYh8KDG9k9zFLUdgGplC5TP47AYTreUEg+deCTHo4DD3YCvrLuyZ8tIDgKu7neQ=="], - "@aws-sdk/client-securityhub": ["@aws-sdk/client-securityhub@3.835.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.835.0", "@aws-sdk/credential-provider-node": "3.835.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", "@aws-sdk/middleware-user-agent": "3.835.0", "@aws-sdk/region-config-resolver": "3.821.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@aws-sdk/util-user-agent-browser": "3.821.0", "@aws-sdk/util-user-agent-node": "3.835.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.5.3", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.12", "@smithy/middleware-retry": "^4.1.13", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.0.6", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.20", "@smithy/util-defaults-mode-node": "^4.0.20", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-B1k30XTVP3edrDuG2nzsiAt8BR0ZkeFVIQBkHVSYPucl6009ck6zLmuB9jH4FIiyES1ZqRRX/xWZMaa4xBKf2w=="], + "@aws-sdk/client-securityhub": ["@aws-sdk/client-securityhub@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/credential-provider-node": "3.848.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "@types/uuid": "^9.0.1", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-o7SJxPvtCF0KSdnBEvNfzHF8HKmYnSSUcp0tb6lvUOfl6xPej3Pt9DjUFwx0k2NfLw+8Do+jbGxbciHjK/9T+g=="], - "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.835.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.835.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", "@aws-sdk/middleware-user-agent": "3.835.0", "@aws-sdk/region-config-resolver": "3.821.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@aws-sdk/util-user-agent-browser": "3.821.0", "@aws-sdk/util-user-agent-node": "3.835.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.5.3", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.12", "@smithy/middleware-retry": "^4.1.13", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.0.6", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.20", "@smithy/util-defaults-mode-node": "^4.0.20", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-4J19IcBKU5vL8yw/YWEvbwEGcmCli0rpRyxG53v0K5/3weVPxVBbKfkWcjWVQ4qdxNz2uInfbTde4BRBFxWllQ=="], + "@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw=="], - "@aws-sdk/client-sts": ["@aws-sdk/client-sts@3.835.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.835.0", "@aws-sdk/credential-provider-node": "3.835.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", "@aws-sdk/middleware-user-agent": "3.835.0", "@aws-sdk/region-config-resolver": "3.821.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@aws-sdk/util-user-agent-browser": "3.821.0", "@aws-sdk/util-user-agent-node": "3.835.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.5.3", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.12", "@smithy/middleware-retry": "^4.1.13", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.0.6", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.20", "@smithy/util-defaults-mode-node": "^4.0.20", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-H1n8oCVPeKOY/3oRuPsoBUopp6jgrqiBfEPEETJK8uiY8jWLpkekj2Boa/hhLGKlXGDRDI/rZAOIE/5xTSSCQA=="], + "@aws-sdk/client-sts": ["@aws-sdk/client-sts@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/credential-provider-node": "3.848.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-NA0ODCELiO76LAi9/aanufPpX+YDAgpLFMkqJTwLVrBvtCMYsgGi/ttYzGKHdxgQljOBmGLu99fTDq5mbuY55g=="], - "@aws-sdk/core": ["@aws-sdk/core@3.835.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@aws-sdk/xml-builder": "3.821.0", "@smithy/core": "^3.5.3", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/signature-v4": "^5.1.2", "@smithy/smithy-client": "^4.4.4", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-utf8": "^4.0.0", "fast-xml-parser": "4.4.1", "tslib": "^2.6.2" } }, "sha512-7mnf4xbaLI8rkDa+w6fUU48dG6yDuOgLXEPe4Ut3SbMp1ceJBPMozNHbCwkiyHk3HpxZYf8eVy0wXhJMrxZq5w=="], + "@aws-sdk/core": ["@aws-sdk/core@3.846.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@aws-sdk/xml-builder": "3.821.0", "@smithy/core": "^3.7.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/signature-v4": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-utf8": "^4.0.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA=="], - "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.835.0", "", { "dependencies": { "@aws-sdk/core": "3.835.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-U9LFWe7+ephNyekpUbzT7o6SmJTmn6xkrPkE0D7pbLojnPVi/8SZKyjtgQGIsAv+2kFkOCqMOIYUKd/0pE7uew=="], + "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.846.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg=="], - "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.835.0", "", { "dependencies": { "@aws-sdk/core": "3.835.0", "@aws-sdk/types": "3.821.0", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/node-http-handler": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.4", "@smithy/types": "^4.3.1", "@smithy/util-stream": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-jCdNEsQklil7frDm/BuVKl4ubVoQHRbV6fnkOjmxAJz0/v7cR8JP0jBGlqKKzh3ROh5/vo1/5VUZbCTLpc9dSg=="], + "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.846.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", "@smithy/property-provider": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw=="], - "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.835.0", "", { "dependencies": { "@aws-sdk/core": "3.835.0", "@aws-sdk/credential-provider-env": "3.835.0", "@aws-sdk/credential-provider-http": "3.835.0", "@aws-sdk/credential-provider-process": "3.835.0", "@aws-sdk/credential-provider-sso": "3.835.0", "@aws-sdk/credential-provider-web-identity": "3.835.0", "@aws-sdk/nested-clients": "3.835.0", "@aws-sdk/types": "3.821.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-nqF6rYRAnJedmvDfrfKygzyeADcduDvtvn7GlbQQbXKeR2l7KnCdhuxHa0FALLvspkHiBx7NtInmvnd5IMuWsw=="], + "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/credential-provider-env": "3.846.0", "@aws-sdk/credential-provider-http": "3.846.0", "@aws-sdk/credential-provider-process": "3.846.0", "@aws-sdk/credential-provider-sso": "3.848.0", "@aws-sdk/credential-provider-web-identity": "3.848.0", "@aws-sdk/nested-clients": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw=="], - "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.835.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.835.0", "@aws-sdk/credential-provider-http": "3.835.0", "@aws-sdk/credential-provider-ini": "3.835.0", "@aws-sdk/credential-provider-process": "3.835.0", "@aws-sdk/credential-provider-sso": "3.835.0", "@aws-sdk/credential-provider-web-identity": "3.835.0", "@aws-sdk/types": "3.821.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-77B8elyZlaEd7vDYyCnYtVLuagIBwuJ0AQ98/36JMGrYX7TT8UVAhiDAfVe0NdUOMORvDNFfzL06VBm7wittYw=="], + "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.848.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.846.0", "@aws-sdk/credential-provider-http": "3.846.0", "@aws-sdk/credential-provider-ini": "3.848.0", "@aws-sdk/credential-provider-process": "3.846.0", "@aws-sdk/credential-provider-sso": "3.848.0", "@aws-sdk/credential-provider-web-identity": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g=="], - "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.835.0", "", { "dependencies": { "@aws-sdk/core": "3.835.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-qXkTt5pAhSi2Mp9GdgceZZFo/cFYrA735efqi/Re/nf0lpqBp8mRM8xv+iAaPHV4Q10q0DlkbEidT1DhxdT/+w=="], + "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.846.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg=="], - "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.835.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.835.0", "@aws-sdk/core": "3.835.0", "@aws-sdk/token-providers": "3.835.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-jAiEMryaPFXayYGszrc7NcgZA/zrrE3QvvvUBh/Udasg+9Qp5ZELdJCm/p98twNyY9n5i6Ex6VgvdxZ7+iEheQ=="], + "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.848.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.848.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/token-providers": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg=="], - "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.835.0", "", { "dependencies": { "@aws-sdk/core": "3.835.0", "@aws-sdk/nested-clients": "3.835.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-zfleEFXDLlcJ7cyfS4xSyCRpd8SVlYZfH3rp0pg2vPYKbnmXVE0r+gPIYXl4L+Yz4A2tizYl63nKCNdtbxadog=="], + "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/nested-clients": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw=="], - "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.830.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@aws-sdk/util-arn-parser": "3.804.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-ElVeCReZSH5Ds+/pkL5ebneJjuo8f49e9JXV1cYizuH0OAOQfYaBU9+M+7+rn61pTttOFE8W//qKzrXBBJhfMg=="], + "@aws-sdk/middleware-bucket-endpoint": ["@aws-sdk/middleware-bucket-endpoint@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@aws-sdk/util-arn-parser": "3.804.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-config-provider": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ=="], - "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-zAOoSZKe1njOrtynvK6ZORU57YGv5I7KP4+rwOvUN3ZhJbQ7QPf8gKtFUCYAPRMegaXCKF/ADPtDZBAmM+zZ9g=="], + "@aws-sdk/middleware-expect-continue": ["@aws-sdk/middleware-expect-continue@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw=="], - "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.835.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.835.0", "@aws-sdk/types": "3.821.0", "@smithy/is-array-buffer": "^4.0.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-middleware": "^4.0.4", "@smithy/util-stream": "^4.2.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-9ezorQYlr5cQY28zWAReFhNKUTaXsi3TMvXIagMRrSeWtQ7R6TCYnt91xzHRCmFR2kp3zLI+dfoeH+wF3iCKUw=="], + "@aws-sdk/middleware-flexible-checksums": ["@aws-sdk/middleware-flexible-checksums@3.846.0", "", { "dependencies": { "@aws-crypto/crc32": "5.2.0", "@aws-crypto/crc32c": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@smithy/is-array-buffer": "^4.0.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-middleware": "^4.0.4", "@smithy/util-stream": "^4.2.3", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-CdkeVfkwt3+bDLhmOwBxvkUf6oY9iUhvosaUnqkoPsOqIiUEN54yTGOnO8A0wLz6mMsZ6aBlfFrQhFnxt3c+yw=="], - "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-xSMR+sopSeWGx5/4pAGhhfMvGBHioVBbqGvDs6pG64xfNwM5vq5s5v6D04e2i+uSTj4qGa71dLUs5I0UzAK3sw=="], + "@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg=="], - "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-sKrm80k0t3R0on8aA/WhWFoMaAl4yvdk+riotmMElLUpcMcRXAd1+600uFVrxJqZdbrKQ0mjX0PjT68DlkYXLg=="], + "@aws-sdk/middleware-location-constraint": ["@aws-sdk/middleware-location-constraint@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-KVLD0u0YMF3aQkVF8bdyHAGWSUY6N1Du89htTLgqCcIhSxxAJ9qifrosVZ9jkAzqRW99hcufyt2LylcVU2yoKQ=="], - "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-0cvI0ipf2tGx7fXYEEN5fBeZDz2RnHyb9xftSgUsEq7NBxjV0yTZfLJw6Za5rjE6snC80dRN8+bTNR1tuG89zA=="], + "@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA=="], - "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-efmaifbhBoqKG3bAoEfDdcM8hn1psF+4qa7ykWuYmfmah59JBeqHLfz5W9m9JoTwoKPkFcVLWZxnyZzAnVBOIg=="], + "@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g=="], - "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.835.0", "", { "dependencies": { "@aws-sdk/core": "3.835.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-arn-parser": "3.804.0", "@smithy/core": "^3.5.3", "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/signature-v4": "^5.1.2", "@smithy/smithy-client": "^4.4.4", "@smithy/types": "^4.3.1", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-stream": "^4.2.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-oPebxpVf9smInHhevHh3APFZagGU+4RPwXEWv9YtYapFvsMq+8QXFvOfxfVZ/mwpe0JVG7EiJzL9/9Kobmts8Q=="], + "@aws-sdk/middleware-sdk-s3": ["@aws-sdk/middleware-sdk-s3@3.846.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-arn-parser": "3.804.0", "@smithy/core": "^3.7.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/signature-v4": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-stream": "^4.2.3", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-jP9x+2Q87J5l8FOP+jlAd7vGLn0cC6G9QGmf386e5OslBPqxXKcl3RjqGLIOKKos2mVItY3ApP5xdXQx7jGTVA=="], - "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-YYi1Hhr2AYiU/24cQc8HIB+SWbQo6FBkMYojVuz/zgrtkFmALxENGF/21OPg7f/QWd+eadZJRxCjmRwh5F2Cxg=="], + "@aws-sdk/middleware-ssec": ["@aws-sdk/middleware-ssec@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q=="], - "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.835.0", "", { "dependencies": { "@aws-sdk/core": "3.835.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@smithy/core": "^3.5.3", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-2gmAYygeE/gzhyF2XlkcbMLYFTbNfV61n+iCFa/ZofJHXYE+RxSyl5g4kujLEs7bVZHmjQZJXhprVSkGccq3/w=="], + "@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@smithy/core": "^3.7.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA=="], - "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.835.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.835.0", "@aws-sdk/middleware-host-header": "3.821.0", "@aws-sdk/middleware-logger": "3.821.0", "@aws-sdk/middleware-recursion-detection": "3.821.0", "@aws-sdk/middleware-user-agent": "3.835.0", "@aws-sdk/region-config-resolver": "3.821.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-endpoints": "3.828.0", "@aws-sdk/util-user-agent-browser": "3.821.0", "@aws-sdk/util-user-agent-node": "3.835.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.5.3", "@smithy/fetch-http-handler": "^5.0.4", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.12", "@smithy/middleware-retry": "^4.1.13", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.0.6", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.20", "@smithy/util-defaults-mode-node": "^4.0.20", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-UtmOO0U5QkicjCEv+B32qqRAnS7o2ZkZhC+i3ccH1h3fsfaBshpuuNBwOYAzRCRBeKW5fw3ANFrV/+2FTp4jWg=="], + "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg=="], - "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-t8og+lRCIIy5nlId0bScNpCkif8sc0LhmtaKsbm0ZPm3sCa/WhCbSZibjbZ28FNjVCV+p0D9RYZx0VDDbtWyjw=="], + "@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA=="], - "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.837.0", "", { "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.835.0", "@aws-sdk/types": "3.821.0", "@aws-sdk/util-format-url": "3.821.0", "@smithy/middleware-endpoint": "^4.1.12", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-h/D/cqeciBPGFSHIHRQm0q/CDvToV4rUoPef3tWzYtfoKzqfYaqRO175FnDv/4XgOYpdoqv6q36bx8KueVQ62w=="], + "@aws-sdk/s3-request-presigner": ["@aws-sdk/s3-request-presigner@3.850.0", "", { "dependencies": { "@aws-sdk/signature-v4-multi-region": "3.846.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-format-url": "3.840.0", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-eFvMUCJXoVTkAxkqHKn125mLMGtNa76+oD3wV97ScXUZuL5liaj+kAN9nSqRiQ5vaCz5gsOeB9t/ba/cTGATjg=="], - "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.835.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.835.0", "@aws-sdk/types": "3.821.0", "@smithy/protocol-http": "^5.1.2", "@smithy/signature-v4": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-rEtJH4dIwJYlXXe5rIH+uTCQmd2VIjuaoHlDY3Dr4nxF6po6U7vKsLfybIU2tgflGVqoqYQnXsfW/kj/Rh+/ow=="], + "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.846.0", "", { "dependencies": { "@aws-sdk/middleware-sdk-s3": "3.846.0", "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", "@smithy/signature-v4": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-ZMfIMxUljqZzPJGOcraC6erwq/z1puNMU35cO1a/WdhB+LdYknMn1lr7SJuH754QwNzzIlZbEgg4hoHw50+DpQ=="], - "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.835.0", "", { "dependencies": { "@aws-sdk/core": "3.835.0", "@aws-sdk/nested-clients": "3.835.0", "@aws-sdk/types": "3.821.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-zN1P3BE+Rv7w7q/CDA8VCQox6SE9QTn0vDtQ47AHA3eXZQQgYzBqgoLgJxR9rKKBIRGZqInJa/VRskLL95VliQ=="], + "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/nested-clients": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg=="], - "@aws-sdk/types": ["@aws-sdk/types@3.821.0", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA=="], + "@aws-sdk/types": ["@aws-sdk/types@3.840.0", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA=="], "@aws-sdk/util-arn-parser": ["@aws-sdk/util-arn-parser@3.804.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ=="], - "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.828.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/types": "^4.3.1", "@smithy/util-endpoints": "^3.0.6", "tslib": "^2.6.2" } }, "sha512-RvKch111SblqdkPzg3oCIdlGxlQs+k+P7Etory9FmxPHyPDvsP1j1c74PmgYqtzzMWmoXTjd+c9naUHh9xG8xg=="], + "@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.848.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-endpoints": "^3.0.6", "tslib": "^2.6.2" } }, "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww=="], - "@aws-sdk/util-format-url": ["@aws-sdk/util-format-url@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-h+xqmPToxDrZ0a7rxE1a8Oh4zpWfZe9oiQUphGtfiGFA6j75UiURH5J3MmGHa/G4t15I3iLLbYtUXxvb1i7evg=="], + "@aws-sdk/util-format-url": ["@aws-sdk/util-format-url@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-VB1PWyI1TQPiPvg4w7tgUGGQER1xxXPNUqfh3baxUSFi1Oh8wHrDnFywkxLm3NMmgDmnLnSZ5Q326qAoyqKLSg=="], "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.804.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A=="], - "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.821.0", "", { "dependencies": { "@aws-sdk/types": "3.821.0", "@smithy/types": "^4.3.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-irWZHyM0Jr1xhC+38OuZ7JB6OXMLPZlj48thElpsO1ZSLRkLZx5+I7VV6k3sp2yZ7BYbKz/G2ojSv4wdm7XTLw=="], + "@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ=="], - "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.835.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.835.0", "@aws-sdk/types": "3.821.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-gY63QZ4W5w9JYHYuqvUxiVGpn7IbCt1ODPQB0ZZwGGr3WRmK+yyZxCtFjbYhEQDQLgTWpf8YgVxgQLv2ps0PJg=="], + "@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.848.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw=="], "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.821.0", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA=="], "@azure/abort-controller": ["@azure/abort-controller@1.1.0", "", { "dependencies": { "tslib": "^2.2.0" } }, "sha512-TrRLIoSQVzfAJX9H1JeFjzAoDGcoK1IYX1UImfceTZpsyYfWr09Ss1aHW1y5TrrR3iq6RZLBwJ3E24uwPhwahw=="], - "@azure/core-auth": ["@azure/core-auth@1.9.0", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.11.0", "tslib": "^2.6.2" } }, "sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw=="], + "@azure/core-auth": ["@azure/core-auth@1.10.0", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-util": "^1.11.0", "tslib": "^2.6.2" } }, "sha512-88Djs5vBvGbHQHf5ZZcaoNHo6Y8BKZkt3cw2iuJIQzLEgH4Ox6Tm4hjFhbqOxyYsgIG/eJbFEHpxRIfEEWv5Ow=="], - "@azure/core-client": ["@azure/core-client@1.9.4", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-rest-pipeline": "^1.20.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", "tslib": "^2.6.2" } }, "sha512-f7IxTD15Qdux30s2qFARH+JxgwxWLG2Rlr4oSkPGuLWm+1p5y1+C04XGLA0vmX6EtqfutmjvpNmAfgwVIS5hpw=="], + "@azure/core-client": ["@azure/core-client@1.10.0", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.4.0", "@azure/core-rest-pipeline": "^1.20.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.6.1", "@azure/logger": "^1.0.0", "tslib": "^2.6.2" } }, "sha512-O4aP3CLFNodg8eTHXECaH3B3CjicfzkxVtnrfLkOq0XNP7TIECGfHpK/C6vADZkWP75wzmdBnsIA8ksuJMk18g=="], "@azure/core-http": ["@azure/core-http@3.0.5", "", { "dependencies": { "@azure/abort-controller": "^1.0.0", "@azure/core-auth": "^1.3.0", "@azure/core-tracing": "1.0.0-preview.13", "@azure/core-util": "^1.1.1", "@azure/logger": "^1.0.0", "@types/node-fetch": "^2.5.0", "@types/tunnel": "^0.0.3", "form-data": "^4.0.0", "node-fetch": "^2.6.7", "process": "^0.11.10", "tslib": "^2.2.0", "tunnel": "^0.0.6", "uuid": "^8.3.0", "xml2js": "^0.5.0" } }, "sha512-T8r2q/c3DxNu6mEJfPuJtptUVqwchxzjj32gKcnMi06rdiVONS9rar7kT9T2Am+XvER7uOzpsP79WsqNbdgdWg=="], - "@azure/core-rest-pipeline": ["@azure/core-rest-pipeline@1.21.0", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.8.0", "@azure/core-tracing": "^1.0.1", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", "@typespec/ts-http-runtime": "^0.2.3", "tslib": "^2.6.2" } }, "sha512-a4MBwe/5WKbq9MIxikzgxLBbruC5qlkFYlBdI7Ev50Y7ib5Vo/Jvt5jnJo7NaWeJ908LCHL0S1Us4UMf1VoTfg=="], + "@azure/core-rest-pipeline": ["@azure/core-rest-pipeline@1.22.0", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.8.0", "@azure/core-tracing": "^1.0.1", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-OKHmb3/Kpm06HypvB3g6Q3zJuvyXcpxDpCS1PnU8OV6AJgSFaee/covXBcPbWc6XDDxtEPlbi3EMQ6nUiPaQtw=="], - "@azure/core-tracing": ["@azure/core-tracing@1.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg=="], + "@azure/core-tracing": ["@azure/core-tracing@1.3.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-+XvmZLLWPe67WXNZo9Oc9CrPj/Tm8QnHR92fFAFdnbzwNdCH1h+7UdpaQgRSBsMY+oW1kHXNUZQLdZ1gHX3ROw=="], - "@azure/core-util": ["@azure/core-util@1.12.0", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@typespec/ts-http-runtime": "^0.2.2", "tslib": "^2.6.2" } }, "sha512-13IyjTQgABPARvG90+N2dXpC+hwp466XCdQXPCRlbWHgd3SJd5Q1VvaBGv6k1BIa4MQm6hAF1UBU1m8QUxV8sQ=="], + "@azure/core-util": ["@azure/core-util@1.13.0", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-o0psW8QWQ58fq3i24Q1K2XfS/jYTxr7O1HRcyUE9bV9NttLU+kYOH82Ixj8DGlMTOWgxm1Sss2QAfKK5UkSPxw=="], - "@azure/identity": ["@azure/identity@4.10.1", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.2", "@azure/core-rest-pipeline": "^1.17.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", "@azure/msal-browser": "^4.2.0", "@azure/msal-node": "^3.5.0", "open": "^10.1.0", "tslib": "^2.2.0" } }, "sha512-YM/z6RxRtFlXUH2egAYF/FDPes+MUE6ZoknjEdaq7ebJMMNUzn9zCJ3bd2ZZZlkP0r1xKa88kolhFH/FGV7JnA=="], + "@azure/identity": ["@azure/identity@4.10.2", "", { "dependencies": { "@azure/abort-controller": "^2.0.0", "@azure/core-auth": "^1.9.0", "@azure/core-client": "^1.9.2", "@azure/core-rest-pipeline": "^1.17.0", "@azure/core-tracing": "^1.0.0", "@azure/core-util": "^1.11.0", "@azure/logger": "^1.0.0", "@azure/msal-browser": "^4.2.0", "@azure/msal-node": "^3.5.0", "open": "^10.1.0", "tslib": "^2.2.0" } }, "sha512-Uth4vz0j+fkXCkbvutChUj03PDCokjbC6Wk9JT8hHEUtpy/EurNKAseb3+gO6Zi9VYBvwt61pgbzn1ovk942Qg=="], - "@azure/logger": ["@azure/logger@1.2.0", "", { "dependencies": { "@typespec/ts-http-runtime": "^0.2.2", "tslib": "^2.6.2" } }, "sha512-0hKEzLhpw+ZTAfNJyRrn6s+V0nDWzXk9OjBr2TiGIu0OfMr5s2V4FpKLTAK3Ca5r5OKLbf4hkOGDPyiRjie/jA=="], + "@azure/logger": ["@azure/logger@1.3.0", "", { "dependencies": { "@typespec/ts-http-runtime": "^0.3.0", "tslib": "^2.6.2" } }, "sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA=="], - "@azure/msal-browser": ["@azure/msal-browser@4.13.2", "", { "dependencies": { "@azure/msal-common": "15.7.1" } }, "sha512-lS75bF6FYZRwsacKLXc8UYu/jb+gOB7dtZq5938chCvV/zKTFDnzuXxCXhsSUh0p8s/P8ztgbfdueD9lFARQlQ=="], + "@azure/msal-browser": ["@azure/msal-browser@4.15.0", "", { "dependencies": { "@azure/msal-common": "15.8.1" } }, "sha512-+AIGTvpVz+FIx5CsM1y+nW0r/qOb/ChRdM8/Cbp+jKWC0Wdw4ldnwPdYOBi5NaALUQnYITirD9XMZX7LdklEzQ=="], - "@azure/msal-common": ["@azure/msal-common@15.7.1", "", {}, "sha512-a0eowoYfRfKZEjbiCoA5bPT3IlWRAdGSvi63OU23Hv+X6EI8gbvXCoeqokUceFMoT9NfRUWTJSx5FiuzruqT8g=="], + "@azure/msal-common": ["@azure/msal-common@15.8.1", "", {}, "sha512-ltIlFK5VxeJ5BurE25OsJIfcx1Q3H/IZg2LjV9d4vmH+5t4c1UCyRQ/HgKLgXuCZShs7qfc/TC95GYZfsUsJUQ=="], - "@azure/msal-node": ["@azure/msal-node@3.6.1", "", { "dependencies": { "@azure/msal-common": "15.7.1", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" } }, "sha512-ctcVz4xS+st5KxOlQqgpvA+uDFAa59CvkmumnuhlD2XmNczloKBdCiMQG7/TigSlaeHe01qoOlDjz3TyUAmKUg=="], + "@azure/msal-node": ["@azure/msal-node@3.6.3", "", { "dependencies": { "@azure/msal-common": "15.8.1", "jsonwebtoken": "^9.0.0", "uuid": "^8.3.0" } }, "sha512-95wjsKGyUcAd5tFmQBo5Ug/kOj+hFh/8FsXuxluEvdfbgg6xCimhSP9qnyq6+xIg78/jREkBD1/BSqd7NIDDYQ=="], "@babel/code-frame": ["@babel/code-frame@7.27.1", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg=="], - "@babel/compat-data": ["@babel/compat-data@7.27.7", "", {}, "sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ=="], + "@babel/compat-data": ["@babel/compat-data@7.28.0", "", {}, "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw=="], - "@babel/core": ["@babel/core@7.27.7", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.5", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", "@babel/parser": "^7.27.7", "@babel/template": "^7.27.2", "@babel/traverse": "^7.27.7", "@babel/types": "^7.27.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w=="], + "@babel/core": ["@babel/core@7.28.0", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-compilation-targets": "^7.27.2", "@babel/helper-module-transforms": "^7.27.3", "@babel/helpers": "^7.27.6", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/traverse": "^7.28.0", "@babel/types": "^7.28.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ=="], - "@babel/generator": ["@babel/generator@7.27.5", "", { "dependencies": { "@babel/parser": "^7.27.5", "@babel/types": "^7.27.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw=="], + "@babel/generator": ["@babel/generator@7.28.0", "", { "dependencies": { "@babel/parser": "^7.28.0", "@babel/types": "^7.28.0", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg=="], "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.27.2", "", { "dependencies": { "@babel/compat-data": "^7.27.2", "@babel/helper-validator-option": "^7.27.1", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ=="], + "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.27.1", "", { "dependencies": { "@babel/traverse": "^7.27.1", "@babel/types": "^7.27.1" } }, "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w=="], "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.27.3", "", { "dependencies": { "@babel/helper-module-imports": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1", "@babel/traverse": "^7.27.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg=="], @@ -615,7 +617,7 @@ "@babel/helpers": ["@babel/helpers@7.27.6", "", { "dependencies": { "@babel/template": "^7.27.2", "@babel/types": "^7.27.6" } }, "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug=="], - "@babel/parser": ["@babel/parser@7.27.7", "", { "dependencies": { "@babel/types": "^7.27.7" }, "bin": "./bin/babel-parser.js" }, "sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q=="], + "@babel/parser": ["@babel/parser@7.28.0", "", { "dependencies": { "@babel/types": "^7.28.0" }, "bin": "./bin/babel-parser.js" }, "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g=="], "@babel/plugin-transform-react-jsx-self": ["@babel/plugin-transform-react-jsx-self@7.27.1", "", { "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw=="], @@ -625,9 +627,9 @@ "@babel/template": ["@babel/template@7.27.2", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/parser": "^7.27.2", "@babel/types": "^7.27.1" } }, "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw=="], - "@babel/traverse": ["@babel/traverse@7.27.7", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.27.5", "@babel/parser": "^7.27.7", "@babel/template": "^7.27.2", "@babel/types": "^7.27.7", "debug": "^4.3.1", "globals": "^11.1.0" } }, "sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw=="], + "@babel/traverse": ["@babel/traverse@7.28.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.0", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.0", "@babel/template": "^7.27.2", "@babel/types": "^7.28.0", "debug": "^4.3.1" } }, "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg=="], - "@babel/types": ["@babel/types@7.27.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw=="], + "@babel/types": ["@babel/types@7.28.1", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.27.1" } }, "sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ=="], "@better-auth/utils": ["@better-auth/utils@0.2.5", "", { "dependencies": { "typescript": "^5.8.2", "uncrypto": "^0.1.3" } }, "sha512-uI2+/8h/zVsH8RrYdG8eUErbuGBk16rZKQfz8CjxQOyCE6v7BqFYEbFwvOkvl1KbUdxhqOnXp78+uE5h8qVEgQ=="], @@ -635,7 +637,7 @@ "@browserbasehq/sdk": ["@browserbasehq/sdk@2.6.0", "", { "dependencies": { "@types/node": "^18.11.18", "@types/node-fetch": "^2.6.4", "abort-controller": "^3.0.0", "agentkeepalive": "^4.2.1", "form-data-encoder": "1.7.2", "formdata-node": "^4.3.2", "node-fetch": "^2.6.7" } }, "sha512-83iXP5D7xMm8Wyn66TUaUrgoByCmAJuoMoZQI3sGg3JAiMlTfnCIMqyVBoNSaItaPIkaCnrsj6LiusmXV2X9YA=="], - "@calcom/atoms": ["@calcom/atoms@1.0.106", "", { "dependencies": { "@radix-ui/react-dialog-atoms": "npm:@radix-ui/react-dialog@^1.0.4", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-switch": "^1.1.0", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip-atoms": "npm:@radix-ui/react-tooltip@^1.0.0", "@tanstack/react-query": "^5.17.15", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "dompurify": "^3.2.3", "marked": "^15.0.3", "react-use": "^17.4.2", "tailwind-merge": "^1.13.2", "tailwindcss": "^3.3.3", "tailwindcss-animate": "^1.0.6" }, "peerDependencies": { "react": ">=18.0.0", "typescript": ">=5.4.5" } }, "sha512-NbczWTH1hvweDpNyrkldwP7QVxMqeAaBhmY2wpFyhs/DlBXM8F5w8UffYQt5LAiZtShQjOwy9BBdjNYFs++cIg=="], + "@calcom/atoms": ["@calcom/atoms@1.1.1", "", { "dependencies": { "@radix-ui/react-dialog-atoms": "npm:@radix-ui/react-dialog@^1.0.4", "@radix-ui/react-slot": "^1.0.2", "@radix-ui/react-switch": "^1.1.0", "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip-atoms": "npm:@radix-ui/react-tooltip@^1.0.0", "@tanstack/react-query": "^5.17.15", "class-variance-authority": "^0.7.0", "clsx": "^2.0.0", "dompurify": "^3.2.3", "marked": "^15.0.3", "react-use": "^17.4.2", "tailwind-merge": "^1.13.2", "tailwindcss": "^3.3.3", "tailwindcss-animate": "^1.0.6" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "typescript": "^5.0.0" } }, "sha512-cq0HAUzkaiXw5tT/5bUozj4o83swg8GDCeEeKgtu9e7yjFJ9YqWRz+OVFc5andX1pUzmbkUpuH1hGxIziSFxaQ=="], "@calcom/embed-core": ["@calcom/embed-core@1.5.3", "", {}, "sha512-GeId9gaByJ5EWiPmuvelZOvFWPOTWkcWZr5vGTCbIUTX125oE5yn0n8lDF1MJk5Xj1WO+/dk9jKIE08Ad9ytiQ=="], @@ -755,11 +757,11 @@ "@electric-sql/client": ["@electric-sql/client@1.0.0-beta.1", "", { "optionalDependencies": { "@rollup/rollup-darwin-arm64": "^4.18.1" } }, "sha512-Ei9jN3pDoGzc+a/bGqnB5ajb52IvSv7/n2btuyzUlcOHIR2kM9fqtYTJXPwZYKLkGZlHWlpHgWyRtrinkP2nHg=="], - "@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + "@emnapi/core": ["@emnapi/core@1.4.5", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.4", "tslib": "^2.4.0" } }, "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q=="], - "@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + "@emnapi/runtime": ["@emnapi/runtime@1.4.5", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.4", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g=="], "@emotion/babel-plugin": ["@emotion/babel-plugin@11.13.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", "stylis": "4.2.0" } }, "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ=="], @@ -783,81 +785,83 @@ "@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="], - "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.5", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.25.8", "", { "os": "aix", "cpu": "ppc64" }, "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA=="], + + "@esbuild/android-arm": ["@esbuild/android-arm@0.25.8", "", { "os": "android", "cpu": "arm" }, "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw=="], - "@esbuild/android-arm": ["@esbuild/android-arm@0.25.5", "", { "os": "android", "cpu": "arm" }, "sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.8", "", { "os": "android", "cpu": "arm64" }, "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w=="], - "@esbuild/android-arm64": ["@esbuild/android-arm64@0.25.5", "", { "os": "android", "cpu": "arm64" }, "sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.25.8", "", { "os": "android", "cpu": "x64" }, "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA=="], - "@esbuild/android-x64": ["@esbuild/android-x64@0.25.5", "", { "os": "android", "cpu": "x64" }, "sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.8", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw=="], - "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.25.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ=="], + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.8", "", { "os": "darwin", "cpu": "x64" }, "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg=="], - "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.25.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ=="], + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.8", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA=="], - "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.25.5", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw=="], + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.8", "", { "os": "freebsd", "cpu": "x64" }, "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw=="], - "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.25.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw=="], + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.8", "", { "os": "linux", "cpu": "arm" }, "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg=="], - "@esbuild/linux-arm": ["@esbuild/linux-arm@0.25.5", "", { "os": "linux", "cpu": "arm" }, "sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw=="], + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.8", "", { "os": "linux", "cpu": "arm64" }, "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w=="], - "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.25.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.8", "", { "os": "linux", "cpu": "ia32" }, "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg=="], - "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.25.5", "", { "os": "linux", "cpu": "ia32" }, "sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ=="], - "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw=="], - "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.8", "", { "os": "linux", "cpu": "ppc64" }, "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ=="], - "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.25.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.8", "", { "os": "linux", "cpu": "none" }, "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg=="], - "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.25.5", "", { "os": "linux", "cpu": "none" }, "sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.8", "", { "os": "linux", "cpu": "s390x" }, "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg=="], - "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.25.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.8", "", { "os": "linux", "cpu": "x64" }, "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ=="], - "@esbuild/linux-x64": ["@esbuild/linux-x64@0.25.5", "", { "os": "linux", "cpu": "x64" }, "sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.8", "", { "os": "none", "cpu": "arm64" }, "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw=="], - "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.25.5", "", { "os": "none", "cpu": "arm64" }, "sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.8", "", { "os": "none", "cpu": "x64" }, "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg=="], - "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.25.5", "", { "os": "none", "cpu": "x64" }, "sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.8", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ=="], - "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.25.5", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.8", "", { "os": "openbsd", "cpu": "x64" }, "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ=="], - "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.25.5", "", { "os": "openbsd", "cpu": "x64" }, "sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.25.8", "", { "os": "none", "cpu": "arm64" }, "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg=="], - "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.5", "", { "os": "sunos", "cpu": "x64" }, "sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.25.8", "", { "os": "sunos", "cpu": "x64" }, "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w=="], - "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.25.8", "", { "os": "win32", "cpu": "arm64" }, "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ=="], - "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.5", "", { "os": "win32", "cpu": "ia32" }, "sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.25.8", "", { "os": "win32", "cpu": "ia32" }, "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg=="], - "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.5", "", { "os": "win32", "cpu": "x64" }, "sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.25.8", "", { "os": "win32", "cpu": "x64" }, "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw=="], "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.1", "", {}, "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ=="], - "@eslint/config-array": ["@eslint/config-array@0.20.1", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw=="], + "@eslint/config-array": ["@eslint/config-array@0.21.0", "", { "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ=="], - "@eslint/config-helpers": ["@eslint/config-helpers@0.2.3", "", {}, "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg=="], + "@eslint/config-helpers": ["@eslint/config-helpers@0.3.0", "", {}, "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw=="], - "@eslint/core": ["@eslint/core@0.14.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg=="], + "@eslint/core": ["@eslint/core@0.15.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA=="], "@eslint/eslintrc": ["@eslint/eslintrc@3.3.1", "", { "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" } }, "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ=="], - "@eslint/js": ["@eslint/js@9.29.0", "", {}, "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ=="], + "@eslint/js": ["@eslint/js@9.31.0", "", {}, "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.6", "", {}, "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA=="], - "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.3", "", { "dependencies": { "@eslint/core": "^0.15.1", "levn": "^0.4.1" } }, "sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag=="], + "@eslint/plugin-kit": ["@eslint/plugin-kit@0.3.4", "", { "dependencies": { "@eslint/core": "^0.15.1", "levn": "^0.4.1" } }, "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw=="], - "@floating-ui/core": ["@floating-ui/core@1.7.1", "", { "dependencies": { "@floating-ui/utils": "^0.2.9" } }, "sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw=="], + "@floating-ui/core": ["@floating-ui/core@1.7.2", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw=="], - "@floating-ui/dom": ["@floating-ui/dom@1.7.1", "", { "dependencies": { "@floating-ui/core": "^1.7.1", "@floating-ui/utils": "^0.2.9" } }, "sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ=="], + "@floating-ui/dom": ["@floating-ui/dom@1.7.2", "", { "dependencies": { "@floating-ui/core": "^1.7.2", "@floating-ui/utils": "^0.2.10" } }, "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA=="], - "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.3", "", { "dependencies": { "@floating-ui/dom": "^1.0.0" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA=="], + "@floating-ui/react-dom": ["@floating-ui/react-dom@2.1.4", "", { "dependencies": { "@floating-ui/dom": "^1.7.2" }, "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw=="], - "@floating-ui/utils": ["@floating-ui/utils@0.2.9", "", {}, "sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg=="], + "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], "@google-cloud/precise-date": ["@google-cloud/precise-date@4.0.0", "", {}, "sha512-1TUx3KdaU3cN7nfCdNf+UVqA/PSX29Cjcox3fZZBtINlRrXVTmUkQnCKv2MbBUbCopbK4olAT1IHl76uZyCiVA=="], @@ -877,47 +881,49 @@ "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.1.0" }, "os": "darwin", "cpu": "arm64" }, "sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg=="], + "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.3", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.0" }, "os": "darwin", "cpu": "arm64" }, "sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg=="], - "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.1.0" }, "os": "darwin", "cpu": "x64" }, "sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g=="], + "@img/sharp-darwin-x64": ["@img/sharp-darwin-x64@0.34.3", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.0" }, "os": "darwin", "cpu": "x64" }, "sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA=="], - "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.1.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA=="], + "@img/sharp-libvips-darwin-arm64": ["@img/sharp-libvips-darwin-arm64@1.2.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ=="], - "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.1.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ=="], + "@img/sharp-libvips-darwin-x64": ["@img/sharp-libvips-darwin-x64@1.2.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg=="], - "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.1.0", "", { "os": "linux", "cpu": "arm" }, "sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA=="], + "@img/sharp-libvips-linux-arm": ["@img/sharp-libvips-linux-arm@1.2.0", "", { "os": "linux", "cpu": "arm" }, "sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw=="], - "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew=="], + "@img/sharp-libvips-linux-arm64": ["@img/sharp-libvips-linux-arm64@1.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA=="], - "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.1.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ=="], + "@img/sharp-libvips-linux-ppc64": ["@img/sharp-libvips-linux-ppc64@1.2.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ=="], - "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.1.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA=="], + "@img/sharp-libvips-linux-s390x": ["@img/sharp-libvips-linux-s390x@1.2.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw=="], - "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q=="], + "@img/sharp-libvips-linux-x64": ["@img/sharp-libvips-linux-x64@1.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg=="], - "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.1.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w=="], + "@img/sharp-libvips-linuxmusl-arm64": ["@img/sharp-libvips-linuxmusl-arm64@1.2.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q=="], - "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.1.0", "", { "os": "linux", "cpu": "x64" }, "sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A=="], + "@img/sharp-libvips-linuxmusl-x64": ["@img/sharp-libvips-linuxmusl-x64@1.2.0", "", { "os": "linux", "cpu": "x64" }, "sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q=="], - "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.1.0" }, "os": "linux", "cpu": "arm" }, "sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ=="], + "@img/sharp-linux-arm": ["@img/sharp-linux-arm@0.34.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.0" }, "os": "linux", "cpu": "arm" }, "sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A=="], - "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q=="], + "@img/sharp-linux-arm64": ["@img/sharp-linux-arm64@0.34.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.0" }, "os": "linux", "cpu": "arm64" }, "sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA=="], - "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.1.0" }, "os": "linux", "cpu": "s390x" }, "sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw=="], + "@img/sharp-linux-ppc64": ["@img/sharp-linux-ppc64@0.34.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.0" }, "os": "linux", "cpu": "ppc64" }, "sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA=="], - "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ=="], + "@img/sharp-linux-s390x": ["@img/sharp-linux-s390x@0.34.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.0" }, "os": "linux", "cpu": "s390x" }, "sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ=="], - "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.1.0" }, "os": "linux", "cpu": "arm64" }, "sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA=="], + "@img/sharp-linux-x64": ["@img/sharp-linux-x64@0.34.3", "", { "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.0" }, "os": "linux", "cpu": "x64" }, "sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ=="], - "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.2", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.1.0" }, "os": "linux", "cpu": "x64" }, "sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA=="], + "@img/sharp-linuxmusl-arm64": ["@img/sharp-linuxmusl-arm64@0.34.3", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.0" }, "os": "linux", "cpu": "arm64" }, "sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ=="], - "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.2", "", { "dependencies": { "@emnapi/runtime": "^1.4.3" }, "cpu": "none" }, "sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ=="], + "@img/sharp-linuxmusl-x64": ["@img/sharp-linuxmusl-x64@0.34.3", "", { "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.0" }, "os": "linux", "cpu": "x64" }, "sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ=="], - "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ=="], + "@img/sharp-wasm32": ["@img/sharp-wasm32@0.34.3", "", { "dependencies": { "@emnapi/runtime": "^1.4.4" }, "cpu": "none" }, "sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg=="], - "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw=="], + "@img/sharp-win32-arm64": ["@img/sharp-win32-arm64@0.34.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ=="], - "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.2", "", { "os": "win32", "cpu": "x64" }, "sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw=="], + "@img/sharp-win32-ia32": ["@img/sharp-win32-ia32@0.34.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw=="], + + "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.3", "", { "os": "win32", "cpu": "x64" }, "sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g=="], "@isaacs/balanced-match": ["@isaacs/balanced-match@4.0.1", "", {}, "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ=="], @@ -929,13 +935,11 @@ "@isaacs/string-locale-compare": ["@isaacs/string-locale-compare@1.1.0", "", {}, "sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ=="], - "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.8", "", { "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA=="], + "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.12", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg=="], "@jridgewell/resolve-uri": ["@jridgewell/resolve-uri@3.1.2", "", {}, "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw=="], - "@jridgewell/set-array": ["@jridgewell/set-array@1.2.1", "", {}, "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A=="], - - "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.0", "", {}, "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="], + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.4", "", {}, "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw=="], "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.9", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ=="], @@ -947,13 +951,13 @@ "@logdna/tail-file": ["@logdna/tail-file@2.2.0", "", {}, "sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng=="], - "@lottiefiles/dotlottie-react": ["@lottiefiles/dotlottie-react@0.14.2", "", { "dependencies": { "@lottiefiles/dotlottie-web": "0.47.0" }, "peerDependencies": { "react": "^17 || ^18 || ^19" } }, "sha512-RR4r0HrKQbOAw6iS6C3mRARS2iu+yI+G1vICoUsRMHzlUUk1/26l3WyAjhcG+KoaGoKmORx8FgHjTNr4Sr/2Ug=="], + "@lottiefiles/dotlottie-react": ["@lottiefiles/dotlottie-react@0.14.3", "", { "dependencies": { "@lottiefiles/dotlottie-web": "0.48.0" }, "peerDependencies": { "react": "^17 || ^18 || ^19" } }, "sha512-O917vzFmacyC/F1NM2CLBsHqCMUBPiyI9Vw0o3ZohbZzRJYbgHPhdOpL83wE3zWs9VNr0JSbmJrkkUwaQizTWQ=="], - "@lottiefiles/dotlottie-web": ["@lottiefiles/dotlottie-web@0.47.0", "", {}, "sha512-YN6wSB4iYZBYEAFKEs/taufrPH3rfNlUA632Ib61WoR58TALAJ1ZX8yDIGUBT28byMJhZR4+xdpRX4v7X8OeBQ=="], + "@lottiefiles/dotlottie-web": ["@lottiefiles/dotlottie-web@0.48.0", "", {}, "sha512-gcS6/3NYcpD2VUi2413wrZmdNLPbtwPaXqoFBqioLW/GsI/oTpTqmunsliRb4BL1ECLAUu0YOzHyK73UXMHrRg=="], "@mediapipe/tasks-vision": ["@mediapipe/tasks-vision@0.10.17", "", {}, "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg=="], - "@mendable/firecrawl-js": ["@mendable/firecrawl-js@1.27.0", "", { "dependencies": { "axios": "^1.6.8", "typescript-event-target": "^1.1.1", "zod": "^3.23.8", "zod-to-json-schema": "^3.23.0" } }, "sha512-Wm/9UTe1AjIeh/kwufXtoziL2JH0jQMcQ+HwsZkOiZCBPiCjykPNCneCQjfyem6aBC5n4j38ZrXSRvSl1owPeA=="], + "@mendable/firecrawl-js": ["@mendable/firecrawl-js@1.29.1", "", { "dependencies": { "axios": "^1.6.8", "typescript-event-target": "^1.1.1", "zod": "^3.23.8", "zod-to-json-schema": "^3.23.0" } }, "sha512-w7mXja6hSNL6li7BHgY6LQLnBJ9RIxWkmZ16y2MCOr3w6MlR7k2ZcTxro6vEJrUoshhyoOqhcFCyD1P0ckBuRw=="], "@monogrid/gainmap-js": ["@monogrid/gainmap-js@3.1.0", "", { "dependencies": { "promise-worker-transferable": "^1.0.4" }, "peerDependencies": { "three": ">= 0.159.0" } }, "sha512-Obb0/gEd/HReTlg8ttaYk+0m62gQJmCblMOjHSMHRrBP2zdfKMHLCRbh/6ex9fSUJMKdjjIEiohwkbGD3wj2Nw=="], @@ -973,7 +977,7 @@ "@nangohq/types": ["@nangohq/types@0.53.2", "", { "dependencies": { "axios": "^1.7.9", "json-schema": "0.4.0", "type-fest": "4.32.0" } }, "sha512-G7oC4QsJrmLjAWQmvB7gY8hE0UMr8PofAY/pPsk/0sHIM1YWeealBI7RiPeN4UluArT7w+OoUvMQd+jtrTh9Lw=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" } }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], "@next/env": ["@next/env@15.4.0-canary.85", "", {}, "sha512-9WnWqH1DU6qAlEJUzQyT8L0TkpzKa6UQ/zYNB9fCUnvnkEkLo2OP8+CobpWzpRhOuyWkbPz5VmX15WZFfsDGkA=="], @@ -995,7 +999,7 @@ "@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.4.0-canary.85", "", { "os": "win32", "cpu": "x64" }, "sha512-nYHH5JH347B9ZdcKRIi8xhUnum9bjMRLL3f2ozKp942U1yucQn9N67HGhWDXHW0dy2Hzx2Em+PhlWTHe2vztSQ=="], - "@next/third-parties": ["@next/third-parties@15.3.4", "", { "dependencies": { "third-party-capital": "1.0.20" }, "peerDependencies": { "next": "^13.0.0 || ^14.0.0 || ^15.0.0", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0" } }, "sha512-jOvAsd0Yoq/eZ3/M+X/y/539/M6Up2xPE/aOr23CGXKinhfK2kscGP4uhtwlS0FZyHvU7ud9HTTt7G3D5G5BkA=="], + "@next/third-parties": ["@next/third-parties@15.4.3", "", { "dependencies": { "third-party-capital": "1.0.20" }, "peerDependencies": { "next": "^13.0.0 || ^14.0.0 || ^15.0.0", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0" } }, "sha512-9eczO97h3CF4ihYi5gulJ7MjugFlRIMiPcCcbc/1DQ2H5Tv3dy1Gcfqbtsa4O4/6tRGE4R900XKzS7FC/A3WdQ=="], "@noble/ciphers": ["@noble/ciphers@0.6.0", "", {}, "sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ=="], @@ -1041,7 +1045,7 @@ "@octokit/auth-token": ["@octokit/auth-token@6.0.0", "", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="], - "@octokit/core": ["@octokit/core@7.0.2", "", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.1", "@octokit/request": "^10.0.2", "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-ODsoD39Lq6vR6aBgvjTnA3nZGliknKboc9Gtxr7E4WDNqY24MxANKcuDQSF0jzapvGb3KWOEDrKfve4HoWGK+g=="], + "@octokit/core": ["@octokit/core@7.0.3", "", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.1", "@octokit/request": "^10.0.2", "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ=="], "@octokit/endpoint": ["@octokit/endpoint@11.0.0", "", { "dependencies": { "@octokit/types": "^14.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-hoYicJZaqISMAI3JfaDr1qMNi48OctWuOih1m80bkYow/ayPw6Jj52tqWJ6GEoFTk1gBqfanSoI1iY99Z5+ekQ=="], @@ -1049,7 +1053,7 @@ "@octokit/openapi-types": ["@octokit/openapi-types@25.1.0", "", {}, "sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA=="], - "@octokit/plugin-paginate-rest": ["@octokit/plugin-paginate-rest@13.1.0", "", { "dependencies": { "@octokit/types": "^14.1.0" }, "peerDependencies": { "@octokit/core": ">=6" } }, "sha512-16iNOa4rTTjaWtfsPGJcYYL79FJakseX8TQFIPfVuSPC3s5nkS/DSNQPFPc5lJHgEDBWNMxSApHrEymNblhA9w=="], + "@octokit/plugin-paginate-rest": ["@octokit/plugin-paginate-rest@13.1.1", "", { "dependencies": { "@octokit/types": "^14.1.0" }, "peerDependencies": { "@octokit/core": ">=6" } }, "sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw=="], "@octokit/plugin-retry": ["@octokit/plugin-retry@8.0.1", "", { "dependencies": { "@octokit/request-error": "^7.0.0", "@octokit/types": "^14.0.0", "bottleneck": "^2.15.3" }, "peerDependencies": { "@octokit/core": ">=7" } }, "sha512-KUoYR77BjF5O3zcwDQHRRZsUvJwepobeqiSSdCJ8lWt27FZExzb0GgVxrhhfuyF6z2B2zpO0hN5pteni1sqWiw=="], @@ -1135,23 +1139,23 @@ "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.1", "", { "os": "win32", "cpu": "x64" }, "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA=="], - "@peculiar/asn1-android": ["@peculiar/asn1-android@2.3.16", "", { "dependencies": { "@peculiar/asn1-schema": "^2.3.15", "asn1js": "^3.0.5", "tslib": "^2.8.1" } }, "sha512-a1viIv3bIahXNssrOIkXZIlI2ePpZaNmR30d4aBL99mu2rO+mT9D6zBsp7H6eROWGtmwv0Ionp5olJurIo09dw=="], + "@peculiar/asn1-android": ["@peculiar/asn1-android@2.4.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.4.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-YFueREq97CLslZZBI8dKzis7jMfEHSLxM+nr0Zdx1POiXFLjqqwoY5s0F1UimdBiEw/iKlHey2m56MRDv7Jtyg=="], - "@peculiar/asn1-ecc": ["@peculiar/asn1-ecc@2.3.15", "", { "dependencies": { "@peculiar/asn1-schema": "^2.3.15", "@peculiar/asn1-x509": "^2.3.15", "asn1js": "^3.0.5", "tslib": "^2.8.1" } }, "sha512-/HtR91dvgog7z/WhCVdxZJ/jitJuIu8iTqiyWVgRE9Ac5imt2sT/E4obqIVGKQw7PIy+X6i8lVBoT6wC73XUgA=="], + "@peculiar/asn1-ecc": ["@peculiar/asn1-ecc@2.4.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.4.0", "@peculiar/asn1-x509": "^2.4.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-fJiYUBCJBDkjh347zZe5H81BdJ0+OGIg0X9z06v8xXUoql3MFeENUX0JsjCaVaU9A0L85PefLPGYkIoGpTnXLQ=="], - "@peculiar/asn1-rsa": ["@peculiar/asn1-rsa@2.3.15", "", { "dependencies": { "@peculiar/asn1-schema": "^2.3.15", "@peculiar/asn1-x509": "^2.3.15", "asn1js": "^3.0.5", "tslib": "^2.8.1" } }, "sha512-p6hsanvPhexRtYSOHihLvUUgrJ8y0FtOM97N5UEpC+VifFYyZa0iZ5cXjTkZoDwxJ/TTJ1IJo3HVTB2JJTpXvg=="], + "@peculiar/asn1-rsa": ["@peculiar/asn1-rsa@2.4.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.4.0", "@peculiar/asn1-x509": "^2.4.0", "asn1js": "^3.0.6", "tslib": "^2.8.1" } }, "sha512-6PP75voaEnOSlWR9sD25iCQyLgFZHXbmxvUfnnDcfL6Zh5h2iHW38+bve4LfH7a60x7fkhZZNmiYqAlAff9Img=="], - "@peculiar/asn1-schema": ["@peculiar/asn1-schema@2.3.15", "", { "dependencies": { "asn1js": "^3.0.5", "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w=="], + "@peculiar/asn1-schema": ["@peculiar/asn1-schema@2.4.0", "", { "dependencies": { "asn1js": "^3.0.6", "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "sha512-umbembjIWOrPSOzEGG5vxFLkeM8kzIhLkgigtsOrfLKnuzxWxejAcUX+q/SoZCdemlODOcr5WiYa7+dIEzBXZQ=="], - "@peculiar/asn1-x509": ["@peculiar/asn1-x509@2.3.15", "", { "dependencies": { "@peculiar/asn1-schema": "^2.3.15", "asn1js": "^3.0.5", "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "sha512-0dK5xqTqSLaxv1FHXIcd4Q/BZNuopg+u1l23hT9rOmQ1g4dNtw0g/RnEi+TboB0gOwGtrWn269v27cMgchFIIg=="], + "@peculiar/asn1-x509": ["@peculiar/asn1-x509@2.4.0", "", { "dependencies": { "@peculiar/asn1-schema": "^2.4.0", "asn1js": "^3.0.6", "pvtsutils": "^1.3.6", "tslib": "^2.8.1" } }, "sha512-F7mIZY2Eao2TaoVqigGMLv+NDdpwuBKU1fucHPONfzaBS4JXXCNCmfO0Z3dsy7JzKGqtDcYC1mr9JjaZQZNiuw=="], "@pkgjs/parseargs": ["@pkgjs/parseargs@0.11.0", "", {}, "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg=="], - "@playwright/experimental-ct-core": ["@playwright/experimental-ct-core@1.53.1", "", { "dependencies": { "playwright": "1.53.1", "playwright-core": "1.53.1", "vite": "^6.3.4" } }, "sha512-3edf/JF1Fnziq+++XJpH20nbU26yQfGBDT2KfTlYoPdEcVWBf3JIHfRNKsF9KXIFmrzYsBtFnJ/Tkzm7dWLzeA=="], + "@playwright/experimental-ct-core": ["@playwright/experimental-ct-core@1.54.1", "", { "dependencies": { "playwright": "1.54.1", "playwright-core": "1.54.1", "vite": "^6.3.4" } }, "sha512-iwFdf95m9RCze47jv4hVbg3tDtsh3GFU1StiLludrPStHlZOtDj9/0GImTKrRmXHQCDcQRmQ9HZfJuGGxlWM3g=="], - "@playwright/experimental-ct-react": ["@playwright/experimental-ct-react@1.53.1", "", { "dependencies": { "@playwright/experimental-ct-core": "1.53.1", "@vitejs/plugin-react": "^4.2.1" }, "bin": { "playwright": "cli.js" } }, "sha512-4u0JLdIVDRIynkhP1KkfqTAjG5FoQ/w7s1KqgViuVoWzlCqYVtwBchxl6Le9g3T25a+vXWgFhWO35ddL3BeVLQ=="], + "@playwright/experimental-ct-react": ["@playwright/experimental-ct-react@1.54.1", "", { "dependencies": { "@playwright/experimental-ct-core": "1.54.1", "@vitejs/plugin-react": "^4.2.1" }, "bin": { "playwright": "cli.js" } }, "sha512-hqa/JhMK3qUqwqx8jm0/RJ3lbpGojA3f7UBhp3clFy8hnzMVu0SDba3JemWikS+JhiqYHjxL6Bn6dGxyikCImA=="], - "@playwright/test": ["@playwright/test@1.53.1", "", { "dependencies": { "playwright": "1.53.1" }, "bin": { "playwright": "cli.js" } }, "sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w=="], + "@playwright/test": ["@playwright/test@1.54.1", "", { "dependencies": { "playwright": "1.54.1" }, "bin": { "playwright": "cli.js" } }, "sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw=="], "@pnpm/config.env-replace": ["@pnpm/config.env-replace@1.1.0", "", {}, "sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w=="], @@ -1167,19 +1171,19 @@ "@prisma/client": ["@prisma/client@6.9.0", "", { "peerDependencies": { "prisma": "*", "typescript": ">=5.1.0" }, "optionalPeers": ["prisma", "typescript"] }, "sha512-Gg7j1hwy3SgF1KHrh0PZsYvAaykeR0PaxusnLXydehS96voYCGt1U5zVR31NIouYc63hWzidcrir1a7AIyCsNQ=="], - "@prisma/config": ["@prisma/config@6.10.1", "", { "dependencies": { "jiti": "2.4.2" } }, "sha512-kz4/bnqrOrzWo8KzYguN0cden4CzLJJ+2VSpKtF8utHS3l1JS0Lhv6BLwpOX6X9yNreTbZQZwewb+/BMPDCIYQ=="], + "@prisma/config": ["@prisma/config@6.12.0", "", { "dependencies": { "jiti": "2.4.2" } }, "sha512-HovZWzhWEMedHxmjefQBRZa40P81N7/+74khKFz9e1AFjakcIQdXgMWKgt20HaACzY+d1LRBC+L4tiz71t9fkg=="], "@prisma/debug": ["@prisma/debug@6.10.1", "", {}, "sha512-k2YT53cWxv9OLjW4zSYTZ6Z7j0gPfCzcr2Mj99qsuvlxr8WAKSZ2NcSR0zLf/mP4oxnYG842IMj3utTgcd7CaA=="], "@prisma/driver-adapter-utils": ["@prisma/driver-adapter-utils@6.10.1", "", { "dependencies": { "@prisma/debug": "6.10.1" } }, "sha512-MJ7NiiMA5YQUD1aMHiOcLmRpW0U0NTpygyeuLMxHXnKbcq+HX/cy10qilFMLVzpveuIEHuwxziR67z6i0K1MKA=="], - "@prisma/engines": ["@prisma/engines@6.10.1", "", { "dependencies": { "@prisma/debug": "6.10.1", "@prisma/engines-version": "6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c", "@prisma/fetch-engine": "6.10.1", "@prisma/get-platform": "6.10.1" } }, "sha512-Q07P5rS2iPwk2IQr/rUQJ42tHjpPyFcbiH7PXZlV81Ryr9NYIgdxcUrwgVOWVm5T7ap02C0dNd1dpnNcSWig8A=="], + "@prisma/engines": ["@prisma/engines@6.12.0", "", { "dependencies": { "@prisma/debug": "6.12.0", "@prisma/engines-version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc", "@prisma/fetch-engine": "6.12.0", "@prisma/get-platform": "6.12.0" } }, "sha512-4BRZZUaAuB4p0XhTauxelvFs7IllhPmNLvmla0bO1nkECs8n/o1pUvAVbQ/VOrZR5DnF4HED0PrGai+rIOVePA=="], - "@prisma/engines-version": ["@prisma/engines-version@6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c", "", {}, "sha512-ZJFTsEqapiTYVzXya6TUKYDFnSWCNegfUiG5ik9fleQva5Sk3DNyyUi7X1+0ZxWFHwHDr6BZV5Vm+iwP+LlciA=="], + "@prisma/engines-version": ["@prisma/engines-version@6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc", "", {}, "sha512-70vhecxBJlRr06VfahDzk9ow4k1HIaSfVUT3X0/kZoHCMl9zbabut4gEXAyzJZxaCGi5igAA7SyyfBI//mmkbQ=="], - "@prisma/fetch-engine": ["@prisma/fetch-engine@6.10.1", "", { "dependencies": { "@prisma/debug": "6.10.1", "@prisma/engines-version": "6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c", "@prisma/get-platform": "6.10.1" } }, "sha512-clmbG/Jgmrc/n6Y77QcBmAUlq9LrwI9Dbgy4pq5jeEARBpRCWJDJ7PWW1P8p0LfFU0i5fsyO7FqRzRB8mkdS4g=="], + "@prisma/fetch-engine": ["@prisma/fetch-engine@6.12.0", "", { "dependencies": { "@prisma/debug": "6.12.0", "@prisma/engines-version": "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc", "@prisma/get-platform": "6.12.0" } }, "sha512-EamoiwrK46rpWaEbLX9aqKDPOd8IyLnZAkiYXFNuq0YsU0Z8K09/rH8S7feOWAVJ3xzeSgcEJtBlVDrajM9Sag=="], - "@prisma/get-platform": ["@prisma/get-platform@6.10.1", "", { "dependencies": { "@prisma/debug": "6.10.1" } }, "sha512-4CY5ndKylcsce9Mv+VWp5obbR2/86SHOLVV053pwIkhVtT9C9A83yqiqI/5kJM9T1v1u1qco/bYjDKycmei9HA=="], + "@prisma/get-platform": ["@prisma/get-platform@6.12.0", "", { "dependencies": { "@prisma/debug": "6.12.0" } }, "sha512-nRerTGhTlgyvcBlyWgt8OLNIV7QgJS2XYXMJD1hysorMCuLAjuDDuoxmVt7C2nLxbuxbWPp7OuFRHC23HqD9dA=="], "@prisma/instrumentation": ["@prisma/instrumentation@6.6.0", "", { "dependencies": { "@opentelemetry/instrumentation": "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0" }, "peerDependencies": { "@opentelemetry/api": "^1.8" } }, "sha512-M/a6njz3hbf2oucwdbjNKrSMLuyMCwgDrmTtkF1pm4Nm7CU45J/Hd6lauF2CDACTUYzu3ymcV7P0ZAhIoj6WRw=="], @@ -1219,7 +1223,7 @@ "@pulumi/tailscale": ["@pulumi/tailscale@0.17.5", "", { "dependencies": { "@pulumi/pulumi": "^3.142.0" } }, "sha512-QGWCUam6WykikNIuBNR5UAicwhw9RZTSZX/M8oOyUkBSiKSmy3ksdl4VxNdpNZJ9C76ZoXzZL/LlLy5J+sUjfw=="], - "@puppeteer/browsers": ["@puppeteer/browsers@2.10.5", "", { "dependencies": { "debug": "^4.4.1", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.2", "tar-fs": "^3.0.8", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w=="], + "@puppeteer/browsers": ["@puppeteer/browsers@2.10.6", "", { "dependencies": { "debug": "^4.4.1", "extract-zip": "^2.0.1", "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.2", "tar-fs": "^3.1.0", "yargs": "^17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" } }, "sha512-pHUn6ZRt39bP3698HFQlu2ZHCkS/lPcpv7fVQcGBSzNNygw171UXAKrCUhy+TEMw4lEttOKDgNpb04hwUAJeiQ=="], "@radix-ui/number": ["@radix-ui/number@1.1.1", "", {}, "sha512-MkKCwxlXTgz6CFoJx3pCwn07GKp36+aZyu/u2Ln2VrA5DcdyCZkASEDBTd8x5whTQQL5CiYf4prXKLcgQdv29g=="], @@ -1381,59 +1385,59 @@ "@react-email/text": ["@react-email/text@0.1.4", "", { "peerDependencies": { "react": "^18.0 || ^19.0 || ^19.0.0-rc" } }, "sha512-cMNE02y8172DocpNGh97uV5HSTawaS4CKG/zOku8Pu+m6ehBKbAjgtQZDIxhgstw8+TWraFB8ltS1DPjfG8nLA=="], - "@react-three/drei": ["@react-three/drei@10.3.0", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@mediapipe/tasks-vision": "0.10.17", "@monogrid/gainmap-js": "^3.0.6", "@use-gesture/react": "^10.3.1", "camera-controls": "^2.9.0", "cross-env": "^7.0.3", "detect-gpu": "^5.0.56", "glsl-noise": "^0.0.0", "hls.js": "^1.5.17", "maath": "^0.10.8", "meshline": "^3.3.1", "stats-gl": "^2.2.8", "stats.js": "^0.17.0", "suspend-react": "^0.1.3", "three-mesh-bvh": "^0.8.3", "three-stdlib": "^2.35.6", "troika-three-text": "^0.52.4", "tunnel-rat": "^0.1.2", "use-sync-external-store": "^1.4.0", "utility-types": "^3.11.0", "zustand": "^5.0.1" }, "peerDependencies": { "@react-three/fiber": "^9.0.0", "react": "^19", "react-dom": "^19", "three": ">=0.159" }, "optionalPeers": ["react-dom"] }, "sha512-+4NHCAUI38jp8XlbuKKWl/23y3F/JKdkvnYsrVXxhw150OyWKJoft+Yyd7dl6awxfV/Gn08x3R9pRRFUuDQwDA=="], + "@react-three/drei": ["@react-three/drei@10.5.2", "", { "dependencies": { "@babel/runtime": "^7.26.0", "@mediapipe/tasks-vision": "0.10.17", "@monogrid/gainmap-js": "^3.0.6", "@use-gesture/react": "^10.3.1", "camera-controls": "^3.0.0", "cross-env": "^7.0.3", "detect-gpu": "^5.0.56", "glsl-noise": "^0.0.0", "hls.js": "^1.5.17", "maath": "^0.10.8", "meshline": "^3.3.1", "stats-gl": "^2.2.8", "stats.js": "^0.17.0", "suspend-react": "^0.1.3", "three-mesh-bvh": "^0.8.3", "three-stdlib": "^2.35.6", "troika-three-text": "^0.52.4", "tunnel-rat": "^0.1.2", "use-sync-external-store": "^1.4.0", "utility-types": "^3.11.0", "zustand": "^5.0.1" }, "peerDependencies": { "@react-three/fiber": "^9.0.0", "react": "^19", "react-dom": "^19", "three": ">=0.159" }, "optionalPeers": ["react-dom"] }, "sha512-s6MpLahua5q59ZVTeJ9EQ52wNLOLNB5mIA9NeLWwKEIymg7owqnkfQock9u5IAFgFzCX7AB1b7U8eaLy4M+YgA=="], - "@react-three/fiber": ["@react-three/fiber@9.1.2", "", { "dependencies": { "@babel/runtime": "^7.17.8", "@types/react-reconciler": "^0.28.9", "@types/webxr": "*", "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^2.0.0", "react-reconciler": "^0.31.0", "react-use-measure": "^2.1.7", "scheduler": "^0.25.0", "suspend-react": "^0.1.3", "use-sync-external-store": "^1.4.0", "zustand": "^5.0.3" }, "peerDependencies": { "expo": ">=43.0", "expo-asset": ">=8.4", "expo-file-system": ">=11.0", "expo-gl": ">=11.0", "react": "^19.0.0", "react-dom": "^19.0.0", "react-native": ">=0.78", "three": ">=0.156" }, "optionalPeers": ["expo", "expo-asset", "expo-file-system", "expo-gl", "react-dom", "react-native"] }, "sha512-k8FR9yVHV9kIF3iuOD0ds5hVymXYXfgdKklqziBVod9ZEJ8uk05Zjw29J/omU3IKeUfLNAIHfxneN3TUYM4I2w=="], + "@react-three/fiber": ["@react-three/fiber@9.2.0", "", { "dependencies": { "@babel/runtime": "^7.17.8", "@types/react-reconciler": "^0.28.9", "@types/webxr": "*", "base64-js": "^1.5.1", "buffer": "^6.0.3", "its-fine": "^2.0.0", "react-reconciler": "^0.31.0", "react-use-measure": "^2.1.7", "scheduler": "^0.25.0", "suspend-react": "^0.1.3", "use-sync-external-store": "^1.4.0", "zustand": "^5.0.3" }, "peerDependencies": { "expo": ">=43.0", "expo-asset": ">=8.4", "expo-file-system": ">=11.0", "expo-gl": ">=11.0", "react": "^19.0.0", "react-dom": "^19.0.0", "react-native": ">=0.78", "three": ">=0.156" }, "optionalPeers": ["expo", "expo-asset", "expo-file-system", "expo-gl", "react-dom", "react-native"] }, "sha512-esZe+E9T/aYEM4HlBkirr/yRE8qWTp9WUsLISyHHMCHKlJv85uc5N4wwKw+Ay0QeTSITw6T9Q3Svpu383Q+CSQ=="], "@react-three/postprocessing": ["@react-three/postprocessing@3.0.4", "", { "dependencies": { "maath": "^0.6.0", "n8ao": "^1.9.4", "postprocessing": "^6.36.6" }, "peerDependencies": { "@react-three/fiber": "^9.0.0", "react": "^19.0", "three": ">= 0.156.0" } }, "sha512-e4+F5xtudDYvhxx3y0NtWXpZbwvQ0x1zdOXWTbXMK6fFLVDd4qucN90YaaStanZGS4Bd5siQm0lGL/5ogf8iDQ=="], "@remirror/core-constants": ["@remirror/core-constants@3.0.0", "", {}, "sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.19", "", {}, "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA=="], + "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.27", "", {}, "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA=="], - "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.44.1", "", { "os": "android", "cpu": "arm" }, "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.45.1", "", { "os": "android", "cpu": "arm" }, "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA=="], - "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.44.1", "", { "os": "android", "cpu": "arm64" }, "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ=="], + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.45.1", "", { "os": "android", "cpu": "arm64" }, "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ=="], - "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.44.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg=="], + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.45.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA=="], - "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.44.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw=="], + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.45.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og=="], - "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.44.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA=="], + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.45.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g=="], - "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.44.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw=="], + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.45.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A=="], - "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.44.1", "", { "os": "linux", "cpu": "arm" }, "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ=="], + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.45.1", "", { "os": "linux", "cpu": "arm" }, "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q=="], - "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.44.1", "", { "os": "linux", "cpu": "arm" }, "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw=="], + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.45.1", "", { "os": "linux", "cpu": "arm" }, "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q=="], - "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.44.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ=="], + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.45.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw=="], - "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.44.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g=="], + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.45.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog=="], - "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.44.1", "", { "os": "linux", "cpu": "none" }, "sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew=="], + "@rollup/rollup-linux-loongarch64-gnu": ["@rollup/rollup-linux-loongarch64-gnu@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg=="], - "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.44.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA=="], + "@rollup/rollup-linux-powerpc64le-gnu": ["@rollup/rollup-linux-powerpc64le-gnu@4.45.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg=="], - "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.44.1", "", { "os": "linux", "cpu": "none" }, "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw=="], + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw=="], - "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.44.1", "", { "os": "linux", "cpu": "none" }, "sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg=="], + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.45.1", "", { "os": "linux", "cpu": "none" }, "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA=="], - "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.44.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw=="], + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.45.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw=="], - "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.44.1", "", { "os": "linux", "cpu": "x64" }, "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw=="], + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.45.1", "", { "os": "linux", "cpu": "x64" }, "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw=="], - "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.44.1", "", { "os": "linux", "cpu": "x64" }, "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g=="], + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.45.1", "", { "os": "linux", "cpu": "x64" }, "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw=="], - "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.44.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg=="], + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.45.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg=="], - "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.44.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A=="], + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.45.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw=="], - "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.44.1", "", { "os": "win32", "cpu": "x64" }, "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug=="], + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.45.1", "", { "os": "win32", "cpu": "x64" }, "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA=="], "@rtsao/scc": ["@rtsao/scc@1.1.0", "", {}, "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g=="], - "@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.11.0", "", {}, "sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ=="], + "@rushstack/eslint-patch": ["@rushstack/eslint-patch@1.12.0", "", {}, "sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw=="], "@sapphire/async-queue": ["@sapphire/async-queue@1.5.5", "", {}, "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg=="], @@ -1471,9 +1475,9 @@ "@sigstore/verify": ["@sigstore/verify@1.2.1", "", { "dependencies": { "@sigstore/bundle": "^2.3.2", "@sigstore/core": "^1.1.0", "@sigstore/protobuf-specs": "^0.3.2" } }, "sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g=="], - "@simplewebauthn/browser": ["@simplewebauthn/browser@13.1.0", "", {}, "sha512-WuHZ/PYvyPJ9nxSzgHtOEjogBhwJfC8xzYkPC+rR/+8chl/ft4ngjiK8kSU5HtRJfczupyOh33b25TjYbvwAcg=="], + "@simplewebauthn/browser": ["@simplewebauthn/browser@13.1.2", "", {}, "sha512-aZnW0KawAM83fSBUgglP5WofbrLbLyr7CoPqYr66Eppm7zO86YX6rrCjRB3hQKPrL7ATvY4FVXlykZ6w6FwYYw=="], - "@simplewebauthn/server": ["@simplewebauthn/server@13.1.1", "", { "dependencies": { "@hexagon/base64": "^1.1.27", "@levischuck/tiny-cbor": "^0.2.2", "@peculiar/asn1-android": "^2.3.10", "@peculiar/asn1-ecc": "^2.3.8", "@peculiar/asn1-rsa": "^2.3.8", "@peculiar/asn1-schema": "^2.3.8", "@peculiar/asn1-x509": "^2.3.8" } }, "sha512-1hsLpRHfSuMB9ee2aAdh0Htza/X3f4djhYISrggqGe3xopNjOcePiSDkDDoPzDYaaMCrbqGP1H2TYU7bgL9PmA=="], + "@simplewebauthn/server": ["@simplewebauthn/server@13.1.2", "", { "dependencies": { "@hexagon/base64": "^1.1.27", "@levischuck/tiny-cbor": "^0.2.2", "@peculiar/asn1-android": "^2.3.10", "@peculiar/asn1-ecc": "^2.3.8", "@peculiar/asn1-rsa": "^2.3.8", "@peculiar/asn1-schema": "^2.3.8", "@peculiar/asn1-x509": "^2.3.8" } }, "sha512-VwoDfvLXSCaRiD+xCIuyslU0HLxVggeE5BL06+GbsP2l1fGf5op8e0c3ZtKoi+vSg1q4ikjtAghC23ze2Q3H9g=="], "@sindresorhus/is": ["@sindresorhus/is@4.6.0", "", {}, "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw=="], @@ -1487,7 +1491,7 @@ "@slack/socket-mode": ["@slack/socket-mode@1.3.6", "", { "dependencies": { "@slack/logger": "^3.0.0", "@slack/web-api": "^6.12.1", "@types/node": ">=12.0.0", "@types/ws": "^7.4.7", "eventemitter3": "^5", "finity": "^0.5.4", "ws": "^7.5.3" } }, "sha512-G+im7OP7jVqHhiNSdHgv2VVrnN5U7KY845/5EZimZkrD4ZmtV0P3BiWkgeJhPtdLuM7C7i6+M6h6Bh+S4OOalA=="], - "@slack/types": ["@slack/types@2.14.0", "", {}, "sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA=="], + "@slack/types": ["@slack/types@2.15.0", "", {}, "sha512-livb1gyG3J8ATLBJ3KjZfjHpTRz9btY1m5cgNuXxWJbhwRB1Gwb8Ly6XLJm2Sy1W6h+vLgqIHg7IwKrF1C1Szg=="], "@slack/web-api": ["@slack/web-api@7.9.3", "", { "dependencies": { "@slack/logger": "^4.0.0", "@slack/types": "^2.9.0", "@types/node": ">=18.0.0", "@types/retry": "0.12.0", "axios": "^1.8.3", "eventemitter3": "^5.0.1", "form-data": "^4.0.0", "is-electron": "2.2.2", "is-stream": "^2", "p-queue": "^6", "p-retry": "^4", "retry": "^0.13.1" } }, "sha512-xjnoldVJyoUe61Ltqjr2UVYBolcsTpp5ottqzSI3l41UCaJgHSHIOpGuYps+nhLFvDfGGpDGUeQ7BWiq3+ypqA=="], @@ -1499,7 +1503,7 @@ "@smithy/config-resolver": ["@smithy/config-resolver@4.1.4", "", { "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-prmU+rDddxHOH0oNcwemL+SwnzcG65sBF2yXRO7aeXIn/xTlq2pX7JLVbkBnVLowHLg4/OL4+jBmv9hVrVGS+w=="], - "@smithy/core": ["@smithy/core@3.6.0", "", { "dependencies": { "@smithy/middleware-serde": "^4.0.8", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-stream": "^4.2.2", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg=="], + "@smithy/core": ["@smithy/core@3.7.1", "", { "dependencies": { "@smithy/middleware-serde": "^4.0.8", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-stream": "^4.2.3", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-ExRCsHnXFtBPnM7MkfKBPcBBdHw1h/QS/cbNw4ho95qnyNHvnpmGbR39MIAv9KggTr5qSPxRSEL+hRXlyGyGQw=="], "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.0.6", "", { "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-hKMWcANhUiNbCJouYkZ9V3+/Qf9pteR1dnwgdyzR09R4ODEYx8BbUysHwRSyex4rZ9zapddZhLFTnT4ZijR4pw=="], @@ -1513,7 +1517,7 @@ "@smithy/eventstream-serde-universal": ["@smithy/eventstream-serde-universal@4.0.4", "", { "dependencies": { "@smithy/eventstream-codec": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-UeJpOmLGhq1SLox79QWw/0n2PFX+oPRE1ZyRMxPIaFEfCqWaqpB7BU9C8kpPOGEhLF7AwEqfFbtwNxGy4ReENA=="], - "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.0.4", "", { "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw=="], + "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.1.0", "", { "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ=="], "@smithy/hash-blob-browser": ["@smithy/hash-blob-browser@4.0.4", "", { "dependencies": { "@smithy/chunked-blob-reader": "^5.0.0", "@smithy/chunked-blob-reader-native": "^4.0.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-WszRiACJiQV3QG6XMV44i5YWlkrlsM5Yxgz4jvsksuu7LDXA6wAtypfPajtNTadzpJy3KyJPoWehYpmZGKUFIQ=="], @@ -1529,9 +1533,9 @@ "@smithy/middleware-content-length": ["@smithy/middleware-content-length@4.0.4", "", { "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-F7gDyfI2BB1Kc+4M6rpuOLne5LOcEknH1n6UQB69qv+HucXBR1rkzXBnQTB2q46sFy1PM/zuSJOB532yc8bg3w=="], - "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.1.13", "", { "dependencies": { "@smithy/core": "^3.6.0", "@smithy/middleware-serde": "^4.0.8", "@smithy/node-config-provider": "^4.1.3", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ=="], + "@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.1.16", "", { "dependencies": { "@smithy/core": "^3.7.1", "@smithy/middleware-serde": "^4.0.8", "@smithy/node-config-provider": "^4.1.3", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-plpa50PIGLqzMR2ANKAw2yOW5YKS626KYKqae3atwucbz4Ve4uQ9K9BEZxDLIFmCu7hKLcrq2zmj4a+PfmUV5w=="], - "@smithy/middleware-retry": ["@smithy/middleware-retry@4.1.14", "", { "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/service-error-classification": "^4.0.6", "@smithy/smithy-client": "^4.4.5", "@smithy/types": "^4.3.1", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-eoXaLlDGpKvdmvt+YBfRXE7HmIEtFF+DJCbTPwuLunP0YUnrydl+C4tS+vEM0+nyxXrX3PSUFqC+lP1+EHB1Tw=="], + "@smithy/middleware-retry": ["@smithy/middleware-retry@4.1.17", "", { "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/service-error-classification": "^4.0.6", "@smithy/smithy-client": "^4.4.8", "@smithy/types": "^4.3.1", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-gsCimeG6BApj0SBecwa1Be+Z+JOJe46iy3B3m3A8jKJHf7eIihP76Is4LwLrbJ1ygoS7Vg73lfqzejmLOrazUA=="], "@smithy/middleware-serde": ["@smithy/middleware-serde@4.0.8", "", { "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-iSSl7HJoJaGyMIoNn2B7czghOVwJ9nD7TMvLhMWeSB5vt0TnEYyRRqPJu/TqW76WScaNvYYB8nRoiBHR9S1Ddw=="], @@ -1539,7 +1543,7 @@ "@smithy/node-config-provider": ["@smithy/node-config-provider@4.1.3", "", { "dependencies": { "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-HGHQr2s59qaU1lrVH6MbLlmOBxadtzTsoO4c+bF5asdgVik3I8o7JIOzoeqWc5MjVa+vD36/LWE0iXKpNqooRw=="], - "@smithy/node-http-handler": ["@smithy/node-http-handler@4.0.6", "", { "dependencies": { "@smithy/abort-controller": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA=="], + "@smithy/node-http-handler": ["@smithy/node-http-handler@4.1.0", "", { "dependencies": { "@smithy/abort-controller": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg=="], "@smithy/property-provider": ["@smithy/property-provider@4.0.4", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-qHJ2sSgu4FqF4U/5UUp4DhXNmdTrgmoAai6oQiM+c5RZ/sbDwJ12qxB1M6FnP+Tn/ggkPZf9ccn4jqKSINaquw=="], @@ -1555,7 +1559,7 @@ "@smithy/signature-v4": ["@smithy/signature-v4@5.1.2", "", { "dependencies": { "@smithy/is-array-buffer": "^4.0.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-uri-escape": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-d3+U/VpX7a60seHziWnVZOHuEgJlclufjkS6zhXvxcJgkJq4UWdH5eOBLzHRMx6gXjsdT9h6lfpmLzbrdupHgQ=="], - "@smithy/smithy-client": ["@smithy/smithy-client@4.4.5", "", { "dependencies": { "@smithy/core": "^3.6.0", "@smithy/middleware-endpoint": "^4.1.13", "@smithy/middleware-stack": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-stream": "^4.2.2", "tslib": "^2.6.2" } }, "sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg=="], + "@smithy/smithy-client": ["@smithy/smithy-client@4.4.8", "", { "dependencies": { "@smithy/core": "^3.7.1", "@smithy/middleware-endpoint": "^4.1.16", "@smithy/middleware-stack": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-pcW691/lx7V54gE+dDGC26nxz8nrvnvRSCJaIYD6XLPpOInEZeKdV/SpSux+wqeQ4Ine7LJQu8uxMvobTIBK0w=="], "@smithy/types": ["@smithy/types@4.3.1", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-UqKOQBL2x6+HWl3P+3QqFD4ncKq0I8Nuz9QItGv5WuKuMHuuwlhvqcZCoXGfc+P1QmfJE7VieykoYYmrOoFJxA=="], @@ -1571,9 +1575,9 @@ "@smithy/util-config-provider": ["@smithy/util-config-provider@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w=="], - "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.0.21", "", { "dependencies": { "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.5", "@smithy/types": "^4.3.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-wM0jhTytgXu3wzJoIqpbBAG5U6BwiubZ6QKzSbP7/VbmF1v96xlAbX2Am/mz0Zep0NLvLh84JT0tuZnk3wmYQA=="], + "@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.0.24", "", { "dependencies": { "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.8", "@smithy/types": "^4.3.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UkQNgaQ+bidw1MgdgPO1z1k95W/v8Ej/5o/T/Is8PiVUYPspl/ZxV6WO/8DrzZQu5ULnmpB9CDdMSRwgRc21AA=="], - "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.0.21", "", { "dependencies": { "@smithy/config-resolver": "^4.1.4", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.5", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-/F34zkoU0GzpUgLJydHY8Rxu9lBn8xQC/s/0M0U9lLBkYbA1htaAFjWYJzpzsbXPuri5D1H8gjp2jBum05qBrA=="], + "@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.0.24", "", { "dependencies": { "@smithy/config-resolver": "^4.1.4", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.8", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-phvGi/15Z4MpuQibTLOYIumvLdXb+XIJu8TA55voGgboln85jytA3wiD7CkUE8SNcWqkkb+uptZKPiuFouX/7g=="], "@smithy/util-endpoints": ["@smithy/util-endpoints@3.0.6", "", { "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-YARl3tFL3WgPuLzljRUnrS2ngLiUtkwhQtj8PAL13XZSyUiNLQxwG3fBBq3QXFqGFUXepIN73pINp3y8c2nBmA=="], @@ -1583,7 +1587,7 @@ "@smithy/util-retry": ["@smithy/util-retry@4.0.6", "", { "dependencies": { "@smithy/service-error-classification": "^4.0.6", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-+YekoF2CaSMv6zKrA6iI/N9yva3Gzn4L6n35Luydweu5MMPYpiGZlWqehPHDHyNbnyaYlz/WJyYAZnC+loBDZg=="], - "@smithy/util-stream": ["@smithy/util-stream@4.2.2", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.0.4", "@smithy/node-http-handler": "^4.0.6", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w=="], + "@smithy/util-stream": ["@smithy/util-stream@4.2.3", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg=="], "@smithy/util-uri-escape": ["@smithy/util-uri-escape@4.0.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg=="], @@ -1597,8 +1601,6 @@ "@standard-schema/utils": ["@standard-schema/utils@0.3.0", "", {}, "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g=="], - "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], - "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], "@szmarczak/http-timer": ["@szmarczak/http-timer@4.0.6", "", { "dependencies": { "defer-to-connect": "^2.0.0" } }, "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w=="], @@ -1641,17 +1643,17 @@ "@tailwindcss/typography": ["@tailwindcss/typography@0.5.16", "", { "dependencies": { "lodash.castarray": "^4.4.0", "lodash.isplainobject": "^4.0.6", "lodash.merge": "^4.6.2", "postcss-selector-parser": "6.0.10" }, "peerDependencies": { "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" } }, "sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA=="], - "@tanstack/query-core": ["@tanstack/query-core@5.81.2", "", {}, "sha512-QLYkPdrudoMATDFa3MiLEwRhNnAlzHWDf0LKaXUqJd0/+QxN8uTPi7bahRlxoAyH0UbLMBdeDbYzWALj7THOtw=="], + "@tanstack/query-core": ["@tanstack/query-core@5.83.0", "", {}, "sha512-0M8dA+amXUkyz5cVUm/B+zSk3xkQAcuXuz5/Q/LveT4ots2rBpPTZOzd7yJa2Utsf8D2Upl5KyjhHRY+9lB/XA=="], - "@tanstack/react-query": ["@tanstack/react-query@5.81.2", "", { "dependencies": { "@tanstack/query-core": "5.81.2" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-pe8kFlTrL2zFLlcAj2kZk9UaYYHDk9/1hg9EBaoO3cxDhOZf1FRGJeziSXKrVZyxIfs7b3aoOj/bw7Lie0mDUg=="], + "@tanstack/react-query": ["@tanstack/react-query@5.83.0", "", { "dependencies": { "@tanstack/query-core": "5.83.0" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-/XGYhZ3foc5H0VM2jLSD/NyBRIOK4q9kfeml4+0x2DlL6xVuAcVEW+hTlTapAmejObg0i3eNqhkr2dT+eciwoQ=="], "@tanstack/react-table": ["@tanstack/react-table@8.21.3", "", { "dependencies": { "@tanstack/table-core": "8.21.3" }, "peerDependencies": { "react": ">=16.8", "react-dom": ">=16.8" } }, "sha512-5nNMTSETP4ykGegmVkhjcS8tTLW6Vl4axfEGQN3v0zdHYbK4UfoqfPChclTrJ4EoK9QynqAu9oUf8VEmrpZ5Ww=="], - "@tanstack/react-virtual": ["@tanstack/react-virtual@3.13.11", "", { "dependencies": { "@tanstack/virtual-core": "3.13.11" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-u5EaOSJOq08T9NXFuDopMdxZBNDFuEMohIFFU45fBYDXXh9SjYdbpNq1OLFSOpQnDRPjqgmY96ipZTkzom9t9Q=="], + "@tanstack/react-virtual": ["@tanstack/react-virtual@3.13.12", "", { "dependencies": { "@tanstack/virtual-core": "3.13.12" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA=="], "@tanstack/table-core": ["@tanstack/table-core@8.21.3", "", {}, "sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg=="], - "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.11", "", {}, "sha512-ORL6UyuZJ0D9X33LDR4TcgcM+K2YiS2j4xbvH1vnhhObwR1Z4dKwPTL/c0kj2Yeb4Yp2lBv1wpyVaqlohk8zpg=="], + "@tanstack/virtual-core": ["@tanstack/virtual-core@3.13.12", "", {}, "sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA=="], "@testing-library/dom": ["@testing-library/dom@10.4.0", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" } }, "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ=="], @@ -1659,75 +1661,75 @@ "@testing-library/react": ["@testing-library/react@16.3.0", "", { "dependencies": { "@babel/runtime": "^7.12.5" }, "peerDependencies": { "@testing-library/dom": "^10.0.0", "@types/react": "^18.0.0 || ^19.0.0", "@types/react-dom": "^18.0.0 || ^19.0.0", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw=="], - "@tiptap/core": ["@tiptap/core@2.22.3", "", { "peerDependencies": { "@tiptap/pm": "^2.7.0" } }, "sha512-czyBPXZG/ZFyObZEF1kyusGf58Ai3X8TnaxlUUn3gqLLWPy0idXZg85NETCidzi/gAxWxL9j6Pcy+zwS4pbZYQ=="], + "@tiptap/core": ["@tiptap/core@2.26.1", "", { "peerDependencies": { "@tiptap/pm": "^2.7.0" } }, "sha512-fymyd/XZvYiHjBoLt1gxs024xP/LY26d43R1vluYq7AHBL/7DE3ywzy+1GEsGyAv5Je2L0KBhNIR/izbq3Kaqg=="], - "@tiptap/extension-blockquote": ["@tiptap/extension-blockquote@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-HvTXvqeGaANg0owk0Xxkgyc4lJMO5CZES2Lc3JJp8u5kV+HZIwd78eJ7fbKBMtkpKb4zOk4xQsHQ/TuhghJaeA=="], + "@tiptap/extension-blockquote": ["@tiptap/extension-blockquote@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-viQ6AHRhjCYYipKK6ZepBzwZpkuMvO9yhRHeUZDvlSOAh8rvsUTSre0y74nu8QRYUt4a44lJJ6BpphJK7bEgYA=="], "@tiptap/extension-bold": ["@tiptap/extension-bold@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-8DWwelH55H8KtLECSIv0wh8x/F/6lpagV/pMvT+Azujad0oqK+1iAPKU/kLgjXbFSkisrpV6KSwQts5neCtfRQ=="], - "@tiptap/extension-bubble-menu": ["@tiptap/extension-bubble-menu@2.22.3", "", { "dependencies": { "tippy.js": "^6.3.7" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-8iQLNrRf3iBPKqI3dQnfvMxMfgp6y9TAbO803LihvzbIGqBaX264ES7fHtoyFIIeVjy2xFruVsTZCZofWTupGg=="], + "@tiptap/extension-bubble-menu": ["@tiptap/extension-bubble-menu@2.26.1", "", { "dependencies": { "tippy.js": "^6.3.7" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-oHevUcZbTMFOTpdCEo4YEDe044MB4P1ZrWyML8CGe5tnnKdlI9BN03AXpI1mEEa5CA3H1/eEckXx8EiCgYwQ3Q=="], - "@tiptap/extension-bullet-list": ["@tiptap/extension-bullet-list@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-SYvLIxqmuV0kTj4/3ZFlnZ1fr9Y233qX00BKuIpGnczeFsWQmzBJo8vGm3d1IlKPCQN+jTRtDdDE1aSum8Kv2w=="], + "@tiptap/extension-bullet-list": ["@tiptap/extension-bullet-list@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-HHakuV4ckYCDOnBbne088FvCEP4YICw+wgPBz/V2dfpiFYQ4WzT0LPK9s7OFMCN+ROraoug+1ryN1Z1KdIgujQ=="], "@tiptap/extension-character-count": ["@tiptap/extension-character-count@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-aTCobbF9yIXOntVTdjzJ4G5V0TJKeeIDW8RFMdTVr5o0R/woSZ27cXiPGdS7XxpN6gY9vlNzYe79CcNBDTzLfA=="], - "@tiptap/extension-code": ["@tiptap/extension-code@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-s+W6jHezq+n9cC40xZ3hZF6cGGSl+fBELik1b2x8+cb0WoIlqmcdWin1dgeMNrWlRZUw1aD2DNwy/PdXI5vn2g=="], + "@tiptap/extension-code": ["@tiptap/extension-code@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-GU9deB1A/Tr4FMPu71CvlcjGKwRhGYz60wQ8m4aM+ELZcVIcZRa1ebR8bExRIEWnvRztQuyRiCQzw2N0xQJ1QQ=="], - "@tiptap/extension-code-block": ["@tiptap/extension-code-block@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-twPCBpb/ygNixlSBAXgvfo+t56Ucpb8lvPDiZn+cH8OjmmO0ayBoSfSrjKWgaEWGPcXBrFAfsBRbYHyoHj7pXg=="], + "@tiptap/extension-code-block": ["@tiptap/extension-code-block@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-/TDDOwONl0qEUc4+B6V9NnWtSjz95eg7/8uCb8Y8iRbGvI9vT4/znRKofFxstvKmW4URu/H74/g0ywV57h0B+A=="], "@tiptap/extension-code-block-lowlight": ["@tiptap/extension-code-block-lowlight@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/extension-code-block": "^2.7.0", "@tiptap/pm": "^2.7.0", "highlight.js": "^11", "lowlight": "^2 || ^3" } }, "sha512-jGcVOkcThwzLdXf56zYkmB0tcB8Xy3S+ImS3kDzaccdem6qCG05JeE33K8bfPqh99OU1QqO9XdHNO9x77A2jug=="], - "@tiptap/extension-document": ["@tiptap/extension-document@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-7MnILbhRZRyROlMUgyntzRZ/EZlqNB8fO761RNjJxR2WMb49R4yc04fz7/+f/QH/hwxoS13bKfsNUDAsDxA5Aw=="], + "@tiptap/extension-document": ["@tiptap/extension-document@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-2P2IZp1NRAE+21mRuFBiP3X2WKfZ6kUC23NJKpn8bcOamY3obYqCt0ltGPhE4eR8n8QAl2fI/3jIgjR07dC8ow=="], - "@tiptap/extension-dropcursor": ["@tiptap/extension-dropcursor@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-yQxSfTWjdUQS+bh6KiNLR9KIMsn1SElzycQe4XE+0eoaetapGtKqxfwkTbbQdNgQOU5wQG1KOda221mnPvkpAA=="], + "@tiptap/extension-dropcursor": ["@tiptap/extension-dropcursor@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-JkDQU2ZYFOuT5mNYb8OiWGwD1HcjbtmX8tLNugQbToECmz9WvVPqJmn7V/q8VGpP81iEECz/IsyRmuf2kSD4uA=="], - "@tiptap/extension-floating-menu": ["@tiptap/extension-floating-menu@2.22.3", "", { "dependencies": { "tippy.js": "^6.3.7" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-GeJRRdulxpwsshxzBkpOf/xJkLD2fa+49o+3FqRCmrm7AioC8oUcZZmzuzjLj5a3ZNGKPuJ9xxDkYWUjH4tE1g=="], + "@tiptap/extension-floating-menu": ["@tiptap/extension-floating-menu@2.26.1", "", { "dependencies": { "tippy.js": "^6.3.7" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-OJF+H6qhQogVTMedAGSWuoL1RPe3LZYXONuFCVyzHnvvMpK+BP1vm180E2zDNFnn/DVA+FOrzNGpZW7YjoFH1w=="], - "@tiptap/extension-gapcursor": ["@tiptap/extension-gapcursor@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-6Q8TLL4PVGcZLn27eQazCC+be8LP8uzuz5Z5e4TpIeswPAju49cerQOdEGNFKkuYv/FelWIhXNtkWFMf4eSmyw=="], + "@tiptap/extension-gapcursor": ["@tiptap/extension-gapcursor@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-KOiMZc3PwJS3hR0nSq5d0TJi2jkNZkLZElcT6pCEnhRHzPH6dRMu9GM5Jj798ZRUy0T9UFcKJalFZaDxnmRnpg=="], - "@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-tbEji/V4Za3UhxYwB36amYhyonwe5j66iYTNRWzgjNixjrcGDbWk6cfaF9jMAgPgIDBmmtQLJY+moKskwgpnZg=="], + "@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-d6uStdNKi8kjPlHAyO59M6KGWATNwhLCD7dng0NXfwGndc22fthzIk/6j9F6ltQx30huy5qQram6j3JXwNACoA=="], - "@tiptap/extension-heading": ["@tiptap/extension-heading@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-+MexJD+kXtNwMDbNTFa7jCFipx1DqAdT+n9GgInqebAN9bK+CWjC+SskzZNRqeMrQ0Er7QTsi6YC09M+74sevA=="], + "@tiptap/extension-heading": ["@tiptap/extension-heading@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-KSzL8WZV3pjJG9ke4RaU70+B5UlYR2S6olNt5UCAawM+fi11mobVztiBoC19xtpSVqIXC1AmXOqUgnuSvmE4ZA=="], "@tiptap/extension-highlight": ["@tiptap/extension-highlight@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-cdPSeQ3QcThhJdzkjK9a1871uPQjwmOf0WzTGW33lJyJDQHypWIRNUus56c3pGA7BgV9P59QW7Fm8rDnM8XkbA=="], - "@tiptap/extension-history": ["@tiptap/extension-history@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-F9sC45zPw7vbjKrwSKuSLZ0ODyc/X3bGPeCa6HYLEHKfgqsdt2v2fQLvxjpmlwO2ZMrnkBkg76KDxHfVyrZ2zQ=="], + "@tiptap/extension-history": ["@tiptap/extension-history@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-m6YR1gkkauIDo3PRl0gP+7Oc4n5OqDzcjVh6LvWREmZP8nmi94hfseYbqOXUb6RPHIc0JKF02eiRifT4MSd2nw=="], - "@tiptap/extension-horizontal-rule": ["@tiptap/extension-horizontal-rule@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-3GvY798p9pCXUBbCebIdSmi1q80l7VZz/B6NN4uUMQ9iwxWopd8yaZ0O7xx2hM2UBzPEtY3M4FAhhpYUTXNFgQ=="], + "@tiptap/extension-horizontal-rule": ["@tiptap/extension-horizontal-rule@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-mT6baqOhs/NakgrAeDeed194E/ZJFGL692H0C7f1N7WDRaWxUu2oR0LrnRqSH5OyPjELkzu6nQnNy0+0tFGHHg=="], "@tiptap/extension-image": ["@tiptap/extension-image@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-pYCUzZBgsxIvVGTzuW03cPz6PIrAo26xpoxqq4W090uMVoK0SgY5W5y0IqCdw4QyLkJ2/oNSFNc2EP9jVi1CcQ=="], - "@tiptap/extension-italic": ["@tiptap/extension-italic@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-W/rQDo7qFL7MfwfaYEcdtbk862fOmBv30qIEwVdqElBye7BFJYKtRuWBzNbG2BwKanjwMbVc/tBXF5W1sqfT7Q=="], + "@tiptap/extension-italic": ["@tiptap/extension-italic@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-pOs6oU4LyGO89IrYE4jbE8ZYsPwMMIiKkYfXcfeD9NtpGNBnjeVXXF5I9ndY2ANrCAgC8k58C3/powDRf0T2yA=="], "@tiptap/extension-link": ["@tiptap/extension-link@2.14.0", "", { "dependencies": { "linkifyjs": "^4.2.0" }, "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-fsqW7eRD2xoD6xy7eFrNPAdIuZ3eicA4jKC45Vcft/Xky0DJoIehlVBLxsPbfmv3f27EBrtPkg5+msLXkLyzJA=="], - "@tiptap/extension-list-item": ["@tiptap/extension-list-item@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-B7Fze+eM1sYbGOZtDDAwAivnj1ow2wN5RqaQPC1la3wdTK4Wgp7bdzGjvUbrN6gp3zMFCEWlqP2toc/mRAHCtA=="], + "@tiptap/extension-list-item": ["@tiptap/extension-list-item@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-quOXckC73Luc3x+Dcm88YAEBW+Crh3x5uvtQOQtn2GEG91AshrvbnhGRiYnfvEN7UhWIS+FYI5liHFcRKSUKrQ=="], - "@tiptap/extension-ordered-list": ["@tiptap/extension-ordered-list@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-pHGkuZhV/uAAHI9vzk/lpAkbdpMT4wUR1FI17/GE3zNrogfzx0VopCQrXq4+sQVsLUW4I6Cj6VeBjm9wB6qlIw=="], + "@tiptap/extension-ordered-list": ["@tiptap/extension-ordered-list@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-UHKNRxq6TBnXMGFSq91knD6QaHsyyOwLOsXMzupmKM5Su0s+CRXEjfav3qKlbb9e4m7D7S/a0aPm8nC9KIXNhQ=="], - "@tiptap/extension-paragraph": ["@tiptap/extension-paragraph@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-TYvgS7CweNFo/xVxsKWSt0wnm46Y8OtsfDSjnLbSC4Pj4ZNa6PU3zpvDTW+UxYakr+8zIPvI2WgLBkyTHq6oQA=="], + "@tiptap/extension-paragraph": ["@tiptap/extension-paragraph@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-UezvM9VDRAVJlX1tykgHWSD1g3MKfVMWWZ+Tg+PE4+kizOwoYkRWznVPgCAxjmyHajxpCKRXgqTZkOxjJ9Kjzg=="], "@tiptap/extension-placeholder": ["@tiptap/extension-placeholder@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-xzfjHvuukbch4i5O/5uyS2K2QgNEaMKi6e6GExTTgVwnFjKfJmgTqee33tt5JCqSItBvtSZlU3SX/vpiaIof+w=="], - "@tiptap/extension-strike": ["@tiptap/extension-strike@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-I+s2Csw2cTHae2vFJiojnHK+NnQjDr6441mSlAd+e7kEly1kjZ4g7J+JMj02ajNQhr/ob8/hb5r6EdIyv2xtoA=="], + "@tiptap/extension-strike": ["@tiptap/extension-strike@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-CkoRH+pAi6MgdCh7K0cVZl4N2uR4pZdabXAnFSoLZRSg6imLvEUmWHfSi1dl3Z7JOvd3a4yZ4NxerQn5MWbJ7g=="], - "@tiptap/extension-table": ["@tiptap/extension-table@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-lYTuDo/3lJsC6g85b5OCfrKi8yID82PnZlngZo4quVHusE/YuXOwXYD4qt3xEOoqdgFoPQl0b7Ck9C5Qyb8AUg=="], + "@tiptap/extension-table": ["@tiptap/extension-table@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-LQ63CK53qx2ZsbLTB4mUX0YCoGC0GbYQ82jS3kD+K7M/mb9MCkefvDk6rA8rXF8TjfGnv6o/Fseoot8uhH3qfg=="], - "@tiptap/extension-table-cell": ["@tiptap/extension-table-cell@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-Yj6/bd4QpKoQpNTi/eNnWpT+VMfTBB7SfCPjlMvTK1MFVr60fmbUjJHrjt2WAfTW2JmkQlLsP8UXjR+Bda+uTA=="], + "@tiptap/extension-table-cell": ["@tiptap/extension-table-cell@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-0P5zY+WGFnULggJkX6+CevmFoBmVv1aUiBBXfcFuLG2mnUsS3QALQTowFtz/0/VbtbjzcOSStaGDHRJxPbk9XQ=="], - "@tiptap/extension-table-header": ["@tiptap/extension-table-header@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-bLq/lufV95fp9gXMjOKMuuhpAa2+t0vi8dz4Zxwnrr1dsvkk4TyiKWRyuI3OV+TCNzZ3hZqOlEStS+Ie6lB/Lg=="], + "@tiptap/extension-table-header": ["@tiptap/extension-table-header@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-SAwTW9H+sjVYjoeU5z8pVDMHn3r3FCi+zp2KAxsEsmujcd7qrQdY0cAjQtWjckCq6H3sQkbICa+xlCCd7C8ZAQ=="], - "@tiptap/extension-table-row": ["@tiptap/extension-table-row@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-PQbrDIyGOHrsN3RmB+J75UJ10lGW7I4PqY+E2HUtx5HvFOEVPlBbcFELMfjy7dOPbKiM+v6KUSbybXW8h745mg=="], + "@tiptap/extension-table-row": ["@tiptap/extension-table-row@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-c4oLrUfj1EVVDpbfKX36v7nnaeI4NxML2KRTQXocvcY65VCe0bPQh8ujpPgPcnKEzdWYdIuAX9RbEAkiYWe8Ww=="], "@tiptap/extension-task-item": ["@tiptap/extension-task-item@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0", "@tiptap/pm": "^2.7.0" } }, "sha512-aVfSa2dLF77bfXpAlrsfPUNdhiHJhw3VJ/pnCTxrEnBXYilDuH59AhtU6DygSNhMZWUgzI4OPqf3crF+yzrHag=="], "@tiptap/extension-task-list": ["@tiptap/extension-task-list@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-o2VELXgkDIHS15pnF1W2OFfxZGvo9V6RcwjzCYUS0mqMF9TTbfHwddRcv4t3pifpMO3sWhspVARavJAGaP5zdQ=="], - "@tiptap/extension-text": ["@tiptap/extension-text@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-07cymWkPTfq6nuum88Yf90YYArbowed8nNiu0Tw3jCvwpzf9J9TDaovT+LAKuSKtrOsnNpFB/9IqUwFxZepOGw=="], + "@tiptap/extension-text": ["@tiptap/extension-text@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-p2n8WVMd/2vckdJlol24acaTDIZAhI7qle5cM75bn01sOEZoFlSw6SwINOULrUCzNJsYb43qrLEibZb4j2LeQw=="], "@tiptap/extension-text-align": ["@tiptap/extension-text-align@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-UZ8803BOrHLHSNFfooqgkm2AQsaK/7eE1deQGSazxft89KksAv1kZkEKFypOE8yw85Bg2NHH2Lp6n4tyz2n6/g=="], - "@tiptap/extension-text-style": ["@tiptap/extension-text-style@2.22.3", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-M3FLOUPcO8fR+rM97mR2gQ54KFkdlAUQtEPKQpO1f312gtcVdBNxgq0WgqTnBY7thWLyqQSKiAsL6y88+JddSA=="], + "@tiptap/extension-text-style": ["@tiptap/extension-text-style@2.26.1", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-t9Nc/UkrbCfnSHEUi1gvUQ2ZPzvfdYFT5TExoV2DTiUCkhG6+mecT5bTVFGW3QkPmbToL+nFhGn4ZRMDD0SP3Q=="], "@tiptap/extension-typography": ["@tiptap/extension-typography@2.14.0", "", { "peerDependencies": { "@tiptap/core": "^2.7.0" } }, "sha512-1pokT94zu1ogJEmGNR+LwjR08iUbO9NZvm3SfPyXc5S1uoQgX3BE5LEwCRtu0Uu528CL9/Pq27wyYkYiSVM8FQ=="], @@ -1765,7 +1767,7 @@ "@tweenjs/tween.js": ["@tweenjs/tween.js@23.1.3", "", {}, "sha512-vJmvvwFxYuGnF2axRtPYocag6Clbb5YS7kLL+SO/TeVFzHqDIWrNKYtcsPMibjDx9O+bu+psAy9NKfWklassUA=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], "@types/archiver": ["@types/archiver@6.0.3", "", { "dependencies": { "@types/readdir-glob": "*" } }, "sha512-a6wUll6k3zX6qs5KlxIggs1P1JcYJaTCx2gnlr+f0S1yd2DoaEwoIK10HmBaLnZwWneBz+JBm0dwcZu0zECBcQ=="], @@ -1783,7 +1785,7 @@ "@types/body-parser": ["@types/body-parser@1.19.6", "", { "dependencies": { "@types/connect": "*", "@types/node": "*" } }, "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g=="], - "@types/bun": ["@types/bun@1.2.17", "", { "dependencies": { "bun-types": "1.2.17" } }, "sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q=="], + "@types/bun": ["@types/bun@1.2.19", "", { "dependencies": { "bun-types": "1.2.19" } }, "sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg=="], "@types/cacheable-request": ["@types/cacheable-request@6.0.3", "", { "dependencies": { "@types/http-cache-semantics": "*", "@types/keyv": "^3.1.4", "@types/node": "*", "@types/responselike": "^1.0.0" } }, "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw=="], @@ -1901,7 +1903,7 @@ "@types/linkify-it": ["@types/linkify-it@5.0.0", "", {}, "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q=="], - "@types/lodash": ["@types/lodash@4.17.19", "", {}, "sha512-NYqRyg/hIQrYPT9lbOeYc3kIRabJDn/k4qQHIXUpx88CBDww2fD15Sg5kbXlW86zm2XEW4g0QxkTI3/Kfkc7xQ=="], + "@types/lodash": ["@types/lodash@4.17.20", "", {}, "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA=="], "@types/markdown-it": ["@types/markdown-it@14.1.2", "", { "dependencies": { "@types/linkify-it": "^5", "@types/mdurl": "^2" } }, "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog=="], @@ -1913,7 +1915,7 @@ "@types/ms": ["@types/ms@2.1.0", "", {}, "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA=="], - "@types/node": ["@types/node@24.0.4", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA=="], + "@types/node": ["@types/node@24.1.0", "", { "dependencies": { "undici-types": "~7.8.0" } }, "sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w=="], "@types/node-fetch": ["@types/node-fetch@2.6.12", "", { "dependencies": { "@types/node": "*", "form-data": "^4.0.0" } }, "sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA=="], @@ -1975,69 +1977,69 @@ "@types/yauzl": ["@types/yauzl@2.10.3", "", { "dependencies": { "@types/node": "*" } }, "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.35.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.35.0", "@typescript-eslint/type-utils": "8.35.0", "@typescript-eslint/utils": "8.35.0", "@typescript-eslint/visitor-keys": "8.35.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.35.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.38.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.38.0", "@typescript-eslint/type-utils": "8.38.0", "@typescript-eslint/utils": "8.38.0", "@typescript-eslint/visitor-keys": "8.38.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.38.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.35.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.35.0", "@typescript-eslint/types": "8.35.0", "@typescript-eslint/typescript-estree": "8.35.0", "@typescript-eslint/visitor-keys": "8.35.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.38.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.38.0", "@typescript-eslint/types": "8.38.0", "@typescript-eslint/typescript-estree": "8.38.0", "@typescript-eslint/visitor-keys": "8.38.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.35.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.35.0", "@typescript-eslint/types": "^8.35.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.38.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.38.0", "@typescript-eslint/types": "^8.38.0", "debug": "^4.3.4" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.35.0", "", { "dependencies": { "@typescript-eslint/types": "8.35.0", "@typescript-eslint/visitor-keys": "8.35.0" } }, "sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.38.0", "", { "dependencies": { "@typescript-eslint/types": "8.38.0", "@typescript-eslint/visitor-keys": "8.38.0" } }, "sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.35.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.38.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.35.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.35.0", "@typescript-eslint/utils": "8.35.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.38.0", "", { "dependencies": { "@typescript-eslint/types": "8.38.0", "@typescript-eslint/typescript-estree": "8.38.0", "@typescript-eslint/utils": "8.38.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.35.0", "", {}, "sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.38.0", "", {}, "sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.35.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.35.0", "@typescript-eslint/tsconfig-utils": "8.35.0", "@typescript-eslint/types": "8.35.0", "@typescript-eslint/visitor-keys": "8.35.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.38.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.38.0", "@typescript-eslint/tsconfig-utils": "8.38.0", "@typescript-eslint/types": "8.38.0", "@typescript-eslint/visitor-keys": "8.38.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.35.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.35.0", "@typescript-eslint/types": "8.35.0", "@typescript-eslint/typescript-estree": "8.35.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.38.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.38.0", "@typescript-eslint/types": "8.38.0", "@typescript-eslint/typescript-estree": "8.38.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.35.0", "", { "dependencies": { "@typescript-eslint/types": "8.35.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.38.0", "", { "dependencies": { "@typescript-eslint/types": "8.38.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g=="], - "@typespec/ts-http-runtime": ["@typespec/ts-http-runtime@0.2.3", "", { "dependencies": { "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "tslib": "^2.6.2" } }, "sha512-oRhjSzcVjX8ExyaF8hC0zzTqxlVuRlgMHL/Bh4w3xB9+wjbm0FpXylVU/lBrn+kgphwYTrOk3tp+AVShGmlYCg=="], + "@typespec/ts-http-runtime": ["@typespec/ts-http-runtime@0.3.0", "", { "dependencies": { "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "tslib": "^2.6.2" } }, "sha512-sOx1PKSuFwnIl7z4RN0Ls7N9AQawmR9r66eI5rFCzLDIs8HTIYrIpH9QjYWoX0lkgGrkLxXhi4QnK7MizPRrIg=="], "@uidotdev/usehooks": ["@uidotdev/usehooks@2.4.1", "", { "peerDependencies": { "react": ">=18.0.0", "react-dom": ">=18.0.0" } }, "sha512-1I+RwWyS+kdv3Mv0Vmc+p0dPYH0DTRAo04HLyXReYBL9AeseDWUJyi4THuksBJcu9F0Pih69Ak150VDnqbVnXg=="], "@ungap/structured-clone": ["@ungap/structured-clone@1.3.0", "", {}, "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g=="], - "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.9.2", "", { "os": "android", "cpu": "arm" }, "sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A=="], + "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="], - "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.9.2", "", { "os": "android", "cpu": "arm64" }, "sha512-MffGiZULa/KmkNjHeuuflLVqfhqLv1vZLm8lWIyeADvlElJ/GLSOkoUX+5jf4/EGtfwrNFcEaB8BRas03KT0/Q=="], + "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="], - "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.9.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-dzJYK5rohS1sYl1DHdJ3mwfwClJj5BClQnQSyAgEfggbUwA9RlROQSSbKBLqrGfsiC/VyrDPtbO8hh56fnkbsQ=="], + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="], - "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.9.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-gaIMWK+CWtXcg9gUyznkdV54LzQ90S3X3dn8zlh+QR5Xy7Y+Efqw4Rs4im61K1juy4YNb67vmJsCDAGOnIeffQ=="], + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="], - "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.9.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-S7QpkMbVoVJb0xwHFwujnwCAEDe/596xqY603rpi/ioTn9VDgBHnCCxh+UFrr5yxuMH+dliHfjwCZJXOPJGPnw=="], + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="], - "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.9.2", "", { "os": "linux", "cpu": "arm" }, "sha512-+XPUMCuCCI80I46nCDFbGum0ZODP5NWGiwS3Pj8fOgsG5/ctz+/zzuBlq/WmGa+EjWZdue6CF0aWWNv84sE1uw=="], + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="], - "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.9.2", "", { "os": "linux", "cpu": "arm" }, "sha512-sqvUyAd1JUpwbz33Ce2tuTLJKM+ucSsYpPGl2vuFwZnEIg0CmdxiZ01MHQ3j6ExuRqEDUCy8yvkDKvjYFPb8Zg=="], + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="], - "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.9.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA=="], + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="], - "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.9.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA=="], + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="], - "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.9.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw=="], + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="], - "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.9.2", "", { "os": "linux", "cpu": "none" }, "sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ=="], + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="], - "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.9.2", "", { "os": "linux", "cpu": "none" }, "sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg=="], + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="], - "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.9.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ=="], + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="], - "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.9.2", "", { "os": "linux", "cpu": "x64" }, "sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w=="], + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="], - "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.9.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw=="], + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="], - "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.9.2", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ=="], + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="], - "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.9.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-EdFbGn7o1SxGmN6aZw9wAkehZJetFPao0VGZ9OMBwKx6TkvDuj6cNeLimF/Psi6ts9lMOe+Dt6z19fZQ9Ye2fw=="], + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="], - "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.9.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-JY9hi1p7AG+5c/dMU8o2kWemM8I6VZxfGwn1GCtf3c5i+IKcMo2NQ8OjZ4Z3/itvY/Si3K10jOBQn7qsD/whUA=="], + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="], - "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.9.2", "", { "os": "win32", "cpu": "x64" }, "sha512-ryoo+EB19lMxAd80ln9BVf8pdOAxLb97amrQ3SFN9OCRn/5M5wvwDgAe4i8ZjhpbiHoDeP8yavcTEnpKBo7lZg=="], + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="], "@uploadthing/mime-types": ["@uploadthing/mime-types@0.3.5", "", {}, "sha512-iYOmod80XXOSe4NVvaUG9FsS91YGPUaJMTBj52Nwu0G2aTzEN6Xcl0mG1rWqXJ4NUH8MzjVqg+tQND5TPkJWhg=="], @@ -2049,15 +2051,15 @@ "@upstash/ratelimit": ["@upstash/ratelimit@2.0.5", "", { "dependencies": { "@upstash/core-analytics": "^0.0.10" }, "peerDependencies": { "@upstash/redis": "^1.34.3" } }, "sha512-1FRv0cs3ZlBjCNOCpCmKYmt9BYGIJf0J0R3pucOPE88R21rL7jNjXG+I+rN/BVOvYJhI9niRAS/JaSNjiSICxA=="], - "@upstash/redis": ["@upstash/redis@1.35.0", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-WUm0Jz1xN4DBDGeJIi2Y0kVsolWRB2tsVds4SExaiLg4wBdHFMB+8IfZtBWr+BP0FvhuBr5G1/VLrJ9xzIWHsg=="], + "@upstash/redis": ["@upstash/redis@1.35.1", "", { "dependencies": { "uncrypto": "^0.1.3" } }, "sha512-sIMuAMU9IYbE2bkgDby8KLoQKRiBMXn0moXxqLvUmQ7VUu2CvulZLtK8O0x3WQZFvvZhU5sRC2/lOVZdGfudkA=="], "@use-gesture/core": ["@use-gesture/core@10.3.1", "", {}, "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw=="], "@use-gesture/react": ["@use-gesture/react@10.3.1", "", { "dependencies": { "@use-gesture/core": "10.3.1" }, "peerDependencies": { "react": ">= 16.8.0" } }, "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g=="], - "@vercel/sdk": ["@vercel/sdk@1.9.0", "", { "peerDependencies": { "@modelcontextprotocol/sdk": ">=1.5.0 <1.10.0", "zod": ">= 3" }, "optionalPeers": ["@modelcontextprotocol/sdk"], "bin": { "mcp": "bin/mcp-server.js" } }, "sha512-Zic62YEexipOzJd8LNDjbxVjR6VSW4xaTbkxigJBUTFMh2NxS0zevmA1oeC4/DanBbs3lVcQpBZy+Owey1GN+w=="], + "@vercel/sdk": ["@vercel/sdk@1.10.0", "", { "peerDependencies": { "@modelcontextprotocol/sdk": ">=1.5.0 <1.10.0", "zod": "^3" }, "optionalPeers": ["@modelcontextprotocol/sdk"], "bin": { "mcp": "bin/mcp-server.js" } }, "sha512-Z3bTFhDkQoEt2wviWxbvmkrkTPxVCYZaRlkV2Y3O/oRwVRnYiZ1tAK7NkjnSNtc19vARRkEAma/DfiaqVMlPzQ=="], - "@vitejs/plugin-react": ["@vitejs/plugin-react@4.6.0", "", { "dependencies": { "@babel/core": "^7.27.4", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.19", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0" } }, "sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ=="], + "@vitejs/plugin-react": ["@vitejs/plugin-react@4.7.0", "", { "dependencies": { "@babel/core": "^7.28.0", "@babel/plugin-transform-react-jsx-self": "^7.27.1", "@babel/plugin-transform-react-jsx-source": "^7.27.1", "@rolldown/pluginutils": "1.0.0-beta.27", "@types/babel__core": "^7.20.5", "react-refresh": "^0.17.0" }, "peerDependencies": { "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" } }, "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA=="], "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], @@ -2077,7 +2079,7 @@ "@vladfrangu/async_event_emitter": ["@vladfrangu/async_event_emitter@2.4.6", "", {}, "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA=="], - "@webgpu/types": ["@webgpu/types@0.1.62", "", {}, "sha512-eS+Go7OnNIILkrrh/w450XfzdyCfnJPmfAgJlNKIn1sR31Jhi9dbsIjFvP98z2U+AgtgNRfCk2lBQdczHCaOGQ=="], + "@webgpu/types": ["@webgpu/types@0.1.64", "", {}, "sha512-84kRIAGV46LJTlJZWxShiOrNL30A+9KokD7RB3dRCIqODFjodS5tCD5yyiZ8kIReGVZSDfA3XkkwyyOIF6K62A=="], "@xobotyi/scrollbar-width": ["@xobotyi/scrollbar-width@1.9.5", "", {}, "sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ=="], @@ -2097,13 +2099,13 @@ "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], - "agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], + "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="], "aggregate-error": ["aggregate-error@3.1.0", "", { "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" } }, "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA=="], - "ai": ["ai@4.3.16", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/react": "1.2.12", "@ai-sdk/ui-utils": "1.2.11", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["react"] }, "sha512-KUDwlThJ5tr2Vw0A1ZkbDKNME3wzWhuVfAOwIvFUzl1TPVDFAXDFTXio3p+jaKneB+dKNCvFFlolYmmgHttG1g=="], + "ai": ["ai@4.3.19", "", { "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/react": "1.2.12", "@ai-sdk/ui-utils": "1.2.11", "@opentelemetry/api": "1.9.0", "jsondiffpatch": "0.6.0" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "optionalPeers": ["react"] }, "sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q=="], "ajv": ["ajv@6.12.6", "", { "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="], @@ -2201,9 +2203,9 @@ "balanced-match": ["balanced-match@1.0.2", "", {}, "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="], - "bare-events": ["bare-events@2.5.4", "", {}, "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA=="], + "bare-events": ["bare-events@2.6.0", "", {}, "sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg=="], - "bare-fs": ["bare-fs@4.1.5", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA=="], + "bare-fs": ["bare-fs@4.1.6", "", { "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", "bare-stream": "^2.6.4" }, "peerDependencies": { "bare-buffer": "*" }, "optionalPeers": ["bare-buffer"] }, "sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ=="], "bare-os": ["bare-os@3.6.1", "", {}, "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g=="], @@ -2221,9 +2223,9 @@ "before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], - "better-auth": ["better-auth@1.2.10", "", { "dependencies": { "@better-auth/utils": "0.2.5", "@better-fetch/fetch": "^1.1.18", "@noble/ciphers": "^0.6.0", "@noble/hashes": "^1.6.1", "@simplewebauthn/browser": "^13.0.0", "@simplewebauthn/server": "^13.0.0", "better-call": "^1.0.8", "defu": "^6.1.4", "jose": "^5.9.6", "kysely": "^0.28.2", "nanostores": "^0.11.3", "zod": "^3.24.1" } }, "sha512-nEj1RG4DdLUuJiV5CR93ORyPCptGRBwksaPPCkUtGo9ka+UIlTpaiKoTaTqVLLYlqwX4bOj9tJ32oBNdf2G3Kg=="], + "better-auth": ["better-auth@1.3.2", "", { "dependencies": { "@better-auth/utils": "0.2.5", "@better-fetch/fetch": "^1.1.18", "@noble/ciphers": "^0.6.0", "@noble/hashes": "^1.8.0", "@simplewebauthn/browser": "^13.0.0", "@simplewebauthn/server": "^13.0.0", "better-call": "^1.0.12", "defu": "^6.1.4", "jose": "^5.9.6", "kysely": "^0.28.1", "nanostores": "^0.11.3", "zod": "^4.0.5" }, "peerDependencies": { "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["react", "react-dom"] }, "sha512-510kOtFBTdp4z51hWtTEqk9yqSinXzyg7PkDFnXYMq1K0KvdXRY1A9t9J998i0CSf/tJA0wNoN3S8exkOgBvTw=="], - "better-call": ["better-call@1.0.9", "", { "dependencies": { "@better-fetch/fetch": "^1.1.4", "rou3": "^0.5.1", "set-cookie-parser": "^2.7.1", "uncrypto": "^0.1.3" } }, "sha512-Qfm0gjk0XQz0oI7qvTK1hbqTsBY4xV2hsHAxF8LZfUYl3RaECCIifXuVqtPpZJWvlCCMlQSvkvhhyuApGUba6g=="], + "better-call": ["better-call@1.0.12", "", { "dependencies": { "@better-fetch/fetch": "^1.1.4", "rou3": "^0.5.1", "set-cookie-parser": "^2.7.1", "uncrypto": "^0.1.3" } }, "sha512-ssq5OfB9Ungv2M1WVrRnMBomB0qz1VKuhkY2WxjHaLtlsHoSe9EPolj1xf7xf8LY9o3vfk3Rx6rCWI4oVHeBRg=="], "bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="], @@ -2253,14 +2255,12 @@ "buffer-from": ["buffer-from@1.1.2", "", {}, "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="], - "bun-types": ["bun-types@1.2.17", "", { "dependencies": { "@types/node": "*" } }, "sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ=="], + "bun-types": ["bun-types@1.2.19", "", { "dependencies": { "@types/node": "*" }, "peerDependencies": { "@types/react": "^19" } }, "sha512-uAOTaZSPuYsWIXRpj7o56Let0g/wjihKCkeRqUBhlLVM/Bt+Fj9xTo+LhC1OV1XDaGkz4hNC80et5xgy+9KTHQ=="], "bundle-name": ["bundle-name@4.1.0", "", { "dependencies": { "run-applescript": "^7.0.0" } }, "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q=="], "bundle-require": ["bundle-require@5.1.0", "", { "dependencies": { "load-tsconfig": "^0.2.3" }, "peerDependencies": { "esbuild": ">=0.18" } }, "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA=="], - "busboy": ["busboy@1.6.0", "", { "dependencies": { "streamsearch": "^1.1.0" } }, "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA=="], - "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], @@ -2281,9 +2281,9 @@ "camelcase-css": ["camelcase-css@2.0.1", "", {}, "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA=="], - "camera-controls": ["camera-controls@2.10.1", "", { "peerDependencies": { "three": ">=0.126.1" } }, "sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w=="], + "camera-controls": ["camera-controls@3.1.0", "", { "peerDependencies": { "three": ">=0.126.1" } }, "sha512-w5oULNpijgTRH0ARFJJ0R5ct1nUM3R3WP7/b8A6j9uTGpRfnsypc/RBMPQV8JQDPayUe37p/TZZY1PcUr4czOQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001726", "", {}, "sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw=="], + "caniuse-lite": ["caniuse-lite@1.0.30001727", "", {}, "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q=="], "canvas-confetti": ["canvas-confetti@1.9.3", "", {}, "sha512-rFfTURMvmVEX1gyXFgn5QMn81bYk70qa0HLzcIOSVEyl57n6o9ItHeBtUSWdvKAPY0xlvBHno4/v3QPrT83q9g=="], @@ -2291,7 +2291,7 @@ "ccount": ["ccount@2.0.1", "", {}, "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg=="], - "chai": ["chai@5.2.0", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw=="], + "chai": ["chai@5.2.1", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -2313,7 +2313,9 @@ "chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], - "chromium-bidi": ["chromium-bidi@5.1.0", "", { "dependencies": { "mitt": "^3.0.1", "zod": "^3.24.1" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-9MSRhWRVoRPDG0TgzkHrshFSJJNZzfY5UFqUMuksg7zL1yoZIZ3jLB0YAgHclbiAxPI86pBnwDX1tbzoiV8aFw=="], + "chromium-bidi": ["chromium-bidi@7.1.1", "", { "dependencies": { "mitt": "^3.0.1", "zod": "^3.24.1" }, "peerDependencies": { "devtools-protocol": "*" } }, "sha512-L2BKQ0rSLADgbPMIdDh3wnYHs3EiUiMay2Sq0CTolheaADmWIf6Pe+T9LJRcnh5rcMz0U7MVk0cQVvKsGRMa1g=="], + + "citty": ["citty@0.1.6", "", { "dependencies": { "consola": "^3.2.3" } }, "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ=="], "cjs-module-lexer": ["cjs-module-lexer@1.4.3", "", {}, "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q=="], @@ -2385,7 +2387,7 @@ "conventional-changelog-conventionalcommits": ["conventional-changelog-conventionalcommits@7.0.2", "", { "dependencies": { "compare-func": "^2.0.0" } }, "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w=="], - "conventional-changelog-writer": ["conventional-changelog-writer@8.1.0", "", { "dependencies": { "conventional-commits-filter": "^5.0.0", "handlebars": "^4.7.7", "meow": "^13.0.0", "semver": "^7.5.2" }, "bin": { "conventional-changelog-writer": "dist/cli/index.js" } }, "sha512-dpC440QnORNCO81XYuRRFOLCsjKj4W7tMkUIn3lR6F/FAaJcWLi7iCj6IcEvSQY2zw6VUgwUKd5DEHKEWrpmEQ=="], + "conventional-changelog-writer": ["conventional-changelog-writer@8.2.0", "", { "dependencies": { "conventional-commits-filter": "^5.0.0", "handlebars": "^4.7.7", "meow": "^13.0.0", "semver": "^7.5.2" }, "bin": { "conventional-changelog-writer": "dist/cli/index.js" } }, "sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw=="], "conventional-commits-filter": ["conventional-commits-filter@5.0.0", "", {}, "sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q=="], @@ -2403,7 +2405,7 @@ "copy-to-clipboard": ["copy-to-clipboard@3.3.3", "", { "dependencies": { "toggle-selection": "^1.0.6" } }, "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA=="], - "core-js": ["core-js@3.43.0", "", {}, "sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA=="], + "core-js": ["core-js@3.44.0", "", {}, "sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw=="], "core-util-is": ["core-util-is@1.0.3", "", {}, "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="], @@ -2527,7 +2529,7 @@ "debug": ["debug@4.4.1", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ=="], - "decimal.js": ["decimal.js@10.5.0", "", {}, "sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw=="], + "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], "decimal.js-light": ["decimal.js-light@2.5.1", "", {}, "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg=="], @@ -2579,7 +2581,7 @@ "devlop": ["devlop@1.1.0", "", { "dependencies": { "dequal": "^2.0.0" } }, "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA=="], - "devtools-protocol": ["devtools-protocol@0.0.1452169", "", {}, "sha512-FOFDVMGrAUNp0dDKsAU1TorWJUx2JOU1k9xdgBKKJF3IBh/Uhl2yswG5r3TEAOrCiGY2QRp1e6LVDQrCsTKO4g=="], + "devtools-protocol": ["devtools-protocol@0.0.1464554", "", {}, "sha512-CAoP3lYfwAGQTaAXYvA6JZR0fjGUb7qec1qf4mToyoH2TZgUFeIqYcjh6f9jNuhHfuZiEdH+PONHYrLhRQX6aw=="], "didyoumean": ["didyoumean@1.2.2", "", {}, "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw=="], @@ -2589,7 +2591,7 @@ "dir-glob": ["dir-glob@3.0.1", "", { "dependencies": { "path-type": "^4.0.0" } }, "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="], - "discord-api-types": ["discord-api-types@0.38.13", "", {}, "sha512-FELWJRgLVQuR7Az8RhdEZE0k6QNjSW9PCUcU1iyP2Gke8HrJmnMceSS9pD93UM64s3tvZzJPajpPLjWZJylf4g=="], + "discord-api-types": ["discord-api-types@0.38.16", "", {}, "sha512-Cz42dC5WqJD17Yk0bRy7YLTJmh3NKo4FGpxZuA8MHqT0RPxKSrll5YhlODZ2z5DiEV/gpHMeTSrTFTWpSXjT1Q=="], "discord.js": ["discord.js@14.21.0", "", { "dependencies": { "@discordjs/builders": "^1.11.2", "@discordjs/collection": "1.5.3", "@discordjs/formatters": "^0.6.1", "@discordjs/rest": "^2.5.1", "@discordjs/util": "^1.1.1", "@discordjs/ws": "^1.2.3", "@sapphire/snowflake": "3.5.3", "discord-api-types": "^0.38.1", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "magic-bytes.js": "^1.10.0", "tslib": "^2.6.3", "undici": "6.21.3" } }, "sha512-U5w41cEmcnSfwKYlLv5RJjB8Joa+QJyRwIJz5i/eg+v2Qvv6EYpCRhN9I2Rlf0900LuqSDg8edakUATrDZQncQ=="], @@ -2621,7 +2623,7 @@ "draco3d": ["draco3d@1.5.7", "", {}, "sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ=="], - "dub": ["dub@0.63.6", "", { "peerDependencies": { "@modelcontextprotocol/sdk": ">=1.5.0 <1.10.0", "zod": ">= 3" }, "optionalPeers": ["@modelcontextprotocol/sdk"], "bin": { "mcp": "bin/mcp-server.js" } }, "sha512-4iAJvOtj5MegRqsSpUc2H9Prvgh95vidGGEHXYrJO6bLUQ4TSfQwoRei+WdKJohV0t4klhEj4ruQx2olefMzuA=="], + "dub": ["dub@0.63.7", "", { "peerDependencies": { "@modelcontextprotocol/sdk": ">=1.5.0 <1.10.0", "zod": ">= 3" }, "optionalPeers": ["@modelcontextprotocol/sdk"], "bin": { "mcp": "bin/mcp-server.js" } }, "sha512-DhMF4ceWIPjMGA4ZU8L1pySJFtwdXRjcwchRLLWReN5t3C/MZohrLvrqbeJOBfdOE4VKGtqI8uYD3kBT+4nMSQ=="], "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], @@ -2635,9 +2637,9 @@ "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], - "effect": ["effect@3.16.10", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-F0hDCOLax7i3SOy5wQnJZTzKP9aGg8OQNUJ2s8YoL5fVcCgRCgE+Ky+Hfz5qC7LgVVOWDDbRpCh5MPB20wRI8Q=="], + "effect": ["effect@3.17.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-szMlUsbPhP9lsrU+sDPXL9pQT2ew8PhcZvPm0p5dzYFbc+Jn/lH2i5thtmPQdm6Ut1rS4fS67SbuG7Qm0E0oZA=="], - "electron-to-chromium": ["electron-to-chromium@1.5.176", "", {}, "sha512-2nDK9orkm7M9ZZkjO3PjbEd3VUulQLyg5T9O3enJdFvUg46Hzd4DUvTvAuEgbdHYXyFsiG4A5sO9IzToMH1cDg=="], + "electron-to-chromium": ["electron-to-chromium@1.5.190", "", {}, "sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw=="], "embla-carousel": ["embla-carousel@8.5.1", "", {}, "sha512-JUb5+FOHobSiWQ2EJNaueCNT/cQU9L6XWBbWmorWPQT9bkbk+fhsuLr8wWrzXKagO3oWszBO7MSx+GfaRk4E6A=="], @@ -2701,7 +2703,7 @@ "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], - "esbuild": ["esbuild@0.25.5", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.5", "@esbuild/android-arm": "0.25.5", "@esbuild/android-arm64": "0.25.5", "@esbuild/android-x64": "0.25.5", "@esbuild/darwin-arm64": "0.25.5", "@esbuild/darwin-x64": "0.25.5", "@esbuild/freebsd-arm64": "0.25.5", "@esbuild/freebsd-x64": "0.25.5", "@esbuild/linux-arm": "0.25.5", "@esbuild/linux-arm64": "0.25.5", "@esbuild/linux-ia32": "0.25.5", "@esbuild/linux-loong64": "0.25.5", "@esbuild/linux-mips64el": "0.25.5", "@esbuild/linux-ppc64": "0.25.5", "@esbuild/linux-riscv64": "0.25.5", "@esbuild/linux-s390x": "0.25.5", "@esbuild/linux-x64": "0.25.5", "@esbuild/netbsd-arm64": "0.25.5", "@esbuild/netbsd-x64": "0.25.5", "@esbuild/openbsd-arm64": "0.25.5", "@esbuild/openbsd-x64": "0.25.5", "@esbuild/sunos-x64": "0.25.5", "@esbuild/win32-arm64": "0.25.5", "@esbuild/win32-ia32": "0.25.5", "@esbuild/win32-x64": "0.25.5" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ=="], + "esbuild": ["esbuild@0.25.8", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.25.8", "@esbuild/android-arm": "0.25.8", "@esbuild/android-arm64": "0.25.8", "@esbuild/android-x64": "0.25.8", "@esbuild/darwin-arm64": "0.25.8", "@esbuild/darwin-x64": "0.25.8", "@esbuild/freebsd-arm64": "0.25.8", "@esbuild/freebsd-x64": "0.25.8", "@esbuild/linux-arm": "0.25.8", "@esbuild/linux-arm64": "0.25.8", "@esbuild/linux-ia32": "0.25.8", "@esbuild/linux-loong64": "0.25.8", "@esbuild/linux-mips64el": "0.25.8", "@esbuild/linux-ppc64": "0.25.8", "@esbuild/linux-riscv64": "0.25.8", "@esbuild/linux-s390x": "0.25.8", "@esbuild/linux-x64": "0.25.8", "@esbuild/netbsd-arm64": "0.25.8", "@esbuild/netbsd-x64": "0.25.8", "@esbuild/openbsd-arm64": "0.25.8", "@esbuild/openbsd-x64": "0.25.8", "@esbuild/openharmony-arm64": "0.25.8", "@esbuild/sunos-x64": "0.25.8", "@esbuild/win32-arm64": "0.25.8", "@esbuild/win32-ia32": "0.25.8", "@esbuild/win32-x64": "0.25.8" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], @@ -2711,7 +2713,7 @@ "escodegen": ["escodegen@2.1.0", "", { "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "optionalDependencies": { "source-map": "~0.6.1" }, "bin": { "esgenerate": "bin/esgenerate.js", "escodegen": "bin/escodegen.js" } }, "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w=="], - "eslint": ["eslint@9.29.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.1", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.29.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ=="], + "eslint": ["eslint@9.31.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.0", "@eslint/config-helpers": "^0.3.0", "@eslint/core": "^0.15.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.31.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ=="], "eslint-config-next": ["eslint-config-next@15.4.0-canary.85", "", { "dependencies": { "@next/eslint-plugin-next": "15.4.0-canary.85", "@rushstack/eslint-patch": "^1.10.3", "@typescript-eslint/eslint-plugin": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser": "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^5.0.0" }, "peerDependencies": { "eslint": "^7.23.0 || ^8.0.0 || ^9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-aI8S/cGs3AapI3po3ANDh5wnZ5JiZcFEn32n+P7FrfHwEY1IittY6ktTajt8HZEZqnhwFM38d2GH1PMscxP6bw=="], @@ -2767,12 +2769,14 @@ "execa": ["execa@5.1.1", "", { "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="], - "expect-type": ["expect-type@1.2.1", "", {}, "sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw=="], + "expect-type": ["expect-type@1.2.2", "", {}, "sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA=="], "exponential-backoff": ["exponential-backoff@3.1.2", "", {}, "sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA=="], "express": ["express@4.21.2", "", { "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "0.19.0", "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" } }, "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA=="], + "exsolve": ["exsolve@1.0.7", "", {}, "sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw=="], + "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="], "extend-shallow": ["extend-shallow@2.0.1", "", { "dependencies": { "is-extendable": "^0.1.0" } }, "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug=="], @@ -2801,7 +2805,7 @@ "fast-uri": ["fast-uri@3.0.6", "", {}, "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw=="], - "fast-xml-parser": ["fast-xml-parser@4.4.1", "", { "dependencies": { "strnum": "^1.0.5" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw=="], + "fast-xml-parser": ["fast-xml-parser@5.2.5", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ=="], "fastest-stable-stringify": ["fastest-stable-stringify@2.0.2", "", {}, "sha512-bijHueCGd0LqqNK9b5oCMHc0MluJAx0cwqASgbWMvkO01lCYgIhacVRLcaDz3QnyYIRNJRDwMb41VuT6pHJ91Q=="], @@ -2823,7 +2827,7 @@ "finalhandler": ["finalhandler@1.3.1", "", { "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", "statuses": "2.0.1", "unpipe": "~1.0.0" } }, "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ=="], - "find-my-way-ts": ["find-my-way-ts@0.1.5", "", {}, "sha512-4GOTMrpGQVzsCH2ruUn2vmwzV/02zF4q+ybhCIrw/Rkt3L8KWcycdC6aJMctJzwN4fXD4SD5F/4B9Sksh5rE0A=="], + "find-my-way-ts": ["find-my-way-ts@0.1.6", "", {}, "sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA=="], "find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="], @@ -2841,7 +2845,7 @@ "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], - "fleetctl": ["fleetctl@4.69.0", "", { "dependencies": { "axios": "1.8.2", "rimraf": "6.0.1", "tar": "7.4.3" }, "bin": { "fleetctl": "run.js" } }, "sha512-JbO/TuO8a5f7fYX1DhaMoE6WdFzi7Z/AbRQ0G8Xr9J7zTzUUfB0+F4HrAXD7V4zjvZzPYWnTYuKh52M1iIjUnQ=="], + "fleetctl": ["fleetctl@4.70.1", "", { "dependencies": { "axios": "1.8.2", "rimraf": "6.0.1", "tar": "7.4.3" }, "bin": { "fleetctl": "run.js" } }, "sha512-tk5o0p3/PwbEWTggTIy31dUkQBa83GH6smRIp773r4jsN0zw6bPvDNb40hg44tu4HOGXnPZhCsXJWuM6xEgfEg=="], "follow-redirects": ["follow-redirects@1.15.9", "", {}, "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ=="], @@ -2851,7 +2855,7 @@ "forever-agent": ["forever-agent@0.6.1", "", {}, "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw=="], - "form-data": ["form-data@4.0.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA=="], + "form-data": ["form-data@4.0.4", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow=="], "form-data-encoder": ["form-data-encoder@1.7.2", "", {}, "sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A=="], @@ -2861,7 +2865,7 @@ "fraction.js": ["fraction.js@4.3.7", "", {}, "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew=="], - "framer-motion": ["framer-motion@12.19.1", "", { "dependencies": { "motion-dom": "^12.19.0", "motion-utils": "^12.19.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-nq9hwWAEKf4gzprbOZzKugLV5OVKF7zrNDY6UOVu+4D3ZgIkg8L9Jy6AMrpBM06fhbKJ6LEG6UY5+t7Eq6wNlg=="], + "framer-motion": ["framer-motion@12.23.6", "", { "dependencies": { "motion-dom": "^12.23.6", "motion-utils": "^12.23.6", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-dsJ389QImVE3lQvM8Mnk99/j8tiZDM/7706PCqvkQ8sSCnpmWxsgX+g0lj7r5OBVL0U36pIecCTBoIWcM2RuKw=="], "fresh": ["fresh@0.5.2", "", {}, "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="], @@ -2907,7 +2911,7 @@ "get-tsconfig": ["get-tsconfig@4.10.1", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ=="], - "get-uri": ["get-uri@6.0.4", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ=="], + "get-uri": ["get-uri@6.0.5", "", { "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4" } }, "sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg=="], "getpass": ["getpass@0.1.7", "", { "dependencies": { "assert-plus": "^1.0.0" } }, "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng=="], @@ -2923,7 +2927,7 @@ "global-directory": ["global-directory@4.0.1", "", { "dependencies": { "ini": "4.1.1" } }, "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q=="], - "globals": ["globals@11.12.0", "", {}, "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA=="], + "globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], "globalthis": ["globalthis@1.0.4", "", { "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ=="], @@ -2973,7 +2977,7 @@ "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="], - "hls.js": ["hls.js@1.6.5", "", {}, "sha512-KMn5n7JBK+olC342740hDPHnGWfE8FiHtGMOdJPfUjRdARTWj9OB+8c13fnsf9sk1VtpuU2fKSgUjHvg4rNbzQ=="], + "hls.js": ["hls.js@1.6.7", "", {}, "sha512-QW2fnwDGKGc9DwQUGLbmMOz8G48UZK7PVNJPcOUql1b8jubKx4/eMHNP5mGqr6tYlJNDG1g10Lx2U/qPzL6zwQ=="], "hoist-non-react-statics": ["hoist-non-react-statics@3.3.2", "", { "dependencies": { "react-is": "^16.7.0" } }, "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw=="], @@ -3245,7 +3249,7 @@ "kleur": ["kleur@3.0.3", "", {}, "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w=="], - "kysely": ["kysely@0.28.2", "", {}, "sha512-4YAVLoF0Sf0UTqlhgQMFU9iQECdah7n+13ANkiuVfRvlK+uI0Etbgd7bVP36dKlG+NXWbhGua8vnGt+sdhvT7A=="], + "kysely": ["kysely@0.28.3", "", {}, "sha512-svKnkSH72APRdjfVCCOknxaC9Eb3nA2StHG9d5/sKOqRvHRp2Dtf1XwDvc92b4B5v6LV+EAGWXQbZ5jMOvHaDw=="], "language-subtag-registry": ["language-subtag-registry@0.3.23", "", {}, "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ=="], @@ -3533,11 +3537,11 @@ "module-details-from-path": ["module-details-from-path@1.0.4", "", {}, "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w=="], - "motion": ["motion@12.19.1", "", { "dependencies": { "framer-motion": "^12.19.1", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-OhoHWrht+zwDPccr2wGltJdwgz2elFBBt/sLei2g0hwICvy2hOBFUkA4Ylup3VnDgz+vUtecf694EV7bJK4XjA=="], + "motion": ["motion@12.23.6", "", { "dependencies": { "framer-motion": "^12.23.6", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-6U55IW5i6Vut2ryKEhrZKg55490k9d6qdGXZoNSf98oQgDj5D7bqTnVJotQ6UW3AS6QfbW6KSLa7/e1gy+a07g=="], - "motion-dom": ["motion-dom@12.19.0", "", { "dependencies": { "motion-utils": "^12.19.0" } }, "sha512-m96uqq8VbwxFLU0mtmlsIVe8NGGSdpBvBSHbnnOJQxniPaabvVdGgxSamhuDwBsRhwX7xPxdICgVJlOpzn/5bw=="], + "motion-dom": ["motion-dom@12.23.6", "", { "dependencies": { "motion-utils": "^12.23.6" } }, "sha512-G2w6Nw7ZOVSzcQmsdLc0doMe64O/Sbuc2bVAbgMz6oP/6/pRStKRiVRV4bQfHp5AHYAKEGhEdVHTM+R3FDgi5w=="], - "motion-utils": ["motion-utils@12.19.0", "", {}, "sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw=="], + "motion-utils": ["motion-utils@12.23.6", "", {}, "sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ=="], "mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="], @@ -3545,11 +3549,11 @@ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "msgpackr": ["msgpackr@1.11.4", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg=="], + "msgpackr": ["msgpackr@1.11.5", "", { "optionalDependencies": { "msgpackr-extract": "^3.0.2" } }, "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA=="], "msgpackr-extract": ["msgpackr-extract@3.0.3", "", { "dependencies": { "node-gyp-build-optional-packages": "5.2.2" }, "optionalDependencies": { "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" }, "bin": { "download-msgpackr-prebuilds": "bin/download-prebuilds.js" } }, "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA=="], - "multipasta": ["multipasta@0.2.5", "", {}, "sha512-c8eMDb1WwZcE02WVjHoOmUVk7fnKU/RmUcosHACglrWAuPQsEJv+E8430sXj6jNc1jHw0zrS16aCjQh4BcEb4A=="], + "multipasta": ["multipasta@0.2.7", "", {}, "sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA=="], "mz": ["mz@2.7.0", "", { "dependencies": { "any-promise": "^1.0.0", "object-assign": "^4.0.1", "thenify-all": "^1.0.0" } }, "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q=="], @@ -3561,7 +3565,7 @@ "nanostores": ["nanostores@0.11.4", "", {}, "sha512-k1oiVNN4hDK8NcNERSZLQiMfRzEGtfnvZvdBvey3SQbgn8Dcrk0h1I6vpxApjb10PFUflZrgJ2WEZyJQ+5v7YQ=="], - "napi-postinstall": ["napi-postinstall@0.2.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg=="], + "napi-postinstall": ["napi-postinstall@0.3.2", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], @@ -3575,7 +3579,7 @@ "next": ["next@15.4.0-canary.85", "", { "dependencies": { "@next/env": "15.4.0-canary.85", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.4.0-canary.85", "@next/swc-darwin-x64": "15.4.0-canary.85", "@next/swc-linux-arm64-gnu": "15.4.0-canary.85", "@next/swc-linux-arm64-musl": "15.4.0-canary.85", "@next/swc-linux-x64-gnu": "15.4.0-canary.85", "@next/swc-linux-x64-musl": "15.4.0-canary.85", "@next/swc-win32-arm64-msvc": "15.4.0-canary.85", "@next/swc-win32-x64-msvc": "15.4.0-canary.85", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-xD+Es5CYPkb20//rQ9/vmWhx1TCohe8V2BhVzwkMv9UwAF8wMUK4GCyHyyXnvxqlNRfGG8KhDjS4IaTxq1ShEg=="], - "next-safe-action": ["next-safe-action@8.0.7", "", { "peerDependencies": { "next": ">= 14.0.0", "react": ">= 18.2.0", "react-dom": ">= 18.2.0" } }, "sha512-clQRxsvf4nZktCYkP1seeNH5rOZjsx6VYSAlpphvXvW+INIBvGySEStKutwtAPFV0/uZFJmNPt77ankoepUYXQ=="], + "next-safe-action": ["next-safe-action@8.0.8", "", { "peerDependencies": { "next": ">= 14.0.0", "react": ">= 18.2.0", "react-dom": ">= 18.2.0" } }, "sha512-qh1wMMrv7vfxoL67ePn1+LDWOrEjlRe7bIgKI47e5TVWOQ2YCHY/ir2Wx687vwDWPF41ifUnHA7jm/HH8JQHNQ=="], "next-themes": ["next-themes@0.4.6", "", { "peerDependencies": { "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA=="], @@ -3631,6 +3635,8 @@ "nwsapi": ["nwsapi@2.2.20", "", {}, "sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA=="], + "nypm": ["nypm@0.6.0", "", { "dependencies": { "citty": "^0.1.6", "consola": "^3.4.0", "pathe": "^2.0.3", "pkg-types": "^2.0.0", "tinyexec": "^0.3.2" }, "bin": { "nypm": "dist/cli.mjs" } }, "sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg=="], + "oauth-sign": ["oauth-sign@0.9.0", "", {}, "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], @@ -3657,7 +3663,7 @@ "onetime": ["onetime@5.1.2", "", { "dependencies": { "mimic-fn": "^2.1.0" } }, "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="], - "open": ["open@10.1.2", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" } }, "sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw=="], + "open": ["open@10.2.0", "", { "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "wsl-utils": "^0.1.0" } }, "sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA=="], "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], @@ -3751,9 +3757,9 @@ "performance-now": ["performance-now@2.1.0", "", {}, "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow=="], - "pg": ["pg@8.16.2", "", { "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", "pg-protocol": "^1.10.2", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.2.6" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-OtLWF0mKLmpxelOt9BqVq83QV6bTfsS0XLegIeAKqKjurRnRKie1Dc1iL89MugmSLhftxw6NNCyZhm1yQFLMEQ=="], + "pg": ["pg@8.16.3", "", { "dependencies": { "pg-connection-string": "^2.9.1", "pg-pool": "^3.10.1", "pg-protocol": "^1.10.3", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.2.7" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw=="], - "pg-cloudflare": ["pg-cloudflare@1.2.6", "", {}, "sha512-uxmJAnmIgmYgnSFzgOf2cqGQBzwnRYcrEgXuFjJNEkpedEIPBSEzxY7ph4uA9k1mI+l/GR0HjPNS6FKNZe8SBQ=="], + "pg-cloudflare": ["pg-cloudflare@1.2.7", "", {}, "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg=="], "pg-connection-string": ["pg-connection-string@2.9.1", "", {}, "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w=="], @@ -3761,7 +3767,7 @@ "pg-pool": ["pg-pool@3.10.1", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg=="], - "pg-protocol": ["pg-protocol@1.10.2", "", {}, "sha512-Ci7jy8PbaWxfsck2dwZdERcDG2A0MG8JoQILs+uZNjABFuBuItAZCWUNz8sXRDMoui24rJw7WlXqgpMdBSN/vQ=="], + "pg-protocol": ["pg-protocol@1.10.3", "", {}, "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ=="], "pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="], @@ -3769,7 +3775,7 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], "pify": ["pify@3.0.0", "", {}, "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg=="], @@ -3781,9 +3787,9 @@ "pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="], - "playwright": ["playwright@1.53.1", "", { "dependencies": { "playwright-core": "1.53.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw=="], + "playwright": ["playwright@1.54.1", "", { "dependencies": { "playwright-core": "1.54.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g=="], - "playwright-core": ["playwright-core@1.53.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg=="], + "playwright-core": ["playwright-core@1.54.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA=="], "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], @@ -3809,11 +3815,11 @@ "postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="], - "posthog-js": ["posthog-js@1.255.1", "", { "dependencies": { "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", "web-vitals": "^4.2.4" }, "peerDependencies": { "@rrweb/types": "2.0.0-alpha.17", "rrweb-snapshot": "2.0.0-alpha.17" }, "optionalPeers": ["@rrweb/types", "rrweb-snapshot"] }, "sha512-KMh0o9MhORhEZVjXpktXB5rJ8PfDk+poqBoTSoLzWgNjhJf6D8jcyB9jUMA6vVPfn4YeepVX5NuclDRqOwr5Mw=="], + "posthog-js": ["posthog-js@1.257.2", "", { "dependencies": { "core-js": "^3.38.1", "fflate": "^0.4.8", "preact": "^10.19.3", "web-vitals": "^4.2.4" }, "peerDependencies": { "@rrweb/types": "2.0.0-alpha.17", "rrweb-snapshot": "2.0.0-alpha.17" }, "optionalPeers": ["@rrweb/types", "rrweb-snapshot"] }, "sha512-E+8wI/ahaiUGrmkilOtAB9aTFL+oELwOEsH1eO/2NyXB5WWcSUk6Rm1loixq8/lC4f3oR+Qqp9rHyXTSYbBDRQ=="], "posthog-node": ["posthog-node@4.18.0", "", { "dependencies": { "axios": "^1.8.2" } }, "sha512-XROs1h+DNatgKh/AlIlCtDxWzwrKdYDb2mOs58n4yN8BkGN9ewqeQwG5ApS4/IzwCb7HPttUkOVulkYatd2PIw=="], - "postprocessing": ["postprocessing@6.37.4", "", { "peerDependencies": { "three": ">= 0.157.0 < 0.178.0" } }, "sha512-O4dv29MDRSjXgMF1Luz3YHlT7NawKIliCfO2OgUCtIMTLNMCg+v0RLuT9/LQSDtVNXxUHGyy3mucbF3UePcElA=="], + "postprocessing": ["postprocessing@6.37.6", "", { "peerDependencies": { "three": ">= 0.157.0 < 0.179.0" } }, "sha512-KrdKLf1257RkoIk3z3nhRS0aToKrX2xJgtR0lbnOQUjd+1I4GVNv1gQYsQlfRglvEXjpzrwqOA5fXfoDBimadg=="], "potpack": ["potpack@1.0.2", "", {}, "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="], @@ -3821,17 +3827,17 @@ "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "prettier": ["prettier@3.6.1", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A=="], + "prettier": ["prettier@3.6.2", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ=="], - "prettier-plugin-organize-imports": ["prettier-plugin-organize-imports@4.1.0", "", { "peerDependencies": { "prettier": ">=2.0", "typescript": ">=2.9", "vue-tsc": "^2.1.0" }, "optionalPeers": ["vue-tsc"] }, "sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A=="], + "prettier-plugin-organize-imports": ["prettier-plugin-organize-imports@4.2.0", "", { "peerDependencies": { "prettier": ">=2.0", "typescript": ">=2.9", "vue-tsc": "^2.1.0 || 3" }, "optionalPeers": ["vue-tsc"] }, "sha512-Zdy27UhlmyvATZi67BTnLcKTo8fm6Oik59Sz6H64PgZJVs6NJpPD1mT240mmJn62c98/QaL+r3kx9Q3gRpDajg=="], - "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.13", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-uQ0asli1+ic8xrrSmIOaElDu0FacR4x69GynTh2oZjFY10JUt6EEumTQl5tB4fMeD6I1naKd+4rXQQ7esT2i1g=="], + "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.6.14", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-import-sort": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-style-order": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-import-sort", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-style-order", "prettier-plugin-svelte"] }, "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg=="], "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="], "pretty-ms": ["pretty-ms@9.2.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg=="], - "prisma": ["prisma@6.10.1", "", { "dependencies": { "@prisma/config": "6.10.1", "@prisma/engines": "6.10.1" }, "peerDependencies": { "typescript": ">=5.1.0" }, "optionalPeers": ["typescript"], "bin": { "prisma": "build/index.js" } }, "sha512-khhlC/G49E4+uyA3T3H5PRBut486HD2bDqE2+rvkU0pwk9IAqGFacLFUyIx9Uw+W2eCtf6XGwsp+/strUwMNPw=="], + "prisma": ["prisma@6.12.0", "", { "dependencies": { "@prisma/config": "6.12.0", "@prisma/engines": "6.12.0" }, "peerDependencies": { "typescript": ">=5.1.0" }, "optionalPeers": ["typescript"], "bin": { "prisma": "build/index.js" } }, "sha512-pmV7NEqQej9WjizN6RSNIwf7Y+jeh9mY1JEX2WjGxJi4YZWexClhde1yz/FuvAM+cTwzchcMytu2m4I6wPkIzg=="], "prismjs": ["prismjs@1.30.0", "", {}, "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw=="], @@ -3883,7 +3889,7 @@ "prosemirror-menu": ["prosemirror-menu@1.2.5", "", { "dependencies": { "crelt": "^1.0.0", "prosemirror-commands": "^1.0.0", "prosemirror-history": "^1.0.0", "prosemirror-state": "^1.0.0" } }, "sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ=="], - "prosemirror-model": ["prosemirror-model@1.25.1", "", { "dependencies": { "orderedmap": "^2.0.0" } }, "sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg=="], + "prosemirror-model": ["prosemirror-model@1.25.2", "", { "dependencies": { "orderedmap": "^2.0.0" } }, "sha512-BVypCAJ4SL6jOiTsDffP3Wp6wD69lRhI4zg/iT8JXjp3ccZFiq5WyguxvMKmdKFC3prhaig7wSr8dneDToHE1Q=="], "prosemirror-schema-basic": ["prosemirror-schema-basic@1.2.4", "", { "dependencies": { "prosemirror-model": "^1.25.0" } }, "sha512-ELxP4TlX3yr2v5rM7Sb70SqStq5NvI15c0j9j/gjsrO5vaw+fnnpovCLEGIcpeGfifkuqJwl4fon6b+KdrODYQ=="], @@ -3897,7 +3903,7 @@ "prosemirror-transform": ["prosemirror-transform@1.10.4", "", { "dependencies": { "prosemirror-model": "^1.21.0" } }, "sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw=="], - "prosemirror-view": ["prosemirror-view@1.40.0", "", { "dependencies": { "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } }, "sha512-2G3svX0Cr1sJjkD/DYWSe3cfV5VPVTBOxI9XQEGWJDFEpsZb/gh4MV29ctv+OJx2RFX4BLt09i+6zaGM/ldkCw=="], + "prosemirror-view": ["prosemirror-view@1.40.1", "", { "dependencies": { "prosemirror-model": "^1.20.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.1.0" } }, "sha512-pbwUjt3G7TlsQQHDiYSupWBhJswpLVB09xXm1YiJPdkjkh9Pe7Y51XdLh5VWIZmROLY8UpUpG03lkdhm9lzIBA=="], "proto-list": ["proto-list@1.2.4", "", {}, "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA=="], @@ -3917,7 +3923,7 @@ "punycode.js": ["punycode.js@2.3.1", "", {}, "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA=="], - "puppeteer-core": ["puppeteer-core@24.10.2", "", { "dependencies": { "@puppeteer/browsers": "2.10.5", "chromium-bidi": "5.1.0", "debug": "^4.4.1", "devtools-protocol": "0.0.1452169", "typed-query-selector": "^2.12.0", "ws": "^8.18.2" } }, "sha512-CnzhOgrZj8DvkDqI+Yx+9or33i3Y9uUYbKyYpP4C13jWwXx/keQ38RMTMmxuLCWQlxjZrOH0Foq7P2fGP7adDQ=="], + "puppeteer-core": ["puppeteer-core@24.14.0", "", { "dependencies": { "@puppeteer/browsers": "2.10.6", "chromium-bidi": "7.1.1", "debug": "^4.4.1", "devtools-protocol": "0.0.1464554", "typed-query-selector": "^2.12.0", "ws": "^8.18.3" } }, "sha512-NO9XpCl+i8oB0zJp81iPhzMo2QK8/JTj4ramSvTpGCo9CPCNo4AZ8qVOGpSgXzlcOfOT3VHOkzTfPo08GOE5jA=="], "pure-rand": ["pure-rand@6.1.0", "", {}, "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA=="], @@ -3951,9 +3957,9 @@ "react-dropzone": ["react-dropzone@14.3.8", "", { "dependencies": { "attr-accept": "^2.2.4", "file-selector": "^2.1.0", "prop-types": "^15.8.1" }, "peerDependencies": { "react": ">= 16.8 || 18.0.0" } }, "sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug=="], - "react-email": ["react-email@4.0.17", "", { "dependencies": { "@babel/parser": "^7.27.0", "@babel/traverse": "^7.27.0", "chalk": "^5.0.0", "chokidar": "^4.0.3", "commander": "^13.0.0", "debounce": "^2.0.0", "esbuild": "^0.25.0", "glob": "^11.0.0", "log-symbols": "^7.0.0", "mime-types": "^3.0.0", "next": "^15.3.1", "normalize-path": "^3.0.0", "ora": "^8.0.0", "socket.io": "^4.8.1", "tsconfig-paths": "4.2.0" }, "bin": { "email": "dist/cli/index.mjs" } }, "sha512-Wppdxgio/QKNe3piccIhk6jvgiLwfOTAwud5t/NlWL8wepsirgXo09OyZCz62Qb9flFNBw+Hz5ahOkpk3JaizQ=="], + "react-email": ["react-email@4.2.3", "", { "dependencies": { "@babel/parser": "^7.27.0", "@babel/traverse": "^7.27.0", "chalk": "^5.0.0", "chokidar": "^4.0.3", "commander": "^13.0.0", "debounce": "^2.0.0", "esbuild": "^0.25.0", "glob": "^11.0.0", "jiti": "2.4.2", "log-symbols": "^7.0.0", "mime-types": "^3.0.0", "normalize-path": "^3.0.0", "nypm": "0.6.0", "ora": "^8.0.0", "prompts": "2.4.2", "socket.io": "^4.8.1", "tsconfig-paths": "4.2.0" }, "bin": { "email": "dist/index.js" } }, "sha512-LUKyk9nNVFuTqAyp4yCEQFQjBe+s8nl3VauMWuOhBZ4VhGnimbrnv01U8yD2YwzaHKtytS0U659x5dc/0+xu+Q=="], - "react-hook-form": ["react-hook-form@7.58.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-Lml/KZYEEFfPhUVgE0RdCVpnC4yhW+PndRhbiTtdvSlQTL8IfVR+iQkBjLIvmmc6+GGoVeM11z37ktKFPAb0FA=="], + "react-hook-form": ["react-hook-form@7.60.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17 || ^18 || ^19" } }, "sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A=="], "react-hotkeys-hook": ["react-hotkeys-hook@5.1.0", "", { "peerDependencies": { "react": ">=16.8.0", "react-dom": ">=16.8.0" } }, "sha512-GCNGXjBzV9buOS3REoQFmSmE4WTvBhYQ0YrAeeMZI83bhXg3dRWsLHXDutcVDdEjwJqJCxk5iewWYX5LtFUd7g=="], @@ -3981,7 +3987,7 @@ "react-resize-detector": ["react-resize-detector@7.1.2", "", { "dependencies": { "lodash": "^4.17.21" }, "peerDependencies": { "react": "^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0" } }, "sha512-zXnPJ2m8+6oq9Nn8zsep/orts9vQv3elrpA+R8XTcW7DVVUJ9vwDwMXaBtykAYjMnkCIaOoK9vObyR7ZgFNlOw=="], - "react-select": ["react-select@5.10.1", "", { "dependencies": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", "@emotion/react": "^11.8.1", "@floating-ui/dom": "^1.0.1", "@types/react-transition-group": "^4.4.0", "memoize-one": "^6.0.0", "prop-types": "^15.6.0", "react-transition-group": "^4.3.0", "use-isomorphic-layout-effect": "^1.2.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-roPEZUL4aRZDx6DcsD+ZNreVl+fM8VsKn0Wtex1v4IazH60ILp5xhdlp464IsEAlJdXeD+BhDAFsBVMfvLQueA=="], + "react-select": ["react-select@5.10.2", "", { "dependencies": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", "@emotion/react": "^11.8.1", "@floating-ui/dom": "^1.0.1", "@types/react-transition-group": "^4.4.0", "memoize-one": "^6.0.0", "prop-types": "^15.6.0", "react-transition-group": "^4.3.0", "use-isomorphic-layout-effect": "^1.2.0" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ=="], "react-smooth": ["react-smooth@4.0.4", "", { "dependencies": { "fast-equals": "^5.0.1", "prop-types": "^15.8.1", "react-transition-group": "^4.4.5" }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q=="], @@ -4049,7 +4055,7 @@ "require-in-the-middle": ["require-in-the-middle@7.5.2", "", { "dependencies": { "debug": "^4.3.5", "module-details-from-path": "^1.0.3", "resolve": "^1.22.8" } }, "sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ=="], - "resend": ["resend@4.6.0", "", { "dependencies": { "@react-email/render": "1.1.2" } }, "sha512-D5T2I82FvEUYFlrHzaDvVtr5ADHdhuoLaXgLFGABKyNtQgPWIuz0Vp2L2Evx779qjK37aF4kcw1yXJDHhA2JnQ=="], + "resend": ["resend@4.7.0", "", { "dependencies": { "@react-email/render": "1.1.2" } }, "sha512-30IbXGBUbmDweQH2IlO53XOXX7ndjYV9xFZ8IEBiWqefqQ/qmTsgrX0Ab6MUnmobJXbpdReVv+iXGRQPubQL5Q=="], "resize-observer-polyfill": ["resize-observer-polyfill@1.5.1", "", {}, "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg=="], @@ -4075,7 +4081,7 @@ "robust-predicates": ["robust-predicates@3.0.2", "", {}, "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg=="], - "rollup": ["rollup@4.44.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.44.1", "@rollup/rollup-android-arm64": "4.44.1", "@rollup/rollup-darwin-arm64": "4.44.1", "@rollup/rollup-darwin-x64": "4.44.1", "@rollup/rollup-freebsd-arm64": "4.44.1", "@rollup/rollup-freebsd-x64": "4.44.1", "@rollup/rollup-linux-arm-gnueabihf": "4.44.1", "@rollup/rollup-linux-arm-musleabihf": "4.44.1", "@rollup/rollup-linux-arm64-gnu": "4.44.1", "@rollup/rollup-linux-arm64-musl": "4.44.1", "@rollup/rollup-linux-loongarch64-gnu": "4.44.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.44.1", "@rollup/rollup-linux-riscv64-gnu": "4.44.1", "@rollup/rollup-linux-riscv64-musl": "4.44.1", "@rollup/rollup-linux-s390x-gnu": "4.44.1", "@rollup/rollup-linux-x64-gnu": "4.44.1", "@rollup/rollup-linux-x64-musl": "4.44.1", "@rollup/rollup-win32-arm64-msvc": "4.44.1", "@rollup/rollup-win32-ia32-msvc": "4.44.1", "@rollup/rollup-win32-x64-msvc": "4.44.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg=="], + "rollup": ["rollup@4.45.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.45.1", "@rollup/rollup-android-arm64": "4.45.1", "@rollup/rollup-darwin-arm64": "4.45.1", "@rollup/rollup-darwin-x64": "4.45.1", "@rollup/rollup-freebsd-arm64": "4.45.1", "@rollup/rollup-freebsd-x64": "4.45.1", "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", "@rollup/rollup-linux-arm-musleabihf": "4.45.1", "@rollup/rollup-linux-arm64-gnu": "4.45.1", "@rollup/rollup-linux-arm64-musl": "4.45.1", "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", "@rollup/rollup-linux-riscv64-gnu": "4.45.1", "@rollup/rollup-linux-riscv64-musl": "4.45.1", "@rollup/rollup-linux-s390x-gnu": "4.45.1", "@rollup/rollup-linux-x64-gnu": "4.45.1", "@rollup/rollup-linux-x64-musl": "4.45.1", "@rollup/rollup-win32-arm64-msvc": "4.45.1", "@rollup/rollup-win32-ia32-msvc": "4.45.1", "@rollup/rollup-win32-x64-msvc": "4.45.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw=="], "rope-sequence": ["rope-sequence@1.3.4", "", {}, "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ=="], @@ -4119,11 +4125,11 @@ "selderee": ["selderee@0.11.0", "", { "dependencies": { "parseley": "^0.12.0" } }, "sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA=="], - "semantic-release": ["semantic-release@24.2.5", "", { "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", "@semantic-release/error": "^4.0.0", "@semantic-release/github": "^11.0.0", "@semantic-release/npm": "^12.0.0", "@semantic-release/release-notes-generator": "^14.0.0-beta.1", "aggregate-error": "^5.0.0", "cosmiconfig": "^9.0.0", "debug": "^4.0.0", "env-ci": "^11.0.0", "execa": "^9.0.0", "figures": "^6.0.0", "find-versions": "^6.0.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", "hook-std": "^3.0.0", "hosted-git-info": "^8.0.0", "import-from-esm": "^2.0.0", "lodash-es": "^4.17.21", "marked": "^15.0.0", "marked-terminal": "^7.3.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", "read-package-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "semver-diff": "^4.0.0", "signale": "^1.2.1", "yargs": "^17.5.1" }, "bin": { "semantic-release": "bin/semantic-release.js" } }, "sha512-9xV49HNY8C0/WmPWxTlaNleiXhWb//qfMzG2c5X8/k7tuWcu8RssbuS+sujb/h7PiWSXv53mrQvV9hrO9b7vuQ=="], + "semantic-release": ["semantic-release@24.2.7", "", { "dependencies": { "@semantic-release/commit-analyzer": "^13.0.0-beta.1", "@semantic-release/error": "^4.0.0", "@semantic-release/github": "^11.0.0", "@semantic-release/npm": "^12.0.2", "@semantic-release/release-notes-generator": "^14.0.0-beta.1", "aggregate-error": "^5.0.0", "cosmiconfig": "^9.0.0", "debug": "^4.0.0", "env-ci": "^11.0.0", "execa": "^9.0.0", "figures": "^6.0.0", "find-versions": "^6.0.0", "get-stream": "^6.0.0", "git-log-parser": "^1.2.0", "hook-std": "^3.0.0", "hosted-git-info": "^8.0.0", "import-from-esm": "^2.0.0", "lodash-es": "^4.17.21", "marked": "^15.0.0", "marked-terminal": "^7.3.0", "micromatch": "^4.0.2", "p-each-series": "^3.0.0", "p-reduce": "^3.0.0", "read-package-up": "^11.0.0", "resolve-from": "^5.0.0", "semver": "^7.3.2", "semver-diff": "^4.0.0", "signale": "^1.2.1", "yargs": "^17.5.1" }, "bin": { "semantic-release": "bin/semantic-release.js" } }, "sha512-g7RssbTAbir1k/S7uSwSVZFfFXwpomUB9Oas0+xi9KStSCmeDXcA7rNhiskjLqvUe/Evhx8fVCT16OSa34eM5g=="], "semantic-release-discord": ["semantic-release-discord@1.2.0", "", { "dependencies": { "@semantic-release/error": "^2.2.0", "discord.js": "^14.7.1" } }, "sha512-hMI5pSy9mPS2RzqakHpRcS5BllSt/shiq0diyLZqGcF0m7T4Gfc8HQA09vg8Ca7UR4hwgWoYMuPx7TLOg5HY+Q=="], - "semantic-release-discord-notifier": ["semantic-release-discord-notifier@1.0.11", "", { "dependencies": { "semantic-release": "24.2.5" } }, "sha512-EJ8qzlAKGJgZG2wp+cb2MQFhhtzb/ISCVvniBCfAc7YGXKnu40XAD6TRmiV2BkHH/+0wojZdv2fg5P/nj53mEg=="], + "semantic-release-discord-notifier": ["semantic-release-discord-notifier@1.0.13", "", { "dependencies": { "semantic-release": "24.2.7" } }, "sha512-Ds1idoxKTnj6SzzRjjJmV6DCIKRHjJS9X8clZMIWAv5WgyokrKIUr22jPvozpea/Q/dleASmYjwp2Z57ci1cXQ=="], "semver": ["semver@7.7.2", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA=="], @@ -4153,7 +4159,7 @@ "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], - "sharp": ["sharp@0.34.2", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.4", "semver": "^7.7.2" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.2", "@img/sharp-darwin-x64": "0.34.2", "@img/sharp-libvips-darwin-arm64": "1.1.0", "@img/sharp-libvips-darwin-x64": "1.1.0", "@img/sharp-libvips-linux-arm": "1.1.0", "@img/sharp-libvips-linux-arm64": "1.1.0", "@img/sharp-libvips-linux-ppc64": "1.1.0", "@img/sharp-libvips-linux-s390x": "1.1.0", "@img/sharp-libvips-linux-x64": "1.1.0", "@img/sharp-libvips-linuxmusl-arm64": "1.1.0", "@img/sharp-libvips-linuxmusl-x64": "1.1.0", "@img/sharp-linux-arm": "0.34.2", "@img/sharp-linux-arm64": "0.34.2", "@img/sharp-linux-s390x": "0.34.2", "@img/sharp-linux-x64": "0.34.2", "@img/sharp-linuxmusl-arm64": "0.34.2", "@img/sharp-linuxmusl-x64": "0.34.2", "@img/sharp-wasm32": "0.34.2", "@img/sharp-win32-arm64": "0.34.2", "@img/sharp-win32-ia32": "0.34.2", "@img/sharp-win32-x64": "0.34.2" } }, "sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg=="], + "sharp": ["sharp@0.34.3", "", { "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.4", "semver": "^7.7.2" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.3", "@img/sharp-darwin-x64": "0.34.3", "@img/sharp-libvips-darwin-arm64": "1.2.0", "@img/sharp-libvips-darwin-x64": "1.2.0", "@img/sharp-libvips-linux-arm": "1.2.0", "@img/sharp-libvips-linux-arm64": "1.2.0", "@img/sharp-libvips-linux-ppc64": "1.2.0", "@img/sharp-libvips-linux-s390x": "1.2.0", "@img/sharp-libvips-linux-x64": "1.2.0", "@img/sharp-libvips-linuxmusl-arm64": "1.2.0", "@img/sharp-libvips-linuxmusl-x64": "1.2.0", "@img/sharp-linux-arm": "0.34.3", "@img/sharp-linux-arm64": "0.34.3", "@img/sharp-linux-ppc64": "0.34.3", "@img/sharp-linux-s390x": "0.34.3", "@img/sharp-linux-x64": "0.34.3", "@img/sharp-linuxmusl-arm64": "0.34.3", "@img/sharp-linuxmusl-x64": "0.34.3", "@img/sharp-wasm32": "0.34.3", "@img/sharp-win32-arm64": "0.34.3", "@img/sharp-win32-ia32": "0.34.3", "@img/sharp-win32-x64": "0.34.3" } }, "sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], @@ -4201,11 +4207,11 @@ "socket.io-parser": ["socket.io-parser@4.2.4", "", { "dependencies": { "@socket.io/component-emitter": "~3.1.0", "debug": "~4.3.1" } }, "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew=="], - "socks": ["socks@2.8.5", "", { "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, "sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww=="], + "socks": ["socks@2.8.6", "", { "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA=="], "socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], - "sonner": ["sonner@2.0.5", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-YwbHQO6cSso3HBXlbCkgrgzDNIhws14r4MO87Ofy+cV2X7ES4pOoAK3+veSmVTvqNx1BWUxlhPmZzP00Crk2aQ=="], + "sonner": ["sonner@2.0.6", "", { "peerDependencies": { "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc" } }, "sha512-yHFhk8T/DK3YxjFQXIrcHT1rGEeTLliVzWbO0xN8GberVun2RiBnxAjXAYpZrqwEVHBG9asI/Li8TAAhN9m59Q=="], "source-map": ["source-map@0.8.0-beta.0", "", { "dependencies": { "whatwg-url": "^7.0.0" } }, "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA=="], @@ -4263,8 +4269,6 @@ "stream-combiner2": ["stream-combiner2@1.1.1", "", { "dependencies": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" } }, "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw=="], - "streamsearch": ["streamsearch@1.1.0", "", {}, "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg=="], - "streamx": ["streamx@2.22.1", "", { "dependencies": { "fast-fifo": "^1.3.2", "text-decoder": "^1.1.0" }, "optionalDependencies": { "bare-events": "^2.2.0" } }, "sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA=="], "string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], @@ -4303,7 +4307,7 @@ "strip-literal": ["strip-literal@3.0.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA=="], - "strnum": ["strnum@1.1.2", "", {}, "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA=="], + "strnum": ["strnum@2.1.1", "", {}, "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw=="], "style-to-js": ["style-to-js@1.1.17", "", { "dependencies": { "style-to-object": "1.0.9" } }, "sha512-xQcBGDxJb6jjFCTzvQtfiPn6YvvP2O8U1MDIPNfJQlWMYfktPy+iGsHE7cssjs7y84d9fQaK4UF3RIJaAHSoYA=="], @@ -4327,7 +4331,7 @@ "suspend-react": ["suspend-react@0.1.3", "", { "peerDependencies": { "react": ">=17.0" } }, "sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ=="], - "swr": ["swr@2.3.3", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A=="], + "swr": ["swr@2.3.4", "", { "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg=="], "symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="], @@ -4343,7 +4347,7 @@ "tar": ["tar@7.4.3", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.0.1", "mkdirp": "^3.0.1", "yallist": "^5.0.0" } }, "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw=="], - "tar-fs": ["tar-fs@3.0.10", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-C1SwlQGNLe/jPNqapK8epDsXME7CAJR5RL3GcE6KWx1d9OUByzoHVcbu1VPI8tevg9H8Alae0AApHHFGzrD5zA=="], + "tar-fs": ["tar-fs@3.1.0", "", { "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" }, "optionalDependencies": { "bare-fs": "^4.0.1", "bare-path": "^3.0.0" } }, "sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w=="], "tar-stream": ["tar-stream@3.1.7", "", { "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } }, "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ=="], @@ -4465,25 +4469,25 @@ "tunnel-rat": ["tunnel-rat@0.1.2", "", { "dependencies": { "zustand": "^4.3.2" } }, "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ=="], - "turbo": ["turbo@2.5.4", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.4", "turbo-darwin-arm64": "2.5.4", "turbo-linux-64": "2.5.4", "turbo-linux-arm64": "2.5.4", "turbo-windows-64": "2.5.4", "turbo-windows-arm64": "2.5.4" }, "bin": { "turbo": "bin/turbo" } }, "sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA=="], + "turbo": ["turbo@2.5.5", "", { "optionalDependencies": { "turbo-darwin-64": "2.5.5", "turbo-darwin-arm64": "2.5.5", "turbo-linux-64": "2.5.5", "turbo-linux-arm64": "2.5.5", "turbo-windows-64": "2.5.5", "turbo-windows-arm64": "2.5.5" }, "bin": { "turbo": "bin/turbo" } }, "sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A=="], - "turbo-darwin-64": ["turbo-darwin-64@2.5.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ=="], + "turbo-darwin-64": ["turbo-darwin-64@2.5.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-RYnTz49u4F5tDD2SUwwtlynABNBAfbyT2uU/brJcyh5k6lDLyNfYKdKmqd3K2ls4AaiALWrFKVSBsiVwhdFNzQ=="], - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A=="], + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.5.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Tk+ZeSNdBobZiMw9aFypQt0DlLsWSFWu1ymqsAdJLuPoAH05qCfYtRxE1pJuYHcJB5pqI+/HOxtJoQ40726Btw=="], - "turbo-linux-64": ["turbo-linux-64@2.5.4", "", { "os": "linux", "cpu": "x64" }, "sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA=="], + "turbo-linux-64": ["turbo-linux-64@2.5.5", "", { "os": "linux", "cpu": "x64" }, "sha512-2/XvMGykD7VgsvWesZZYIIVXMlgBcQy+ZAryjugoTcvJv8TZzSU/B1nShcA7IAjZ0q7OsZ45uP2cOb8EgKT30w=="], - "turbo-linux-arm64": ["turbo-linux-arm64@2.5.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg=="], + "turbo-linux-arm64": ["turbo-linux-arm64@2.5.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-DW+8CjCjybu0d7TFm9dovTTVg1VRnlkZ1rceO4zqsaLrit3DgHnN4to4uwyuf9s2V/BwS3IYcRy+HG9BL596Iw=="], - "turbo-windows-64": ["turbo-windows-64@2.5.4", "", { "os": "win32", "cpu": "x64" }, "sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA=="], + "turbo-windows-64": ["turbo-windows-64@2.5.5", "", { "os": "win32", "cpu": "x64" }, "sha512-q5p1BOy8ChtSZfULuF1BhFMYIx6bevXu4fJ+TE/hyNfyHJIfjl90Z6jWdqAlyaFLmn99X/uw+7d6T/Y/dr5JwQ=="], - "turbo-windows-arm64": ["turbo-windows-arm64@2.5.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A=="], + "turbo-windows-arm64": ["turbo-windows-arm64@2.5.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q=="], "tweetnacl": ["tweetnacl@0.14.5", "", {}, "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA=="], "type-check": ["type-check@0.4.0", "", { "dependencies": { "prelude-ls": "^1.2.1" } }, "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="], - "type-fest": ["type-fest@4.32.0", "", {}, "sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw=="], + "type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], "type-is": ["type-is@1.6.18", "", { "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" } }, "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g=="], @@ -4545,7 +4549,7 @@ "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], - "unrs-resolver": ["unrs-resolver@1.9.2", "", { "dependencies": { "napi-postinstall": "^0.2.4" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.9.2", "@unrs/resolver-binding-android-arm64": "1.9.2", "@unrs/resolver-binding-darwin-arm64": "1.9.2", "@unrs/resolver-binding-darwin-x64": "1.9.2", "@unrs/resolver-binding-freebsd-x64": "1.9.2", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.9.2", "@unrs/resolver-binding-linux-arm-musleabihf": "1.9.2", "@unrs/resolver-binding-linux-arm64-gnu": "1.9.2", "@unrs/resolver-binding-linux-arm64-musl": "1.9.2", "@unrs/resolver-binding-linux-ppc64-gnu": "1.9.2", "@unrs/resolver-binding-linux-riscv64-gnu": "1.9.2", "@unrs/resolver-binding-linux-riscv64-musl": "1.9.2", "@unrs/resolver-binding-linux-s390x-gnu": "1.9.2", "@unrs/resolver-binding-linux-x64-gnu": "1.9.2", "@unrs/resolver-binding-linux-x64-musl": "1.9.2", "@unrs/resolver-binding-wasm32-wasi": "1.9.2", "@unrs/resolver-binding-win32-arm64-msvc": "1.9.2", "@unrs/resolver-binding-win32-ia32-msvc": "1.9.2", "@unrs/resolver-binding-win32-x64-msvc": "1.9.2" } }, "sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA=="], + "unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="], "upath": ["upath@1.2.0", "", {}, "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="], @@ -4585,7 +4589,7 @@ "validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], - "validate-npm-package-name": ["validate-npm-package-name@6.0.1", "", {}, "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg=="], + "validate-npm-package-name": ["validate-npm-package-name@6.0.2", "", {}, "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ=="], "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], @@ -4599,7 +4603,7 @@ "victory-vendor": ["victory-vendor@36.9.2", "", { "dependencies": { "@types/d3-array": "^3.0.3", "@types/d3-ease": "^3.0.0", "@types/d3-interpolate": "^3.0.1", "@types/d3-scale": "^4.0.2", "@types/d3-shape": "^3.1.0", "@types/d3-time": "^3.0.0", "@types/d3-timer": "^3.0.0", "d3-array": "^3.1.6", "d3-ease": "^3.0.1", "d3-interpolate": "^3.0.1", "d3-scale": "^4.0.2", "d3-shape": "^3.1.0", "d3-time": "^3.0.0", "d3-timer": "^3.0.1" } }, "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ=="], - "vite": ["vite@7.0.0", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.2", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g=="], + "vite": ["vite@7.0.5", "", { "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.6", "picomatch": "^4.0.2", "postcss": "^8.5.6", "rollup": "^4.40.0", "tinyglobby": "^0.2.14" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw=="], "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], @@ -4657,7 +4661,9 @@ "write-file-atomic": ["write-file-atomic@5.0.1", "", { "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" } }, "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw=="], - "ws": ["ws@8.18.2", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ=="], + "ws": ["ws@8.18.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg=="], + + "wsl-utils": ["wsl-utils@0.1.0", "", { "dependencies": { "is-wsl": "^3.1.0" } }, "sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw=="], "xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="], @@ -4705,7 +4711,7 @@ "zwitch": ["zwitch@2.0.4", "", {}, "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A=="], - "@ampproject/remapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@ampproject/remapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], "@aws-crypto/sha1-browser/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], @@ -4713,44 +4719,6 @@ "@aws-crypto/util/@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="], - "@aws-sdk/client-ecs/@aws-sdk/core": ["@aws-sdk/core@3.846.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@aws-sdk/xml-builder": "3.821.0", "@smithy/core": "^3.7.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/signature-v4": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-utf8": "^4.0.0", "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" } }, "sha512-7CX0pM906r4WSS68fCTNMTtBCSkTtf3Wggssmx13gD40gcWEZXsU00KzPp1bYheNRyPlAq3rE22xt4wLPXbuxA=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.848.0", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.846.0", "@aws-sdk/credential-provider-http": "3.846.0", "@aws-sdk/credential-provider-ini": "3.848.0", "@aws-sdk/credential-provider-process": "3.846.0", "@aws-sdk/credential-provider-sso": "3.848.0", "@aws-sdk/credential-provider-web-identity": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-AblNesOqdzrfyASBCo1xW3uweiSro4Kft9/htdxLeCVU1KVOnFWA5P937MNahViRmIQm2sPBCqL8ZG0u9lnh5g=="], - - "@aws-sdk/client-ecs/@aws-sdk/middleware-host-header": ["@aws-sdk/middleware-host-header@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-ub+hXJAbAje94+Ya6c6eL7sYujoE8D4Bumu1NUI8TXjUhVVn0HzVWQjpRLshdLsUp1AW7XyeJaxyajRaJQ8+Xg=="], - - "@aws-sdk/client-ecs/@aws-sdk/middleware-logger": ["@aws-sdk/middleware-logger@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-lSV8FvjpdllpGaRspywss4CtXV8M7NNNH+2/j86vMH+YCOZ6fu2T/TyFd/tHwZ92vDfHctWkRbQxg0bagqwovA=="], - - "@aws-sdk/client-ecs/@aws-sdk/middleware-recursion-detection": ["@aws-sdk/middleware-recursion-detection@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-Gu7lGDyfddyhIkj1Z1JtrY5NHb5+x/CRiB87GjaSrKxkDaydtX2CU977JIABtt69l9wLbcGDIQ+W0uJ5xPof7g=="], - - "@aws-sdk/client-ecs/@aws-sdk/middleware-user-agent": ["@aws-sdk/middleware-user-agent@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@smithy/core": "^3.7.0", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-rjMuqSWJEf169/ByxvBqfdei1iaduAnfolTshsZxwcmLIUtbYrFUmts0HrLQqsAG8feGPpDLHA272oPl+NTCCA=="], - - "@aws-sdk/client-ecs/@aws-sdk/region-config-resolver": ["@aws-sdk/region-config-resolver@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "@smithy/util-config-provider": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-Qjnxd/yDv9KpIMWr90ZDPtRj0v75AqGC92Lm9+oHXZ8p1MjG5JE2CW0HL8JRgK9iKzgKBL7pPQRXI8FkvEVfrA=="], - - "@aws-sdk/client-ecs/@aws-sdk/types": ["@aws-sdk/types@3.840.0", "", { "dependencies": { "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA=="], - - "@aws-sdk/client-ecs/@aws-sdk/util-endpoints": ["@aws-sdk/util-endpoints@3.848.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-endpoints": "^3.0.6", "tslib": "^2.6.2" } }, "sha512-fY/NuFFCq/78liHvRyFKr+aqq1aA/uuVSANjzr5Ym8c+9Z3HRPE9OrExAHoMrZ6zC8tHerQwlsXYYH5XZ7H+ww=="], - - "@aws-sdk/client-ecs/@aws-sdk/util-user-agent-browser": ["@aws-sdk/util-user-agent-browser@3.840.0", "", { "dependencies": { "@aws-sdk/types": "3.840.0", "@smithy/types": "^4.3.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-JdyZM3EhhL4PqwFpttZu1afDpPJCCc3eyZOLi+srpX11LsGj6sThf47TYQN75HT1CarZ7cCdQHGzP2uy3/xHfQ=="], - - "@aws-sdk/client-ecs/@aws-sdk/util-user-agent-node": ["@aws-sdk/util-user-agent-node@3.848.0", "", { "dependencies": { "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/node-config-provider": "^4.1.3", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" }, "peerDependencies": { "aws-crt": ">=1.0.0" }, "optionalPeers": ["aws-crt"] }, "sha512-Zz1ft9NiLqbzNj/M0jVNxaoxI2F4tGXN0ZbZIj+KJ+PbJo+w5+Jo6d0UDAtbj3AEd79pjcCaP4OA9NTVzItUdw=="], - - "@aws-sdk/client-ecs/@smithy/core": ["@smithy/core@3.7.1", "", { "dependencies": { "@smithy/middleware-serde": "^4.0.8", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.4", "@smithy/util-stream": "^4.2.3", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-ExRCsHnXFtBPnM7MkfKBPcBBdHw1h/QS/cbNw4ho95qnyNHvnpmGbR39MIAv9KggTr5qSPxRSEL+hRXlyGyGQw=="], - - "@aws-sdk/client-ecs/@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.1.0", "", { "dependencies": { "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-mADw7MS0bYe2OGKkHYMaqarOXuDwRbO6ArD91XhHcl2ynjGCFF+hvqf0LyQcYxkA1zaWjefSkU7Ne9mqgApSgQ=="], - - "@aws-sdk/client-ecs/@smithy/middleware-endpoint": ["@smithy/middleware-endpoint@4.1.16", "", { "dependencies": { "@smithy/core": "^3.7.1", "@smithy/middleware-serde": "^4.0.8", "@smithy/node-config-provider": "^4.1.3", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-middleware": "^4.0.4", "tslib": "^2.6.2" } }, "sha512-plpa50PIGLqzMR2ANKAw2yOW5YKS626KYKqae3atwucbz4Ve4uQ9K9BEZxDLIFmCu7hKLcrq2zmj4a+PfmUV5w=="], - - "@aws-sdk/client-ecs/@smithy/middleware-retry": ["@smithy/middleware-retry@4.1.17", "", { "dependencies": { "@smithy/node-config-provider": "^4.1.3", "@smithy/protocol-http": "^5.1.2", "@smithy/service-error-classification": "^4.0.6", "@smithy/smithy-client": "^4.4.8", "@smithy/types": "^4.3.1", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "tslib": "^2.6.2", "uuid": "^9.0.1" } }, "sha512-gsCimeG6BApj0SBecwa1Be+Z+JOJe46iy3B3m3A8jKJHf7eIihP76Is4LwLrbJ1ygoS7Vg73lfqzejmLOrazUA=="], - - "@aws-sdk/client-ecs/@smithy/node-http-handler": ["@smithy/node-http-handler@4.1.0", "", { "dependencies": { "@smithy/abort-controller": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/querystring-builder": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-vqfSiHz2v8b3TTTrdXi03vNz1KLYYS3bhHCDv36FYDqxT7jvTll1mMnCrkD+gOvgwybuunh/2VmvOMqwBegxEg=="], - - "@aws-sdk/client-ecs/@smithy/smithy-client": ["@smithy/smithy-client@4.4.8", "", { "dependencies": { "@smithy/core": "^3.7.1", "@smithy/middleware-endpoint": "^4.1.16", "@smithy/middleware-stack": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/types": "^4.3.1", "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-pcW691/lx7V54gE+dDGC26nxz8nrvnvRSCJaIYD6XLPpOInEZeKdV/SpSux+wqeQ4Ine7LJQu8uxMvobTIBK0w=="], - - "@aws-sdk/client-ecs/@smithy/util-defaults-mode-browser": ["@smithy/util-defaults-mode-browser@4.0.24", "", { "dependencies": { "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.8", "@smithy/types": "^4.3.1", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-UkQNgaQ+bidw1MgdgPO1z1k95W/v8Ej/5o/T/Is8PiVUYPspl/ZxV6WO/8DrzZQu5ULnmpB9CDdMSRwgRc21AA=="], - - "@aws-sdk/client-ecs/@smithy/util-defaults-mode-node": ["@smithy/util-defaults-mode-node@4.0.24", "", { "dependencies": { "@smithy/config-resolver": "^4.1.4", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/node-config-provider": "^4.1.3", "@smithy/property-provider": "^4.0.4", "@smithy/smithy-client": "^4.4.8", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-phvGi/15Z4MpuQibTLOYIumvLdXb+XIJu8TA55voGgboln85jytA3wiD7CkUE8SNcWqkkb+uptZKPiuFouX/7g=="], - "@aws-sdk/client-ecs/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], "@aws-sdk/client-s3/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], @@ -4773,13 +4741,13 @@ "@babel/core/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@babel/generator/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], "@babel/helper-compilation-targets/lru-cache": ["lru-cache@5.1.1", "", { "dependencies": { "yallist": "^3.0.2" } }, "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w=="], "@babel/helper-compilation-targets/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "@browserbasehq/sdk/@types/node": ["@types/node@18.19.112", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-i+Vukt9POdS/MBI7YrrkkI5fMfwFtOjphSmt4WXYLfwqsfr6z/HdCx7LqT9M7JktGob8WNgj8nFB4TbGNE4Cog=="], + "@browserbasehq/sdk/@types/node": ["@types/node@18.19.120", "", { "dependencies": { "undici-types": "~5.26.4" } }, "sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA=="], "@calcom/atoms/tailwind-merge": ["tailwind-merge@1.14.0", "", {}, "sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ=="], @@ -4815,27 +4783,23 @@ "@eslint/config-array/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "@eslint/eslintrc/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], "@eslint/eslintrc/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], "@eslint/eslintrc/strip-json-comments": ["strip-json-comments@3.1.1", "", {}, "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="], - "@eslint/plugin-kit/@eslint/core": ["@eslint/core@0.15.1", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA=="], - "@humanfs/node/@humanwhocodes/retry": ["@humanwhocodes/retry@0.3.1", "", {}, "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA=="], "@isaacs/cliui/string-width": ["string-width@5.1.2", "", { "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" } }, "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA=="], "@isaacs/cliui/wrap-ansi": ["wrap-ansi@8.1.0", "", { "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", "strip-ansi": "^7.0.1" } }, "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ=="], - "@jridgewell/gen-mapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.25", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ=="], + "@jridgewell/gen-mapping/@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.29", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ=="], - "@next/eslint-plugin-next/fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="], + "@nangohq/types/type-fest": ["type-fest@4.32.0", "", {}, "sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw=="], - "@next/third-parties/next": ["next@15.3.4", "", { "dependencies": { "@next/env": "15.3.4", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.4", "@next/swc-darwin-x64": "15.3.4", "@next/swc-linux-arm64-gnu": "15.3.4", "@next/swc-linux-arm64-musl": "15.3.4", "@next/swc-linux-x64-gnu": "15.3.4", "@next/swc-linux-x64-musl": "15.3.4", "@next/swc-win32-arm64-msvc": "15.3.4", "@next/swc-win32-x64-msvc": "15.3.4", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA=="], + "@next/eslint-plugin-next/fast-glob": ["fast-glob@3.3.1", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.4" } }, "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="], "@npmcli/arborist/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], @@ -4939,6 +4903,12 @@ "@pnpm/network.ca-file/graceful-fs": ["graceful-fs@4.2.10", "", {}, "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA=="], + "@prisma/engines/@prisma/debug": ["@prisma/debug@6.12.0", "", {}, "sha512-plbz6z72orcqr0eeio7zgUrZj5EudZUpAeWkFTA/DDdXEj28YHDXuiakvR6S7sD6tZi+jiwQEJAPeV6J6m/tEQ=="], + + "@prisma/fetch-engine/@prisma/debug": ["@prisma/debug@6.12.0", "", {}, "sha512-plbz6z72orcqr0eeio7zgUrZj5EudZUpAeWkFTA/DDdXEj28YHDXuiakvR6S7sD6tZi+jiwQEJAPeV6J6m/tEQ=="], + + "@prisma/get-platform/@prisma/debug": ["@prisma/debug@6.12.0", "", {}, "sha512-plbz6z72orcqr0eeio7zgUrZj5EudZUpAeWkFTA/DDdXEj28YHDXuiakvR6S7sD6tZi+jiwQEJAPeV6J6m/tEQ=="], + "@pulumi/aws/mime": ["mime@2.6.0", "", { "bin": { "mime": "cli.js" } }, "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg=="], "@pulumi/awsx/@pulumi/docker-build": ["@pulumi/docker-build@0.0.8", "", { "dependencies": { "@pulumi/pulumi": "^3.136.0" } }, "sha512-tS6UUgmDjQ+LVekMXGC/6ND7riY75h3oO9fLiVOrvNafCBumxK+Cjm6ZZ9tUChLYvw6H+rZRExZEhfC8F/SQgQ=="], @@ -4983,13 +4953,13 @@ "@smithy/middleware-retry/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.4.5", "", { "dependencies": { "@emnapi/wasi-threads": "1.0.4", "tslib": "^2.4.0" }, "bundled": true }, "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.4.5", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.0.4", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g=="], - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.11", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.9.0" }, "bundled": true }, "sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA=="], + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" }, "bundled": true }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.9.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw=="], @@ -5033,6 +5003,8 @@ "babel-plugin-macros/cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], + "better-auth/zod": ["zod@4.0.5", "", {}, "sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA=="], + "body-parser/debug": ["debug@2.6.9", "", { "dependencies": { "ms": "2.0.0" } }, "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA=="], "body-parser/iconv-lite": ["iconv-lite@0.4.24", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3" } }, "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA=="], @@ -5145,8 +5117,6 @@ "gauge/strip-ansi": ["strip-ansi@3.0.1", "", { "dependencies": { "ansi-regex": "^2.0.0" } }, "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg=="], - "geist/next": ["next@15.3.4", "", { "dependencies": { "@next/env": "15.3.4", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.4", "@next/swc-darwin-x64": "15.3.4", "@next/swc-linux-arm64-gnu": "15.3.4", "@next/swc-linux-arm64-musl": "15.3.4", "@next/swc-linux-x64-gnu": "15.3.4", "@next/swc-linux-x64-musl": "15.3.4", "@next/swc-win32-arm64-msvc": "15.3.4", "@next/swc-win32-x64-msvc": "15.3.4", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA=="], - "git-raw-commits/meow": ["meow@12.1.1", "", {}, "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw=="], "git-raw-commits/split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="], @@ -5207,8 +5177,6 @@ "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], - "next-safe-action/next": ["next@15.3.4", "", { "dependencies": { "@next/env": "15.3.4", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.4", "@next/swc-darwin-x64": "15.3.4", "@next/swc-linux-arm64-gnu": "15.3.4", "@next/swc-linux-arm64-musl": "15.3.4", "@next/swc-linux-x64-gnu": "15.3.4", "@next/swc-linux-x64-musl": "15.3.4", "@next/swc-win32-arm64-msvc": "15.3.4", "@next/swc-win32-x64-msvc": "15.3.4", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA=="], - "node-fetch/whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="], "node-gyp/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], @@ -5283,13 +5251,13 @@ "npm/abbrev": ["abbrev@3.0.1", "", { "bundled": true }, "sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg=="], - "npm/agent-base": ["agent-base@7.1.3", "", {}, "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw=="], + "npm/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="], "npm/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "npm/ansi-styles": ["ansi-styles@6.2.1", "", {}, "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug=="], - "npm/aproba": ["aproba@2.0.0", "", {}, "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ=="], + "npm/aproba": ["aproba@2.1.0", "", {}, "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew=="], "npm/archy": ["archy@1.0.0", "", { "bundled": true }, "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw=="], @@ -5307,7 +5275,7 @@ "npm/chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], - "npm/ci-info": ["ci-info@4.2.0", "", { "bundled": true }, "sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg=="], + "npm/ci-info": ["ci-info@4.3.0", "", { "bundled": true }, "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ=="], "npm/cidr-regex": ["cidr-regex@4.1.3", "", { "dependencies": { "ip-regex": "^5.0.0" } }, "sha512-86M1y3ZeQvpZkZejQCcS+IaSWjlDUC+ORP0peScQ4uEUFCZ8bEQVz7NlJHqysoUb6w3zCjx4Mq/8/2RHhMwHYw=="], @@ -5449,7 +5417,7 @@ "npm/nopt": ["nopt@8.1.0", "", { "dependencies": { "abbrev": "^3.0.0" }, "bundled": true, "bin": { "nopt": "bin/nopt.js" } }, "sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A=="], - "npm/normalize-package-data": ["normalize-package-data@7.0.0", "", { "dependencies": { "hosted-git-info": "^8.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "bundled": true }, "sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA=="], + "npm/normalize-package-data": ["normalize-package-data@7.0.1", "", { "dependencies": { "hosted-git-info": "^8.0.0", "semver": "^7.3.5", "validate-npm-package-license": "^3.0.4" }, "bundled": true }, "sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA=="], "npm/npm-audit-report": ["npm-audit-report@6.0.0", "", { "bundled": true }, "sha512-Ag6Y1irw/+CdSLqEEAn69T8JBgBThj5mw0vuFIKeP7hATYuQuS5jkMjK6xmVB8pr7U4g5Audbun0lHhBDMIBRA=="], @@ -5483,7 +5451,7 @@ "npm/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "npm/picomatch": ["picomatch@4.0.2", "", {}, "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg=="], + "npm/picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], "npm/postcss-selector-parser": ["postcss-selector-parser@7.1.0", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA=="], @@ -5523,7 +5491,7 @@ "npm/smart-buffer": ["smart-buffer@4.2.0", "", {}, "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg=="], - "npm/socks": ["socks@2.8.5", "", { "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, "sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww=="], + "npm/socks": ["socks@2.8.6", "", { "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, "sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA=="], "npm/socks-proxy-agent": ["socks-proxy-agent@8.0.5", "", { "dependencies": { "agent-base": "^7.1.2", "debug": "^4.3.4", "socks": "^2.8.3" } }, "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw=="], @@ -5559,7 +5527,7 @@ "npm/treeverse": ["treeverse@3.0.0", "", { "bundled": true }, "sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ=="], - "npm/tuf-js": ["tuf-js@3.0.1", "", { "dependencies": { "@tufjs/models": "3.0.1", "debug": "^4.3.6", "make-fetch-happen": "^14.0.1" } }, "sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA=="], + "npm/tuf-js": ["tuf-js@3.1.0", "", { "dependencies": { "@tufjs/models": "3.0.1", "debug": "^4.4.1", "make-fetch-happen": "^14.0.3" } }, "sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg=="], "npm/unique-filename": ["unique-filename@4.0.0", "", { "dependencies": { "unique-slug": "^5.0.0" } }, "sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ=="], @@ -5569,7 +5537,7 @@ "npm/validate-npm-package-license": ["validate-npm-package-license@3.0.4", "", { "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew=="], - "npm/validate-npm-package-name": ["validate-npm-package-name@6.0.1", "", { "bundled": true }, "sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg=="], + "npm/validate-npm-package-name": ["validate-npm-package-name@6.0.2", "", { "bundled": true }, "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ=="], "npm/walk-up-path": ["walk-up-path@3.0.1", "", {}, "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA=="], @@ -5591,6 +5559,10 @@ "npm-registry-fetch/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], + "nypm/pkg-types": ["pkg-types@2.2.0", "", { "dependencies": { "confbox": "^0.2.2", "exsolve": "^1.0.7", "pathe": "^2.0.3" } }, "sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ=="], + + "nypm/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "ora/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], "ora/log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], @@ -5607,8 +5579,6 @@ "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], - "parse-json/type-fest": ["type-fest@4.41.0", "", {}, "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA=="], - "parse5-htmlparser2-tree-adapter/parse5": ["parse5@6.0.1", "", {}, "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="], "path-scurry/lru-cache": ["lru-cache@11.1.0", "", {}, "sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A=="], @@ -5643,8 +5613,6 @@ "react-email/chalk": ["chalk@5.4.1", "", {}, "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w=="], - "react-email/next": ["next@15.3.4", "", { "dependencies": { "@next/env": "15.3.4", "@swc/counter": "0.1.3", "@swc/helpers": "0.5.15", "busboy": "1.6.0", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.3.4", "@next/swc-darwin-x64": "15.3.4", "@next/swc-linux-arm64-gnu": "15.3.4", "@next/swc-linux-arm64-musl": "15.3.4", "@next/swc-linux-x64-gnu": "15.3.4", "@next/swc-linux-x64-musl": "15.3.4", "@next/swc-win32-arm64-msvc": "15.3.4", "@next/swc-win32-x64-msvc": "15.3.4", "sharp": "^0.34.1" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.41.2", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA=="], - "react-promise-suspense/fast-deep-equal": ["fast-deep-equal@2.0.1", "", {}, "sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w=="], "react-reconciler/scheduler": ["scheduler@0.25.0", "", {}, "sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA=="], @@ -5791,24 +5759,6 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "^2.2.0", "tslib": "^2.6.2" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="], - "@aws-sdk/client-ecs/@aws-sdk/core/fast-xml-parser": ["fast-xml-parser@5.2.5", "", { "dependencies": { "strnum": "^2.1.0" }, "bin": { "fxparser": "src/cli/cli.js" } }, "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.846.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-QuCQZET9enja7AWVISY+mpFrEIeHzvkx/JEEbHYzHhUkxcnC2Kq2c0bB7hDihGD0AZd3Xsm653hk1O97qu69zg=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.846.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", "@smithy/property-provider": "^4.0.4", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/util-stream": "^4.2.3", "tslib": "^2.6.2" } }, "sha512-Jh1iKUuepdmtreMYozV2ePsPcOF5W9p3U4tWhi3v6nDvz0GsBjzjAROW+BW8XMz9vAD3I9R+8VC3/aq63p5nlw=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/credential-provider-env": "3.846.0", "@aws-sdk/credential-provider-http": "3.846.0", "@aws-sdk/credential-provider-process": "3.846.0", "@aws-sdk/credential-provider-sso": "3.848.0", "@aws-sdk/credential-provider-web-identity": "3.848.0", "@aws-sdk/nested-clients": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/credential-provider-imds": "^4.0.6", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-r6KWOG+En2xujuMhgZu7dzOZV3/M5U/5+PXrG8dLQ3rdPRB3vgp5tc56KMqLwm/EXKRzAOSuw/UE4HfNOAB8Hw=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.846.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-mEpwDYarJSH+CIXnnHN0QOe0MXI+HuPStD6gsv3z/7Q6ESl8KRWon3weFZCDnqpiJMUVavlDR0PPlAFg2MQoPg=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.848.0", "", { "dependencies": { "@aws-sdk/client-sso": "3.848.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/token-providers": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-pozlDXOwJZL0e7w+dqXLgzVDB7oCx4WvtY0sk6l4i07uFliWF/exupb6pIehFWvTUcOvn5aFTTqcQaEzAD5Wsg=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/nested-clients": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-D1fRpwPxtVDhcSc/D71exa2gYweV+ocp4D3brF0PgFd//JR3XahZ9W24rVnTQwYEcK9auiBZB89Ltv+WbWN8qw=="], - - "@aws-sdk/client-ecs/@smithy/core/@smithy/util-stream": ["@smithy/util-stream@4.2.3", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg=="], - - "@aws-sdk/client-ecs/@smithy/smithy-client/@smithy/util-stream": ["@smithy/util-stream@4.2.3", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg=="], - "@babel/helper-compilation-targets/lru-cache/yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], "@browserbasehq/sdk/@types/node/undici-types": ["undici-types@5.26.5", "", {}, "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA=="], @@ -5849,26 +5799,6 @@ "@next/eslint-plugin-next/fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "@next/third-parties/next/@next/env": ["@next/env@15.3.4", "", {}, "sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ=="], - - "@next/third-parties/next/@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg=="], - - "@next/third-parties/next/@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.3.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw=="], - - "@next/third-parties/next/@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g=="], - - "@next/third-parties/next/@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw=="], - - "@next/third-parties/next/@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg=="], - - "@next/third-parties/next/@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A=="], - - "@next/third-parties/next/@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.3.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ=="], - - "@next/third-parties/next/@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.4", "", { "os": "win32", "cpu": "x64" }, "sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg=="], - - "@next/third-parties/next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], - "@npmcli/arborist/npm-package-arg/validate-npm-package-name": ["validate-npm-package-name@5.0.1", "", {}, "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ=="], "@npmcli/git/which/isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], @@ -5927,22 +5857,24 @@ "@slack/bolt/@slack/web-api/eventemitter3": ["eventemitter3@3.1.2", "", {}, "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="], - "@slack/bolt/@slack/web-api/form-data": ["form-data@2.5.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ=="], + "@slack/bolt/@slack/web-api/form-data": ["form-data@2.5.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A=="], "@slack/bolt/@slack/web-api/is-stream": ["is-stream@1.1.0", "", {}, "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="], "@slack/oauth/@slack/web-api/eventemitter3": ["eventemitter3@3.1.2", "", {}, "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="], - "@slack/oauth/@slack/web-api/form-data": ["form-data@2.5.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ=="], + "@slack/oauth/@slack/web-api/form-data": ["form-data@2.5.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A=="], "@slack/oauth/@slack/web-api/is-stream": ["is-stream@1.1.0", "", {}, "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="], "@slack/socket-mode/@slack/web-api/eventemitter3": ["eventemitter3@3.1.2", "", {}, "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q=="], - "@slack/socket-mode/@slack/web-api/form-data": ["form-data@2.5.3", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ=="], + "@slack/socket-mode/@slack/web-api/form-data": ["form-data@2.5.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.35", "safe-buffer": "^5.2.1" } }, "sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A=="], "@slack/socket-mode/@slack/web-api/is-stream": ["is-stream@1.1.0", "", {}, "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ=="], + "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ=="], + "@testing-library/jest-dom/chalk/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], "@trigger.dev/core/@opentelemetry/resources/@opentelemetry/core": ["@opentelemetry/core@1.25.1", "", { "dependencies": { "@opentelemetry/semantic-conventions": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ=="], @@ -6059,26 +5991,6 @@ "gauge/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], - "geist/next/@next/env": ["@next/env@15.3.4", "", {}, "sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ=="], - - "geist/next/@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg=="], - - "geist/next/@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.3.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw=="], - - "geist/next/@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g=="], - - "geist/next/@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw=="], - - "geist/next/@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg=="], - - "geist/next/@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A=="], - - "geist/next/@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.3.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ=="], - - "geist/next/@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.4", "", { "os": "win32", "cpu": "x64" }, "sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg=="], - - "geist/next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], - "jszip/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "jszip/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], @@ -6097,26 +6009,6 @@ "minipass-sized/minipass/yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], - "next-safe-action/next/@next/env": ["@next/env@15.3.4", "", {}, "sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ=="], - - "next-safe-action/next/@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg=="], - - "next-safe-action/next/@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.3.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw=="], - - "next-safe-action/next/@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g=="], - - "next-safe-action/next/@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw=="], - - "next-safe-action/next/@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg=="], - - "next-safe-action/next/@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A=="], - - "next-safe-action/next/@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.3.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ=="], - - "next-safe-action/next/@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.4", "", { "os": "win32", "cpu": "x64" }, "sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg=="], - - "next-safe-action/next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], - "node-fetch/whatwg-url/tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="], "node-fetch/whatwg-url/webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="], @@ -6173,6 +6065,8 @@ "npm/wrap-ansi-cjs/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], + "nypm/pkg-types/confbox": ["confbox@0.2.2", "", {}, "sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ=="], + "ora/log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], "ora/string-width/emoji-regex": ["emoji-regex@10.4.0", "", {}, "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw=="], @@ -6199,26 +6093,6 @@ "pkg-dir/find-up/path-exists": ["path-exists@5.0.0", "", {}, "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ=="], - "react-email/next/@next/env": ["@next/env@15.3.4", "", {}, "sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ=="], - - "react-email/next/@next/swc-darwin-arm64": ["@next/swc-darwin-arm64@15.3.4", "", { "os": "darwin", "cpu": "arm64" }, "sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg=="], - - "react-email/next/@next/swc-darwin-x64": ["@next/swc-darwin-x64@15.3.4", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw=="], - - "react-email/next/@next/swc-linux-arm64-gnu": ["@next/swc-linux-arm64-gnu@15.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g=="], - - "react-email/next/@next/swc-linux-arm64-musl": ["@next/swc-linux-arm64-musl@15.3.4", "", { "os": "linux", "cpu": "arm64" }, "sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw=="], - - "react-email/next/@next/swc-linux-x64-gnu": ["@next/swc-linux-x64-gnu@15.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg=="], - - "react-email/next/@next/swc-linux-x64-musl": ["@next/swc-linux-x64-musl@15.3.4", "", { "os": "linux", "cpu": "x64" }, "sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A=="], - - "react-email/next/@next/swc-win32-arm64-msvc": ["@next/swc-win32-arm64-msvc@15.3.4", "", { "os": "win32", "cpu": "arm64" }, "sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ=="], - - "react-email/next/@next/swc-win32-x64-msvc": ["@next/swc-win32-x64-msvc@15.3.4", "", { "os": "win32", "cpu": "x64" }, "sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg=="], - - "react-email/next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], - "read-yaml-file/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], "request/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], @@ -6289,18 +6163,6 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], - "@aws-sdk/client-ecs/@aws-sdk/core/fast-xml-parser/strnum": ["strnum@2.1.1", "", {}, "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-http/@smithy/util-stream": ["@smithy/util-stream@4.2.3", "", { "dependencies": { "@smithy/fetch-http-handler": "^5.1.0", "@smithy/node-http-handler": "^4.1.0", "@smithy/types": "^4.3.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-buffer-from": "^4.0.0", "@smithy/util-hex-encoding": "^4.0.0", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-cQn412DWHHFNKrQfbHY8vSFI3nTROY1aIKji9N0tpp8gUABRilr7wdf8fqBbSlXresobM+tQFNk6I+0LXK/YZg=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-ini/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/client-sso": ["@aws-sdk/client-sso@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-mD+gOwoeZQvbecVLGoCmY6pS7kg02BHesbtIxUj+PeBqYoZV5uLvjUOmuGfw1SfoSobKvS11urxC9S7zxU/Maw=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.848.0", "", { "dependencies": { "@aws-sdk/core": "3.846.0", "@aws-sdk/nested-clients": "3.848.0", "@aws-sdk/types": "3.840.0", "@smithy/property-provider": "^4.0.4", "@smithy/shared-ini-file-loader": "^4.0.4", "@smithy/types": "^4.3.1", "tslib": "^2.6.2" } }, "sha512-oNPyM4+Di2Umu0JJRFSxDcKQ35+Chl/rAwD47/bS0cDPI8yrao83mLXLeDqpRPHyQW4sXlP763FZcuAibC0+mg=="], - - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-web-identity/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg=="], - "@calcom/atoms/tailwindcss/chokidar/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "@calcom/atoms/tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], @@ -6447,8 +6309,6 @@ "signale/chalk/supports-color/has-flag": ["has-flag@3.0.0", "", {}, "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw=="], - "@aws-sdk/client-ecs/@aws-sdk/credential-provider-node/@aws-sdk/credential-provider-sso/@aws-sdk/token-providers/@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.848.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.846.0", "@aws-sdk/middleware-host-header": "3.840.0", "@aws-sdk/middleware-logger": "3.840.0", "@aws-sdk/middleware-recursion-detection": "3.840.0", "@aws-sdk/middleware-user-agent": "3.848.0", "@aws-sdk/region-config-resolver": "3.840.0", "@aws-sdk/types": "3.840.0", "@aws-sdk/util-endpoints": "3.848.0", "@aws-sdk/util-user-agent-browser": "3.840.0", "@aws-sdk/util-user-agent-node": "3.848.0", "@smithy/config-resolver": "^4.1.4", "@smithy/core": "^3.7.0", "@smithy/fetch-http-handler": "^5.1.0", "@smithy/hash-node": "^4.0.4", "@smithy/invalid-dependency": "^4.0.4", "@smithy/middleware-content-length": "^4.0.4", "@smithy/middleware-endpoint": "^4.1.15", "@smithy/middleware-retry": "^4.1.16", "@smithy/middleware-serde": "^4.0.8", "@smithy/middleware-stack": "^4.0.4", "@smithy/node-config-provider": "^4.1.3", "@smithy/node-http-handler": "^4.1.0", "@smithy/protocol-http": "^5.1.2", "@smithy/smithy-client": "^4.4.7", "@smithy/types": "^4.3.1", "@smithy/url-parser": "^4.0.4", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", "@smithy/util-defaults-mode-browser": "^4.0.23", "@smithy/util-defaults-mode-node": "^4.0.23", "@smithy/util-endpoints": "^3.0.6", "@smithy/util-middleware": "^4.0.4", "@smithy/util-retry": "^4.0.6", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" } }, "sha512-joLsyyo9u61jnZuyYzo1z7kmS7VgWRAkzSGESVzQHfOA1H2PYeUFek6vLT4+c9xMGrX/Z6B0tkRdzfdOPiatLg=="], - "@calcom/atoms/tailwindcss/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], "@commitlint/top-level/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], diff --git a/yarn.lock b/yarn.lock index b40b4d0bd..30ff0e91e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,6 +1,6 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 -# bun ./bun.lockb --hash: 0000000000000000-0000000000000000-0000000000000000-0000000000000000 +# bun ./bun.lockb --hash: 713737C131024FEA-fca7d31c5527c180-03CD25DE6A583D96-25c4f14a138621ee "@adobe/css-tools@^4.4.0": @@ -17,9 +17,9 @@ "@ai-sdk/provider-utils" "2.2.8" "@ai-sdk/openai@^1.3.19": - version "1.3.22" - resolved "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.3.22.tgz" - integrity sha512-QwA+2EkG0QyjVR+7h6FE7iOu2ivNqAVMm9UJZkVxxTk5OIq5fFJDTEI/zICEMuHImTTXR2JjsL6EirJ28Jc4cw== + version "1.3.23" + resolved "https://registry.npmjs.org/@ai-sdk/openai/-/openai-1.3.23.tgz" + integrity sha512-86U7rFp8yacUAOE/Jz8WbGcwMCqWvjK33wk5DXkfnAOEn3mx2r7tNSJdjukQFZbAK97VMXGPPHxF+aEARDXRXQ== dependencies: "@ai-sdk/provider" "1.1.3" "@ai-sdk/provider-utils" "2.2.8" @@ -36,8 +36,8 @@ resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz" integrity sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA== dependencies: - "@ai-sdk/provider" "1.1.3" nanoid "^3.3.8" + "@ai-sdk/provider" "1.1.3" secure-json-parse "^2.7.0" "@ai-sdk/react@1.2.12", "@ai-sdk/react@^1.2.9": @@ -45,10 +45,10 @@ resolved "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz" integrity sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g== dependencies: - "@ai-sdk/provider-utils" "2.2.8" - "@ai-sdk/ui-utils" "1.2.11" swr "^2.2.5" throttleit "2.1.0" + "@ai-sdk/ui-utils" "1.2.11" + "@ai-sdk/provider-utils" "2.2.8" "@ai-sdk/ui-utils@1.2.11": version "1.2.11" @@ -77,11 +77,11 @@ resolved "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz" integrity sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw== dependencies: + lru-cache "^10.4.3" "@csstools/css-calc" "^2.1.3" + "@csstools/css-tokenizer" "^3.0.3" "@csstools/css-color-parser" "^3.0.9" "@csstools/css-parser-algorithms" "^3.0.4" - "@csstools/css-tokenizer" "^3.0.3" - lru-cache "^10.4.3" "@aws-crypto/crc32@5.2.0": version "5.2.0" @@ -131,9 +131,9 @@ resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz" integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== dependencies: - "@aws-crypto/util" "^5.2.0" - "@aws-sdk/types" "^3.222.0" tslib "^2.6.2" + "@aws-sdk/types" "^3.222.0" + "@aws-crypto/util" "^5.2.0" "@aws-crypto/supports-web-crypto@^5.2.0": version "5.2.0" @@ -147,9 +147,9 @@ resolved "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz" integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== dependencies: + tslib "^2.6.2" "@aws-sdk/types" "^3.222.0" "@smithy/util-utf8" "^2.0.0" - tslib "^2.6.2" "@aws-sdk/client-ecs@^3.405.0": version "3.848.0" @@ -200,108 +200,108 @@ uuid "^9.0.1" "@aws-sdk/client-s3@^3.806.0": - version "3.837.0" - resolved "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.837.0.tgz" - integrity sha512-sBjPPG30HIfNwpzWuajCDf7agb4YAxPFFpsp3kwgptJF8PEi0HzQg64bskquMzjqLC2tXsn5rKtDVpQOvs29MQ== + version "3.850.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-s3/-/client-s3-3.850.0.tgz" + integrity sha512-tX5bUfqiLOh6jtAlaiAuOUKFYh8KDG9k9zFLUdgGplC5TP47AYTreUEg+deCTHo4DD3YCvrLuyZ8tIDgKu7neQ== dependencies: "@aws-crypto/sha1-browser" "5.2.0" "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.835.0" - "@aws-sdk/credential-provider-node" "3.835.0" - "@aws-sdk/middleware-bucket-endpoint" "3.830.0" - "@aws-sdk/middleware-expect-continue" "3.821.0" - "@aws-sdk/middleware-flexible-checksums" "3.835.0" - "@aws-sdk/middleware-host-header" "3.821.0" - "@aws-sdk/middleware-location-constraint" "3.821.0" - "@aws-sdk/middleware-logger" "3.821.0" - "@aws-sdk/middleware-recursion-detection" "3.821.0" - "@aws-sdk/middleware-sdk-s3" "3.835.0" - "@aws-sdk/middleware-ssec" "3.821.0" - "@aws-sdk/middleware-user-agent" "3.835.0" - "@aws-sdk/region-config-resolver" "3.821.0" - "@aws-sdk/signature-v4-multi-region" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@aws-sdk/util-endpoints" "3.828.0" - "@aws-sdk/util-user-agent-browser" "3.821.0" - "@aws-sdk/util-user-agent-node" "3.835.0" + "@aws-sdk/core" "3.846.0" + "@aws-sdk/credential-provider-node" "3.848.0" + "@aws-sdk/middleware-bucket-endpoint" "3.840.0" + "@aws-sdk/middleware-expect-continue" "3.840.0" + "@aws-sdk/middleware-flexible-checksums" "3.846.0" + "@aws-sdk/middleware-host-header" "3.840.0" + "@aws-sdk/middleware-location-constraint" "3.840.0" + "@aws-sdk/middleware-logger" "3.840.0" + "@aws-sdk/middleware-recursion-detection" "3.840.0" + "@aws-sdk/middleware-sdk-s3" "3.846.0" + "@aws-sdk/middleware-ssec" "3.840.0" + "@aws-sdk/middleware-user-agent" "3.848.0" + "@aws-sdk/region-config-resolver" "3.840.0" + "@aws-sdk/signature-v4-multi-region" "3.846.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-endpoints" "3.848.0" + "@aws-sdk/util-user-agent-browser" "3.840.0" + "@aws-sdk/util-user-agent-node" "3.848.0" "@aws-sdk/xml-builder" "3.821.0" "@smithy/config-resolver" "^4.1.4" - "@smithy/core" "^3.5.3" + "@smithy/core" "^3.7.0" "@smithy/eventstream-serde-browser" "^4.0.4" "@smithy/eventstream-serde-config-resolver" "^4.1.2" "@smithy/eventstream-serde-node" "^4.0.4" - "@smithy/fetch-http-handler" "^5.0.4" + "@smithy/fetch-http-handler" "^5.1.0" "@smithy/hash-blob-browser" "^4.0.4" "@smithy/hash-node" "^4.0.4" "@smithy/hash-stream-node" "^4.0.4" "@smithy/invalid-dependency" "^4.0.4" "@smithy/md5-js" "^4.0.4" "@smithy/middleware-content-length" "^4.0.4" - "@smithy/middleware-endpoint" "^4.1.12" - "@smithy/middleware-retry" "^4.1.13" + "@smithy/middleware-endpoint" "^4.1.15" + "@smithy/middleware-retry" "^4.1.16" "@smithy/middleware-serde" "^4.0.8" "@smithy/middleware-stack" "^4.0.4" "@smithy/node-config-provider" "^4.1.3" - "@smithy/node-http-handler" "^4.0.6" + "@smithy/node-http-handler" "^4.1.0" "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.4" + "@smithy/smithy-client" "^4.4.7" "@smithy/types" "^4.3.1" "@smithy/url-parser" "^4.0.4" "@smithy/util-base64" "^4.0.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.20" - "@smithy/util-defaults-mode-node" "^4.0.20" + "@smithy/util-defaults-mode-browser" "^4.0.23" + "@smithy/util-defaults-mode-node" "^4.0.23" "@smithy/util-endpoints" "^3.0.6" "@smithy/util-middleware" "^4.0.4" "@smithy/util-retry" "^4.0.6" - "@smithy/util-stream" "^4.2.2" + "@smithy/util-stream" "^4.2.3" "@smithy/util-utf8" "^4.0.0" - "@smithy/util-waiter" "^4.0.5" + "@smithy/util-waiter" "^4.0.6" "@types/uuid" "^9.0.1" tslib "^2.6.2" uuid "^9.0.1" "@aws-sdk/client-securityhub@^3.0.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/client-securityhub/-/client-securityhub-3.835.0.tgz" - integrity sha512-B1k30XTVP3edrDuG2nzsiAt8BR0ZkeFVIQBkHVSYPucl6009ck6zLmuB9jH4FIiyES1ZqRRX/xWZMaa4xBKf2w== + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-securityhub/-/client-securityhub-3.848.0.tgz" + integrity sha512-o7SJxPvtCF0KSdnBEvNfzHF8HKmYnSSUcp0tb6lvUOfl6xPej3Pt9DjUFwx0k2NfLw+8Do+jbGxbciHjK/9T+g== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.835.0" - "@aws-sdk/credential-provider-node" "3.835.0" - "@aws-sdk/middleware-host-header" "3.821.0" - "@aws-sdk/middleware-logger" "3.821.0" - "@aws-sdk/middleware-recursion-detection" "3.821.0" - "@aws-sdk/middleware-user-agent" "3.835.0" - "@aws-sdk/region-config-resolver" "3.821.0" - "@aws-sdk/types" "3.821.0" - "@aws-sdk/util-endpoints" "3.828.0" - "@aws-sdk/util-user-agent-browser" "3.821.0" - "@aws-sdk/util-user-agent-node" "3.835.0" + "@aws-sdk/core" "3.846.0" + "@aws-sdk/credential-provider-node" "3.848.0" + "@aws-sdk/middleware-host-header" "3.840.0" + "@aws-sdk/middleware-logger" "3.840.0" + "@aws-sdk/middleware-recursion-detection" "3.840.0" + "@aws-sdk/middleware-user-agent" "3.848.0" + "@aws-sdk/region-config-resolver" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-endpoints" "3.848.0" + "@aws-sdk/util-user-agent-browser" "3.840.0" + "@aws-sdk/util-user-agent-node" "3.848.0" "@smithy/config-resolver" "^4.1.4" - "@smithy/core" "^3.5.3" - "@smithy/fetch-http-handler" "^5.0.4" + "@smithy/core" "^3.7.0" + "@smithy/fetch-http-handler" "^5.1.0" "@smithy/hash-node" "^4.0.4" "@smithy/invalid-dependency" "^4.0.4" "@smithy/middleware-content-length" "^4.0.4" - "@smithy/middleware-endpoint" "^4.1.12" - "@smithy/middleware-retry" "^4.1.13" + "@smithy/middleware-endpoint" "^4.1.15" + "@smithy/middleware-retry" "^4.1.16" "@smithy/middleware-serde" "^4.0.8" "@smithy/middleware-stack" "^4.0.4" "@smithy/node-config-provider" "^4.1.3" - "@smithy/node-http-handler" "^4.0.6" + "@smithy/node-http-handler" "^4.1.0" "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.4" + "@smithy/smithy-client" "^4.4.7" "@smithy/types" "^4.3.1" "@smithy/url-parser" "^4.0.4" "@smithy/util-base64" "^4.0.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.20" - "@smithy/util-defaults-mode-node" "^4.0.20" + "@smithy/util-defaults-mode-browser" "^4.0.23" + "@smithy/util-defaults-mode-node" "^4.0.23" "@smithy/util-endpoints" "^3.0.6" "@smithy/util-middleware" "^4.0.4" "@smithy/util-retry" "^4.0.6" @@ -310,50 +310,6 @@ tslib "^2.6.2" uuid "^9.0.1" -"@aws-sdk/client-sso@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.835.0.tgz" - integrity sha512-4J19IcBKU5vL8yw/YWEvbwEGcmCli0rpRyxG53v0K5/3weVPxVBbKfkWcjWVQ4qdxNz2uInfbTde4BRBFxWllQ== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.835.0" - "@aws-sdk/middleware-host-header" "3.821.0" - "@aws-sdk/middleware-logger" "3.821.0" - "@aws-sdk/middleware-recursion-detection" "3.821.0" - "@aws-sdk/middleware-user-agent" "3.835.0" - "@aws-sdk/region-config-resolver" "3.821.0" - "@aws-sdk/types" "3.821.0" - "@aws-sdk/util-endpoints" "3.828.0" - "@aws-sdk/util-user-agent-browser" "3.821.0" - "@aws-sdk/util-user-agent-node" "3.835.0" - "@smithy/config-resolver" "^4.1.4" - "@smithy/core" "^3.5.3" - "@smithy/fetch-http-handler" "^5.0.4" - "@smithy/hash-node" "^4.0.4" - "@smithy/invalid-dependency" "^4.0.4" - "@smithy/middleware-content-length" "^4.0.4" - "@smithy/middleware-endpoint" "^4.1.12" - "@smithy/middleware-retry" "^4.1.13" - "@smithy/middleware-serde" "^4.0.8" - "@smithy/middleware-stack" "^4.0.4" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/node-http-handler" "^4.0.6" - "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.4" - "@smithy/types" "^4.3.1" - "@smithy/url-parser" "^4.0.4" - "@smithy/util-base64" "^4.0.0" - "@smithy/util-body-length-browser" "^4.0.0" - "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.20" - "@smithy/util-defaults-mode-node" "^4.0.20" - "@smithy/util-endpoints" "^3.0.6" - "@smithy/util-middleware" "^4.0.4" - "@smithy/util-retry" "^4.0.6" - "@smithy/util-utf8" "^4.0.0" - tslib "^2.6.2" - "@aws-sdk/client-sso@3.848.0": version "3.848.0" resolved "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.848.0.tgz" @@ -399,71 +355,50 @@ tslib "^2.6.2" "@aws-sdk/client-sts@^3.808.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.835.0.tgz" - integrity sha512-H1n8oCVPeKOY/3oRuPsoBUopp6jgrqiBfEPEETJK8uiY8jWLpkekj2Boa/hhLGKlXGDRDI/rZAOIE/5xTSSCQA== + version "3.848.0" + resolved "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.848.0.tgz" + integrity sha512-NA0ODCELiO76LAi9/aanufPpX+YDAgpLFMkqJTwLVrBvtCMYsgGi/ttYzGKHdxgQljOBmGLu99fTDq5mbuY55g== dependencies: "@aws-crypto/sha256-browser" "5.2.0" "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.835.0" - "@aws-sdk/credential-provider-node" "3.835.0" - "@aws-sdk/middleware-host-header" "3.821.0" - "@aws-sdk/middleware-logger" "3.821.0" - "@aws-sdk/middleware-recursion-detection" "3.821.0" - "@aws-sdk/middleware-user-agent" "3.835.0" - "@aws-sdk/region-config-resolver" "3.821.0" - "@aws-sdk/types" "3.821.0" - "@aws-sdk/util-endpoints" "3.828.0" - "@aws-sdk/util-user-agent-browser" "3.821.0" - "@aws-sdk/util-user-agent-node" "3.835.0" + "@aws-sdk/core" "3.846.0" + "@aws-sdk/credential-provider-node" "3.848.0" + "@aws-sdk/middleware-host-header" "3.840.0" + "@aws-sdk/middleware-logger" "3.840.0" + "@aws-sdk/middleware-recursion-detection" "3.840.0" + "@aws-sdk/middleware-user-agent" "3.848.0" + "@aws-sdk/region-config-resolver" "3.840.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-endpoints" "3.848.0" + "@aws-sdk/util-user-agent-browser" "3.840.0" + "@aws-sdk/util-user-agent-node" "3.848.0" "@smithy/config-resolver" "^4.1.4" - "@smithy/core" "^3.5.3" - "@smithy/fetch-http-handler" "^5.0.4" + "@smithy/core" "^3.7.0" + "@smithy/fetch-http-handler" "^5.1.0" "@smithy/hash-node" "^4.0.4" "@smithy/invalid-dependency" "^4.0.4" "@smithy/middleware-content-length" "^4.0.4" - "@smithy/middleware-endpoint" "^4.1.12" - "@smithy/middleware-retry" "^4.1.13" + "@smithy/middleware-endpoint" "^4.1.15" + "@smithy/middleware-retry" "^4.1.16" "@smithy/middleware-serde" "^4.0.8" "@smithy/middleware-stack" "^4.0.4" "@smithy/node-config-provider" "^4.1.3" - "@smithy/node-http-handler" "^4.0.6" + "@smithy/node-http-handler" "^4.1.0" "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.4" + "@smithy/smithy-client" "^4.4.7" "@smithy/types" "^4.3.1" "@smithy/url-parser" "^4.0.4" "@smithy/util-base64" "^4.0.0" "@smithy/util-body-length-browser" "^4.0.0" "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.20" - "@smithy/util-defaults-mode-node" "^4.0.20" + "@smithy/util-defaults-mode-browser" "^4.0.23" + "@smithy/util-defaults-mode-node" "^4.0.23" "@smithy/util-endpoints" "^3.0.6" "@smithy/util-middleware" "^4.0.4" "@smithy/util-retry" "^4.0.6" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/core@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.835.0.tgz" - integrity sha512-7mnf4xbaLI8rkDa+w6fUU48dG6yDuOgLXEPe4Ut3SbMp1ceJBPMozNHbCwkiyHk3HpxZYf8eVy0wXhJMrxZq5w== - dependencies: - "@aws-sdk/types" "3.821.0" - "@aws-sdk/xml-builder" "3.821.0" - "@smithy/core" "^3.5.3" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/property-provider" "^4.0.4" - "@smithy/protocol-http" "^5.1.2" - "@smithy/signature-v4" "^5.1.2" - "@smithy/smithy-client" "^4.4.4" - "@smithy/types" "^4.3.1" - "@smithy/util-base64" "^4.0.0" - "@smithy/util-body-length-browser" "^4.0.0" - "@smithy/util-middleware" "^4.0.4" - "@smithy/util-utf8" "^4.0.0" - fast-xml-parser "4.4.1" - tslib "^2.6.2" - "@aws-sdk/core@3.846.0": version "3.846.0" resolved "https://registry.npmjs.org/@aws-sdk/core/-/core-3.846.0.tgz" @@ -485,17 +420,6 @@ fast-xml-parser "5.2.5" tslib "^2.6.2" -"@aws-sdk/credential-provider-env@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.835.0.tgz" - integrity sha512-U9LFWe7+ephNyekpUbzT7o6SmJTmn6xkrPkE0D7pbLojnPVi/8SZKyjtgQGIsAv+2kFkOCqMOIYUKd/0pE7uew== - dependencies: - "@aws-sdk/core" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@smithy/property-provider" "^4.0.4" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@aws-sdk/credential-provider-env@3.846.0": version "3.846.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.846.0.tgz" @@ -507,22 +431,6 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-http@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.835.0.tgz" - integrity sha512-jCdNEsQklil7frDm/BuVKl4ubVoQHRbV6fnkOjmxAJz0/v7cR8JP0jBGlqKKzh3ROh5/vo1/5VUZbCTLpc9dSg== - dependencies: - "@aws-sdk/core" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@smithy/fetch-http-handler" "^5.0.4" - "@smithy/node-http-handler" "^4.0.6" - "@smithy/property-provider" "^4.0.4" - "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.4" - "@smithy/types" "^4.3.1" - "@smithy/util-stream" "^4.2.2" - tslib "^2.6.2" - "@aws-sdk/credential-provider-http@3.846.0": version "3.846.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.846.0.tgz" @@ -539,25 +447,6 @@ "@smithy/util-stream" "^4.2.3" tslib "^2.6.2" -"@aws-sdk/credential-provider-ini@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.835.0.tgz" - integrity sha512-nqF6rYRAnJedmvDfrfKygzyeADcduDvtvn7GlbQQbXKeR2l7KnCdhuxHa0FALLvspkHiBx7NtInmvnd5IMuWsw== - dependencies: - "@aws-sdk/core" "3.835.0" - "@aws-sdk/credential-provider-env" "3.835.0" - "@aws-sdk/credential-provider-http" "3.835.0" - "@aws-sdk/credential-provider-process" "3.835.0" - "@aws-sdk/credential-provider-sso" "3.835.0" - "@aws-sdk/credential-provider-web-identity" "3.835.0" - "@aws-sdk/nested-clients" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@smithy/credential-provider-imds" "^4.0.6" - "@smithy/property-provider" "^4.0.4" - "@smithy/shared-ini-file-loader" "^4.0.4" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@aws-sdk/credential-provider-ini@3.848.0": version "3.848.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.848.0.tgz" @@ -577,24 +466,6 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-node@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.835.0.tgz" - integrity sha512-77B8elyZlaEd7vDYyCnYtVLuagIBwuJ0AQ98/36JMGrYX7TT8UVAhiDAfVe0NdUOMORvDNFfzL06VBm7wittYw== - dependencies: - "@aws-sdk/credential-provider-env" "3.835.0" - "@aws-sdk/credential-provider-http" "3.835.0" - "@aws-sdk/credential-provider-ini" "3.835.0" - "@aws-sdk/credential-provider-process" "3.835.0" - "@aws-sdk/credential-provider-sso" "3.835.0" - "@aws-sdk/credential-provider-web-identity" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@smithy/credential-provider-imds" "^4.0.6" - "@smithy/property-provider" "^4.0.4" - "@smithy/shared-ini-file-loader" "^4.0.4" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@aws-sdk/credential-provider-node@3.848.0": version "3.848.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.848.0.tgz" @@ -613,18 +484,6 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-process@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.835.0.tgz" - integrity sha512-qXkTt5pAhSi2Mp9GdgceZZFo/cFYrA735efqi/Re/nf0lpqBp8mRM8xv+iAaPHV4Q10q0DlkbEidT1DhxdT/+w== - dependencies: - "@aws-sdk/core" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@smithy/property-provider" "^4.0.4" - "@smithy/shared-ini-file-loader" "^4.0.4" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@aws-sdk/credential-provider-process@3.846.0": version "3.846.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.846.0.tgz" @@ -637,20 +496,6 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-sso@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.835.0.tgz" - integrity sha512-jAiEMryaPFXayYGszrc7NcgZA/zrrE3QvvvUBh/Udasg+9Qp5ZELdJCm/p98twNyY9n5i6Ex6VgvdxZ7+iEheQ== - dependencies: - "@aws-sdk/client-sso" "3.835.0" - "@aws-sdk/core" "3.835.0" - "@aws-sdk/token-providers" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@smithy/property-provider" "^4.0.4" - "@smithy/shared-ini-file-loader" "^4.0.4" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@aws-sdk/credential-provider-sso@3.848.0": version "3.848.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.848.0.tgz" @@ -665,18 +510,6 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/credential-provider-web-identity@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.835.0.tgz" - integrity sha512-zfleEFXDLlcJ7cyfS4xSyCRpd8SVlYZfH3rp0pg2vPYKbnmXVE0r+gPIYXl4L+Yz4A2tizYl63nKCNdtbxadog== - dependencies: - "@aws-sdk/core" "3.835.0" - "@aws-sdk/nested-clients" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@smithy/property-provider" "^4.0.4" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@aws-sdk/credential-provider-web-identity@3.848.0": version "3.848.0" resolved "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.848.0.tgz" @@ -689,12 +522,12 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/middleware-bucket-endpoint@3.830.0": - version "3.830.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.830.0.tgz" - integrity sha512-ElVeCReZSH5Ds+/pkL5ebneJjuo8f49e9JXV1cYizuH0OAOQfYaBU9+M+7+rn61pTttOFE8W//qKzrXBBJhfMg== +"@aws-sdk/middleware-bucket-endpoint@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.840.0.tgz" + integrity sha512-+gkQNtPwcSMmlwBHFd4saVVS11In6ID1HczNzpM3MXKXRBfSlbZJbCt6wN//AZ8HMklZEik4tcEOG0qa9UY8SQ== dependencies: - "@aws-sdk/types" "3.821.0" + "@aws-sdk/types" "3.840.0" "@aws-sdk/util-arn-parser" "3.804.0" "@smithy/node-config-provider" "^4.1.3" "@smithy/protocol-http" "^5.1.2" @@ -702,45 +535,35 @@ "@smithy/util-config-provider" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-expect-continue@3.821.0": - version "3.821.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.821.0.tgz" - integrity sha512-zAOoSZKe1njOrtynvK6ZORU57YGv5I7KP4+rwOvUN3ZhJbQ7QPf8gKtFUCYAPRMegaXCKF/ADPtDZBAmM+zZ9g== +"@aws-sdk/middleware-expect-continue@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.840.0.tgz" + integrity sha512-iJg2r6FKsKKvdiU4oCOuCf7Ro/YE0Q2BT/QyEZN3/Rt8Nr4SAZiQOlcBXOCpGvuIKOEAhvDOUnW3aDHL01PdVw== dependencies: - "@aws-sdk/types" "3.821.0" + "@aws-sdk/types" "3.840.0" "@smithy/protocol-http" "^5.1.2" "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/middleware-flexible-checksums@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.835.0.tgz" - integrity sha512-9ezorQYlr5cQY28zWAReFhNKUTaXsi3TMvXIagMRrSeWtQ7R6TCYnt91xzHRCmFR2kp3zLI+dfoeH+wF3iCKUw== +"@aws-sdk/middleware-flexible-checksums@3.846.0": + version "3.846.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.846.0.tgz" + integrity sha512-CdkeVfkwt3+bDLhmOwBxvkUf6oY9iUhvosaUnqkoPsOqIiUEN54yTGOnO8A0wLz6mMsZ6aBlfFrQhFnxt3c+yw== dependencies: "@aws-crypto/crc32" "5.2.0" "@aws-crypto/crc32c" "5.2.0" "@aws-crypto/util" "5.2.0" - "@aws-sdk/core" "3.835.0" - "@aws-sdk/types" "3.821.0" + "@aws-sdk/core" "3.846.0" + "@aws-sdk/types" "3.840.0" "@smithy/is-array-buffer" "^4.0.0" "@smithy/node-config-provider" "^4.1.3" "@smithy/protocol-http" "^5.1.2" "@smithy/types" "^4.3.1" "@smithy/util-middleware" "^4.0.4" - "@smithy/util-stream" "^4.2.2" + "@smithy/util-stream" "^4.2.3" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-host-header@3.821.0": - version "3.821.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.821.0.tgz" - integrity sha512-xSMR+sopSeWGx5/4pAGhhfMvGBHioVBbqGvDs6pG64xfNwM5vq5s5v6D04e2i+uSTj4qGa71dLUs5I0UzAK3sw== - dependencies: - "@aws-sdk/types" "3.821.0" - "@smithy/protocol-http" "^5.1.2" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@aws-sdk/middleware-host-header@3.840.0": version "3.840.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.840.0.tgz" @@ -751,21 +574,12 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/middleware-location-constraint@3.821.0": - version "3.821.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.821.0.tgz" - integrity sha512-sKrm80k0t3R0on8aA/WhWFoMaAl4yvdk+riotmMElLUpcMcRXAd1+600uFVrxJqZdbrKQ0mjX0PjT68DlkYXLg== - dependencies: - "@aws-sdk/types" "3.821.0" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - -"@aws-sdk/middleware-logger@3.821.0": - version "3.821.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.821.0.tgz" - integrity sha512-0cvI0ipf2tGx7fXYEEN5fBeZDz2RnHyb9xftSgUsEq7NBxjV0yTZfLJw6Za5rjE6snC80dRN8+bTNR1tuG89zA== +"@aws-sdk/middleware-location-constraint@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.840.0.tgz" + integrity sha512-KVLD0u0YMF3aQkVF8bdyHAGWSUY6N1Du89htTLgqCcIhSxxAJ9qifrosVZ9jkAzqRW99hcufyt2LylcVU2yoKQ== dependencies: - "@aws-sdk/types" "3.821.0" + "@aws-sdk/types" "3.840.0" "@smithy/types" "^4.3.1" tslib "^2.6.2" @@ -778,16 +592,6 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/middleware-recursion-detection@3.821.0": - version "3.821.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.821.0.tgz" - integrity sha512-efmaifbhBoqKG3bAoEfDdcM8hn1psF+4qa7ykWuYmfmah59JBeqHLfz5W9m9JoTwoKPkFcVLWZxnyZzAnVBOIg== - dependencies: - "@aws-sdk/types" "3.821.0" - "@smithy/protocol-http" "^5.1.2" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@aws-sdk/middleware-recursion-detection@3.840.0": version "3.840.0" resolved "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.840.0.tgz" @@ -798,45 +602,32 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/middleware-sdk-s3@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.835.0.tgz" - integrity sha512-oPebxpVf9smInHhevHh3APFZagGU+4RPwXEWv9YtYapFvsMq+8QXFvOfxfVZ/mwpe0JVG7EiJzL9/9Kobmts8Q== +"@aws-sdk/middleware-sdk-s3@3.846.0": + version "3.846.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.846.0.tgz" + integrity sha512-jP9x+2Q87J5l8FOP+jlAd7vGLn0cC6G9QGmf386e5OslBPqxXKcl3RjqGLIOKKos2mVItY3ApP5xdXQx7jGTVA== dependencies: - "@aws-sdk/core" "3.835.0" - "@aws-sdk/types" "3.821.0" + "@aws-sdk/core" "3.846.0" + "@aws-sdk/types" "3.840.0" "@aws-sdk/util-arn-parser" "3.804.0" - "@smithy/core" "^3.5.3" + "@smithy/core" "^3.7.0" "@smithy/node-config-provider" "^4.1.3" "@smithy/protocol-http" "^5.1.2" "@smithy/signature-v4" "^5.1.2" - "@smithy/smithy-client" "^4.4.4" + "@smithy/smithy-client" "^4.4.7" "@smithy/types" "^4.3.1" "@smithy/util-config-provider" "^4.0.0" "@smithy/util-middleware" "^4.0.4" - "@smithy/util-stream" "^4.2.2" + "@smithy/util-stream" "^4.2.3" "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/middleware-ssec@3.821.0": - version "3.821.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.821.0.tgz" - integrity sha512-YYi1Hhr2AYiU/24cQc8HIB+SWbQo6FBkMYojVuz/zgrtkFmALxENGF/21OPg7f/QWd+eadZJRxCjmRwh5F2Cxg== - dependencies: - "@aws-sdk/types" "3.821.0" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - -"@aws-sdk/middleware-user-agent@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.835.0.tgz" - integrity sha512-2gmAYygeE/gzhyF2XlkcbMLYFTbNfV61n+iCFa/ZofJHXYE+RxSyl5g4kujLEs7bVZHmjQZJXhprVSkGccq3/w== +"@aws-sdk/middleware-ssec@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/middleware-ssec/-/middleware-ssec-3.840.0.tgz" + integrity sha512-CBZP9t1QbjDFGOrtnUEHL1oAvmnCUUm7p0aPNbIdSzNtH42TNKjPRN3TuEIJDGjkrqpL3MXyDSmNayDcw/XW7Q== dependencies: - "@aws-sdk/core" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@aws-sdk/util-endpoints" "3.828.0" - "@smithy/core" "^3.5.3" - "@smithy/protocol-http" "^5.1.2" + "@aws-sdk/types" "3.840.0" "@smithy/types" "^4.3.1" tslib "^2.6.2" @@ -853,50 +644,6 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/nested-clients@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.835.0.tgz" - integrity sha512-UtmOO0U5QkicjCEv+B32qqRAnS7o2ZkZhC+i3ccH1h3fsfaBshpuuNBwOYAzRCRBeKW5fw3ANFrV/+2FTp4jWg== - dependencies: - "@aws-crypto/sha256-browser" "5.2.0" - "@aws-crypto/sha256-js" "5.2.0" - "@aws-sdk/core" "3.835.0" - "@aws-sdk/middleware-host-header" "3.821.0" - "@aws-sdk/middleware-logger" "3.821.0" - "@aws-sdk/middleware-recursion-detection" "3.821.0" - "@aws-sdk/middleware-user-agent" "3.835.0" - "@aws-sdk/region-config-resolver" "3.821.0" - "@aws-sdk/types" "3.821.0" - "@aws-sdk/util-endpoints" "3.828.0" - "@aws-sdk/util-user-agent-browser" "3.821.0" - "@aws-sdk/util-user-agent-node" "3.835.0" - "@smithy/config-resolver" "^4.1.4" - "@smithy/core" "^3.5.3" - "@smithy/fetch-http-handler" "^5.0.4" - "@smithy/hash-node" "^4.0.4" - "@smithy/invalid-dependency" "^4.0.4" - "@smithy/middleware-content-length" "^4.0.4" - "@smithy/middleware-endpoint" "^4.1.12" - "@smithy/middleware-retry" "^4.1.13" - "@smithy/middleware-serde" "^4.0.8" - "@smithy/middleware-stack" "^4.0.4" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/node-http-handler" "^4.0.6" - "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.4" - "@smithy/types" "^4.3.1" - "@smithy/url-parser" "^4.0.4" - "@smithy/util-base64" "^4.0.0" - "@smithy/util-body-length-browser" "^4.0.0" - "@smithy/util-body-length-node" "^4.0.0" - "@smithy/util-defaults-mode-browser" "^4.0.20" - "@smithy/util-defaults-mode-node" "^4.0.20" - "@smithy/util-endpoints" "^3.0.6" - "@smithy/util-middleware" "^4.0.4" - "@smithy/util-retry" "^4.0.6" - "@smithy/util-utf8" "^4.0.0" - tslib "^2.6.2" - "@aws-sdk/nested-clients@3.848.0": version "3.848.0" resolved "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.848.0.tgz" @@ -941,18 +688,6 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@aws-sdk/region-config-resolver@3.821.0": - version "3.821.0" - resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.821.0.tgz" - integrity sha512-t8og+lRCIIy5nlId0bScNpCkif8sc0LhmtaKsbm0ZPm3sCa/WhCbSZibjbZ28FNjVCV+p0D9RYZx0VDDbtWyjw== - dependencies: - "@aws-sdk/types" "3.821.0" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/types" "^4.3.1" - "@smithy/util-config-provider" "^4.0.0" - "@smithy/util-middleware" "^4.0.4" - tslib "^2.6.2" - "@aws-sdk/region-config-resolver@3.840.0": version "3.840.0" resolved "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.840.0.tgz" @@ -966,44 +701,31 @@ tslib "^2.6.2" "@aws-sdk/s3-request-presigner@^3.832.0": - version "3.837.0" - resolved "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.837.0.tgz" - integrity sha512-h/D/cqeciBPGFSHIHRQm0q/CDvToV4rUoPef3tWzYtfoKzqfYaqRO175FnDv/4XgOYpdoqv6q36bx8KueVQ62w== - dependencies: - "@aws-sdk/signature-v4-multi-region" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@aws-sdk/util-format-url" "3.821.0" - "@smithy/middleware-endpoint" "^4.1.12" + version "3.850.0" + resolved "https://registry.npmjs.org/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.850.0.tgz" + integrity sha512-eFvMUCJXoVTkAxkqHKn125mLMGtNa76+oD3wV97ScXUZuL5liaj+kAN9nSqRiQ5vaCz5gsOeB9t/ba/cTGATjg== + dependencies: + "@aws-sdk/signature-v4-multi-region" "3.846.0" + "@aws-sdk/types" "3.840.0" + "@aws-sdk/util-format-url" "3.840.0" + "@smithy/middleware-endpoint" "^4.1.15" "@smithy/protocol-http" "^5.1.2" - "@smithy/smithy-client" "^4.4.4" + "@smithy/smithy-client" "^4.4.7" "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/signature-v4-multi-region@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.835.0.tgz" - integrity sha512-rEtJH4dIwJYlXXe5rIH+uTCQmd2VIjuaoHlDY3Dr4nxF6po6U7vKsLfybIU2tgflGVqoqYQnXsfW/kj/Rh+/ow== +"@aws-sdk/signature-v4-multi-region@3.846.0": + version "3.846.0" + resolved "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.846.0.tgz" + integrity sha512-ZMfIMxUljqZzPJGOcraC6erwq/z1puNMU35cO1a/WdhB+LdYknMn1lr7SJuH754QwNzzIlZbEgg4hoHw50+DpQ== dependencies: - "@aws-sdk/middleware-sdk-s3" "3.835.0" - "@aws-sdk/types" "3.821.0" + "@aws-sdk/middleware-sdk-s3" "3.846.0" + "@aws-sdk/types" "3.840.0" "@smithy/protocol-http" "^5.1.2" "@smithy/signature-v4" "^5.1.2" "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/token-providers@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.835.0.tgz" - integrity sha512-zN1P3BE+Rv7w7q/CDA8VCQox6SE9QTn0vDtQ47AHA3eXZQQgYzBqgoLgJxR9rKKBIRGZqInJa/VRskLL95VliQ== - dependencies: - "@aws-sdk/core" "3.835.0" - "@aws-sdk/nested-clients" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@smithy/property-provider" "^4.0.4" - "@smithy/shared-ini-file-loader" "^4.0.4" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@aws-sdk/token-providers@3.848.0": version "3.848.0" resolved "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.848.0.tgz" @@ -1017,15 +739,7 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@aws-sdk/types@3.821.0", "@aws-sdk/types@^3.222.0": - version "3.821.0" - resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.821.0.tgz" - integrity sha512-Znroqdai1a90TlxGaJ+FK1lwC0fHpo97Xjsp5UKGR5JODYm7f9+/fF17ebO1KdoBr/Rm0UIFiF5VmI8ts9F1eA== - dependencies: - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - -"@aws-sdk/types@3.840.0": +"@aws-sdk/types@3.840.0", "@aws-sdk/types@^3.222.0": version "3.840.0" resolved "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz" integrity sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA== @@ -1040,16 +754,6 @@ dependencies: tslib "^2.6.2" -"@aws-sdk/util-endpoints@3.828.0": - version "3.828.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.828.0.tgz" - integrity sha512-RvKch111SblqdkPzg3oCIdlGxlQs+k+P7Etory9FmxPHyPDvsP1j1c74PmgYqtzzMWmoXTjd+c9naUHh9xG8xg== - dependencies: - "@aws-sdk/types" "3.821.0" - "@smithy/types" "^4.3.1" - "@smithy/util-endpoints" "^3.0.6" - tslib "^2.6.2" - "@aws-sdk/util-endpoints@3.848.0": version "3.848.0" resolved "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.848.0.tgz" @@ -1061,12 +765,12 @@ "@smithy/util-endpoints" "^3.0.6" tslib "^2.6.2" -"@aws-sdk/util-format-url@3.821.0": - version "3.821.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.821.0.tgz" - integrity sha512-h+xqmPToxDrZ0a7rxE1a8Oh4zpWfZe9oiQUphGtfiGFA6j75UiURH5J3MmGHa/G4t15I3iLLbYtUXxvb1i7evg== +"@aws-sdk/util-format-url@3.840.0": + version "3.840.0" + resolved "https://registry.npmjs.org/@aws-sdk/util-format-url/-/util-format-url-3.840.0.tgz" + integrity sha512-VB1PWyI1TQPiPvg4w7tgUGGQER1xxXPNUqfh3baxUSFi1Oh8wHrDnFywkxLm3NMmgDmnLnSZ5Q326qAoyqKLSg== dependencies: - "@aws-sdk/types" "3.821.0" + "@aws-sdk/types" "3.840.0" "@smithy/querystring-builder" "^4.0.4" "@smithy/types" "^4.3.1" tslib "^2.6.2" @@ -1078,16 +782,6 @@ dependencies: tslib "^2.6.2" -"@aws-sdk/util-user-agent-browser@3.821.0": - version "3.821.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.821.0.tgz" - integrity sha512-irWZHyM0Jr1xhC+38OuZ7JB6OXMLPZlj48thElpsO1ZSLRkLZx5+I7VV6k3sp2yZ7BYbKz/G2ojSv4wdm7XTLw== - dependencies: - "@aws-sdk/types" "3.821.0" - "@smithy/types" "^4.3.1" - bowser "^2.11.0" - tslib "^2.6.2" - "@aws-sdk/util-user-agent-browser@3.840.0": version "3.840.0" resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.840.0.tgz" @@ -1098,17 +792,6 @@ bowser "^2.11.0" tslib "^2.6.2" -"@aws-sdk/util-user-agent-node@3.835.0": - version "3.835.0" - resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.835.0.tgz" - integrity sha512-gY63QZ4W5w9JYHYuqvUxiVGpn7IbCt1ODPQB0ZZwGGr3WRmK+yyZxCtFjbYhEQDQLgTWpf8YgVxgQLv2ps0PJg== - dependencies: - "@aws-sdk/middleware-user-agent" "3.835.0" - "@aws-sdk/types" "3.821.0" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@aws-sdk/util-user-agent-node@3.848.0": version "3.848.0" resolved "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.848.0.tgz" @@ -1143,127 +826,127 @@ tslib "^2.6.2" "@azure/core-auth@^1.3.0", "@azure/core-auth@^1.4.0", "@azure/core-auth@^1.8.0", "@azure/core-auth@^1.9.0": - version "1.9.0" - resolved "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.9.0.tgz" - integrity sha512-FPwHpZywuyasDSLMqJ6fhbOK3TqUdviZNF8OqRGA4W5Ewib2lEEZ+pBsYcBa88B2NGO/SEnYPGhyBqNlE8ilSw== + version "1.10.0" + resolved "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.0.tgz" + integrity sha512-88Djs5vBvGbHQHf5ZZcaoNHo6Y8BKZkt3cw2iuJIQzLEgH4Ox6Tm4hjFhbqOxyYsgIG/eJbFEHpxRIfEEWv5Ow== dependencies: - "@azure/abort-controller" "^2.0.0" - "@azure/core-util" "^1.11.0" tslib "^2.6.2" + "@azure/core-util" "^1.11.0" + "@azure/abort-controller" "^2.0.0" "@azure/core-client@^1.9.2": - version "1.9.4" - resolved "https://registry.npmjs.org/@azure/core-client/-/core-client-1.9.4.tgz" - integrity sha512-f7IxTD15Qdux30s2qFARH+JxgwxWLG2Rlr4oSkPGuLWm+1p5y1+C04XGLA0vmX6EtqfutmjvpNmAfgwVIS5hpw== + version "1.10.0" + resolved "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.0.tgz" + integrity sha512-O4aP3CLFNodg8eTHXECaH3B3CjicfzkxVtnrfLkOq0XNP7TIECGfHpK/C6vADZkWP75wzmdBnsIA8ksuJMk18g== dependencies: - "@azure/abort-controller" "^2.0.0" + tslib "^2.6.2" + "@azure/logger" "^1.0.0" "@azure/core-auth" "^1.4.0" - "@azure/core-rest-pipeline" "^1.20.0" - "@azure/core-tracing" "^1.0.0" "@azure/core-util" "^1.6.1" - "@azure/logger" "^1.0.0" - tslib "^2.6.2" + "@azure/core-tracing" "^1.0.0" + "@azure/abort-controller" "^2.0.0" + "@azure/core-rest-pipeline" "^1.20.0" "@azure/core-http@^3.0.5": version "3.0.5" resolved "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.5.tgz" integrity sha512-T8r2q/c3DxNu6mEJfPuJtptUVqwchxzjj32gKcnMi06rdiVONS9rar7kT9T2Am+XvER7uOzpsP79WsqNbdgdWg== dependencies: - "@azure/abort-controller" "^1.0.0" - "@azure/core-auth" "^1.3.0" - "@azure/core-tracing" "1.0.0-preview.13" - "@azure/core-util" "^1.1.1" - "@azure/logger" "^1.0.0" - "@types/node-fetch" "^2.5.0" - "@types/tunnel" "^0.0.3" - form-data "^4.0.0" - node-fetch "^2.6.7" - process "^0.11.10" + uuid "^8.3.0" tslib "^2.2.0" tunnel "^0.0.6" - uuid "^8.3.0" xml2js "^0.5.0" + process "^0.11.10" + form-data "^4.0.0" + node-fetch "^2.6.7" + "@azure/logger" "^1.0.0" + "@types/tunnel" "^0.0.3" + "@azure/core-auth" "^1.3.0" + "@azure/core-util" "^1.1.1" + "@types/node-fetch" "^2.5.0" + "@azure/core-tracing" "1.0.0-preview.13" + "@azure/abort-controller" "^1.0.0" "@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.20.0", "@azure/core-rest-pipeline@^1.21.0": - version "1.21.0" - resolved "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.21.0.tgz" - integrity sha512-a4MBwe/5WKbq9MIxikzgxLBbruC5qlkFYlBdI7Ev50Y7ib5Vo/Jvt5jnJo7NaWeJ908LCHL0S1Us4UMf1VoTfg== + version "1.22.0" + resolved "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.0.tgz" + integrity sha512-OKHmb3/Kpm06HypvB3g6Q3zJuvyXcpxDpCS1PnU8OV6AJgSFaee/covXBcPbWc6XDDxtEPlbi3EMQ6nUiPaQtw== dependencies: - "@azure/abort-controller" "^2.0.0" + tslib "^2.6.2" + "@azure/logger" "^1.0.0" "@azure/core-auth" "^1.8.0" - "@azure/core-tracing" "^1.0.1" "@azure/core-util" "^1.11.0" - "@azure/logger" "^1.0.0" - "@typespec/ts-http-runtime" "^0.2.3" - tslib "^2.6.2" + "@azure/core-tracing" "^1.0.1" + "@azure/abort-controller" "^2.0.0" + "@typespec/ts-http-runtime" "^0.3.0" "@azure/core-tracing@1.0.0-preview.13": version "1.0.0-preview.13" resolved "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz" integrity sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ== dependencies: - "@opentelemetry/api" "^1.0.1" tslib "^2.2.0" + "@opentelemetry/api" "^1.0.1" "@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.0.1", "@azure/core-tracing@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.2.0.tgz" - integrity sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg== + version "1.3.0" + resolved "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.3.0.tgz" + integrity sha512-+XvmZLLWPe67WXNZo9Oc9CrPj/Tm8QnHR92fFAFdnbzwNdCH1h+7UdpaQgRSBsMY+oW1kHXNUZQLdZ1gHX3ROw== dependencies: tslib "^2.6.2" "@azure/core-util@^1.1.1", "@azure/core-util@^1.11.0", "@azure/core-util@^1.6.1": - version "1.12.0" - resolved "https://registry.npmjs.org/@azure/core-util/-/core-util-1.12.0.tgz" - integrity sha512-13IyjTQgABPARvG90+N2dXpC+hwp466XCdQXPCRlbWHgd3SJd5Q1VvaBGv6k1BIa4MQm6hAF1UBU1m8QUxV8sQ== + version "1.13.0" + resolved "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.0.tgz" + integrity sha512-o0psW8QWQ58fq3i24Q1K2XfS/jYTxr7O1HRcyUE9bV9NttLU+kYOH82Ixj8DGlMTOWgxm1Sss2QAfKK5UkSPxw== dependencies: - "@azure/abort-controller" "^2.0.0" - "@typespec/ts-http-runtime" "^0.2.2" tslib "^2.6.2" + "@azure/abort-controller" "^2.0.0" + "@typespec/ts-http-runtime" "^0.3.0" "@azure/identity@^4.10.0": - version "4.10.1" - resolved "https://registry.npmjs.org/@azure/identity/-/identity-4.10.1.tgz" - integrity sha512-YM/z6RxRtFlXUH2egAYF/FDPes+MUE6ZoknjEdaq7ebJMMNUzn9zCJ3bd2ZZZlkP0r1xKa88kolhFH/FGV7JnA== + version "4.10.2" + resolved "https://registry.npmjs.org/@azure/identity/-/identity-4.10.2.tgz" + integrity sha512-Uth4vz0j+fkXCkbvutChUj03PDCokjbC6Wk9JT8hHEUtpy/EurNKAseb3+gO6Zi9VYBvwt61pgbzn1ovk942Qg== dependencies: - "@azure/abort-controller" "^2.0.0" + open "^10.1.0" + tslib "^2.2.0" + "@azure/logger" "^1.0.0" "@azure/core-auth" "^1.9.0" + "@azure/core-util" "^1.11.0" + "@azure/msal-node" "^3.5.0" "@azure/core-client" "^1.9.2" - "@azure/core-rest-pipeline" "^1.17.0" "@azure/core-tracing" "^1.0.0" - "@azure/core-util" "^1.11.0" - "@azure/logger" "^1.0.0" "@azure/msal-browser" "^4.2.0" - "@azure/msal-node" "^3.5.0" - open "^10.1.0" - tslib "^2.2.0" + "@azure/abort-controller" "^2.0.0" + "@azure/core-rest-pipeline" "^1.17.0" "@azure/logger@^1.0.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@azure/logger/-/logger-1.2.0.tgz" - integrity sha512-0hKEzLhpw+ZTAfNJyRrn6s+V0nDWzXk9OjBr2TiGIu0OfMr5s2V4FpKLTAK3Ca5r5OKLbf4hkOGDPyiRjie/jA== + version "1.3.0" + resolved "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz" + integrity sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA== dependencies: - "@typespec/ts-http-runtime" "^0.2.2" tslib "^2.6.2" + "@typespec/ts-http-runtime" "^0.3.0" "@azure/msal-browser@^4.2.0": - version "4.13.2" - resolved "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.13.2.tgz" - integrity sha512-lS75bF6FYZRwsacKLXc8UYu/jb+gOB7dtZq5938chCvV/zKTFDnzuXxCXhsSUh0p8s/P8ztgbfdueD9lFARQlQ== + version "4.15.0" + resolved "https://registry.npmjs.org/@azure/msal-browser/-/msal-browser-4.15.0.tgz" + integrity sha512-+AIGTvpVz+FIx5CsM1y+nW0r/qOb/ChRdM8/Cbp+jKWC0Wdw4ldnwPdYOBi5NaALUQnYITirD9XMZX7LdklEzQ== dependencies: - "@azure/msal-common" "15.7.1" + "@azure/msal-common" "15.8.1" -"@azure/msal-common@15.7.1": - version "15.7.1" - resolved "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.7.1.tgz" - integrity sha512-a0eowoYfRfKZEjbiCoA5bPT3IlWRAdGSvi63OU23Hv+X6EI8gbvXCoeqokUceFMoT9NfRUWTJSx5FiuzruqT8g== +"@azure/msal-common@15.8.1": + version "15.8.1" + resolved "https://registry.npmjs.org/@azure/msal-common/-/msal-common-15.8.1.tgz" + integrity sha512-ltIlFK5VxeJ5BurE25OsJIfcx1Q3H/IZg2LjV9d4vmH+5t4c1UCyRQ/HgKLgXuCZShs7qfc/TC95GYZfsUsJUQ== "@azure/msal-node@^3.5.0": - version "3.6.1" - resolved "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.6.1.tgz" - integrity sha512-ctcVz4xS+st5KxOlQqgpvA+uDFAa59CvkmumnuhlD2XmNczloKBdCiMQG7/TigSlaeHe01qoOlDjz3TyUAmKUg== + version "3.6.3" + resolved "https://registry.npmjs.org/@azure/msal-node/-/msal-node-3.6.3.tgz" + integrity sha512-95wjsKGyUcAd5tFmQBo5Ug/kOj+hFh/8FsXuxluEvdfbgg6xCimhSP9qnyq6+xIg78/jREkBD1/BSqd7NIDDYQ== dependencies: - "@azure/msal-common" "15.7.1" + "@azure/msal-common" "15.8.1" jsonwebtoken "^9.0.0" uuid "^8.3.0" @@ -1272,74 +955,79 @@ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: - "@babel/helper-validator-identifier" "^7.27.1" js-tokens "^4.0.0" picocolors "^1.1.1" + "@babel/helper-validator-identifier" "^7.27.1" "@babel/compat-data@^7.27.2": - version "7.27.7" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.7.tgz" - integrity sha512-xgu/ySj2mTiUFmdE9yCMfBxLp4DHd5DwmbbD05YAuICfodYT3VvRxbrh81LGQ/8UpSdtMdfKMn3KouYDX59DGQ== + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz" + integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.27.4": - version "7.27.7" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.27.7.tgz" - integrity sha512-BU2f9tlKQ5CAthiMIgpzAh4eDTLWo1mqi9jqE2OxMG0E/OM199VJt2q8BztTxpnSW0i1ymdwLXRJnYzvDM5r2w== +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz" + integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.5" - "@babel/helper-compilation-targets" "^7.27.2" - "@babel/helper-module-transforms" "^7.27.3" - "@babel/helpers" "^7.27.6" - "@babel/parser" "^7.27.7" - "@babel/template" "^7.27.2" - "@babel/traverse" "^7.27.7" - "@babel/types" "^7.27.7" - convert-source-map "^2.0.0" debug "^4.1.0" - gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" + gensync "^1.0.0-beta.2" + "@babel/types" "^7.28.0" + "@babel/parser" "^7.28.0" + "@babel/helpers" "^7.27.6" + "@babel/template" "^7.27.2" + "@babel/traverse" "^7.28.0" + "@babel/generator" "^7.28.0" + "@babel/code-frame" "^7.27.1" + convert-source-map "^2.0.0" + "@ampproject/remapping" "^2.2.0" + "@babel/helper-module-transforms" "^7.27.3" + "@babel/helper-compilation-targets" "^7.27.2" -"@babel/generator@^7.27.5": - version "7.27.5" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz" - integrity sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw== +"@babel/generator@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz" + integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== dependencies: - "@babel/parser" "^7.27.5" - "@babel/types" "^7.27.3" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" jsesc "^3.0.2" + "@babel/types" "^7.28.0" + "@babel/parser" "^7.28.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" "@babel/helper-compilation-targets@^7.27.2": version "7.27.2" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: + semver "^6.3.1" + lru-cache "^5.1.1" + browserslist "^4.24.0" "@babel/compat-data" "^7.27.2" "@babel/helper-validator-option" "^7.27.1" - browserslist "^4.24.0" - lru-cache "^5.1.1" - semver "^6.3.1" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.27.1": version "7.27.1" resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== dependencies: - "@babel/traverse" "^7.27.1" "@babel/types" "^7.27.1" + "@babel/traverse" "^7.27.1" "@babel/helper-module-transforms@^7.27.3": version "7.27.3" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz" integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== dependencies: + "@babel/traverse" "^7.27.3" "@babel/helper-module-imports" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" - "@babel/traverse" "^7.27.3" "@babel/helper-plugin-utils@^7.27.1": version "7.27.1" @@ -1366,15 +1054,15 @@ resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz" integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== dependencies: - "@babel/template" "^7.27.2" "@babel/types" "^7.27.6" + "@babel/template" "^7.27.2" -"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.0", "@babel/parser@^7.27.2", "@babel/parser@^7.27.5", "@babel/parser@^7.27.7": - version "7.27.7" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.27.7.tgz" - integrity sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q== +"@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.0", "@babel/parser@^7.27.2", "@babel/parser@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz" + integrity sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== dependencies: - "@babel/types" "^7.27.7" + "@babel/types" "^7.28.0" "@babel/plugin-transform-react-jsx-self@^7.27.1": version "7.27.1" @@ -1400,27 +1088,27 @@ resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/code-frame" "^7.27.1" -"@babel/traverse@^7.27.0", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.27.7": - version "7.27.7" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.7.tgz" - integrity sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw== +"@babel/traverse@^7.27.0", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0": + version "7.28.0" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz" + integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== dependencies: - "@babel/code-frame" "^7.27.1" - "@babel/generator" "^7.27.5" - "@babel/parser" "^7.27.7" - "@babel/template" "^7.27.2" - "@babel/types" "^7.27.7" debug "^4.3.1" - globals "^11.1.0" + "@babel/types" "^7.28.0" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/generator" "^7.28.0" + "@babel/code-frame" "^7.27.1" + "@babel/helper-globals" "^7.28.0" -"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.27.6", "@babel/types@^7.27.7": - version "7.27.7" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.27.7.tgz" - integrity sha512-8OLQgDScAOHXnAz2cV+RfzzNMipuLVBz2biuAJFMV9bfkNf393je3VM8CLkjQodW5+iWsSJdSgSWT6rsZoXHPw== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.6", "@babel/types@^7.28.0": + version "7.28.1" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.28.1.tgz" + integrity sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" @@ -1452,24 +1140,24 @@ node-fetch "^2.6.7" "@calcom/atoms@^1.0.102-framer": - version "1.0.106" - resolved "https://registry.npmjs.org/@calcom/atoms/-/atoms-1.0.106.tgz" - integrity sha512-NbczWTH1hvweDpNyrkldwP7QVxMqeAaBhmY2wpFyhs/DlBXM8F5w8UffYQt5LAiZtShQjOwy9BBdjNYFs++cIg== + version "1.1.1" + resolved "https://registry.npmjs.org/@calcom/atoms/-/atoms-1.1.1.tgz" + integrity sha512-cq0HAUzkaiXw5tT/5bUozj4o83swg8GDCeEeKgtu9e7yjFJ9YqWRz+OVFc5andX1pUzmbkUpuH1hGxIziSFxaQ== dependencies: - "@radix-ui/react-dialog-atoms" "npm:@radix-ui/react-dialog@^1.0.4" - "@radix-ui/react-slot" "^1.0.2" - "@radix-ui/react-switch" "^1.1.0" - "@radix-ui/react-toast" "^1.1.5" - "@radix-ui/react-tooltip-atoms" "npm:@radix-ui/react-tooltip@^1.0.0" - "@tanstack/react-query" "^5.17.15" - class-variance-authority "^0.7.0" clsx "^2.0.0" - dompurify "^3.2.3" marked "^15.0.3" + dompurify "^3.2.3" react-use "^17.4.2" - tailwind-merge "^1.13.2" tailwindcss "^3.3.3" + tailwind-merge "^1.13.2" tailwindcss-animate "^1.0.6" + "@radix-ui/react-slot" "^1.0.2" + "@radix-ui/react-toast" "^1.1.5" + "@tanstack/react-query" "^5.17.15" + "@radix-ui/react-switch" "^1.1.0" + class-variance-authority "^0.7.0" + "@radix-ui/react-dialog-atoms" "npm:@radix-ui/react-dialog@^1.0.4" + "@radix-ui/react-tooltip-atoms" "npm:@radix-ui/react-tooltip@^1.0.0" "@calcom/embed-core@1.5.3": version "1.5.3" @@ -1651,14 +1339,14 @@ "@types/conventional-commits-parser" "^5.0.0" chalk "^5.3.0" -"@comp/analytics@^workspace:packages/analytics": +"@comp/analytics@packages/analytics": version "workspace:packages/analytics" resolved "workspace:packages/analytics" dependencies: posthog-js "^1.236.6" posthog-node "^4.14.0" -"@comp/app@^workspace:apps/app", "@comp/app@workspace:*": +"@comp/app@apps/app", "@comp/app@workspace:*": version "workspace:apps/app" resolved "workspace:apps/app" devDependencies: @@ -1696,9 +1384,7 @@ "@browserbasehq/sdk" "^2.5.0" "@calcom/atoms" "^1.0.102-framer" "@calcom/embed-react" "^1.5.3" - dependencies: "@comp/db" "workspace:*" - dependencies: "@date-fns/tz" "^1.2.0" "@dnd-kit/core" "^6.3.1" "@dnd-kit/modifiers" "^9.0.0" @@ -1768,19 +1454,18 @@ zaraz-ts "^1.2.0" zustand "^5.0.3" -"@comp/db@^workspace:packages/db", "@comp/db@workspace:*": +"@comp/db@packages/db", "@comp/db@workspace:*": version "workspace:packages/db" resolved "workspace:packages/db" devDependencies: "@comp/tsconfig" "workspace:*" - devDependencies: prisma "^6.9.0" ts-node "^10.9.2" typescript "^5.8.3" dependencies: "@prisma/client" "6.9.0" -"@comp/email@^workspace:packages/email": +"@comp/email@packages/email": version "workspace:packages/email" resolved "workspace:packages/email" devDependencies: @@ -1791,7 +1476,6 @@ dependencies: "@comp/ui" "workspace:*" "@comp/utils" "workspace:*" - dependencies: "@react-email/components" "^0.0.41" "@react-email/render" "^1.1.2" "@react-email/tailwind" "1.0.5" @@ -1800,7 +1484,7 @@ react-email "^4.0.15" responsive-react-email "^0.0.5" -"@comp/framework-editor@^workspace:apps/framework-editor": +"@comp/framework-editor@apps/framework-editor": version "workspace:apps/framework-editor" resolved "workspace:apps/framework-editor" devDependencies: @@ -1816,7 +1500,6 @@ dependencies: "@comp/db" "workspace:*" "@comp/ui" "workspace:*" - dependencies: "@hookform/resolvers" "^5.1.1" "@tanstack/react-table" "^8.21.3" "@tanstack/react-virtual" "^3.13.8" @@ -1830,7 +1513,7 @@ tippy.js "^6.3.7" zod "3.25.67" -"@comp/infra@^workspace:apps/infra": +"@comp/infra@apps/infra": version "workspace:apps/infra" resolved "workspace:apps/infra" devDependencies: @@ -1846,7 +1529,7 @@ "@pulumi/tailscale" "^0.17.0" dotenv "^17.2.0" -"@comp/integrations@^workspace:packages/integrations": +"@comp/integrations@packages/integrations": version "workspace:packages/integrations" resolved "workspace:packages/integrations" devDependencies: @@ -1857,9 +1540,7 @@ "@ai-sdk/openai" "^1.3.19" "@aws-sdk/client-securityhub" "^3.0.0" "@azure/identity" "^4.10.0" - dependencies: "@comp/app" "workspace:*" - dependencies: "@slack/bolt" "^3.22.0" "@slack/web-api" "^7.8.0" ai "^4.3.16" @@ -1869,14 +1550,14 @@ stoppable "^1.1.0" zod "3.25.67" -"@comp/kv@^workspace:packages/kv": +"@comp/kv@packages/kv": version "workspace:packages/kv" resolved "workspace:packages/kv" dependencies: "@upstash/redis" "^1.34.2" server-only "0.0.1" -"@comp/portal@^workspace:apps/portal": +"@comp/portal@apps/portal": version "workspace:apps/portal" resolved "workspace:apps/portal" devDependencies: @@ -1892,10 +1573,8 @@ typescript "^5.8.3" dependencies: "@aws-sdk/s3-request-presigner" "^3.832.0" - dependencies: "@comp/db" "workspace:*" "@comp/ui" "workspace:*" - dependencies: "@react-email/components" "^0.0.41" "@react-email/render" "^1.1.2" "@t3-oss/env-nextjs" "^0.13.8" @@ -1907,7 +1586,7 @@ next "15.4.0-canary.85" react-email "^4.0.15" -"@comp/trust@^workspace:apps/trust": +"@comp/trust@apps/trust": version "workspace:apps/trust" resolved "workspace:apps/trust" devDependencies: @@ -1924,16 +1603,15 @@ dependencies: "@comp/db" "workspace:*" "@comp/ui" "workspace:*" - dependencies: "@lottiefiles/dotlottie-react" "^0.14.2" lucide-react "^0.518.0" next "15.4.0-canary.85" -"@comp/tsconfig@^workspace:packages/tsconfig", "@comp/tsconfig@workspace:*": +"@comp/tsconfig@packages/tsconfig", "@comp/tsconfig@workspace:*": version "workspace:packages/tsconfig" resolved "workspace:packages/tsconfig" -"@comp/ui@^workspace:packages/ui", "@comp/ui@workspace:*": +"@comp/ui@packages/ui", "@comp/ui@workspace:*": version "workspace:packages/ui" resolved "workspace:packages/ui" devDependencies: @@ -2016,7 +1694,7 @@ use-debounce "^10.0.4" vaul "^0.9.6" -"@comp/utils@^workspace:packages/utils", "@comp/utils@workspace:*": +"@comp/utils@packages/utils", "@comp/utils@workspace:*": version "workspace:packages/utils" resolved "workspace:packages/utils" devDependencies: @@ -2072,13 +1750,13 @@ resolved "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.2.tgz" integrity sha512-F1WTABdd8/R9D1icJzajC4IuLyyS8f3rTOz66JsSI3pKvpCAtsMBweu8cyNYsIyvcrKAVn9EPK+Psoymq+XC0A== dependencies: - "@discordjs/formatters" "^0.6.1" + tslib "^2.6.3" + ts-mixer "^6.0.4" "@discordjs/util" "^1.1.1" - "@sapphire/shapeshift" "^4.0.0" - discord-api-types "^0.38.1" fast-deep-equal "^3.1.3" - ts-mixer "^6.0.4" - tslib "^2.6.3" + discord-api-types "^0.38.1" + "@sapphire/shapeshift" "^4.0.0" + "@discordjs/formatters" "^0.6.1" "@discordjs/collection@1.5.3": version "1.5.3" @@ -2102,15 +1780,15 @@ resolved "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.1.tgz" integrity sha512-Tg9840IneBcbrAjcGaQzHUJWFNq1MMWZjTdjJ0WS/89IffaNKc++iOvffucPxQTF/gviO9+9r8kEPea1X5J2Dw== dependencies: - "@discordjs/collection" "^2.1.1" + tslib "^2.6.3" + undici "6.21.3" + magic-bytes.js "^1.10.0" "@discordjs/util" "^1.1.1" - "@sapphire/async-queue" "^1.5.3" + discord-api-types "^0.38.1" "@sapphire/snowflake" "^3.5.3" + "@discordjs/collection" "^2.1.1" + "@sapphire/async-queue" "^1.5.3" "@vladfrangu/async_event_emitter" "^2.4.6" - discord-api-types "^0.38.1" - magic-bytes.js "^1.10.0" - tslib "^2.6.3" - undici "6.21.3" "@discordjs/util@^1.1.0", "@discordjs/util@^1.1.1": version "1.1.1" @@ -2122,15 +1800,15 @@ resolved "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.3.tgz" integrity sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw== dependencies: - "@discordjs/collection" "^2.1.0" + ws "^8.17.0" + tslib "^2.6.2" + "@types/ws" "^8.5.10" "@discordjs/rest" "^2.5.1" "@discordjs/util" "^1.1.0" + discord-api-types "^0.38.1" + "@discordjs/collection" "^2.1.0" "@sapphire/async-queue" "^1.5.2" - "@types/ws" "^8.5.10" "@vladfrangu/async_event_emitter" "^2.2.4" - discord-api-types "^0.38.1" - tslib "^2.6.2" - ws "^8.17.0" "@dnd-kit/accessibility@^3.1.1": version "3.1.1" @@ -2144,9 +1822,9 @@ resolved "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz" integrity sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ== dependencies: + tslib "^2.0.0" "@dnd-kit/accessibility" "^3.1.1" "@dnd-kit/utilities" "^3.2.2" - tslib "^2.0.0" "@dnd-kit/modifiers@^9.0.0": version "9.0.0" @@ -2197,18 +1875,18 @@ resolved "https://registry.npmjs.org/@dub/embed-react/-/embed-react-0.0.15.tgz" integrity sha512-GLLAMGpn6WLXbM8q4n0lPOrjsYkmI0W3LvAAMFbb+FeQ6OwFvz390xwWW2ygfUo74wvWLSYVEOoHymiuoSrb7Q== dependencies: + vite "5.2.9" "@dub/embed-core" "^0.0.15" class-variance-authority "^0.7.0" - vite "5.2.9" "@effect/platform@0.85.2": version "0.85.2" resolved "https://registry.npmjs.org/@effect/platform/-/platform-0.85.2.tgz" integrity sha512-zIRixbQeO6QniR0k2mwR7DmR2HO1w6+qQlzQ5nb8lyPyPgd1gV9wo/9yBeB6zRC+CGnxiUiYsRMamclVISuxLw== dependencies: - find-my-way-ts "^0.1.5" msgpackr "^1.11.4" multipasta "^0.2.5" + find-my-way-ts "^0.1.5" "@electric-sql/client@1.0.0-beta.1": version "1.0.0-beta.1" @@ -2218,24 +1896,24 @@ "@rollup/rollup-darwin-arm64" "^4.18.1" "@emnapi/core@^1.4.3": - version "1.4.3" - resolved "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz" - integrity sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g== + version "1.4.5" + resolved "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz" + integrity sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q== dependencies: - "@emnapi/wasi-threads" "1.0.2" + "@emnapi/wasi-threads" "1.0.4" tslib "^2.4.0" -"@emnapi/runtime@^1.4.3": - version "1.4.3" - resolved "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.3.tgz" - integrity sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ== +"@emnapi/runtime@^1.4.3", "@emnapi/runtime@^1.4.4": + version "1.4.5" + resolved "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz" + integrity sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg== dependencies: tslib "^2.4.0" -"@emnapi/wasi-threads@1.0.2", "@emnapi/wasi-threads@^1.0.2": - version "1.0.2" - resolved "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz" - integrity sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA== +"@emnapi/wasi-threads@1.0.4", "@emnapi/wasi-threads@^1.0.2": + version "1.0.4" + resolved "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz" + integrity sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g== dependencies: tslib "^2.4.0" @@ -2332,240 +2010,245 @@ resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz" integrity sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g== -"@esbuild/aix-ppc64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.5.tgz" - integrity sha512-9o3TMmpmftaCMepOdA5k/yDw8SfInyzWWTjYTFCX3kPSDJMROQTb8jg+h9Cnwnmm1vOzvxN7gIfB5V2ewpjtGA== +"@esbuild/aix-ppc64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz" + integrity sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA== "@esbuild/android-arm@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz" integrity sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w== -"@esbuild/android-arm@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.5.tgz" - integrity sha512-AdJKSPeEHgi7/ZhuIPtcQKr5RQdo6OO2IL87JkianiMYMPbCtot9fxPbrMiBADOWWm3T2si9stAiVsGbTQFkbA== +"@esbuild/android-arm@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.8.tgz" + integrity sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw== "@esbuild/android-arm64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz" integrity sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg== -"@esbuild/android-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.5.tgz" - integrity sha512-VGzGhj4lJO+TVGV1v8ntCZWJktV7SGCs3Pn1GRWI1SBFtRALoomm8k5E9Pmwg3HOAal2VDc2F9+PM/rEY6oIDg== +"@esbuild/android-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz" + integrity sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w== "@esbuild/android-x64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz" integrity sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg== -"@esbuild/android-x64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.5.tgz" - integrity sha512-D2GyJT1kjvO//drbRT3Hib9XPwQeWd9vZoBJn+bu/lVsOZ13cqNdDeqIF/xQ5/VmWvMduP6AmXvylO/PIc2isw== +"@esbuild/android-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.8.tgz" + integrity sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA== "@esbuild/darwin-arm64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz" integrity sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA== -"@esbuild/darwin-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.5.tgz" - integrity sha512-GtaBgammVvdF7aPIgH2jxMDdivezgFu6iKpmT+48+F8Hhg5J/sfnDieg0aeG/jfSvkYQU2/pceFPDKlqZzwnfQ== +"@esbuild/darwin-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz" + integrity sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw== "@esbuild/darwin-x64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz" integrity sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA== -"@esbuild/darwin-x64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.5.tgz" - integrity sha512-1iT4FVL0dJ76/q1wd7XDsXrSW+oLoquptvh4CLR4kITDtqi2e/xwXwdCVH8hVHU43wgJdsq7Gxuzcs6Iq/7bxQ== +"@esbuild/darwin-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz" + integrity sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg== "@esbuild/freebsd-arm64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz" integrity sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw== -"@esbuild/freebsd-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.5.tgz" - integrity sha512-nk4tGP3JThz4La38Uy/gzyXtpkPW8zSAmoUhK9xKKXdBCzKODMc2adkB2+8om9BDYugz+uGV7sLmpTYzvmz6Sw== +"@esbuild/freebsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz" + integrity sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA== "@esbuild/freebsd-x64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz" integrity sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw== -"@esbuild/freebsd-x64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.5.tgz" - integrity sha512-PrikaNjiXdR2laW6OIjlbeuCPrPaAl0IwPIaRv+SMV8CiM8i2LqVUHFC1+8eORgWyY7yhQY+2U2fA55mBzReaw== +"@esbuild/freebsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz" + integrity sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw== "@esbuild/linux-arm@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz" integrity sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg== -"@esbuild/linux-arm@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.5.tgz" - integrity sha512-cPzojwW2okgh7ZlRpcBEtsX7WBuqbLrNXqLU89GxWbNt6uIg78ET82qifUy3W6OVww6ZWobWub5oqZOVtwolfw== +"@esbuild/linux-arm@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz" + integrity sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg== "@esbuild/linux-arm64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz" integrity sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A== -"@esbuild/linux-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.5.tgz" - integrity sha512-Z9kfb1v6ZlGbWj8EJk9T6czVEjjq2ntSYLY2cw6pAZl4oKtfgQuS4HOq41M/BcoLPzrUbNd+R4BXFyH//nHxVg== +"@esbuild/linux-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz" + integrity sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w== "@esbuild/linux-ia32@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz" integrity sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig== -"@esbuild/linux-ia32@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.5.tgz" - integrity sha512-sQ7l00M8bSv36GLV95BVAdhJ2QsIbCuCjh/uYrWiMQSUuV+LpXwIqhgJDcvMTj+VsQmqAHL2yYaasENvJ7CDKA== +"@esbuild/linux-ia32@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz" + integrity sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg== "@esbuild/linux-loong64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz" integrity sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ== -"@esbuild/linux-loong64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.5.tgz" - integrity sha512-0ur7ae16hDUC4OL5iEnDb0tZHDxYmuQyhKhsPBV8f99f6Z9KQM02g33f93rNH5A30agMS46u2HP6qTdEt6Q1kg== +"@esbuild/linux-loong64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz" + integrity sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ== "@esbuild/linux-mips64el@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz" integrity sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA== -"@esbuild/linux-mips64el@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.5.tgz" - integrity sha512-kB/66P1OsHO5zLz0i6X0RxlQ+3cu0mkxS3TKFvkb5lin6uwZ/ttOkP3Z8lfR9mJOBk14ZwZ9182SIIWFGNmqmg== +"@esbuild/linux-mips64el@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz" + integrity sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw== "@esbuild/linux-ppc64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz" integrity sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg== -"@esbuild/linux-ppc64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.5.tgz" - integrity sha512-UZCmJ7r9X2fe2D6jBmkLBMQetXPXIsZjQJCjgwpVDz+YMcS6oFR27alkgGv3Oqkv07bxdvw7fyB71/olceJhkQ== +"@esbuild/linux-ppc64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz" + integrity sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ== "@esbuild/linux-riscv64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz" integrity sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg== -"@esbuild/linux-riscv64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.5.tgz" - integrity sha512-kTxwu4mLyeOlsVIFPfQo+fQJAV9mh24xL+y+Bm6ej067sYANjyEw1dNHmvoqxJUCMnkBdKpvOn0Ahql6+4VyeA== +"@esbuild/linux-riscv64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz" + integrity sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg== "@esbuild/linux-s390x@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz" integrity sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ== -"@esbuild/linux-s390x@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.5.tgz" - integrity sha512-K2dSKTKfmdh78uJ3NcWFiqyRrimfdinS5ErLSn3vluHNeHVnBAFWC8a4X5N+7FgVE1EjXS1QDZbpqZBjfrqMTQ== +"@esbuild/linux-s390x@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz" + integrity sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg== "@esbuild/linux-x64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz" integrity sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw== -"@esbuild/linux-x64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.5.tgz" - integrity sha512-uhj8N2obKTE6pSZ+aMUbqq+1nXxNjZIIjCjGLfsWvVpy7gKCOL6rsY1MhRh9zLtUtAI7vpgLMK6DxjO8Qm9lJw== +"@esbuild/linux-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz" + integrity sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ== -"@esbuild/netbsd-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.5.tgz" - integrity sha512-pwHtMP9viAy1oHPvgxtOv+OkduK5ugofNTVDilIzBLpoWAM16r7b/mxBvfpuQDpRQFMfuVr5aLcn4yveGvBZvw== +"@esbuild/netbsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz" + integrity sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw== "@esbuild/netbsd-x64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz" integrity sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ== -"@esbuild/netbsd-x64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.5.tgz" - integrity sha512-WOb5fKrvVTRMfWFNCroYWWklbnXH0Q5rZppjq0vQIdlsQKuw6mdSihwSo4RV/YdQ5UCKKvBy7/0ZZYLBZKIbwQ== +"@esbuild/netbsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz" + integrity sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg== -"@esbuild/openbsd-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.5.tgz" - integrity sha512-7A208+uQKgTxHd0G0uqZO8UjK2R0DDb4fDmERtARjSHWxqMTye4Erz4zZafx7Di9Cv+lNHYuncAkiGFySoD+Mw== +"@esbuild/openbsd-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz" + integrity sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ== "@esbuild/openbsd-x64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz" integrity sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ== -"@esbuild/openbsd-x64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.5.tgz" - integrity sha512-G4hE405ErTWraiZ8UiSoesH8DaCsMm0Cay4fsFWOOUcz8b8rC6uCvnagr+gnioEjWn0wC+o1/TAHt+It+MpIMg== +"@esbuild/openbsd-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz" + integrity sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ== + +"@esbuild/openharmony-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz" + integrity sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg== "@esbuild/sunos-x64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz" integrity sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w== -"@esbuild/sunos-x64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.5.tgz" - integrity sha512-l+azKShMy7FxzY0Rj4RCt5VD/q8mG/e+mDivgspo+yL8zW7qEwctQ6YqKX34DTEleFAvCIUviCFX1SDZRSyMQA== +"@esbuild/sunos-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz" + integrity sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w== "@esbuild/win32-arm64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz" integrity sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ== -"@esbuild/win32-arm64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.5.tgz" - integrity sha512-O2S7SNZzdcFG7eFKgvwUEZ2VG9D/sn/eIiz8XRZ1Q/DO5a3s76Xv0mdBzVM5j5R639lXQmPmSo0iRpHqUUrsxw== +"@esbuild/win32-arm64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz" + integrity sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ== "@esbuild/win32-ia32@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz" integrity sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ== -"@esbuild/win32-ia32@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.5.tgz" - integrity sha512-onOJ02pqs9h1iMJ1PQphR+VZv8qBMQ77Klcsqv9CNW2w6yLqoURLcgERAIurY6QE63bbLuqgP9ATqajFLK5AMQ== +"@esbuild/win32-ia32@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz" + integrity sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg== "@esbuild/win32-x64@0.20.2": version "0.20.2" resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz" integrity sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ== -"@esbuild/win32-x64@0.25.5": - version "0.25.5" - resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.5.tgz" - integrity sha512-TXv6YnJ8ZMVdX+SXWVBo/0p8LTcrUYngpWjvm91TMjjBQii7Oz11Lw5lbDV5Y0TzuhSJHwiH4hEtC1I42mMS0g== +"@esbuild/win32-x64@0.25.8": + version "0.25.8" + resolved "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz" + integrity sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.7.0": version "4.7.0" @@ -2579,28 +2262,21 @@ resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz" integrity sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== -"@eslint/config-array@^0.20.1": - version "0.20.1" - resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz" - integrity sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw== +"@eslint/config-array@^0.21.0": + version "0.21.0" + resolved "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz" + integrity sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ== dependencies: "@eslint/object-schema" "^2.1.6" debug "^4.3.1" minimatch "^3.1.2" -"@eslint/config-helpers@^0.2.1": - version "0.2.3" - resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz" - integrity sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg== - -"@eslint/core@^0.14.0": - version "0.14.0" - resolved "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz" - integrity sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg== - dependencies: - "@types/json-schema" "^7.0.15" - -"@eslint/core@^0.15.1": +"@eslint/config-helpers@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz" + integrity sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw== + +"@eslint/core@^0.15.0", "@eslint/core@^0.15.1": version "0.15.1" resolved "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz" integrity sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA== @@ -2622,10 +2298,10 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@9.29.0": - version "9.29.0" - resolved "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz" - integrity sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ== +"@eslint/js@9.31.0": + version "9.31.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz" + integrity sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw== "@eslint/object-schema@^2.1.6": version "2.1.6" @@ -2633,39 +2309,39 @@ integrity sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA== "@eslint/plugin-kit@^0.3.1": - version "0.3.3" - resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.3.tgz" - integrity sha512-1+WqvgNMhmlAambTvT3KPtCl/Ibr68VldY2XY40SL1CE0ZXiakFR/cbTspaF5HsnpDMvcYYoJHfl4980NBjGag== + version "0.3.4" + resolved "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz" + integrity sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw== dependencies: "@eslint/core" "^0.15.1" levn "^0.4.1" -"@floating-ui/core@^1.7.1": - version "1.7.1" - resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.1.tgz" - integrity sha512-azI0DrjMMfIug/ExbBaeDVJXcY0a7EPvPjb2xAJPa4HeimBX+Z18HK8QQR3jb6356SnDDdxx+hinMLcJEDdOjw== +"@floating-ui/core@^1.7.2": + version "1.7.2" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz" + integrity sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw== dependencies: - "@floating-ui/utils" "^0.2.9" + "@floating-ui/utils" "^0.2.10" -"@floating-ui/dom@^1.0.0", "@floating-ui/dom@^1.0.1", "@floating-ui/dom@^1.6.12": - version "1.7.1" - resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.1.tgz" - integrity sha512-cwsmW/zyw5ltYTUeeYJ60CnQuPqmGwuGVhG9w0PRaRKkAyi38BT5CKrpIbb+jtahSwUl04cWzSx9ZOIxeS6RsQ== +"@floating-ui/dom@^1.0.1", "@floating-ui/dom@^1.6.12", "@floating-ui/dom@^1.7.2": + version "1.7.2" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz" + integrity sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA== dependencies: - "@floating-ui/core" "^1.7.1" - "@floating-ui/utils" "^0.2.9" + "@floating-ui/core" "^1.7.2" + "@floating-ui/utils" "^0.2.10" "@floating-ui/react-dom@^2.0.0": - version "2.1.3" - resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.3.tgz" - integrity sha512-huMBfiU9UnQ2oBwIhgzyIiSpVgvlDstU8CX0AF+wS+KzmYMs0J2a3GwuFHV1Lz+jlrQGeC1fF+Nv0QoumyV0bA== + version "2.1.4" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.4.tgz" + integrity sha512-JbbpPhp38UmXDDAu60RJmbeme37Jbgsm7NrHGgzYYFKmblzRUh6Pa641dII6LsjwF4XlScDrde2UAzDo/b9KPw== dependencies: - "@floating-ui/dom" "^1.0.0" + "@floating-ui/dom" "^1.7.2" -"@floating-ui/utils@^0.2.9": - version "0.2.9" - resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.9.tgz" - integrity sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg== +"@floating-ui/utils@^0.2.10": + version "0.2.10" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz" + integrity sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ== "@google-cloud/precise-date@^4.0.0": version "4.0.0" @@ -2685,10 +2361,10 @@ resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz" integrity sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ== dependencies: - lodash.camelcase "^4.3.0" long "^5.0.0" - protobufjs "^7.2.5" yargs "^17.7.2" + protobufjs "^7.2.5" + lodash.camelcase "^4.3.0" "@hexagon/base64@^1.1.27": version "1.1.28" @@ -2712,8 +2388,8 @@ resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz" integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== dependencies: - "@humanfs/core" "^0.19.1" "@humanwhocodes/retry" "^0.3.0" + "@humanfs/core" "^0.19.1" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" @@ -2730,128 +2406,135 @@ resolved "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== -"@img/sharp-darwin-arm64@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.2.tgz" - integrity sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg== +"@img/sharp-darwin-arm64@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.3.tgz" + integrity sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg== optionalDependencies: - "@img/sharp-libvips-darwin-arm64" "1.1.0" + "@img/sharp-libvips-darwin-arm64" "1.2.0" -"@img/sharp-darwin-x64@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.2.tgz" - integrity sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g== +"@img/sharp-darwin-x64@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.3.tgz" + integrity sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA== optionalDependencies: - "@img/sharp-libvips-darwin-x64" "1.1.0" + "@img/sharp-libvips-darwin-x64" "1.2.0" -"@img/sharp-libvips-darwin-arm64@1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.1.0.tgz" - integrity sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA== +"@img/sharp-libvips-darwin-arm64@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.0.tgz" + integrity sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ== -"@img/sharp-libvips-darwin-x64@1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.1.0.tgz" - integrity sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ== +"@img/sharp-libvips-darwin-x64@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.0.tgz" + integrity sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg== -"@img/sharp-libvips-linux-arm@1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.1.0.tgz" - integrity sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA== +"@img/sharp-libvips-linux-arm@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.0.tgz" + integrity sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw== -"@img/sharp-libvips-linux-arm64@1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.1.0.tgz" - integrity sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew== +"@img/sharp-libvips-linux-arm64@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.0.tgz" + integrity sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA== -"@img/sharp-libvips-linux-ppc64@1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.1.0.tgz" - integrity sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ== +"@img/sharp-libvips-linux-ppc64@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.0.tgz" + integrity sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ== -"@img/sharp-libvips-linux-s390x@1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.1.0.tgz" - integrity sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA== +"@img/sharp-libvips-linux-s390x@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.0.tgz" + integrity sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw== -"@img/sharp-libvips-linux-x64@1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.1.0.tgz" - integrity sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q== +"@img/sharp-libvips-linux-x64@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.0.tgz" + integrity sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg== -"@img/sharp-libvips-linuxmusl-arm64@1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.1.0.tgz" - integrity sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w== +"@img/sharp-libvips-linuxmusl-arm64@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.0.tgz" + integrity sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q== -"@img/sharp-libvips-linuxmusl-x64@1.1.0": - version "1.1.0" - resolved "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.1.0.tgz" - integrity sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A== +"@img/sharp-libvips-linuxmusl-x64@1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.0.tgz" + integrity sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q== + +"@img/sharp-linux-arm@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.3.tgz" + integrity sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A== + optionalDependencies: + "@img/sharp-libvips-linux-arm" "1.2.0" -"@img/sharp-linux-arm@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.2.tgz" - integrity sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ== +"@img/sharp-linux-arm64@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.3.tgz" + integrity sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA== optionalDependencies: - "@img/sharp-libvips-linux-arm" "1.1.0" + "@img/sharp-libvips-linux-arm64" "1.2.0" -"@img/sharp-linux-arm64@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.2.tgz" - integrity sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q== +"@img/sharp-linux-ppc64@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.3.tgz" + integrity sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA== optionalDependencies: - "@img/sharp-libvips-linux-arm64" "1.1.0" + "@img/sharp-libvips-linux-ppc64" "1.2.0" -"@img/sharp-linux-s390x@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.2.tgz" - integrity sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw== +"@img/sharp-linux-s390x@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.3.tgz" + integrity sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ== optionalDependencies: - "@img/sharp-libvips-linux-s390x" "1.1.0" + "@img/sharp-libvips-linux-s390x" "1.2.0" -"@img/sharp-linux-x64@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.2.tgz" - integrity sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ== +"@img/sharp-linux-x64@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.3.tgz" + integrity sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ== optionalDependencies: - "@img/sharp-libvips-linux-x64" "1.1.0" + "@img/sharp-libvips-linux-x64" "1.2.0" -"@img/sharp-linuxmusl-arm64@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.2.tgz" - integrity sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA== +"@img/sharp-linuxmusl-arm64@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.3.tgz" + integrity sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ== optionalDependencies: - "@img/sharp-libvips-linuxmusl-arm64" "1.1.0" + "@img/sharp-libvips-linuxmusl-arm64" "1.2.0" -"@img/sharp-linuxmusl-x64@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.2.tgz" - integrity sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA== +"@img/sharp-linuxmusl-x64@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.3.tgz" + integrity sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ== optionalDependencies: - "@img/sharp-libvips-linuxmusl-x64" "1.1.0" + "@img/sharp-libvips-linuxmusl-x64" "1.2.0" -"@img/sharp-wasm32@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.2.tgz" - integrity sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ== +"@img/sharp-wasm32@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.3.tgz" + integrity sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg== dependencies: - "@emnapi/runtime" "^1.4.3" + "@emnapi/runtime" "^1.4.4" -"@img/sharp-win32-arm64@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.2.tgz" - integrity sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ== +"@img/sharp-win32-arm64@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.3.tgz" + integrity sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ== -"@img/sharp-win32-ia32@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.2.tgz" - integrity sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw== +"@img/sharp-win32-ia32@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.3.tgz" + integrity sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw== -"@img/sharp-win32-x64@0.34.2": - version "0.34.2" - resolved "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.2.tgz" - integrity sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw== +"@img/sharp-win32-x64@0.34.3": + version "0.34.3" + resolved "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.3.tgz" + integrity sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g== "@isaacs/balanced-match@^4.0.1": version "4.0.1" @@ -2889,13 +2572,12 @@ resolved "https://registry.npmjs.org/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz" integrity sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== -"@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.2", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.12" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz" + integrity sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/sourcemap-codec" "^1.5.0" "@jridgewell/trace-mapping" "^0.3.24" "@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": @@ -2903,15 +2585,10 @@ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - "@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14", "@jridgewell/sourcemap-codec@^1.4.15", "@jridgewell/sourcemap-codec@^1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + version "1.5.4" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz" + integrity sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -2921,10 +2598,10 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.29" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz" + integrity sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== dependencies: "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" @@ -2950,16 +2627,16 @@ integrity sha512-XGSsWDweP80Fks16lwkAUIr54ICyBs6PsI4mpfTLQaWgEJRtY9xEV+PeyDpJ+sJEGZxqINlpmAwe/6tS1pP8Ng== "@lottiefiles/dotlottie-react@^0.14.2": - version "0.14.2" - resolved "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.14.2.tgz" - integrity sha512-RR4r0HrKQbOAw6iS6C3mRARS2iu+yI+G1vICoUsRMHzlUUk1/26l3WyAjhcG+KoaGoKmORx8FgHjTNr4Sr/2Ug== + version "0.14.3" + resolved "https://registry.npmjs.org/@lottiefiles/dotlottie-react/-/dotlottie-react-0.14.3.tgz" + integrity sha512-O917vzFmacyC/F1NM2CLBsHqCMUBPiyI9Vw0o3ZohbZzRJYbgHPhdOpL83wE3zWs9VNr0JSbmJrkkUwaQizTWQ== dependencies: - "@lottiefiles/dotlottie-web" "0.47.0" + "@lottiefiles/dotlottie-web" "0.48.0" -"@lottiefiles/dotlottie-web@0.47.0": - version "0.47.0" - resolved "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.47.0.tgz" - integrity sha512-YN6wSB4iYZBYEAFKEs/taufrPH3rfNlUA632Ib61WoR58TALAJ1ZX8yDIGUBT28byMJhZR4+xdpRX4v7X8OeBQ== +"@lottiefiles/dotlottie-web@0.48.0": + version "0.48.0" + resolved "https://registry.npmjs.org/@lottiefiles/dotlottie-web/-/dotlottie-web-0.48.0.tgz" + integrity sha512-gcS6/3NYcpD2VUi2413wrZmdNLPbtwPaXqoFBqioLW/GsI/oTpTqmunsliRb4BL1ECLAUu0YOzHyK73UXMHrRg== "@mediapipe/tasks-vision@0.10.17": version "0.10.17" @@ -2967,14 +2644,14 @@ integrity sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg== "@mendable/firecrawl-js@^1.24.0": - version "1.27.0" - resolved "https://registry.npmjs.org/@mendable/firecrawl-js/-/firecrawl-js-1.27.0.tgz" - integrity sha512-Wm/9UTe1AjIeh/kwufXtoziL2JH0jQMcQ+HwsZkOiZCBPiCjykPNCneCQjfyem6aBC5n4j38ZrXSRvSl1owPeA== + version "1.29.1" + resolved "https://registry.npmjs.org/@mendable/firecrawl-js/-/firecrawl-js-1.29.1.tgz" + integrity sha512-w7mXja6hSNL6li7BHgY6LQLnBJ9RIxWkmZ16y2MCOr3w6MlR7k2ZcTxro6vEJrUoshhyoOqhcFCyD1P0ckBuRw== dependencies: - axios "^1.6.8" typescript-event-target "^1.1.1" zod "^3.23.8" zod-to-json-schema "^3.23.0" + axios "^1.6.8" "@monogrid/gainmap-js@^3.0.6": version "3.1.0" @@ -3026,22 +2703,17 @@ integrity sha512-G7oC4QsJrmLjAWQmvB7gY8hE0UMr8PofAY/pPsk/0sHIM1YWeealBI7RiPeN4UluArT7w+OoUvMQd+jtrTh9Lw== dependencies: axios "^1.7.9" - json-schema "0.4.0" type-fest "4.32.0" + json-schema "0.4.0" "@napi-rs/wasm-runtime@^0.2.11": - version "0.2.11" - resolved "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.11.tgz" - integrity sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA== + version "0.2.12" + resolved "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz" + integrity sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ== dependencies: "@emnapi/core" "^1.4.3" "@emnapi/runtime" "^1.4.3" - "@tybys/wasm-util" "^0.9.0" - -"@next/env@15.3.4": - version "15.3.4" - resolved "https://registry.npmjs.org/@next/env/-/env-15.3.4.tgz" - integrity sha512-ZkdYzBseS6UjYzz6ylVKPOK+//zLWvD6Ta+vpoye8cW11AjiQjGYVibF0xuvT4L0iJfAPfZLFidaEzAOywyOAQ== + "@tybys/wasm-util" "^0.10.0" "@next/env@15.4.0-canary.85": version "15.4.0-canary.85" @@ -3055,90 +2727,50 @@ dependencies: fast-glob "3.3.1" -"@next/swc-darwin-arm64@15.3.4": - version "15.3.4" - resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.3.4.tgz" - integrity sha512-z0qIYTONmPRbwHWvpyrFXJd5F9YWLCsw3Sjrzj2ZvMYy9NPQMPZ1NjOJh4ojr4oQzcGYwgJKfidzehaNa1BpEg== - "@next/swc-darwin-arm64@15.4.0-canary.85": version "15.4.0-canary.85" resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.4.0-canary.85.tgz" integrity sha512-za0E9RDk5mubKtCC9VgZccKdUa+jigtnHfpcxWz3YEq5KI7hq20SuV/64ige/pKoT5+ROV6sqO+5RFhPqWzpwA== -"@next/swc-darwin-x64@15.3.4": - version "15.3.4" - resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.3.4.tgz" - integrity sha512-Z0FYJM8lritw5Wq+vpHYuCIzIlEMjewG2aRkc3Hi2rcbULknYL/xqfpBL23jQnCSrDUGAo/AEv0Z+s2bff9Zkw== - "@next/swc-darwin-x64@15.4.0-canary.85": version "15.4.0-canary.85" resolved "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.4.0-canary.85.tgz" integrity sha512-YkRjaE0lSdppT4kCCyrEwMct0el/YvLRhceNhB5iHHacieEmVkU5IRHRpWL9b6VNM5tCuYj0lLohcmUTj2sDiw== -"@next/swc-linux-arm64-gnu@15.3.4": - version "15.3.4" - resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.3.4.tgz" - integrity sha512-l8ZQOCCg7adwmsnFm8m5q9eIPAHdaB2F3cxhufYtVo84pymwKuWfpYTKcUiFcutJdp9xGHC+F1Uq3xnFU1B/7g== - "@next/swc-linux-arm64-gnu@15.4.0-canary.85": version "15.4.0-canary.85" resolved "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.4.0-canary.85.tgz" integrity sha512-Mwoff9MQ78NL5zMXP/JOd/ArhLiC8zjN6dUp85Xx6lAiW/g0uzEjzAgrZga3K+07eSJjQ+7vGNdjVK3rl0odUA== -"@next/swc-linux-arm64-musl@15.3.4": - version "15.3.4" - resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.3.4.tgz" - integrity sha512-wFyZ7X470YJQtpKot4xCY3gpdn8lE9nTlldG07/kJYexCUpX1piX+MBfZdvulo+t1yADFVEuzFfVHfklfEx8kw== - "@next/swc-linux-arm64-musl@15.4.0-canary.85": version "15.4.0-canary.85" resolved "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.4.0-canary.85.tgz" integrity sha512-TXAVI+oVHCHkHwBYYlQLabGxHHylnIHDB+HvXy9hcrY/BozUF9jEjZb1x9HLMORzWM60mfWsALl1j1putN7lRA== -"@next/swc-linux-x64-gnu@15.3.4": - version "15.3.4" - resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.3.4.tgz" - integrity sha512-gEbH9rv9o7I12qPyvZNVTyP/PWKqOp8clvnoYZQiX800KkqsaJZuOXkWgMa7ANCCh/oEN2ZQheh3yH8/kWPSEg== - "@next/swc-linux-x64-gnu@15.4.0-canary.85": version "15.4.0-canary.85" resolved "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.4.0-canary.85.tgz" integrity sha512-lG8E8HFpabOMyZG+BFqijEoB/Pd5MowaVogXaPcjHbnncIoZytvCHT2ZUc83/y3Aly1xpre+dVAShOsGzwm7XA== -"@next/swc-linux-x64-musl@15.3.4": - version "15.3.4" - resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.3.4.tgz" - integrity sha512-Cf8sr0ufuC/nu/yQ76AnarbSAXcwG/wj+1xFPNbyNo8ltA6kw5d5YqO8kQuwVIxk13SBdtgXrNyom3ZosHAy4A== - "@next/swc-linux-x64-musl@15.4.0-canary.85": version "15.4.0-canary.85" resolved "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.4.0-canary.85.tgz" integrity sha512-4WALgXIS7oIw65OMoic4wEsiiVKYMh3nLcWAHuAks9kpoH1dIxF2B2ve58iXpqJIZ98xS7LfsMQoXqEK1aA6Eg== -"@next/swc-win32-arm64-msvc@15.3.4": - version "15.3.4" - resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.3.4.tgz" - integrity sha512-ay5+qADDN3rwRbRpEhTOreOn1OyJIXS60tg9WMYTWCy3fB6rGoyjLVxc4dR9PYjEdR2iDYsaF5h03NA+XuYPQQ== - "@next/swc-win32-arm64-msvc@15.4.0-canary.85": version "15.4.0-canary.85" resolved "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.4.0-canary.85.tgz" integrity sha512-DGgM++G920r3OHUU4X+HopxJZGGK+Gb+UWjDKepbxPtOTX64/XvAhoiA523a+eXm3ysi+kycuA0+jRlwrKEB/Q== -"@next/swc-win32-x64-msvc@15.3.4": - version "15.3.4" - resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.3.4.tgz" - integrity sha512-4kDt31Bc9DGyYs41FTL1/kNpDeHyha2TC0j5sRRoKCyrhNcfZ/nRQkAUlF27mETwm8QyHqIjHJitfcza2Iykfg== - "@next/swc-win32-x64-msvc@15.4.0-canary.85": version "15.4.0-canary.85" resolved "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.4.0-canary.85.tgz" integrity sha512-nYHH5JH347B9ZdcKRIi8xhUnum9bjMRLL3f2ozKp942U1yucQn9N67HGhWDXHW0dy2Hzx2Em+PhlWTHe2vztSQ== "@next/third-parties@^15.3.1": - version "15.3.4" - resolved "https://registry.npmjs.org/@next/third-parties/-/third-parties-15.3.4.tgz" - integrity sha512-jOvAsd0Yoq/eZ3/M+X/y/539/M6Up2xPE/aOr23CGXKinhfK2kscGP4uhtwlS0FZyHvU7ud9HTTt7G3D5G5BkA== + version "15.4.3" + resolved "https://registry.npmjs.org/@next/third-parties/-/third-parties-15.4.3.tgz" + integrity sha512-9eczO97h3CF4ihYi5gulJ7MjugFlRIMiPcCcbc/1DQ2H5Tv3dy1Gcfqbtsa4O4/6tRGE4R900XKzS7FC/A3WdQ== dependencies: third-party-capital "1.0.20" @@ -3147,7 +2779,7 @@ resolved "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.6.0.tgz" integrity sha512-mIbq/R9QXk5/cTfESb1OKtyFnk7oc1Om/8onA1158K9/OZUQFDEVy55jVTato+xmp3XX6F6Qh0zz0Nc1AxAlRQ== -"@noble/hashes@^1.6.1": +"@noble/hashes@^1.8.0": version "1.8.0" resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz" integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== @@ -3157,8 +2789,8 @@ resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" + "@nodelib/fs.stat" "2.0.5" "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" @@ -3170,8 +2802,8 @@ resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" + "@nodelib/fs.scandir" "2.1.5" "@nolyfill/is-core-module@1.0.39": version "1.0.39" @@ -3183,10 +2815,10 @@ resolved "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz" integrity sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== dependencies: + lru-cache "^10.0.1" agent-base "^7.1.0" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.1" - lru-cache "^10.0.1" socks-proxy-agent "^8.0.3" "@npmcli/agent@^3.0.0": @@ -3194,10 +2826,10 @@ resolved "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz" integrity sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q== dependencies: + lru-cache "^10.0.1" agent-base "^7.1.0" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.1" - lru-cache "^10.0.1" socks-proxy-agent "^8.0.3" "@npmcli/arborist@^7.3.1": @@ -3205,41 +2837,41 @@ resolved "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz" integrity sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g== dependencies: - "@isaacs/string-locale-compare" "^1.1.0" + nopt "^7.2.1" + ssri "^10.0.6" + pacote "^18.0.6" + proggy "^2.0.0" + semver "^7.3.7" + cacache "^18.0.3" + proc-log "^4.2.0" + bin-links "^4.0.4" + lru-cache "^10.2.2" + minimatch "^9.0.4" + treeverse "^3.0.0" "@npmcli/fs" "^3.1.1" - "@npmcli/installed-package-contents" "^2.1.0" - "@npmcli/map-workspaces" "^3.0.2" - "@npmcli/metavuln-calculator" "^7.1.1" - "@npmcli/name-from-folder" "^2.0.0" - "@npmcli/node-gyp" "^3.0.0" - "@npmcli/package-json" "^5.1.0" + walk-up-path "^3.0.1" "@npmcli/query" "^3.1.0" "@npmcli/redact" "^2.0.0" - "@npmcli/run-script" "^8.1.0" - bin-links "^4.0.4" - cacache "^18.0.3" - common-ancestor-path "^1.0.1" hosted-git-info "^7.0.2" - json-parse-even-better-errors "^3.0.2" - json-stringify-nice "^1.1.4" - lru-cache "^10.2.2" - minimatch "^9.0.4" - nopt "^7.2.1" - npm-install-checks "^6.2.0" npm-package-arg "^11.0.2" + "@npmcli/node-gyp" "^3.0.0" npm-pick-manifest "^9.0.1" + "@npmcli/run-script" "^8.1.0" + npm-install-checks "^6.2.0" npm-registry-fetch "^17.0.1" - pacote "^18.0.6" - parse-conflict-json "^3.0.0" - proc-log "^4.2.0" - proggy "^2.0.0" - promise-all-reject-late "^1.0.0" promise-call-limit "^3.0.1" + json-stringify-nice "^1.1.4" + parse-conflict-json "^3.0.0" + "@npmcli/package-json" "^5.1.0" + common-ancestor-path "^1.0.1" + "@npmcli/map-workspaces" "^3.0.2" read-package-json-fast "^3.0.2" - semver "^7.3.7" - ssri "^10.0.6" - treeverse "^3.0.0" - walk-up-path "^3.0.1" + promise-all-reject-late "^1.0.0" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/metavuln-calculator" "^7.1.1" + "@isaacs/string-locale-compare" "^1.1.0" + json-parse-even-better-errors "^3.0.2" + "@npmcli/installed-package-contents" "^2.1.0" "@npmcli/arborist@^8.0.1": version "8.0.1" @@ -3287,14 +2919,14 @@ resolved "https://registry.npmjs.org/@npmcli/config/-/config-9.0.0.tgz" integrity sha512-P5Vi16Y+c8E0prGIzX112ug7XxqfaPFUVW/oXAV+2VsxplKZEnJozqZ0xnK8V8w/SEsBf+TXhUihrEIAU4CA5Q== dependencies: - "@npmcli/map-workspaces" "^4.0.1" - "@npmcli/package-json" "^6.0.1" - ci-info "^4.0.0" ini "^5.0.0" nopt "^8.0.0" - proc-log "^5.0.0" semver "^7.3.5" + ci-info "^4.0.0" + proc-log "^5.0.0" walk-up-path "^3.0.1" + "@npmcli/package-json" "^6.0.1" + "@npmcli/map-workspaces" "^4.0.1" "@npmcli/fs@^3.1.0", "@npmcli/fs@^3.1.1": version "3.1.1" @@ -3315,29 +2947,29 @@ resolved "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz" integrity sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ== dependencies: - "@npmcli/promise-spawn" "^7.0.0" ini "^4.1.3" - lru-cache "^10.0.1" - npm-pick-manifest "^9.0.0" + which "^4.0.0" + semver "^7.3.5" proc-log "^4.0.0" - promise-inflight "^1.0.1" + lru-cache "^10.0.1" promise-retry "^2.0.1" - semver "^7.3.5" - which "^4.0.0" + promise-inflight "^1.0.1" + npm-pick-manifest "^9.0.0" + "@npmcli/promise-spawn" "^7.0.0" "@npmcli/git@^6.0.0", "@npmcli/git@^6.0.1": version "6.0.3" resolved "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz" integrity sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ== dependencies: - "@npmcli/promise-spawn" "^8.0.0" ini "^5.0.0" - lru-cache "^10.0.1" - npm-pick-manifest "^10.0.0" + which "^5.0.0" + semver "^7.3.5" proc-log "^5.0.0" + lru-cache "^10.0.1" promise-retry "^2.0.1" - semver "^7.3.5" - which "^5.0.0" + npm-pick-manifest "^10.0.0" + "@npmcli/promise-spawn" "^8.0.0" "@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.1.0": version "2.1.0" @@ -3360,42 +2992,42 @@ resolved "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz" integrity sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA== dependencies: - "@npmcli/name-from-folder" "^2.0.0" glob "^10.2.2" minimatch "^9.0.0" read-package-json-fast "^3.0.0" + "@npmcli/name-from-folder" "^2.0.0" "@npmcli/map-workspaces@^4.0.1", "@npmcli/map-workspaces@^4.0.2": version "4.0.2" resolved "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-4.0.2.tgz" integrity sha512-mnuMuibEbkaBTYj9HQ3dMe6L0ylYW+s/gfz7tBDMFY/la0w9Kf44P9aLn4/+/t3aTR3YUHKoT6XQL9rlicIe3Q== dependencies: - "@npmcli/name-from-folder" "^3.0.0" - "@npmcli/package-json" "^6.0.0" glob "^10.2.2" minimatch "^9.0.0" + "@npmcli/package-json" "^6.0.0" + "@npmcli/name-from-folder" "^3.0.0" "@npmcli/metavuln-calculator@^7.1.1": version "7.1.1" resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz" integrity sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g== dependencies: - cacache "^18.0.0" - json-parse-even-better-errors "^3.0.0" pacote "^18.0.0" - proc-log "^4.1.0" semver "^7.3.5" + cacache "^18.0.0" + proc-log "^4.1.0" + json-parse-even-better-errors "^3.0.0" "@npmcli/metavuln-calculator@^8.0.0": version "8.0.1" resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-8.0.1.tgz" integrity sha512-WXlJx9cz3CfHSt9W9Opi1PTFc4WZLFomm5O8wekxQZmkyljrBRwATwDxfC9iOXJwYVmfiW1C1dUe0W2aN0UrSg== dependencies: - cacache "^19.0.0" - json-parse-even-better-errors "^4.0.0" pacote "^20.0.0" - proc-log "^5.0.0" semver "^7.3.5" + cacache "^19.0.0" + proc-log "^5.0.0" + json-parse-even-better-errors "^4.0.0" "@npmcli/name-from-folder@^2.0.0": version "2.0.0" @@ -3422,13 +3054,13 @@ resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz" integrity sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ== dependencies: - "@npmcli/git" "^5.0.0" glob "^10.2.2" + semver "^7.5.3" + proc-log "^4.0.0" + "@npmcli/git" "^5.0.0" hosted-git-info "^7.0.0" - json-parse-even-better-errors "^3.0.0" normalize-package-data "^6.0.0" - proc-log "^4.0.0" - semver "^7.5.3" + json-parse-even-better-errors "^3.0.0" "@npmcli/package-json@^6.0.0", "@npmcli/package-json@^6.0.1", "@npmcli/package-json@^6.2.0": version "6.2.0" @@ -3486,24 +3118,24 @@ resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz" integrity sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg== dependencies: + which "^4.0.0" + node-gyp "^10.0.0" + proc-log "^4.0.0" "@npmcli/node-gyp" "^3.0.0" "@npmcli/package-json" "^5.0.0" "@npmcli/promise-spawn" "^7.0.0" - node-gyp "^10.0.0" - proc-log "^4.0.0" - which "^4.0.0" "@npmcli/run-script@^9.0.0", "@npmcli/run-script@^9.0.1", "@npmcli/run-script@^9.1.0": version "9.1.0" resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz" integrity sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg== dependencies: + which "^5.0.0" + node-gyp "^11.0.0" + proc-log "^5.0.0" "@npmcli/node-gyp" "^4.0.0" "@npmcli/package-json" "^6.0.0" "@npmcli/promise-spawn" "^8.0.0" - node-gyp "^11.0.0" - proc-log "^5.0.0" - which "^5.0.0" "@number-flow/react@^0.5.9": version "0.5.10" @@ -3519,17 +3151,17 @@ integrity sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w== "@octokit/core@>=6", "@octokit/core@>=7", "@octokit/core@^7.0.0": - version "7.0.2" - resolved "https://registry.npmjs.org/@octokit/core/-/core-7.0.2.tgz" - integrity sha512-ODsoD39Lq6vR6aBgvjTnA3nZGliknKboc9Gtxr7E4WDNqY24MxANKcuDQSF0jzapvGb3KWOEDrKfve4HoWGK+g== + version "7.0.3" + resolved "https://registry.npmjs.org/@octokit/core/-/core-7.0.3.tgz" + integrity sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ== dependencies: - "@octokit/auth-token" "^6.0.0" + "@octokit/types" "^14.0.0" "@octokit/graphql" "^9.0.1" "@octokit/request" "^10.0.2" - "@octokit/request-error" "^7.0.0" - "@octokit/types" "^14.0.0" before-after-hook "^4.0.0" + "@octokit/auth-token" "^6.0.0" universal-user-agent "^7.0.0" + "@octokit/request-error" "^7.0.0" "@octokit/endpoint@^11.0.0": version "11.0.0" @@ -3554,9 +3186,9 @@ integrity sha512-idsIggNXUKkk0+BExUn1dQ92sfysJrje03Q0bv0e+KPLrvyqZF8MnBpFz8UNfYDwB3Ie7Z0TByjWfzxt7vseaA== "@octokit/plugin-paginate-rest@^13.0.0": - version "13.1.0" - resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.1.0.tgz" - integrity sha512-16iNOa4rTTjaWtfsPGJcYYL79FJakseX8TQFIPfVuSPC3s5nkS/DSNQPFPc5lJHgEDBWNMxSApHrEymNblhA9w== + version "13.1.1" + resolved "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-13.1.1.tgz" + integrity sha512-q9iQGlZlxAVNRN2jDNskJW/Cafy7/XE52wjZ5TTvyhyOD904Cvx//DNyoO3J/MXJ0ve3rPoNWKEg5iZrisQSuw== dependencies: "@octokit/types" "^14.1.0" @@ -3582,11 +3214,11 @@ resolved "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz" integrity sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA== dependencies: + "@octokit/types" "^14.0.0" "@octokit/endpoint" "^11.0.0" + universal-user-agent "^7.0.2" "@octokit/request-error" "^7.0.0" - "@octokit/types" "^14.0.0" fast-content-type-parse "^3.0.0" - universal-user-agent "^7.0.2" "@octokit/request-error@^7.0.0": version "7.0.0" @@ -3602,7 +3234,7 @@ dependencies: "@octokit/openapi-types" "^25.1.0" -"@opentelemetry/api@1.9.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0", "@opentelemetry/api@>=1.4.0 <1.10.0", "@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.0.1", "@opentelemetry/api@^1.1.0", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.8", "@opentelemetry/api@^1.9": +"@opentelemetry/api@1.9.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0", "@opentelemetry/api@>=1.4.0 <1.10.0", "@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.0.1", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.8", "@opentelemetry/api@^1.9": version "1.9.0" resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== @@ -3657,11 +3289,11 @@ resolved "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.52.1.tgz" integrity sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA== dependencies: - "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/sdk-logs" "0.52.1" + "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/exporter-trace-otlp-grpc@0.52.1": version "0.52.1" @@ -3670,10 +3302,10 @@ dependencies: "@grpc/grpc-js" "^1.7.1" "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-grpc-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" + "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/otlp-grpc-exporter-base" "0.52.1" "@opentelemetry/exporter-trace-otlp-http@0.52.1": version "0.52.1" @@ -3681,10 +3313,10 @@ integrity sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg== dependencies: "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" + "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/exporter-trace-otlp-proto@0.52.1": version "0.52.1" @@ -3692,10 +3324,10 @@ integrity sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ== dependencies: "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" + "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/exporter-zipkin@1.25.1": version "1.25.1" @@ -3722,36 +3354,36 @@ resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz" integrity sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw== dependencies: - "@opentelemetry/api-logs" "0.52.1" + semver "^7.5.2" + shimmer "^1.2.1" "@types/shimmer" "^1.0.2" import-in-the-middle "^1.8.1" require-in-the-middle "^7.1.1" - semver "^7.5.2" - shimmer "^1.2.1" + "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/instrumentation@0.55.0", "@opentelemetry/instrumentation@^0.55": version "0.55.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz" integrity sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ== dependencies: - "@opentelemetry/api-logs" "0.55.0" + semver "^7.5.2" + shimmer "^1.2.1" "@types/shimmer" "^1.2.0" import-in-the-middle "^1.8.1" require-in-the-middle "^7.1.1" - semver "^7.5.2" - shimmer "^1.2.1" + "@opentelemetry/api-logs" "0.55.0" "@opentelemetry/instrumentation@^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0": version "0.57.2" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz" integrity sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg== dependencies: - "@opentelemetry/api-logs" "0.57.2" + semver "^7.5.2" + shimmer "^1.2.1" "@types/shimmer" "^1.2.0" import-in-the-middle "^1.8.1" require-in-the-middle "^7.1.1" - semver "^7.5.2" - shimmer "^1.2.1" + "@opentelemetry/api-logs" "0.57.2" "@opentelemetry/instrumentation-grpc@^0.55": version "0.55.0" @@ -3776,21 +3408,21 @@ dependencies: "@grpc/grpc-js" "^1.7.1" "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/otlp-transformer@0.52.1": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz" integrity sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg== dependencies: - "@opentelemetry/api-logs" "0.52.1" + protobufjs "^7.3.0" "@opentelemetry/core" "1.25.1" - "@opentelemetry/resources" "1.25.1" + "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/sdk-logs" "0.52.1" + "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-metrics" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" - protobufjs "^7.3.0" "@opentelemetry/propagator-b3@1.25.1": version "1.25.1" @@ -3841,8 +3473,8 @@ resolved "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz" integrity sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA== dependencies: - "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/core" "1.25.1" + "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-metrics@1.25.1": @@ -3850,28 +3482,28 @@ resolved "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz" integrity sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q== dependencies: + lodash.merge "^4.6.2" "@opentelemetry/core" "1.25.1" "@opentelemetry/resources" "1.25.1" - lodash.merge "^4.6.2" "@opentelemetry/sdk-node@0.52.1": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz" integrity sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA== dependencies: - "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/core" "1.25.1" - "@opentelemetry/exporter-trace-otlp-grpc" "0.52.1" - "@opentelemetry/exporter-trace-otlp-http" "0.52.1" - "@opentelemetry/exporter-trace-otlp-proto" "0.52.1" - "@opentelemetry/exporter-zipkin" "1.25.1" - "@opentelemetry/instrumentation" "0.52.1" - "@opentelemetry/resources" "1.25.1" + "@opentelemetry/api-logs" "0.52.1" "@opentelemetry/sdk-logs" "0.52.1" + "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-metrics" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" "@opentelemetry/sdk-trace-node" "1.25.1" + "@opentelemetry/exporter-zipkin" "1.25.1" + "@opentelemetry/instrumentation" "0.52.1" "@opentelemetry/semantic-conventions" "1.25.1" + "@opentelemetry/exporter-trace-otlp-grpc" "0.52.1" + "@opentelemetry/exporter-trace-otlp-http" "0.52.1" + "@opentelemetry/exporter-trace-otlp-proto" "0.52.1" "@opentelemetry/sdk-trace-base@1.25.1": version "1.25.1" @@ -3896,24 +3528,24 @@ resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz" integrity sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ== dependencies: - "@opentelemetry/context-async-hooks" "1.25.1" + semver "^7.5.2" "@opentelemetry/core" "1.25.1" "@opentelemetry/propagator-b3" "1.25.1" - "@opentelemetry/propagator-jaeger" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" - semver "^7.5.2" + "@opentelemetry/propagator-jaeger" "1.25.1" + "@opentelemetry/context-async-hooks" "1.25.1" "@opentelemetry/sdk-trace-node@^1.28": version "1.30.1" resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.30.1.tgz" integrity sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ== dependencies: - "@opentelemetry/context-async-hooks" "1.30.1" + semver "^7.5.2" "@opentelemetry/core" "1.30.1" "@opentelemetry/propagator-b3" "1.30.1" - "@opentelemetry/propagator-jaeger" "1.30.1" "@opentelemetry/sdk-trace-base" "1.30.1" - semver "^7.5.2" + "@opentelemetry/propagator-jaeger" "1.30.1" + "@opentelemetry/context-async-hooks" "1.30.1" "@opentelemetry/semantic-conventions@1.25.1": version "1.25.1" @@ -3934,25 +3566,25 @@ version "2.5.1" resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz" integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== - optionalDependencies: - "@parcel/watcher-android-arm64" "2.5.1" - "@parcel/watcher-darwin-arm64" "2.5.1" - "@parcel/watcher-darwin-x64" "2.5.1" - "@parcel/watcher-freebsd-x64" "2.5.1" - "@parcel/watcher-linux-arm-glibc" "2.5.1" - "@parcel/watcher-linux-arm-musl" "2.5.1" - "@parcel/watcher-linux-arm64-glibc" "2.5.1" - "@parcel/watcher-linux-arm64-musl" "2.5.1" - "@parcel/watcher-linux-x64-glibc" "2.5.1" - "@parcel/watcher-linux-x64-musl" "2.5.1" - "@parcel/watcher-win32-arm64" "2.5.1" - "@parcel/watcher-win32-ia32" "2.5.1" - "@parcel/watcher-win32-x64" "2.5.1" dependencies: detect-libc "^1.0.3" is-glob "^4.0.3" micromatch "^4.0.5" node-addon-api "^7.0.0" + optionalDependencies: + "@parcel/watcher-darwin-x64" "2.5.1" + "@parcel/watcher-darwin-arm64" "2.5.1" + "@parcel/watcher-win32-x64" "2.5.1" + "@parcel/watcher-win32-arm64" "2.5.1" + "@parcel/watcher-win32-ia32" "2.5.1" + "@parcel/watcher-linux-x64-glibc" "2.5.1" + "@parcel/watcher-linux-x64-musl" "2.5.1" + "@parcel/watcher-linux-arm64-glibc" "2.5.1" + "@parcel/watcher-linux-arm64-musl" "2.5.1" + "@parcel/watcher-linux-arm-glibc" "2.5.1" + "@parcel/watcher-linux-arm-musl" "2.5.1" + "@parcel/watcher-android-arm64" "2.5.1" + "@parcel/watcher-freebsd-x64" "2.5.1" "@parcel/watcher-android-arm64@2.5.1": version "2.5.1" @@ -4020,50 +3652,50 @@ integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== "@peculiar/asn1-android@^2.3.10": - version "2.3.16" - resolved "https://registry.npmjs.org/@peculiar/asn1-android/-/asn1-android-2.3.16.tgz" - integrity sha512-a1viIv3bIahXNssrOIkXZIlI2ePpZaNmR30d4aBL99mu2rO+mT9D6zBsp7H6eROWGtmwv0Ionp5olJurIo09dw== + version "2.4.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-android/-/asn1-android-2.4.0.tgz" + integrity sha512-YFueREq97CLslZZBI8dKzis7jMfEHSLxM+nr0Zdx1POiXFLjqqwoY5s0F1UimdBiEw/iKlHey2m56MRDv7Jtyg== dependencies: - "@peculiar/asn1-schema" "^2.3.15" - asn1js "^3.0.5" + "@peculiar/asn1-schema" "^2.4.0" + asn1js "^3.0.6" tslib "^2.8.1" "@peculiar/asn1-ecc@^2.3.8": - version "2.3.15" - resolved "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.3.15.tgz" - integrity sha512-/HtR91dvgog7z/WhCVdxZJ/jitJuIu8iTqiyWVgRE9Ac5imt2sT/E4obqIVGKQw7PIy+X6i8lVBoT6wC73XUgA== + version "2.4.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.4.0.tgz" + integrity sha512-fJiYUBCJBDkjh347zZe5H81BdJ0+OGIg0X9z06v8xXUoql3MFeENUX0JsjCaVaU9A0L85PefLPGYkIoGpTnXLQ== dependencies: - "@peculiar/asn1-schema" "^2.3.15" - "@peculiar/asn1-x509" "^2.3.15" - asn1js "^3.0.5" + "@peculiar/asn1-schema" "^2.4.0" + "@peculiar/asn1-x509" "^2.4.0" + asn1js "^3.0.6" tslib "^2.8.1" "@peculiar/asn1-rsa@^2.3.8": - version "2.3.15" - resolved "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.3.15.tgz" - integrity sha512-p6hsanvPhexRtYSOHihLvUUgrJ8y0FtOM97N5UEpC+VifFYyZa0iZ5cXjTkZoDwxJ/TTJ1IJo3HVTB2JJTpXvg== + version "2.4.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.4.0.tgz" + integrity sha512-6PP75voaEnOSlWR9sD25iCQyLgFZHXbmxvUfnnDcfL6Zh5h2iHW38+bve4LfH7a60x7fkhZZNmiYqAlAff9Img== dependencies: - "@peculiar/asn1-schema" "^2.3.15" - "@peculiar/asn1-x509" "^2.3.15" - asn1js "^3.0.5" + "@peculiar/asn1-schema" "^2.4.0" + "@peculiar/asn1-x509" "^2.4.0" + asn1js "^3.0.6" tslib "^2.8.1" -"@peculiar/asn1-schema@^2.3.15", "@peculiar/asn1-schema@^2.3.8": - version "2.3.15" - resolved "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.3.15.tgz" - integrity sha512-QPeD8UA8axQREpgR5UTAfu2mqQmm97oUqahDtNdBcfj3qAnoXzFdQW+aNf/tD2WVXF8Fhmftxoj0eMIT++gX2w== +"@peculiar/asn1-schema@^2.3.8", "@peculiar/asn1-schema@^2.4.0": + version "2.4.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.4.0.tgz" + integrity sha512-umbembjIWOrPSOzEGG5vxFLkeM8kzIhLkgigtsOrfLKnuzxWxejAcUX+q/SoZCdemlODOcr5WiYa7+dIEzBXZQ== dependencies: - asn1js "^3.0.5" + asn1js "^3.0.6" pvtsutils "^1.3.6" tslib "^2.8.1" -"@peculiar/asn1-x509@^2.3.15", "@peculiar/asn1-x509@^2.3.8": - version "2.3.15" - resolved "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.3.15.tgz" - integrity sha512-0dK5xqTqSLaxv1FHXIcd4Q/BZNuopg+u1l23hT9rOmQ1g4dNtw0g/RnEi+TboB0gOwGtrWn269v27cMgchFIIg== +"@peculiar/asn1-x509@^2.3.8", "@peculiar/asn1-x509@^2.4.0": + version "2.4.0" + resolved "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.4.0.tgz" + integrity sha512-F7mIZY2Eao2TaoVqigGMLv+NDdpwuBKU1fucHPONfzaBS4JXXCNCmfO0Z3dsy7JzKGqtDcYC1mr9JjaZQZNiuw== dependencies: - "@peculiar/asn1-schema" "^2.3.15" - asn1js "^3.0.5" + "@peculiar/asn1-schema" "^2.4.0" + asn1js "^3.0.6" pvtsutils "^1.3.6" tslib "^2.8.1" @@ -4072,29 +3704,29 @@ resolved "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz" integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== -"@playwright/experimental-ct-core@1.53.1": - version "1.53.1" - resolved "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.53.1.tgz" - integrity sha512-3edf/JF1Fnziq+++XJpH20nbU26yQfGBDT2KfTlYoPdEcVWBf3JIHfRNKsF9KXIFmrzYsBtFnJ/Tkzm7dWLzeA== +"@playwright/experimental-ct-core@1.54.1": + version "1.54.1" + resolved "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.54.1.tgz" + integrity sha512-iwFdf95m9RCze47jv4hVbg3tDtsh3GFU1StiLludrPStHlZOtDj9/0GImTKrRmXHQCDcQRmQ9HZfJuGGxlWM3g== dependencies: - playwright "1.53.1" - playwright-core "1.53.1" vite "^6.3.4" + playwright "1.54.1" + playwright-core "1.54.1" "@playwright/experimental-ct-react@^1.53.1": - version "1.53.1" - resolved "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.53.1.tgz" - integrity sha512-4u0JLdIVDRIynkhP1KkfqTAjG5FoQ/w7s1KqgViuVoWzlCqYVtwBchxl6Le9g3T25a+vXWgFhWO35ddL3BeVLQ== + version "1.54.1" + resolved "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.54.1.tgz" + integrity sha512-hqa/JhMK3qUqwqx8jm0/RJ3lbpGojA3f7UBhp3clFy8hnzMVu0SDba3JemWikS+JhiqYHjxL6Bn6dGxyikCImA== dependencies: - "@playwright/experimental-ct-core" "1.53.1" "@vitejs/plugin-react" "^4.2.1" + "@playwright/experimental-ct-core" "1.54.1" -"@playwright/test@^1.41.2", "@playwright/test@^1.51.1", "@playwright/test@^1.53.1": - version "1.53.1" - resolved "https://registry.npmjs.org/@playwright/test/-/test-1.53.1.tgz" - integrity sha512-Z4c23LHV0muZ8hfv4jw6HngPJkbbtZxTkxPNIg7cJcTc9C28N/p2q7g3JZS2SiKBBHJ3uM1dgDye66bB7LEk5w== +"@playwright/test@^1.53.1": + version "1.54.1" + resolved "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz" + integrity sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw== dependencies: - playwright "1.53.1" + playwright "1.54.1" "@pnpm/config.env-replace@^1.1.0": version "1.1.0" @@ -4113,9 +3745,9 @@ resolved "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz" integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== dependencies: - "@pnpm/config.env-replace" "^1.1.0" - "@pnpm/network.ca-file" "^1.0.1" config-chain "^1.1.11" + "@pnpm/network.ca-file" "^1.0.1" + "@pnpm/config.env-replace" "^1.1.0" "@polka/url@^1.0.0-next.24": version "1.0.0-next.29" @@ -4132,18 +3764,18 @@ resolved "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-6.10.1.tgz" integrity sha512-4Kpz5EV1jEOsKDuKYMjfJKMiIIcsuR9Ou1B8zLzehYtB7/oi+1ooDoK1K+T7sMisHkP69aYat5j0dskxvJTgdQ== dependencies: - "@prisma/driver-adapter-utils" "6.10.1" postgres-array "3.0.4" + "@prisma/driver-adapter-utils" "6.10.1" "@prisma/client@6.9.0": version "6.9.0" resolved "https://registry.npmjs.org/@prisma/client/-/client-6.9.0.tgz" integrity sha512-Gg7j1hwy3SgF1KHrh0PZsYvAaykeR0PaxusnLXydehS96voYCGt1U5zVR31NIouYc63hWzidcrir1a7AIyCsNQ== -"@prisma/config@6.10.1": - version "6.10.1" - resolved "https://registry.npmjs.org/@prisma/config/-/config-6.10.1.tgz" - integrity sha512-kz4/bnqrOrzWo8KzYguN0cden4CzLJJ+2VSpKtF8utHS3l1JS0Lhv6BLwpOX6X9yNreTbZQZwewb+/BMPDCIYQ== +"@prisma/config@6.12.0": + version "6.12.0" + resolved "https://registry.npmjs.org/@prisma/config/-/config-6.12.0.tgz" + integrity sha512-HovZWzhWEMedHxmjefQBRZa40P81N7/+74khKFz9e1AFjakcIQdXgMWKgt20HaACzY+d1LRBC+L4tiz71t9fkg== dependencies: jiti "2.4.2" @@ -4152,6 +3784,11 @@ resolved "https://registry.npmjs.org/@prisma/debug/-/debug-6.10.1.tgz" integrity sha512-k2YT53cWxv9OLjW4zSYTZ6Z7j0gPfCzcr2Mj99qsuvlxr8WAKSZ2NcSR0zLf/mP4oxnYG842IMj3utTgcd7CaA== +"@prisma/debug@6.12.0": + version "6.12.0" + resolved "https://registry.npmjs.org/@prisma/debug/-/debug-6.12.0.tgz" + integrity sha512-plbz6z72orcqr0eeio7zgUrZj5EudZUpAeWkFTA/DDdXEj28YHDXuiakvR6S7sD6tZi+jiwQEJAPeV6J6m/tEQ== + "@prisma/driver-adapter-utils@6.10.1": version "6.10.1" resolved "https://registry.npmjs.org/@prisma/driver-adapter-utils/-/driver-adapter-utils-6.10.1.tgz" @@ -4159,36 +3796,36 @@ dependencies: "@prisma/debug" "6.10.1" -"@prisma/engines@6.10.1": - version "6.10.1" - resolved "https://registry.npmjs.org/@prisma/engines/-/engines-6.10.1.tgz" - integrity sha512-Q07P5rS2iPwk2IQr/rUQJ42tHjpPyFcbiH7PXZlV81Ryr9NYIgdxcUrwgVOWVm5T7ap02C0dNd1dpnNcSWig8A== +"@prisma/engines@6.12.0": + version "6.12.0" + resolved "https://registry.npmjs.org/@prisma/engines/-/engines-6.12.0.tgz" + integrity sha512-4BRZZUaAuB4p0XhTauxelvFs7IllhPmNLvmla0bO1nkECs8n/o1pUvAVbQ/VOrZR5DnF4HED0PrGai+rIOVePA== dependencies: - "@prisma/debug" "6.10.1" - "@prisma/engines-version" "6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c" - "@prisma/fetch-engine" "6.10.1" - "@prisma/get-platform" "6.10.1" + "@prisma/debug" "6.12.0" + "@prisma/fetch-engine" "6.12.0" + "@prisma/get-platform" "6.12.0" + "@prisma/engines-version" "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc" -"@prisma/engines-version@6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c": - version "6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c" - resolved "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c.tgz" - integrity sha512-ZJFTsEqapiTYVzXya6TUKYDFnSWCNegfUiG5ik9fleQva5Sk3DNyyUi7X1+0ZxWFHwHDr6BZV5Vm+iwP+LlciA== +"@prisma/engines-version@6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc": + version "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc" + resolved "https://registry.npmjs.org/@prisma/engines-version/-/engines-version-6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc.tgz" + integrity sha512-70vhecxBJlRr06VfahDzk9ow4k1HIaSfVUT3X0/kZoHCMl9zbabut4gEXAyzJZxaCGi5igAA7SyyfBI//mmkbQ== -"@prisma/fetch-engine@6.10.1": - version "6.10.1" - resolved "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.10.1.tgz" - integrity sha512-clmbG/Jgmrc/n6Y77QcBmAUlq9LrwI9Dbgy4pq5jeEARBpRCWJDJ7PWW1P8p0LfFU0i5fsyO7FqRzRB8mkdS4g== +"@prisma/fetch-engine@6.12.0": + version "6.12.0" + resolved "https://registry.npmjs.org/@prisma/fetch-engine/-/fetch-engine-6.12.0.tgz" + integrity sha512-EamoiwrK46rpWaEbLX9aqKDPOd8IyLnZAkiYXFNuq0YsU0Z8K09/rH8S7feOWAVJ3xzeSgcEJtBlVDrajM9Sag== dependencies: - "@prisma/debug" "6.10.1" - "@prisma/engines-version" "6.10.1-1.9b628578b3b7cae625e8c927178f15a170e74a9c" - "@prisma/get-platform" "6.10.1" + "@prisma/debug" "6.12.0" + "@prisma/get-platform" "6.12.0" + "@prisma/engines-version" "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc" -"@prisma/get-platform@6.10.1": - version "6.10.1" - resolved "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.10.1.tgz" - integrity sha512-4CY5ndKylcsce9Mv+VWp5obbR2/86SHOLVV053pwIkhVtT9C9A83yqiqI/5kJM9T1v1u1qco/bYjDKycmei9HA== +"@prisma/get-platform@6.12.0": + version "6.12.0" + resolved "https://registry.npmjs.org/@prisma/get-platform/-/get-platform-6.12.0.tgz" + integrity sha512-nRerTGhTlgyvcBlyWgt8OLNIV7QgJS2XYXMJD1hysorMCuLAjuDDuoxmVt7C2nLxbuxbWPp7OuFRHC23HqD9dA== dependencies: - "@prisma/debug" "6.10.1" + "@prisma/debug" "6.12.0" "@prisma/instrumentation@6.6.0": version "6.6.0" @@ -4255,22 +3892,22 @@ resolved "https://registry.npmjs.org/@pulumi/aws/-/aws-6.83.0.tgz" integrity sha512-uYpYSA5aaDERFuxy3D+FDWiwH7YYNHSwGLpHVuARAzBfQ/SQDkS/tfJI5NNo7/+KCmje3rloKE2enUK/Q9bVBg== dependencies: - "@pulumi/pulumi" "^3.142.0" mime "^2.0.0" + "@pulumi/pulumi" "^3.142.0" "@pulumi/awsx@^2.22.0": version "2.22.0" resolved "https://registry.npmjs.org/@pulumi/awsx/-/awsx-2.22.0.tgz" integrity sha512-uajrWX6zkk8G9DCCkCkRaH2yzeGRkCElkC8FOE9viUtb9WyVt01EbNqJkje+QwYq4g055jWqcq2YRn7xT1Y44w== dependencies: - "@aws-sdk/client-ecs" "^3.405.0" + mime "^2.0.0" "@pulumi/aws" "^6.66.3" "@pulumi/docker" "^4.6.0" - "@pulumi/docker-build" "^0.0.8" "@pulumi/pulumi" "^3.142.0" - "@types/aws-lambda" "^8.10.23" docker-classic "npm:@pulumi/docker@3.6.1" - mime "^2.0.0" + "@types/aws-lambda" "^8.10.23" + "@aws-sdk/client-ecs" "^3.405.0" + "@pulumi/docker-build" "^0.0.8" "@pulumi/command@^1.1.0": version "1.1.0" @@ -4284,16 +3921,16 @@ resolved "https://registry.npmjs.org/@pulumi/docker/-/docker-3.6.1.tgz" integrity sha512-BZME50QkT556v+LvmTXPT8ssB2xxNkp9+msB5xYFEnUnWcdGAx5yUysQw70RJCb+U0GbkJSbxtlgMJgOQf/now== dependencies: - "@pulumi/pulumi" "^3.0.0" semver "^5.4.0" + "@pulumi/pulumi" "^3.0.0" "@pulumi/docker@^4.6.0": version "4.8.0" resolved "https://registry.npmjs.org/@pulumi/docker/-/docker-4.8.0.tgz" integrity sha512-R1jDAokbz71VbljF6TJ4yNA4Tp1Gd+ISgIQmrcsUf/gNCP1hoA7putyTIta5q0zzy83aPeeeySYwx54iOfHrvQ== dependencies: - "@pulumi/pulumi" "^3.142.0" semver "^5.4.0" + "@pulumi/pulumi" "^3.142.0" "@pulumi/docker-build@^0.0.8": version "0.0.8" @@ -4314,34 +3951,34 @@ resolved "https://registry.npmjs.org/@pulumi/pulumi/-/pulumi-3.185.0.tgz" integrity sha512-J8Ha8EDxw503hMmVu1i+qd7atQRJkB6VD0En5ibUgm+B4453AfWclGTHoFcz/QLCneYRQhH+SUS2zy1+sqggdw== dependencies: - "@grpc/grpc-js" "^1.10.1" - "@logdna/tail-file" "^2.0.6" - "@npmcli/arborist" "^7.3.1" - "@opentelemetry/api" "^1.9" - "@opentelemetry/exporter-zipkin" "^1.28" - "@opentelemetry/instrumentation" "^0.55" - "@opentelemetry/instrumentation-grpc" "^0.55" - "@opentelemetry/resources" "^1.28" - "@opentelemetry/sdk-trace-base" "^1.28" - "@opentelemetry/sdk-trace-node" "^1.28" - "@types/google-protobuf" "^3.15.5" - "@types/semver" "^7.5.6" - "@types/tmp" "^0.2.6" - execa "^5.1.0" - fdir "^6.1.1" - google-protobuf "^3.5.0" got "^11.8.6" ini "^2.0.0" + tmp "^0.2.1" + fdir "^6.1.1" + execa "^5.1.0" + upath "^1.1.0" + semver "^7.5.2" js-yaml "^3.14.0" + pkg-dir "^7.0.0" minimist "^1.2.6" - normalize-package-data "^6.0.0" picomatch "^3.0.1" - pkg-dir "^7.0.0" - require-from-string "^2.0.1" - semver "^7.5.2" + "@types/tmp" "^0.2.6" + "@grpc/grpc-js" "^1.10.1" + "@types/semver" "^7.5.6" + google-protobuf "^3.5.0" + "@npmcli/arborist" "^7.3.1" + "@logdna/tail-file" "^2.0.6" + "@opentelemetry/api" "^1.9" source-map-support "^0.5.6" - tmp "^0.2.1" - upath "^1.1.0" + require-from-string "^2.0.1" + "@types/google-protobuf" "^3.15.5" + normalize-package-data "^6.0.0" + "@opentelemetry/resources" "^1.28" + "@opentelemetry/sdk-trace-base" "^1.28" + "@opentelemetry/sdk-trace-node" "^1.28" + "@opentelemetry/exporter-zipkin" "^1.28" + "@opentelemetry/instrumentation" "^0.55" + "@opentelemetry/instrumentation-grpc" "^0.55" "@pulumi/random@^4.18.2": version "4.18.2" @@ -4357,18 +3994,18 @@ dependencies: "@pulumi/pulumi" "^3.142.0" -"@puppeteer/browsers@2.10.5": - version "2.10.5" - resolved "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.5.tgz" - integrity sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w== +"@puppeteer/browsers@2.10.6": + version "2.10.6" + resolved "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.6.tgz" + integrity sha512-pHUn6ZRt39bP3698HFQlu2ZHCkS/lPcpv7fVQcGBSzNNygw171UXAKrCUhy+TEMw4lEttOKDgNpb04hwUAJeiQ== dependencies: debug "^4.4.1" extract-zip "^2.0.1" progress "^2.0.3" proxy-agent "^6.5.0" - semver "^7.7.2" - tar-fs "^3.0.8" + tar-fs "^3.1.0" yargs "^17.7.2" + semver "^7.7.2" "@radix-ui/number@1.1.1": version "1.1.1" @@ -4385,14 +4022,14 @@ resolved "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.11.tgz" integrity sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A== dependencies: + "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-collapsible" "1.1.11" - "@radix-ui/react-collection" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" "@radix-ui/react-direction" "1.1.1" - "@radix-ui/react-id" "1.1.1" "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-collapsible" "1.1.11" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-alert-dialog@1.1.14": @@ -4401,11 +4038,11 @@ integrity sha512-IOZfZ3nPvN6lXpJTBCunFQPRSvK8MDgSc1FB85xnIpUKOw9en0dJj8JmCAxV7BiZdtYlUpmrQjoTFkVYtdoWzQ== dependencies: "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-dialog" "1.1.14" + "@radix-ui/react-context" "1.1.2" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-slot" "1.2.3" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-arrow@1.1.7": version "1.1.7" @@ -4431,27 +4068,27 @@ integrity sha512-yd+dI56KZqawxKZrJ31eENUwqc1QSqg4OZ15rybGjF2ZNwMO+wCyHzAVLRp9qoYJf7kYy0YpZ2b0JCzJ42HZpA== dependencies: "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" "@radix-ui/react-presence" "1.1.4" + "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-previous" "1.1.1" - "@radix-ui/react-use-size" "1.1.1" + "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-collapsible@1.1.11": version "1.1.11" resolved "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.11.tgz" integrity sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg== dependencies: + "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-id" "1.1.1" "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-collection@1.1.7": version "1.1.7" @@ -4479,8 +4116,8 @@ integrity sha512-UsQUMjcYTsBjTSXw0P3GO0werEQvUY2plgRQuKoCTtkNr45q1DiL51j4m7gxhABzZ0BadoXNsIbg7F3KwiUBbw== dependencies: "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-context" "1.1.2" "@radix-ui/react-menu" "2.1.15" + "@radix-ui/react-context" "1.1.2" "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-use-callback-ref" "1.1.1" "@radix-ui/react-use-controllable-state" "1.2.2" @@ -4490,20 +4127,20 @@ resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz" integrity sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw== dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-dismissable-layer" "1.1.10" - "@radix-ui/react-focus-guards" "1.1.2" - "@radix-ui/react-focus-scope" "1.1.7" + aria-hidden "^1.2.4" "@radix-ui/react-id" "1.1.1" + "@radix-ui/primitive" "1.1.2" + react-remove-scroll "^2.6.3" + "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-context" "1.1.2" "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-slot" "1.2.3" + "@radix-ui/react-focus-scope" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-focus-guards" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.10" "@radix-ui/react-use-controllable-state" "1.2.2" - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" "@radix-ui/react-direction@1.1.1": version "1.1.1" @@ -4526,12 +4163,12 @@ resolved "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.15.tgz" integrity sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ== dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" "@radix-ui/react-id" "1.1.1" + "@radix-ui/primitive" "1.1.2" "@radix-ui/react-menu" "2.1.15" + "@radix-ui/react-context" "1.1.2" "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-focus-guards@1.1.2": @@ -4554,13 +4191,13 @@ integrity sha512-CPYZ24Mhirm+g6D8jArmLzjYu4Eyg3TTUHswR26QgzXBHBe64BO/RHOJKzmF/Dxb4y4f9PKyJdwm/O/AhNkb+Q== dependencies: "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-dismissable-layer" "1.1.10" "@radix-ui/react-popper" "1.2.7" "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-context" "1.1.2" "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.10" "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-icons@^1.3.0": @@ -4587,6 +4224,8 @@ resolved "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.15.tgz" integrity sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew== dependencies: + aria-hidden "^1.2.4" + react-remove-scroll "^2.6.3" "@radix-ui/primitive" "1.1.2" "@radix-ui/react-collection" "1.1.7" "@radix-ui/react-compose-refs" "1.1.2" @@ -4594,58 +4233,56 @@ "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-dismissable-layer" "1.1.10" "@radix-ui/react-focus-guards" "1.1.2" - "@radix-ui/react-focus-scope" "1.1.7" - "@radix-ui/react-id" "1.1.1" "@radix-ui/react-popper" "1.2.7" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-focus-scope" "1.1.7" "@radix-ui/react-portal" "1.1.9" "@radix-ui/react-presence" "1.1.4" - "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-roving-focus" "1.1.10" + "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-use-callback-ref" "1.1.1" - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" "@radix-ui/react-navigation-menu@1.2.13": version "1.2.13" resolved "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.13.tgz" integrity sha512-WG8wWfDiJlSF5hELjwfjSGOXcBR/ZMhBFCGYe8vERpC39CQYZeq1PQ2kaYHdye3V95d06H89KGMsVCIE4LWo3g== dependencies: + "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-collection" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-direction" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.10" - "@radix-ui/react-id" "1.1.1" "@radix-ui/react-presence" "1.1.4" + "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-callback-ref" "1.1.1" - "@radix-ui/react-use-controllable-state" "1.2.2" - "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-previous" "1.1.1" "@radix-ui/react-visually-hidden" "1.2.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-popover@1.1.14": version "1.1.14" resolved "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz" integrity sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw== dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-dismissable-layer" "1.1.10" - "@radix-ui/react-focus-guards" "1.1.2" - "@radix-ui/react-focus-scope" "1.1.7" + aria-hidden "^1.2.4" "@radix-ui/react-id" "1.1.1" + "@radix-ui/primitive" "1.1.2" + react-remove-scroll "^2.6.3" + "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-popper" "1.2.7" "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-context" "1.1.2" "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-slot" "1.2.3" + "@radix-ui/react-focus-scope" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-focus-guards" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.10" "@radix-ui/react-use-controllable-state" "1.2.2" - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" "@radix-ui/react-popper@1.2.7": version "1.2.7" @@ -4654,13 +4291,13 @@ dependencies: "@floating-ui/react-dom" "^2.0.0" "@radix-ui/react-arrow" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-use-callback-ref" "1.1.1" "@radix-ui/react-use-layout-effect" "1.1.1" - "@radix-ui/react-use-rect" "1.1.1" "@radix-ui/react-use-size" "1.1.1" + "@radix-ui/react-use-rect" "1.1.1" "@radix-ui/rect" "1.1.1" "@radix-ui/react-portal@1.1.9": @@ -4700,15 +4337,15 @@ integrity sha512-9w5XhD0KPOrm92OTTE0SysH3sYzHsSTHNvZgUBo/VZ80VdYyB5RneDbc0dKpURS24IxkoFRu/hI0i4XyfFwY6g== dependencies: "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-presence" "1.1.4" + "@radix-ui/react-use-size" "1.1.1" + "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-roving-focus" "1.1.10" - "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-use-previous" "1.1.1" - "@radix-ui/react-use-size" "1.1.1" + "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-roving-focus@1.1.10": version "1.1.10" @@ -4717,10 +4354,10 @@ dependencies: "@radix-ui/primitive" "1.1.2" "@radix-ui/react-collection" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-use-callback-ref" "1.1.1" "@radix-ui/react-use-controllable-state" "1.2.2" @@ -4732,11 +4369,11 @@ dependencies: "@radix-ui/number" "1.1.1" "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-presence" "1.1.4" + "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-callback-ref" "1.1.1" "@radix-ui/react-use-layout-effect" "1.1.1" @@ -4745,27 +4382,27 @@ resolved "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.5.tgz" integrity sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA== dependencies: - "@radix-ui/number" "1.1.1" - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-collection" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-direction" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.10" - "@radix-ui/react-focus-guards" "1.1.2" - "@radix-ui/react-focus-scope" "1.1.7" + aria-hidden "^1.2.4" + "@radix-ui/number" "1.1.1" "@radix-ui/react-id" "1.1.1" + "@radix-ui/primitive" "1.1.2" + react-remove-scroll "^2.6.3" + "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-popper" "1.2.7" "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-slot" "1.2.3" - "@radix-ui/react-use-callback-ref" "1.1.1" - "@radix-ui/react-use-controllable-state" "1.2.2" - "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-focus-scope" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-focus-guards" "1.1.2" "@radix-ui/react-use-previous" "1.1.1" "@radix-ui/react-visually-hidden" "1.2.3" - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" + "@radix-ui/react-use-callback-ref" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-separator@1.1.7": version "1.1.7" @@ -4781,15 +4418,15 @@ dependencies: "@radix-ui/number" "1.1.1" "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-collection" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-controllable-state" "1.2.2" - "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-previous" "1.1.1" - "@radix-ui/react-use-size" "1.1.1" + "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-slot@1.2.3", "@radix-ui/react-slot@^1.0.2": version "1.2.3" @@ -4804,23 +4441,23 @@ integrity sha512-5ijLkak6ZMylXsaImpZ8u4Rlf5grRmoc0p0QeX9VJtlrM4f5m3nCTX8tWga/zOA8PZYIR/t0p2Mnvd7InrJ6yQ== dependencies: "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-previous" "1.1.1" - "@radix-ui/react-use-size" "1.1.1" + "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-tabs@1.1.12": version "1.1.12" resolved "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.12.tgz" integrity sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw== dependencies: + "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-direction" "1.1.1" - "@radix-ui/react-id" "1.1.1" "@radix-ui/react-presence" "1.1.4" + "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-roving-focus" "1.1.10" "@radix-ui/react-use-controllable-state" "1.2.2" @@ -4858,11 +4495,11 @@ integrity sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ== dependencies: "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-toggle" "1.1.9" "@radix-ui/react-context" "1.1.2" "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-roving-focus" "1.1.10" - "@radix-ui/react-toggle" "1.1.9" "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-tooltip@1.2.7", "@radix-ui/react-tooltip@npm:@radix-ui/react-tooltip@^1.0.0": @@ -4870,18 +4507,18 @@ resolved "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz" integrity sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw== dependencies: - "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-dismissable-layer" "1.1.10" "@radix-ui/react-id" "1.1.1" + "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-popper" "1.2.7" "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-context" "1.1.2" "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-slot" "1.2.3" - "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-visually-hidden" "1.2.3" + "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-use-callback-ref@1.1.1": version "1.1.1" @@ -5000,26 +4637,26 @@ resolved "https://registry.npmjs.org/@react-email/components/-/components-0.0.41.tgz" integrity sha512-WUI3wHwra3QS0pwrovSU6b0I0f3TvY33ph0y44LuhSYDSQlMRyeOzgoT6HRDY5FXMDF57cHYq9WoKwpwP0yd7Q== dependencies: + "@react-email/hr" "0.0.11" + "@react-email/img" "0.0.11" + "@react-email/row" "0.0.12" "@react-email/body" "0.0.11" - "@react-email/button" "0.0.19" - "@react-email/code-block" "0.0.13" - "@react-email/code-inline" "0.0.5" - "@react-email/column" "0.0.13" - "@react-email/container" "0.0.15" "@react-email/font" "0.0.9" "@react-email/head" "0.0.12" - "@react-email/heading" "0.0.15" - "@react-email/hr" "0.0.11" "@react-email/html" "0.0.11" - "@react-email/img" "0.0.11" "@react-email/link" "0.0.12" - "@react-email/markdown" "0.0.15" - "@react-email/preview" "0.0.13" + "@react-email/text" "0.1.4" + "@react-email/button" "0.0.19" + "@react-email/column" "0.0.13" "@react-email/render" "1.1.2" - "@react-email/row" "0.0.12" + "@react-email/heading" "0.0.15" + "@react-email/preview" "0.0.13" "@react-email/section" "0.0.16" + "@react-email/markdown" "0.0.15" "@react-email/tailwind" "1.0.5" - "@react-email/text" "0.1.4" + "@react-email/container" "0.0.15" + "@react-email/code-block" "0.0.13" + "@react-email/code-inline" "0.0.5" "@react-email/container@0.0.15": version "0.0.15" @@ -5078,8 +4715,8 @@ resolved "https://registry.npmjs.org/@react-email/render/-/render-1.1.2.tgz" integrity sha512-RnRehYN3v9gVlNMehHPHhyp2RQo7+pSkHDtXPvg3s0GbzM9SQMW4Qrf8GRNvtpLC4gsI+Wt0VatNRUFqjvevbw== dependencies: - html-to-text "^9.0.5" prettier "^3.5.3" + html-to-text "^9.0.5" react-promise-suspense "^0.3.4" "@react-email/render@^1.1.2": @@ -5112,15 +4749,15 @@ integrity sha512-cMNE02y8172DocpNGh97uV5HSTawaS4CKG/zOku8Pu+m6ehBKbAjgtQZDIxhgstw8+TWraFB8ltS1DPjfG8nLA== "@react-three/drei@^10.3.0": - version "10.3.0" - resolved "https://registry.npmjs.org/@react-three/drei/-/drei-10.3.0.tgz" - integrity sha512-+4NHCAUI38jp8XlbuKKWl/23y3F/JKdkvnYsrVXxhw150OyWKJoft+Yyd7dl6awxfV/Gn08x3R9pRRFUuDQwDA== + version "10.5.2" + resolved "https://registry.npmjs.org/@react-three/drei/-/drei-10.5.2.tgz" + integrity sha512-s6MpLahua5q59ZVTeJ9EQ52wNLOLNB5mIA9NeLWwKEIymg7owqnkfQock9u5IAFgFzCX7AB1b7U8eaLy4M+YgA== dependencies: "@babel/runtime" "^7.26.0" "@mediapipe/tasks-vision" "0.10.17" "@monogrid/gainmap-js" "^3.0.6" "@use-gesture/react" "^10.3.1" - camera-controls "^2.9.0" + camera-controls "^3.0.0" cross-env "^7.0.3" detect-gpu "^5.0.56" glsl-noise "^0.0.0" @@ -5139,9 +4776,9 @@ zustand "^5.0.1" "@react-three/fiber@^9.0.0", "@react-three/fiber@^9.1.2": - version "9.1.2" - resolved "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.1.2.tgz" - integrity sha512-k8FR9yVHV9kIF3iuOD0ds5hVymXYXfgdKklqziBVod9ZEJ8uk05Zjw29J/omU3IKeUfLNAIHfxneN3TUYM4I2w== + version "9.2.0" + resolved "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.2.0.tgz" + integrity sha512-esZe+E9T/aYEM4HlBkirr/yRE8qWTp9WUsLISyHHMCHKlJv85uc5N4wwKw+Ay0QeTSITw6T9Q3Svpu383Q+CSQ== dependencies: "@babel/runtime" "^7.17.8" "@types/react-reconciler" "^0.28.9" @@ -5170,110 +4807,110 @@ resolved "https://registry.npmjs.org/@remirror/core-constants/-/core-constants-3.0.0.tgz" integrity sha512-42aWfPrimMfDKDi4YegyS7x+/0tlzaqwPQCULLanv3DMIlu96KTJR0fM5isWX2UViOqlGnX6YFgqWepcX+XMNg== -"@rolldown/pluginutils@1.0.0-beta.19": - version "1.0.0-beta.19" - resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz" - integrity sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA== - -"@rollup/rollup-android-arm-eabi@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz" - integrity sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w== - -"@rollup/rollup-android-arm64@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz" - integrity sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ== - -"@rollup/rollup-darwin-arm64@4.44.1", "@rollup/rollup-darwin-arm64@^4.18.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz" - integrity sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg== - -"@rollup/rollup-darwin-x64@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz" - integrity sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw== - -"@rollup/rollup-freebsd-arm64@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.44.1.tgz" - integrity sha512-wnFQmJ/zPThM5zEGcnDcCJeYJgtSLjh1d//WuHzhf6zT3Md1BvvhJnWoy+HECKu2bMxaIcfWiu3bJgx6z4g2XA== - -"@rollup/rollup-freebsd-x64@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.44.1.tgz" - integrity sha512-uBmIxoJ4493YATvU2c0upGz87f99e3wop7TJgOA/bXMFd2SvKCI7xkxY/5k50bv7J6dw1SXT4MQBQSLn8Bb/Uw== - -"@rollup/rollup-linux-arm-gnueabihf@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz" - integrity sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ== - -"@rollup/rollup-linux-arm-musleabihf@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz" - integrity sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw== - -"@rollup/rollup-linux-arm64-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz" - integrity sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ== - -"@rollup/rollup-linux-arm64-musl@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz" - integrity sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g== - -"@rollup/rollup-linux-loongarch64-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.44.1.tgz" - integrity sha512-1zqnUEMWp9WrGVuVak6jWTl4fEtrVKfZY7CvcBmUUpxAJ7WcSowPSAWIKa/0o5mBL/Ij50SIf9tuirGx63Ovew== - -"@rollup/rollup-linux-powerpc64le-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz" - integrity sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA== - -"@rollup/rollup-linux-riscv64-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz" - integrity sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw== - -"@rollup/rollup-linux-riscv64-musl@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.44.1.tgz" - integrity sha512-ppn5llVGgrZw7yxbIm8TTvtj1EoPgYUAbfw0uDjIOzzoqlZlZrLJ/KuiE7uf5EpTpCTrNt1EdtzF0naMm0wGYg== - -"@rollup/rollup-linux-s390x-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz" - integrity sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw== - -"@rollup/rollup-linux-x64-gnu@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz" - integrity sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw== - -"@rollup/rollup-linux-x64-musl@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz" - integrity sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g== - -"@rollup/rollup-win32-arm64-msvc@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz" - integrity sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg== - -"@rollup/rollup-win32-ia32-msvc@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz" - integrity sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A== - -"@rollup/rollup-win32-x64-msvc@4.44.1": - version "4.44.1" - resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz" - integrity sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug== +"@rolldown/pluginutils@1.0.0-beta.27": + version "1.0.0-beta.27" + resolved "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz" + integrity sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA== + +"@rollup/rollup-android-arm-eabi@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz" + integrity sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA== + +"@rollup/rollup-android-arm64@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz" + integrity sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ== + +"@rollup/rollup-darwin-arm64@4.45.1", "@rollup/rollup-darwin-arm64@^4.18.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz" + integrity sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA== + +"@rollup/rollup-darwin-x64@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz" + integrity sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og== + +"@rollup/rollup-freebsd-arm64@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz" + integrity sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g== + +"@rollup/rollup-freebsd-x64@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz" + integrity sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A== + +"@rollup/rollup-linux-arm-gnueabihf@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz" + integrity sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q== + +"@rollup/rollup-linux-arm-musleabihf@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz" + integrity sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q== + +"@rollup/rollup-linux-arm64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz" + integrity sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw== + +"@rollup/rollup-linux-arm64-musl@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz" + integrity sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog== + +"@rollup/rollup-linux-loongarch64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz" + integrity sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg== + +"@rollup/rollup-linux-powerpc64le-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz" + integrity sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg== + +"@rollup/rollup-linux-riscv64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz" + integrity sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw== + +"@rollup/rollup-linux-riscv64-musl@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz" + integrity sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA== + +"@rollup/rollup-linux-s390x-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz" + integrity sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw== + +"@rollup/rollup-linux-x64-gnu@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz" + integrity sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw== + +"@rollup/rollup-linux-x64-musl@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz" + integrity sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw== + +"@rollup/rollup-win32-arm64-msvc@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz" + integrity sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg== + +"@rollup/rollup-win32-ia32-msvc@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz" + integrity sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw== + +"@rollup/rollup-win32-x64-msvc@4.45.1": + version "4.45.1" + resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz" + integrity sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA== "@rtsao/scc@^1.1.0": version "1.1.0" @@ -5281,9 +4918,9 @@ integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== "@rushstack/eslint-patch@^1.10.3": - version "1.11.0" - resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.11.0.tgz" - integrity sha512-zxnHvoMQVqewTJr/W4pKjF0bMGiKJv1WX7bSrkl46Hg0QjESbzBROWK0Wg4RphzSOS5Jiy7eFimmM3UgMrMZbQ== + version "1.12.0" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.12.0.tgz" + integrity sha512-5EwMtOqvJMMa3HbmxLlF74e+3/HhwBTMcvt3nqVJgGCozO6hzIPOBlwm8mGVNR9SN2IJpxSnlxczyDjcn7qIyw== "@sapphire/async-queue@^1.5.2", "@sapphire/async-queue@^1.5.3": version "1.5.5" @@ -5295,8 +4932,8 @@ resolved "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz" integrity sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg== dependencies: - fast-deep-equal "^3.1.3" lodash "^4.17.21" + fast-deep-equal "^3.1.3" "@sapphire/snowflake@3.5.3", "@sapphire/snowflake@^3.5.3": version "3.5.3" @@ -5374,41 +5011,41 @@ resolved "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.3.tgz" integrity sha512-T2fKUyFkHHkUNa5XNmcsEcDPuG23hwBKptfUVcFXDVG2cSjXXZYDOfVYwfouqbWo/8UefotLaoGfQeK+k3ep6A== dependencies: - "@octokit/core" "^7.0.0" - "@octokit/plugin-paginate-rest" "^13.0.0" - "@octokit/plugin-retry" "^8.0.0" - "@octokit/plugin-throttling" "^11.0.0" - "@semantic-release/error" "^4.0.0" - aggregate-error "^5.0.0" + mime "^4.0.0" debug "^4.3.4" - dir-glob "^3.0.1" globby "^14.0.0" - http-proxy-agent "^7.0.0" - https-proxy-agent "^7.0.0" - issue-parser "^7.0.0" - lodash-es "^4.17.21" - mime "^4.0.0" + dir-glob "^3.0.1" p-filter "^4.0.0" url-join "^5.0.0" + lodash-es "^4.17.21" + issue-parser "^7.0.0" + "@octokit/core" "^7.0.0" + aggregate-error "^5.0.0" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + "@octokit/plugin-retry" "^8.0.0" + "@semantic-release/error" "^4.0.0" + "@octokit/plugin-throttling" "^11.0.0" + "@octokit/plugin-paginate-rest" "^13.0.0" -"@semantic-release/npm@^12.0.0", "@semantic-release/npm@^12.0.1": +"@semantic-release/npm@^12.0.1", "@semantic-release/npm@^12.0.2": version "12.0.2" resolved "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.2.tgz" integrity sha512-+M9/Lb35IgnlUO6OSJ40Ie+hUsZLuph2fqXC/qrKn0fMvUU/jiCjpoL6zEm69vzcmaZJ8yNKtMBEKHWN49WBbQ== dependencies: - "@semantic-release/error" "^4.0.0" - aggregate-error "^5.0.0" + rc "^1.2.8" + npm "^10.9.3" execa "^9.0.0" + tempy "^3.0.0" + semver "^7.1.2" fs-extra "^11.0.0" + read-pkg "^9.0.0" lodash-es "^4.17.21" nerf-dart "^1.0.0" normalize-url "^8.0.0" - npm "^10.9.3" - rc "^1.2.8" - read-pkg "^9.0.0" + aggregate-error "^5.0.0" registry-auth-token "^5.0.0" - semver "^7.1.2" - tempy "^3.0.0" + "@semantic-release/error" "^4.0.0" "@semantic-release/release-notes-generator@^14.0.0-beta.1", "@semantic-release/release-notes-generator@^14.0.3": version "14.0.3" @@ -5465,12 +5102,12 @@ resolved "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz" integrity sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA== dependencies: - "@sigstore/bundle" "^2.3.2" - "@sigstore/core" "^1.0.0" - "@sigstore/protobuf-specs" "^0.3.2" - make-fetch-happen "^13.0.1" proc-log "^4.2.0" promise-retry "^2.0.1" + "@sigstore/core" "^1.0.0" + "@sigstore/bundle" "^2.3.2" + make-fetch-happen "^13.0.1" + "@sigstore/protobuf-specs" "^0.3.2" "@sigstore/sign@^3.1.0": version "3.1.0" @@ -5489,8 +5126,8 @@ resolved "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz" integrity sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw== dependencies: - "@sigstore/protobuf-specs" "^0.3.2" tuf-js "^2.2.1" + "@sigstore/protobuf-specs" "^0.3.2" "@sigstore/tuf@^3.1.0", "@sigstore/tuf@^3.1.1": version "3.1.1" @@ -5505,8 +5142,8 @@ resolved "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz" integrity sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g== dependencies: - "@sigstore/bundle" "^2.3.2" "@sigstore/core" "^1.1.0" + "@sigstore/bundle" "^2.3.2" "@sigstore/protobuf-specs" "^0.3.2" "@sigstore/verify@^2.1.0": @@ -5514,19 +5151,19 @@ resolved "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz" integrity sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w== dependencies: + "@sigstore/protobuf-specs" "^0.4.1" "@sigstore/bundle" "^3.1.0" "@sigstore/core" "^2.0.0" - "@sigstore/protobuf-specs" "^0.4.1" "@simplewebauthn/browser@^13.0.0": - version "13.1.0" - resolved "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.1.0.tgz" - integrity sha512-WuHZ/PYvyPJ9nxSzgHtOEjogBhwJfC8xzYkPC+rR/+8chl/ft4ngjiK8kSU5HtRJfczupyOh33b25TjYbvwAcg== + version "13.1.2" + resolved "https://registry.npmjs.org/@simplewebauthn/browser/-/browser-13.1.2.tgz" + integrity sha512-aZnW0KawAM83fSBUgglP5WofbrLbLyr7CoPqYr66Eppm7zO86YX6rrCjRB3hQKPrL7ATvY4FVXlykZ6w6FwYYw== "@simplewebauthn/server@^13.0.0": - version "13.1.1" - resolved "https://registry.npmjs.org/@simplewebauthn/server/-/server-13.1.1.tgz" - integrity sha512-1hsLpRHfSuMB9ee2aAdh0Htza/X3f4djhYISrggqGe3xopNjOcePiSDkDDoPzDYaaMCrbqGP1H2TYU7bgL9PmA== + version "13.1.2" + resolved "https://registry.npmjs.org/@simplewebauthn/server/-/server-13.1.2.tgz" + integrity sha512-VwoDfvLXSCaRiD+xCIuyslU0HLxVggeE5BL06+GbsP2l1fGf5op8e0c3ZtKoi+vSg1q4ikjtAghC23ze2Q3H9g== dependencies: "@hexagon/base64" "^1.1.27" "@levischuck/tiny-cbor" "^0.2.2" @@ -5556,20 +5193,20 @@ resolved "https://registry.npmjs.org/@slack/bolt/-/bolt-3.22.0.tgz" integrity sha512-iKDqGPEJDnrVwxSVlFW6OKTkijd7s4qLBeSufoBsTM0reTyfdp/5izIQVkxNfzjHi3o6qjdYbRXkYad5HBsBog== dependencies: - "@slack/logger" "^4.0.0" + axios "^1.7.4" + tsscmp "^1.0.6" + express "^4.21.0" + raw-body "^2.3.3" "@slack/oauth" "^2.6.3" - "@slack/socket-mode" "^1.3.6" "@slack/types" "^2.13.0" + "@slack/logger" "^4.0.0" + "@types/tsscmp" "^1.0.0" "@slack/web-api" "^6.13.0" "@types/express" "^4.16.1" - "@types/promise.allsettled" "^1.0.3" - "@types/tsscmp" "^1.0.0" - axios "^1.7.4" - express "^4.21.0" path-to-regexp "^8.1.0" + "@slack/socket-mode" "^1.3.6" promise.allsettled "^1.0.2" - raw-body "^2.3.3" - tsscmp "^1.0.6" + "@types/promise.allsettled" "^1.0.3" "@slack/logger@^3.0.0": version "3.0.0" @@ -5590,47 +5227,47 @@ resolved "https://registry.npmjs.org/@slack/oauth/-/oauth-2.6.3.tgz" integrity sha512-1amXs6xRkJpoH6zSgjVPgGEJXCibKNff9WNDijcejIuVy1HFAl1adh7lehaGNiHhTWfQkfKxBiF+BGn56kvoFw== dependencies: - "@slack/logger" "^3.0.0" - "@slack/web-api" "^6.12.1" - "@types/jsonwebtoken" "^8.3.7" "@types/node" ">=12" jsonwebtoken "^9.0.0" + "@slack/logger" "^3.0.0" + "@slack/web-api" "^6.12.1" lodash.isstring "^4.0.1" + "@types/jsonwebtoken" "^8.3.7" "@slack/socket-mode@^1.3.6": version "1.3.6" resolved "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-1.3.6.tgz" integrity sha512-G+im7OP7jVqHhiNSdHgv2VVrnN5U7KY845/5EZimZkrD4ZmtV0P3BiWkgeJhPtdLuM7C7i6+M6h6Bh+S4OOalA== dependencies: - "@slack/logger" "^3.0.0" - "@slack/web-api" "^6.12.1" - "@types/node" ">=12.0.0" + ws "^7.5.3" + finity "^0.5.4" "@types/ws" "^7.4.7" + "@types/node" ">=12.0.0" + "@slack/logger" "^3.0.0" eventemitter3 "^5" - finity "^0.5.4" - ws "^7.5.3" + "@slack/web-api" "^6.12.1" "@slack/types@^2.11.0", "@slack/types@^2.13.0", "@slack/types@^2.9.0": - version "2.14.0" - resolved "https://registry.npmjs.org/@slack/types/-/types-2.14.0.tgz" - integrity sha512-n0EGm7ENQRxlXbgKSrQZL69grzg1gHLAVd+GlRVQJ1NSORo0FrApR7wql/gaKdu2n4TO83Sq/AmeUOqD60aXUA== + version "2.15.0" + resolved "https://registry.npmjs.org/@slack/types/-/types-2.15.0.tgz" + integrity sha512-livb1gyG3J8ATLBJ3KjZfjHpTRz9btY1m5cgNuXxWJbhwRB1Gwb8Ly6XLJm2Sy1W6h+vLgqIHg7IwKrF1C1Szg== "@slack/web-api@^6.12.1", "@slack/web-api@^6.13.0": version "6.13.0" resolved "https://registry.npmjs.org/@slack/web-api/-/web-api-6.13.0.tgz" integrity sha512-dv65crIgdh9ZYHrevLU6XFHTQwTyDmNqEqzuIrV+Vqe/vgiG6w37oex5ePDU1RGm2IJ90H8iOvHFvzdEO/vB+g== dependencies: - "@slack/logger" "^3.0.0" - "@slack/types" "^2.11.0" - "@types/is-stream" "^1.1.0" - "@types/node" ">=12.0.0" axios "^1.7.4" - eventemitter3 "^3.1.0" - form-data "^2.5.0" - is-electron "2.2.2" - is-stream "^1.1.0" p-queue "^6.6.1" p-retry "^4.0.0" + form-data "^2.5.0" + is-stream "^1.1.0" + "@types/node" ">=12.0.0" + is-electron "2.2.2" + "@slack/types" "^2.11.0" + "@slack/logger" "^3.0.0" + eventemitter3 "^3.1.0" + "@types/is-stream" "^1.1.0" "@slack/web-api@^7.8.0": version "7.9.3" @@ -5670,8 +5307,8 @@ resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz" integrity sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig== dependencies: - "@smithy/util-base64" "^4.0.0" tslib "^2.6.2" + "@smithy/util-base64" "^4.0.0" "@smithy/config-resolver@^4.1.4": version "4.1.4" @@ -5684,21 +5321,6 @@ "@smithy/util-middleware" "^4.0.4" tslib "^2.6.2" -"@smithy/core@^3.5.3", "@smithy/core@^3.6.0": - version "3.6.0" - resolved "https://registry.npmjs.org/@smithy/core/-/core-3.6.0.tgz" - integrity sha512-Pgvfb+TQ4wUNLyHzvgCP4aYZMh16y7GcfF59oirRHcgGgkH1e/s9C0nv/v3WP+Quymyr5je71HeFQCwh+44XLg== - dependencies: - "@smithy/middleware-serde" "^4.0.8" - "@smithy/protocol-http" "^5.1.2" - "@smithy/types" "^4.3.1" - "@smithy/util-base64" "^4.0.0" - "@smithy/util-body-length-browser" "^4.0.0" - "@smithy/util-middleware" "^4.0.4" - "@smithy/util-stream" "^4.2.2" - "@smithy/util-utf8" "^4.0.0" - tslib "^2.6.2" - "@smithy/core@^3.7.0", "@smithy/core@^3.7.1": version "3.7.1" resolved "https://registry.npmjs.org/@smithy/core/-/core-3.7.1.tgz" @@ -5770,17 +5392,6 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@smithy/fetch-http-handler@^5.0.4": - version "5.0.4" - resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.0.4.tgz" - integrity sha512-AMtBR5pHppYMVD7z7G+OlHHAcgAN7v0kVKEpHuTO4Gb199Gowh0taYi9oDStFeUhetkeP55JLSVlTW1n9rFtUw== - dependencies: - "@smithy/protocol-http" "^5.1.2" - "@smithy/querystring-builder" "^4.0.4" - "@smithy/types" "^4.3.1" - "@smithy/util-base64" "^4.0.0" - tslib "^2.6.2" - "@smithy/fetch-http-handler@^5.1.0": version "5.1.0" resolved "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.0.tgz" @@ -5861,20 +5472,6 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@smithy/middleware-endpoint@^4.1.12", "@smithy/middleware-endpoint@^4.1.13": - version "4.1.13" - resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.13.tgz" - integrity sha512-xg3EHV/Q5ZdAO5b0UiIMj3RIOCobuS40pBBODguUDVdko6YK6QIzCVRrHTogVuEKglBWqWenRnZ71iZnLL3ZAQ== - dependencies: - "@smithy/core" "^3.6.0" - "@smithy/middleware-serde" "^4.0.8" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/shared-ini-file-loader" "^4.0.4" - "@smithy/types" "^4.3.1" - "@smithy/url-parser" "^4.0.4" - "@smithy/util-middleware" "^4.0.4" - tslib "^2.6.2" - "@smithy/middleware-endpoint@^4.1.15", "@smithy/middleware-endpoint@^4.1.16": version "4.1.16" resolved "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.16.tgz" @@ -5889,21 +5486,6 @@ "@smithy/util-middleware" "^4.0.4" tslib "^2.6.2" -"@smithy/middleware-retry@^4.1.13": - version "4.1.14" - resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.14.tgz" - integrity sha512-eoXaLlDGpKvdmvt+YBfRXE7HmIEtFF+DJCbTPwuLunP0YUnrydl+C4tS+vEM0+nyxXrX3PSUFqC+lP1+EHB1Tw== - dependencies: - "@smithy/node-config-provider" "^4.1.3" - "@smithy/protocol-http" "^5.1.2" - "@smithy/service-error-classification" "^4.0.6" - "@smithy/smithy-client" "^4.4.5" - "@smithy/types" "^4.3.1" - "@smithy/util-middleware" "^4.0.4" - "@smithy/util-retry" "^4.0.6" - tslib "^2.6.2" - uuid "^9.0.1" - "@smithy/middleware-retry@^4.1.16": version "4.1.17" resolved "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.17.tgz" @@ -5946,17 +5528,6 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@smithy/node-http-handler@^4.0.6": - version "4.0.6" - resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.0.6.tgz" - integrity sha512-NqbmSz7AW2rvw4kXhKGrYTiJVDHnMsFnX4i+/FzcZAfbOBauPYs2ekuECkSbtqaxETLLTu9Rl/ex6+I2BKErPA== - dependencies: - "@smithy/abort-controller" "^4.0.4" - "@smithy/protocol-http" "^5.1.2" - "@smithy/querystring-builder" "^4.0.4" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@smithy/node-http-handler@^4.1.0": version "4.1.0" resolved "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.0.tgz" @@ -6030,19 +5601,6 @@ "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" -"@smithy/smithy-client@^4.4.4", "@smithy/smithy-client@^4.4.5": - version "4.4.5" - resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.5.tgz" - integrity sha512-+lynZjGuUFJaMdDYSTMnP/uPBBXXukVfrJlP+1U/Dp5SFTEI++w6NMga8DjOENxecOF71V9Z2DllaVDYRnGlkg== - dependencies: - "@smithy/core" "^3.6.0" - "@smithy/middleware-endpoint" "^4.1.13" - "@smithy/middleware-stack" "^4.0.4" - "@smithy/protocol-http" "^5.1.2" - "@smithy/types" "^4.3.1" - "@smithy/util-stream" "^4.2.2" - tslib "^2.6.2" - "@smithy/smithy-client@^4.4.7", "@smithy/smithy-client@^4.4.8": version "4.4.8" resolved "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.8.tgz" @@ -6077,9 +5635,9 @@ resolved "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz" integrity sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg== dependencies: - "@smithy/util-buffer-from" "^4.0.0" - "@smithy/util-utf8" "^4.0.0" tslib "^2.6.2" + "@smithy/util-utf8" "^4.0.0" + "@smithy/util-buffer-from" "^4.0.0" "@smithy/util-body-length-browser@^4.0.0": version "4.0.0" @@ -6100,33 +5658,22 @@ resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz" integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== dependencies: - "@smithy/is-array-buffer" "^2.2.0" tslib "^2.6.2" + "@smithy/is-array-buffer" "^2.2.0" "@smithy/util-buffer-from@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz" integrity sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug== dependencies: - "@smithy/is-array-buffer" "^4.0.0" tslib "^2.6.2" + "@smithy/is-array-buffer" "^4.0.0" "@smithy/util-config-provider@^4.0.0": version "4.0.0" - resolved "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz" - integrity sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w== - dependencies: - tslib "^2.6.2" - -"@smithy/util-defaults-mode-browser@^4.0.20": - version "4.0.21" - resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.21.tgz" - integrity sha512-wM0jhTytgXu3wzJoIqpbBAG5U6BwiubZ6QKzSbP7/VbmF1v96xlAbX2Am/mz0Zep0NLvLh84JT0tuZnk3wmYQA== + resolved "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz" + integrity sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w== dependencies: - "@smithy/property-provider" "^4.0.4" - "@smithy/smithy-client" "^4.4.5" - "@smithy/types" "^4.3.1" - bowser "^2.11.0" tslib "^2.6.2" "@smithy/util-defaults-mode-browser@^4.0.23": @@ -6140,19 +5687,6 @@ bowser "^2.11.0" tslib "^2.6.2" -"@smithy/util-defaults-mode-node@^4.0.20": - version "4.0.21" - resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.21.tgz" - integrity sha512-/F34zkoU0GzpUgLJydHY8Rxu9lBn8xQC/s/0M0U9lLBkYbA1htaAFjWYJzpzsbXPuri5D1H8gjp2jBum05qBrA== - dependencies: - "@smithy/config-resolver" "^4.1.4" - "@smithy/credential-provider-imds" "^4.0.6" - "@smithy/node-config-provider" "^4.1.3" - "@smithy/property-provider" "^4.0.4" - "@smithy/smithy-client" "^4.4.5" - "@smithy/types" "^4.3.1" - tslib "^2.6.2" - "@smithy/util-defaults-mode-node@^4.0.23": version "4.0.24" resolved "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.24.tgz" @@ -6199,20 +5733,6 @@ "@smithy/types" "^4.3.1" tslib "^2.6.2" -"@smithy/util-stream@^4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.2.tgz" - integrity sha512-aI+GLi7MJoVxg24/3J1ipwLoYzgkB4kUfogZfnslcYlynj3xsQ0e7vk4TnTro9hhsS5PvX1mwmkRqqHQjwcU7w== - dependencies: - "@smithy/fetch-http-handler" "^5.0.4" - "@smithy/node-http-handler" "^4.0.6" - "@smithy/types" "^4.3.1" - "@smithy/util-base64" "^4.0.0" - "@smithy/util-buffer-from" "^4.0.0" - "@smithy/util-hex-encoding" "^4.0.0" - "@smithy/util-utf8" "^4.0.0" - tslib "^2.6.2" - "@smithy/util-stream@^4.2.3": version "4.2.3" resolved "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.3.tgz" @@ -6239,18 +5759,18 @@ resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz" integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== dependencies: - "@smithy/util-buffer-from" "^2.2.0" tslib "^2.6.2" + "@smithy/util-buffer-from" "^2.2.0" "@smithy/util-utf8@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz" integrity sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow== dependencies: - "@smithy/util-buffer-from" "^4.0.0" tslib "^2.6.2" + "@smithy/util-buffer-from" "^4.0.0" -"@smithy/util-waiter@^4.0.5", "@smithy/util-waiter@^4.0.6": +"@smithy/util-waiter@^4.0.6": version "4.0.6" resolved "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.0.6.tgz" integrity sha512-slcr1wdRbX7NFphXZOxtxRNA7hXAAtJAXJDE/wdoMAos27SIquVCKiSqfB6/28YzQ8FCsB5NKkhdM5gMADbqxg== @@ -6279,11 +5799,6 @@ resolved "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz" integrity sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g== -"@swc/counter@0.1.3": - version "0.1.3" - resolved "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - "@swc/helpers@0.5.15": version "0.5.15" resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz" @@ -6315,47 +5830,47 @@ resolved "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.1.11.tgz" integrity sha512-7RAFOrVaXCFz5ooEG36Kbh+sMJiI2j4+Ozp71smgjnLfBRu7DTfoq8DsTvzse2/6nDeo2M3vS/FGaxfDgr3rtQ== dependencies: - "@parcel/watcher" "^2.5.1" - "@tailwindcss/node" "4.1.11" - "@tailwindcss/oxide" "4.1.11" - enhanced-resolve "^5.18.1" mri "^1.2.0" picocolors "^1.1.1" tailwindcss "4.1.11" + "@parcel/watcher" "^2.5.1" + enhanced-resolve "^5.18.1" + "@tailwindcss/node" "4.1.11" + "@tailwindcss/oxide" "4.1.11" "@tailwindcss/node@4.1.11": version "4.1.11" resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz" integrity sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q== dependencies: - "@ampproject/remapping" "^2.3.0" - enhanced-resolve "^5.18.1" jiti "^2.4.2" + tailwindcss "4.1.11" lightningcss "1.30.1" magic-string "^0.30.17" source-map-js "^1.2.1" - tailwindcss "4.1.11" + enhanced-resolve "^5.18.1" + "@ampproject/remapping" "^2.3.0" "@tailwindcss/oxide@4.1.11": version "4.1.11" resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz" integrity sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg== + dependencies: + tar "^7.4.3" + detect-libc "^2.0.4" optionalDependencies: - "@tailwindcss/oxide-android-arm64" "4.1.11" - "@tailwindcss/oxide-darwin-arm64" "4.1.11" "@tailwindcss/oxide-darwin-x64" "4.1.11" "@tailwindcss/oxide-freebsd-x64" "4.1.11" - "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.11" - "@tailwindcss/oxide-linux-arm64-gnu" "4.1.11" - "@tailwindcss/oxide-linux-arm64-musl" "4.1.11" + "@tailwindcss/oxide-wasm32-wasi" "4.1.11" + "@tailwindcss/oxide-darwin-arm64" "4.1.11" + "@tailwindcss/oxide-android-arm64" "4.1.11" "@tailwindcss/oxide-linux-x64-gnu" "4.1.11" "@tailwindcss/oxide-linux-x64-musl" "4.1.11" - "@tailwindcss/oxide-wasm32-wasi" "4.1.11" - "@tailwindcss/oxide-win32-arm64-msvc" "4.1.11" "@tailwindcss/oxide-win32-x64-msvc" "4.1.11" - dependencies: - detect-libc "^2.0.4" - tar "^7.4.3" + "@tailwindcss/oxide-linux-arm64-gnu" "4.1.11" + "@tailwindcss/oxide-linux-arm64-musl" "4.1.11" + "@tailwindcss/oxide-win32-arm64-msvc" "4.1.11" + "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.11" "@tailwindcss/oxide-android-arm64@4.1.11": version "4.1.11" @@ -6407,12 +5922,12 @@ resolved "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz" integrity sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g== dependencies: + tslib "^2.8.0" "@emnapi/core" "^1.4.3" "@emnapi/runtime" "^1.4.3" + "@tybys/wasm-util" "^0.9.0" "@emnapi/wasi-threads" "^1.0.2" "@napi-rs/wasm-runtime" "^0.2.11" - "@tybys/wasm-util" "^0.9.0" - tslib "^2.8.0" "@tailwindcss/oxide-win32-arm64-msvc@4.1.11": version "4.1.11" @@ -6429,33 +5944,33 @@ resolved "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz" integrity sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA== dependencies: + postcss "^8.4.41" + tailwindcss "4.1.11" "@alloc/quick-lru" "^5.2.0" "@tailwindcss/node" "4.1.11" "@tailwindcss/oxide" "4.1.11" - postcss "^8.4.41" - tailwindcss "4.1.11" "@tailwindcss/typography@^0.5.16": version "0.5.16" resolved "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz" integrity sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA== dependencies: + lodash.merge "^4.6.2" lodash.castarray "^4.4.0" lodash.isplainobject "^4.0.6" - lodash.merge "^4.6.2" postcss-selector-parser "6.0.10" -"@tanstack/query-core@5.81.2": - version "5.81.2" - resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.81.2.tgz" - integrity sha512-QLYkPdrudoMATDFa3MiLEwRhNnAlzHWDf0LKaXUqJd0/+QxN8uTPi7bahRlxoAyH0UbLMBdeDbYzWALj7THOtw== +"@tanstack/query-core@5.83.0": + version "5.83.0" + resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.83.0.tgz" + integrity sha512-0M8dA+amXUkyz5cVUm/B+zSk3xkQAcuXuz5/Q/LveT4ots2rBpPTZOzd7yJa2Utsf8D2Upl5KyjhHRY+9lB/XA== "@tanstack/react-query@^5.17.15", "@tanstack/react-query@^5.74.4": - version "5.81.2" - resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.81.2.tgz" - integrity sha512-pe8kFlTrL2zFLlcAj2kZk9UaYYHDk9/1hg9EBaoO3cxDhOZf1FRGJeziSXKrVZyxIfs7b3aoOj/bw7Lie0mDUg== + version "5.83.0" + resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.83.0.tgz" + integrity sha512-/XGYhZ3foc5H0VM2jLSD/NyBRIOK4q9kfeml4+0x2DlL6xVuAcVEW+hTlTapAmejObg0i3eNqhkr2dT+eciwoQ== dependencies: - "@tanstack/query-core" "5.81.2" + "@tanstack/query-core" "5.83.0" "@tanstack/react-table@^8.21.3": version "8.21.3" @@ -6465,35 +5980,35 @@ "@tanstack/table-core" "8.21.3" "@tanstack/react-virtual@^3.0.0-beta.18", "@tanstack/react-virtual@^3.13.8": - version "3.13.11" - resolved "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.11.tgz" - integrity sha512-u5EaOSJOq08T9NXFuDopMdxZBNDFuEMohIFFU45fBYDXXh9SjYdbpNq1OLFSOpQnDRPjqgmY96ipZTkzom9t9Q== + version "3.13.12" + resolved "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.13.12.tgz" + integrity sha512-Gd13QdxPSukP8ZrkbgS2RwoZseTTbQPLnQEn7HY/rqtM+8Zt95f7xKC7N0EsKs7aoz0WzZ+fditZux+F8EzYxA== dependencies: - "@tanstack/virtual-core" "3.13.11" + "@tanstack/virtual-core" "3.13.12" "@tanstack/table-core@8.21.3": version "8.21.3" resolved "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.21.3.tgz" integrity sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg== -"@tanstack/virtual-core@3.13.11": - version "3.13.11" - resolved "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.11.tgz" - integrity sha512-ORL6UyuZJ0D9X33LDR4TcgcM+K2YiS2j4xbvH1vnhhObwR1Z4dKwPTL/c0kj2Yeb4Yp2lBv1wpyVaqlohk8zpg== +"@tanstack/virtual-core@3.13.12": + version "3.13.12" + resolved "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.13.12.tgz" + integrity sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA== "@testing-library/dom@^10.0.0", "@testing-library/dom@^10.4.0": version "10.4.0" resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz" integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/runtime" "^7.12.5" - "@types/aria-query" "^5.0.1" - aria-query "5.3.0" chalk "^4.1.0" - dom-accessibility-api "^0.5.9" lz-string "^1.5.0" + aria-query "5.3.0" pretty-format "^27.0.2" + "@babel/runtime" "^7.12.5" + "@babel/code-frame" "^7.10.4" + "@types/aria-query" "^5.0.1" + dom-accessibility-api "^0.5.9" "@testing-library/jest-dom@^6.6.3": version "6.6.3" @@ -6516,14 +6031,14 @@ "@babel/runtime" "^7.12.5" "@tiptap/core@^2.14.0", "@tiptap/core@^2.7.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/core/-/core-2.22.3.tgz" - integrity sha512-czyBPXZG/ZFyObZEF1kyusGf58Ai3X8TnaxlUUn3gqLLWPy0idXZg85NETCidzi/gAxWxL9j6Pcy+zwS4pbZYQ== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/core/-/core-2.26.1.tgz" + integrity sha512-fymyd/XZvYiHjBoLt1gxs024xP/LY26d43R1vluYq7AHBL/7DE3ywzy+1GEsGyAv5Je2L0KBhNIR/izbq3Kaqg== "@tiptap/extension-blockquote@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.22.3.tgz" - integrity sha512-HvTXvqeGaANg0owk0Xxkgyc4lJMO5CZES2Lc3JJp8u5kV+HZIwd78eJ7fbKBMtkpKb4zOk4xQsHQ/TuhghJaeA== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-2.26.1.tgz" + integrity sha512-viQ6AHRhjCYYipKK6ZepBzwZpkuMvO9yhRHeUZDvlSOAh8rvsUTSre0y74nu8QRYUt4a44lJJ6BpphJK7bEgYA== "@tiptap/extension-bold@2.14.0", "@tiptap/extension-bold@^2.14.0": version "2.14.0" @@ -6531,16 +6046,16 @@ integrity sha512-8DWwelH55H8KtLECSIv0wh8x/F/6lpagV/pMvT+Azujad0oqK+1iAPKU/kLgjXbFSkisrpV6KSwQts5neCtfRQ== "@tiptap/extension-bubble-menu@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.22.3.tgz" - integrity sha512-8iQLNrRf3iBPKqI3dQnfvMxMfgp6y9TAbO803LihvzbIGqBaX264ES7fHtoyFIIeVjy2xFruVsTZCZofWTupGg== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.26.1.tgz" + integrity sha512-oHevUcZbTMFOTpdCEo4YEDe044MB4P1ZrWyML8CGe5tnnKdlI9BN03AXpI1mEEa5CA3H1/eEckXx8EiCgYwQ3Q== dependencies: tippy.js "^6.3.7" "@tiptap/extension-bullet-list@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.22.3.tgz" - integrity sha512-SYvLIxqmuV0kTj4/3ZFlnZ1fr9Y233qX00BKuIpGnczeFsWQmzBJo8vGm3d1IlKPCQN+jTRtDdDE1aSum8Kv2w== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-2.26.1.tgz" + integrity sha512-HHakuV4ckYCDOnBbne088FvCEP4YICw+wgPBz/V2dfpiFYQ4WzT0LPK9s7OFMCN+ROraoug+1ryN1Z1KdIgujQ== "@tiptap/extension-character-count@2.14.0": version "2.14.0" @@ -6548,14 +6063,14 @@ integrity sha512-aTCobbF9yIXOntVTdjzJ4G5V0TJKeeIDW8RFMdTVr5o0R/woSZ27cXiPGdS7XxpN6gY9vlNzYe79CcNBDTzLfA== "@tiptap/extension-code@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.22.3.tgz" - integrity sha512-s+W6jHezq+n9cC40xZ3hZF6cGGSl+fBELik1b2x8+cb0WoIlqmcdWin1dgeMNrWlRZUw1aD2DNwy/PdXI5vn2g== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-2.26.1.tgz" + integrity sha512-GU9deB1A/Tr4FMPu71CvlcjGKwRhGYz60wQ8m4aM+ELZcVIcZRa1ebR8bExRIEWnvRztQuyRiCQzw2N0xQJ1QQ== "@tiptap/extension-code-block@^2.14.0", "@tiptap/extension-code-block@^2.7.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.22.3.tgz" - integrity sha512-twPCBpb/ygNixlSBAXgvfo+t56Ucpb8lvPDiZn+cH8OjmmO0ayBoSfSrjKWgaEWGPcXBrFAfsBRbYHyoHj7pXg== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-2.26.1.tgz" + integrity sha512-/TDDOwONl0qEUc4+B6V9NnWtSjz95eg7/8uCb8Y8iRbGvI9vT4/znRKofFxstvKmW4URu/H74/g0ywV57h0B+A== "@tiptap/extension-code-block-lowlight@2.14.0": version "2.14.0" @@ -6563,36 +6078,36 @@ integrity sha512-jGcVOkcThwzLdXf56zYkmB0tcB8Xy3S+ImS3kDzaccdem6qCG05JeE33K8bfPqh99OU1QqO9XdHNO9x77A2jug== "@tiptap/extension-document@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.22.3.tgz" - integrity sha512-7MnILbhRZRyROlMUgyntzRZ/EZlqNB8fO761RNjJxR2WMb49R4yc04fz7/+f/QH/hwxoS13bKfsNUDAsDxA5Aw== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-2.26.1.tgz" + integrity sha512-2P2IZp1NRAE+21mRuFBiP3X2WKfZ6kUC23NJKpn8bcOamY3obYqCt0ltGPhE4eR8n8QAl2fI/3jIgjR07dC8ow== "@tiptap/extension-dropcursor@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.22.3.tgz" - integrity sha512-yQxSfTWjdUQS+bh6KiNLR9KIMsn1SElzycQe4XE+0eoaetapGtKqxfwkTbbQdNgQOU5wQG1KOda221mnPvkpAA== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-2.26.1.tgz" + integrity sha512-JkDQU2ZYFOuT5mNYb8OiWGwD1HcjbtmX8tLNugQbToECmz9WvVPqJmn7V/q8VGpP81iEECz/IsyRmuf2kSD4uA== "@tiptap/extension-floating-menu@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.22.3.tgz" - integrity sha512-GeJRRdulxpwsshxzBkpOf/xJkLD2fa+49o+3FqRCmrm7AioC8oUcZZmzuzjLj5a3ZNGKPuJ9xxDkYWUjH4tE1g== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-floating-menu/-/extension-floating-menu-2.26.1.tgz" + integrity sha512-OJF+H6qhQogVTMedAGSWuoL1RPe3LZYXONuFCVyzHnvvMpK+BP1vm180E2zDNFnn/DVA+FOrzNGpZW7YjoFH1w== dependencies: tippy.js "^6.3.7" "@tiptap/extension-gapcursor@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.22.3.tgz" - integrity sha512-6Q8TLL4PVGcZLn27eQazCC+be8LP8uzuz5Z5e4TpIeswPAju49cerQOdEGNFKkuYv/FelWIhXNtkWFMf4eSmyw== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-2.26.1.tgz" + integrity sha512-KOiMZc3PwJS3hR0nSq5d0TJi2jkNZkLZElcT6pCEnhRHzPH6dRMu9GM5Jj798ZRUy0T9UFcKJalFZaDxnmRnpg== "@tiptap/extension-hard-break@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.22.3.tgz" - integrity sha512-tbEji/V4Za3UhxYwB36amYhyonwe5j66iYTNRWzgjNixjrcGDbWk6cfaF9jMAgPgIDBmmtQLJY+moKskwgpnZg== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-2.26.1.tgz" + integrity sha512-d6uStdNKi8kjPlHAyO59M6KGWATNwhLCD7dng0NXfwGndc22fthzIk/6j9F6ltQx30huy5qQram6j3JXwNACoA== "@tiptap/extension-heading@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.22.3.tgz" - integrity sha512-+MexJD+kXtNwMDbNTFa7jCFipx1DqAdT+n9GgInqebAN9bK+CWjC+SskzZNRqeMrQ0Er7QTsi6YC09M+74sevA== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-2.26.1.tgz" + integrity sha512-KSzL8WZV3pjJG9ke4RaU70+B5UlYR2S6olNt5UCAawM+fi11mobVztiBoC19xtpSVqIXC1AmXOqUgnuSvmE4ZA== "@tiptap/extension-highlight@2.22.3": version "2.22.3" @@ -6600,14 +6115,14 @@ integrity sha512-cdPSeQ3QcThhJdzkjK9a1871uPQjwmOf0WzTGW33lJyJDQHypWIRNUus56c3pGA7BgV9P59QW7Fm8rDnM8XkbA== "@tiptap/extension-history@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.22.3.tgz" - integrity sha512-F9sC45zPw7vbjKrwSKuSLZ0ODyc/X3bGPeCa6HYLEHKfgqsdt2v2fQLvxjpmlwO2ZMrnkBkg76KDxHfVyrZ2zQ== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-history/-/extension-history-2.26.1.tgz" + integrity sha512-m6YR1gkkauIDo3PRl0gP+7Oc4n5OqDzcjVh6LvWREmZP8nmi94hfseYbqOXUb6RPHIc0JKF02eiRifT4MSd2nw== "@tiptap/extension-horizontal-rule@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.22.3.tgz" - integrity sha512-3GvY798p9pCXUBbCebIdSmi1q80l7VZz/B6NN4uUMQ9iwxWopd8yaZ0O7xx2hM2UBzPEtY3M4FAhhpYUTXNFgQ== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.26.1.tgz" + integrity sha512-mT6baqOhs/NakgrAeDeed194E/ZJFGL692H0C7f1N7WDRaWxUu2oR0LrnRqSH5OyPjELkzu6nQnNy0+0tFGHHg== "@tiptap/extension-image@2.14.0": version "2.14.0" @@ -6615,9 +6130,9 @@ integrity sha512-pYCUzZBgsxIvVGTzuW03cPz6PIrAo26xpoxqq4W090uMVoK0SgY5W5y0IqCdw4QyLkJ2/oNSFNc2EP9jVi1CcQ== "@tiptap/extension-italic@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.22.3.tgz" - integrity sha512-W/rQDo7qFL7MfwfaYEcdtbk862fOmBv30qIEwVdqElBye7BFJYKtRuWBzNbG2BwKanjwMbVc/tBXF5W1sqfT7Q== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-2.26.1.tgz" + integrity sha512-pOs6oU4LyGO89IrYE4jbE8ZYsPwMMIiKkYfXcfeD9NtpGNBnjeVXXF5I9ndY2ANrCAgC8k58C3/powDRf0T2yA== "@tiptap/extension-link@2.14.0": version "2.14.0" @@ -6627,19 +6142,19 @@ linkifyjs "^4.2.0" "@tiptap/extension-list-item@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.22.3.tgz" - integrity sha512-B7Fze+eM1sYbGOZtDDAwAivnj1ow2wN5RqaQPC1la3wdTK4Wgp7bdzGjvUbrN6gp3zMFCEWlqP2toc/mRAHCtA== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-2.26.1.tgz" + integrity sha512-quOXckC73Luc3x+Dcm88YAEBW+Crh3x5uvtQOQtn2GEG91AshrvbnhGRiYnfvEN7UhWIS+FYI5liHFcRKSUKrQ== "@tiptap/extension-ordered-list@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.22.3.tgz" - integrity sha512-pHGkuZhV/uAAHI9vzk/lpAkbdpMT4wUR1FI17/GE3zNrogfzx0VopCQrXq4+sQVsLUW4I6Cj6VeBjm9wB6qlIw== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-2.26.1.tgz" + integrity sha512-UHKNRxq6TBnXMGFSq91knD6QaHsyyOwLOsXMzupmKM5Su0s+CRXEjfav3qKlbb9e4m7D7S/a0aPm8nC9KIXNhQ== "@tiptap/extension-paragraph@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.22.3.tgz" - integrity sha512-TYvgS7CweNFo/xVxsKWSt0wnm46Y8OtsfDSjnLbSC4Pj4ZNa6PU3zpvDTW+UxYakr+8zIPvI2WgLBkyTHq6oQA== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-2.26.1.tgz" + integrity sha512-UezvM9VDRAVJlX1tykgHWSD1g3MKfVMWWZ+Tg+PE4+kizOwoYkRWznVPgCAxjmyHajxpCKRXgqTZkOxjJ9Kjzg== "@tiptap/extension-placeholder@2.14.0": version "2.14.0" @@ -6647,29 +6162,29 @@ integrity sha512-xzfjHvuukbch4i5O/5uyS2K2QgNEaMKi6e6GExTTgVwnFjKfJmgTqee33tt5JCqSItBvtSZlU3SX/vpiaIof+w== "@tiptap/extension-strike@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.22.3.tgz" - integrity sha512-I+s2Csw2cTHae2vFJiojnHK+NnQjDr6441mSlAd+e7kEly1kjZ4g7J+JMj02ajNQhr/ob8/hb5r6EdIyv2xtoA== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-2.26.1.tgz" + integrity sha512-CkoRH+pAi6MgdCh7K0cVZl4N2uR4pZdabXAnFSoLZRSg6imLvEUmWHfSi1dl3Z7JOvd3a4yZ4NxerQn5MWbJ7g== "@tiptap/extension-table@^2.22.3": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-2.22.3.tgz" - integrity sha512-lYTuDo/3lJsC6g85b5OCfrKi8yID82PnZlngZo4quVHusE/YuXOwXYD4qt3xEOoqdgFoPQl0b7Ck9C5Qyb8AUg== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-table/-/extension-table-2.26.1.tgz" + integrity sha512-LQ63CK53qx2ZsbLTB4mUX0YCoGC0GbYQ82jS3kD+K7M/mb9MCkefvDk6rA8rXF8TjfGnv6o/Fseoot8uhH3qfg== "@tiptap/extension-table-cell@^2.22.3": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.22.3.tgz" - integrity sha512-Yj6/bd4QpKoQpNTi/eNnWpT+VMfTBB7SfCPjlMvTK1MFVr60fmbUjJHrjt2WAfTW2JmkQlLsP8UXjR+Bda+uTA== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-table-cell/-/extension-table-cell-2.26.1.tgz" + integrity sha512-0P5zY+WGFnULggJkX6+CevmFoBmVv1aUiBBXfcFuLG2mnUsS3QALQTowFtz/0/VbtbjzcOSStaGDHRJxPbk9XQ== "@tiptap/extension-table-header@^2.22.3": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.22.3.tgz" - integrity sha512-bLq/lufV95fp9gXMjOKMuuhpAa2+t0vi8dz4Zxwnrr1dsvkk4TyiKWRyuI3OV+TCNzZ3hZqOlEStS+Ie6lB/Lg== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-table-header/-/extension-table-header-2.26.1.tgz" + integrity sha512-SAwTW9H+sjVYjoeU5z8pVDMHn3r3FCi+zp2KAxsEsmujcd7qrQdY0cAjQtWjckCq6H3sQkbICa+xlCCd7C8ZAQ== "@tiptap/extension-table-row@^2.22.3": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.22.3.tgz" - integrity sha512-PQbrDIyGOHrsN3RmB+J75UJ10lGW7I4PqY+E2HUtx5HvFOEVPlBbcFELMfjy7dOPbKiM+v6KUSbybXW8h745mg== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-table-row/-/extension-table-row-2.26.1.tgz" + integrity sha512-c4oLrUfj1EVVDpbfKX36v7nnaeI4NxML2KRTQXocvcY65VCe0bPQh8ujpPgPcnKEzdWYdIuAX9RbEAkiYWe8Ww== "@tiptap/extension-task-item@2.22.3": version "2.22.3" @@ -6682,9 +6197,9 @@ integrity sha512-o2VELXgkDIHS15pnF1W2OFfxZGvo9V6RcwjzCYUS0mqMF9TTbfHwddRcv4t3pifpMO3sWhspVARavJAGaP5zdQ== "@tiptap/extension-text@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.22.3.tgz" - integrity sha512-07cymWkPTfq6nuum88Yf90YYArbowed8nNiu0Tw3jCvwpzf9J9TDaovT+LAKuSKtrOsnNpFB/9IqUwFxZepOGw== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-2.26.1.tgz" + integrity sha512-p2n8WVMd/2vckdJlol24acaTDIZAhI7qle5cM75bn01sOEZoFlSw6SwINOULrUCzNJsYb43qrLEibZb4j2LeQw== "@tiptap/extension-text-align@2.22.3": version "2.22.3" @@ -6692,9 +6207,9 @@ integrity sha512-UZ8803BOrHLHSNFfooqgkm2AQsaK/7eE1deQGSazxft89KksAv1kZkEKFypOE8yw85Bg2NHH2Lp6n4tyz2n6/g== "@tiptap/extension-text-style@^2.14.0": - version "2.22.3" - resolved "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.22.3.tgz" - integrity sha512-M3FLOUPcO8fR+rM97mR2gQ54KFkdlAUQtEPKQpO1f312gtcVdBNxgq0WgqTnBY7thWLyqQSKiAsL6y88+JddSA== + version "2.26.1" + resolved "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-2.26.1.tgz" + integrity sha512-t9Nc/UkrbCfnSHEUi1gvUQ2ZPzvfdYFT5TExoV2DTiUCkhG6+mecT5bTVFGW3QkPmbToL+nFhGn4ZRMDD0SP3Q== "@tiptap/extension-typography@2.14.0": version "2.14.0" @@ -6711,62 +6226,62 @@ resolved "https://registry.npmjs.org/@tiptap/pm/-/pm-2.22.3.tgz" integrity sha512-uWPeIScnpQVCYdTnL140XgcvbT1qH288CstMJ6S0Y11lC5PclPK9CxfAipsqgWWrIK7yatxKUVCg6TzfG9zpmA== dependencies: - prosemirror-changeset "^2.3.0" + prosemirror-menu "^1.2.4" + prosemirror-view "^1.37.0" + prosemirror-model "^1.23.0" + prosemirror-state "^1.4.3" prosemirror-collab "^1.3.1" + prosemirror-keymap "^1.2.2" + prosemirror-tables "^1.6.4" + prosemirror-history "^1.4.1" prosemirror-commands "^1.6.2" - prosemirror-dropcursor "^1.8.1" + prosemirror-markdown "^1.13.1" + prosemirror-changeset "^2.3.0" prosemirror-gapcursor "^1.3.2" - prosemirror-history "^1.4.1" + prosemirror-transform "^1.10.2" + prosemirror-dropcursor "^1.8.1" prosemirror-inputrules "^1.4.0" - prosemirror-keymap "^1.2.2" - prosemirror-markdown "^1.13.1" - prosemirror-menu "^1.2.4" - prosemirror-model "^1.23.0" - prosemirror-schema-basic "^1.2.3" prosemirror-schema-list "^1.4.1" - prosemirror-state "^1.4.3" - prosemirror-tables "^1.6.4" + prosemirror-schema-basic "^1.2.3" prosemirror-trailing-node "^3.0.0" - prosemirror-transform "^1.10.2" - prosemirror-view "^1.37.0" "@tiptap/react@2.14.0": version "2.14.0" resolved "https://registry.npmjs.org/@tiptap/react/-/react-2.14.0.tgz" integrity sha512-6mtksbT2+EWXFLdHVFag9PSoh0GXPmL97Cm+4sJoyECUmBkAyoErapAccmZIljyMaVIHBYpYkNdp9Pw1B73ezw== dependencies: - "@tiptap/extension-bubble-menu" "^2.14.0" - "@tiptap/extension-floating-menu" "^2.14.0" - "@types/use-sync-external-store" "^0.0.6" fast-deep-equal "^3" use-sync-external-store "^1" + "@tiptap/extension-bubble-menu" "^2.14.0" + "@types/use-sync-external-store" "^0.0.6" + "@tiptap/extension-floating-menu" "^2.14.0" "@tiptap/starter-kit@2.14.0": version "2.14.0" resolved "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.14.0.tgz" integrity sha512-Z1bKAfHl14quRI3McmdU+bs675jp6/iexEQTI9M9oHa6l3McFF38g9N3xRpPPX02MX83DghsUPupndUW/yJvEQ== dependencies: + "@tiptap/pm" "^2.14.0" "@tiptap/core" "^2.14.0" - "@tiptap/extension-blockquote" "^2.14.0" "@tiptap/extension-bold" "^2.14.0" - "@tiptap/extension-bullet-list" "^2.14.0" "@tiptap/extension-code" "^2.14.0" - "@tiptap/extension-code-block" "^2.14.0" - "@tiptap/extension-document" "^2.14.0" - "@tiptap/extension-dropcursor" "^2.14.0" - "@tiptap/extension-gapcursor" "^2.14.0" - "@tiptap/extension-hard-break" "^2.14.0" + "@tiptap/extension-text" "^2.14.0" + "@tiptap/extension-italic" "^2.14.0" + "@tiptap/extension-strike" "^2.14.0" "@tiptap/extension-heading" "^2.14.0" "@tiptap/extension-history" "^2.14.0" - "@tiptap/extension-horizontal-rule" "^2.14.0" - "@tiptap/extension-italic" "^2.14.0" + "@tiptap/extension-document" "^2.14.0" + "@tiptap/extension-gapcursor" "^2.14.0" "@tiptap/extension-list-item" "^2.14.0" - "@tiptap/extension-ordered-list" "^2.14.0" "@tiptap/extension-paragraph" "^2.14.0" - "@tiptap/extension-strike" "^2.14.0" - "@tiptap/extension-text" "^2.14.0" + "@tiptap/extension-blockquote" "^2.14.0" + "@tiptap/extension-code-block" "^2.14.0" + "@tiptap/extension-dropcursor" "^2.14.0" + "@tiptap/extension-hard-break" "^2.14.0" "@tiptap/extension-text-style" "^2.14.0" - "@tiptap/pm" "^2.14.0" + "@tiptap/extension-bullet-list" "^2.14.0" + "@tiptap/extension-ordered-list" "^2.14.0" + "@tiptap/extension-horizontal-rule" "^2.14.0" "@tiptap/suggestion@2.14.0": version "2.14.0" @@ -6783,70 +6298,70 @@ resolved "https://registry.npmjs.org/@trigger.dev/build/-/build-3.3.17.tgz" integrity sha512-dfreMuVeLAcZypS3kkUA9nWNviiuOPIQ3ldy2ywPCmwmbHyd0BE8tI5D3A4kmVq/f53TdRMls4c+cYafxlwubQ== dependencies: - "@trigger.dev/core" "3.3.17" + tsconfck "3.1.3" pkg-types "^1.1.3" tinyglobby "^0.2.2" - tsconfck "3.1.3" + "@trigger.dev/core" "3.3.17" "@trigger.dev/core@3.3.17", "@trigger.dev/core@^3.3.17": version "3.3.17" resolved "https://registry.npmjs.org/@trigger.dev/core/-/core-3.3.17.tgz" integrity sha512-KjnRxCuHq4R+MnE0zPvIQ7EIz4QSpJL+1Yn74n2cCGjyHYgQ/g8rcARn0Nxf2s8jzE38CnyRufjUrwG8k+DJrw== dependencies: - "@electric-sql/client" "1.0.0-beta.1" - "@google-cloud/precise-date" "^4.0.0" + zod "3.23.8" + jose "^5.4.0" + execa "^8.0.1" + dequal "^2.0.3" + nanoid "^3.3.4" + superjson "^2.2.1" + zod-error "1.5.0" + eventsource "^3.0.5" "@jsonhero/path" "^1.0.21" + socket.io-client "4.7.5" + humanize-duration "^3.27.3" "@opentelemetry/api" "1.9.0" + eventsource-parser "^3.0.0" + "@electric-sql/client" "1.0.0-beta.1" + zod-validation-error "^1.5.0" "@opentelemetry/api-logs" "0.52.1" - "@opentelemetry/exporter-logs-otlp-http" "0.52.1" - "@opentelemetry/exporter-trace-otlp-http" "0.52.1" - "@opentelemetry/instrumentation" "0.52.1" - "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-logs" "0.52.1" "@opentelemetry/sdk-node" "0.52.1" + "@opentelemetry/resources" "1.25.1" + "@google-cloud/precise-date" "^4.0.0" "@opentelemetry/sdk-trace-base" "1.25.1" "@opentelemetry/sdk-trace-node" "1.25.1" + "@opentelemetry/instrumentation" "0.52.1" "@opentelemetry/semantic-conventions" "1.25.1" - dequal "^2.0.3" - eventsource "^3.0.5" - eventsource-parser "^3.0.0" - execa "^8.0.1" - humanize-duration "^3.27.3" - jose "^5.4.0" - nanoid "^3.3.4" - socket.io-client "4.7.5" - superjson "^2.2.1" - zod "3.23.8" - zod-error "1.5.0" - zod-validation-error "^1.5.0" + "@opentelemetry/exporter-logs-otlp-http" "0.52.1" + "@opentelemetry/exporter-trace-otlp-http" "0.52.1" "@trigger.dev/react-hooks@3.3.17": version "3.3.17" resolved "https://registry.npmjs.org/@trigger.dev/react-hooks/-/react-hooks-3.3.17.tgz" integrity sha512-1icVcYE7fuoB912KjeUxeTBiKygW82sy1XIWsYhEr6qyj7LcmfNzkNuL4qUdbqgcwJD0z91eKskRmd7MkjQrDg== dependencies: - "@trigger.dev/core" "^3.3.17" swr "^2.2.5" + "@trigger.dev/core" "^3.3.17" "@trigger.dev/sdk@3.3.17": version "3.3.17" resolved "https://registry.npmjs.org/@trigger.dev/sdk/-/sdk-3.3.17.tgz" integrity sha512-wjIjlQWKybYWw/J7LxFIOO1pXzxXoj9lxbFMvjb51JtfebxnQnh6aExN47nOGhVhV38wHYstfBI/8ClWwBnFYw== dependencies: - "@opentelemetry/api" "1.9.0" - "@opentelemetry/api-logs" "0.52.1" - "@opentelemetry/semantic-conventions" "1.25.1" - "@trigger.dev/core" "3.3.17" - chalk "^5.2.0" - cronstrue "^2.21.0" - debug "^4.3.4" + ws "^8.11.0" evt "^2.4.13" slug "^6.0.0" - terminal-link "^3.0.0" ulid "^2.3.0" - uncrypto "^0.1.3" uuid "^9.0.0" - ws "^8.11.0" + chalk "^5.2.0" + debug "^4.3.4" + uncrypto "^0.1.3" + cronstrue "^2.21.0" + terminal-link "^3.0.0" + "@trigger.dev/core" "3.3.17" + "@opentelemetry/api" "1.9.0" + "@opentelemetry/api-logs" "0.52.1" + "@opentelemetry/semantic-conventions" "1.25.1" "@tsconfig/node10@^1.0.7": version "1.0.11" @@ -6878,8 +6393,8 @@ resolved "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz" integrity sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg== dependencies: - "@tufjs/canonical-json" "2.0.0" minimatch "^9.0.4" + "@tufjs/canonical-json" "2.0.0" "@tufjs/models@3.0.1": version "3.0.1" @@ -6901,6 +6416,13 @@ dependencies: tslib "^2.4.0" +"@tybys/wasm-util@^0.10.0": + version "0.10.0" + resolved "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz" + integrity sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ== + dependencies: + tslib "^2.4.0" + "@types/archiver@^6.0.3": version "6.0.3" resolved "https://registry.npmjs.org/@types/archiver/-/archiver-6.0.3.tgz" @@ -6923,11 +6445,11 @@ resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: - "@babel/parser" "^7.20.7" "@babel/types" "^7.20.7" - "@types/babel__generator" "*" + "@babel/parser" "^7.20.7" "@types/babel__template" "*" "@types/babel__traverse" "*" + "@types/babel__generator" "*" "@types/babel__generator@*": version "7.27.0" @@ -6941,8 +6463,8 @@ resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: - "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" + "@babel/parser" "^7.1.0" "@types/babel__traverse@*": version "7.20.7" @@ -6956,25 +6478,25 @@ resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz" integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== dependencies: - "@types/connect" "*" "@types/node" "*" + "@types/connect" "*" "@types/bun@^1.2.15": - version "1.2.17" - resolved "https://registry.npmjs.org/@types/bun/-/bun-1.2.17.tgz" - integrity sha512-l/BYs/JYt+cXA/0+wUhulYJB6a6p//GTPiJ7nV+QHa8iiId4HZmnu/3J/SowP5g0rTiERY2kfGKXEK5Ehltx4Q== + version "1.2.19" + resolved "https://registry.npmjs.org/@types/bun/-/bun-1.2.19.tgz" + integrity sha512-d9ZCmrH3CJ2uYKXQIUuZ/pUnTqIvLDS0SK7pFmbx8ma+ziH/FRMoAq5bYpRG7y+w1gl+HgyNZbtqgMq4W4e2Lg== dependencies: - bun-types "1.2.17" + bun-types "1.2.19" "@types/cacheable-request@^6.0.1": version "6.0.3" resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz" integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== dependencies: - "@types/http-cache-semantics" "*" "@types/keyv" "^3.1.4" "@types/node" "*" "@types/responselike" "^1.0.0" + "@types/http-cache-semantics" "*" "@types/canvas-confetti@^1.9.0": version "1.9.0" @@ -7014,36 +6536,36 @@ resolved "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz" integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== dependencies: - "@types/d3-array" "*" + "@types/d3-dsv" "*" + "@types/d3-geo" "*" "@types/d3-axis" "*" - "@types/d3-brush" "*" - "@types/d3-chord" "*" - "@types/d3-color" "*" - "@types/d3-contour" "*" - "@types/d3-delaunay" "*" - "@types/d3-dispatch" "*" "@types/d3-drag" "*" - "@types/d3-dsv" "*" "@types/d3-ease" "*" + "@types/d3-path" "*" + "@types/d3-time" "*" + "@types/d3-zoom" "*" + "@types/d3-array" "*" + "@types/d3-brush" "*" + "@types/d3-chord" "*" + "@types/d3-color" "*" "@types/d3-fetch" "*" "@types/d3-force" "*" + "@types/d3-scale" "*" + "@types/d3-shape" "*" + "@types/d3-timer" "*" "@types/d3-format" "*" - "@types/d3-geo" "*" - "@types/d3-hierarchy" "*" - "@types/d3-interpolate" "*" - "@types/d3-path" "*" + "@types/d3-random" "*" + "@types/d3-contour" "*" "@types/d3-polygon" "*" + "@types/d3-delaunay" "*" + "@types/d3-dispatch" "*" "@types/d3-quadtree" "*" - "@types/d3-random" "*" - "@types/d3-scale" "*" - "@types/d3-scale-chromatic" "*" + "@types/d3-hierarchy" "*" "@types/d3-selection" "*" - "@types/d3-shape" "*" - "@types/d3-time" "*" - "@types/d3-time-format" "*" - "@types/d3-timer" "*" "@types/d3-transition" "*" - "@types/d3-zoom" "*" + "@types/d3-interpolate" "*" + "@types/d3-time-format" "*" + "@types/d3-scale-chromatic" "*" "@types/d3-array@*", "@types/d3-array@^3.0.3": version "3.2.1" @@ -7079,8 +6601,8 @@ resolved "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz" integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== dependencies: - "@types/d3-array" "*" "@types/geojson" "*" + "@types/d3-array" "*" "@types/d3-delaunay@*": version "6.0.4" @@ -7216,10 +6738,10 @@ resolved "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz" integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== dependencies: - "@types/d3-interpolate" "*" "@types/d3-selection" "*" + "@types/d3-interpolate" "*" -"@types/debug@^4.0.0", "@types/debug@^4.1.12": +"@types/debug@^4.0.0": version "4.1.12" resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== @@ -7258,20 +6780,20 @@ resolved "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz" integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" "@types/qs" "*" + "@types/body-parser" "*" "@types/serve-static" "*" + "@types/express-serve-static-core" "^4.17.33" "@types/express-serve-static-core@^4.17.33": version "4.19.6" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz" integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== dependencies: - "@types/node" "*" "@types/qs" "*" - "@types/range-parser" "*" + "@types/node" "*" "@types/send" "*" + "@types/range-parser" "*" "@types/geojson@*": version "7946.0.16" @@ -7349,17 +6871,17 @@ integrity sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q== "@types/lodash@^4.17.17": - version "4.17.19" - resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.19.tgz" - integrity sha512-NYqRyg/hIQrYPT9lbOeYc3kIRabJDn/k4qQHIXUpx88CBDww2fD15Sg5kbXlW86zm2XEW4g0QxkTI3/Kfkc7xQ== + version "4.17.20" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.20.tgz" + integrity sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA== "@types/markdown-it@^14.0.0": version "14.1.2" resolved "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz" integrity sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog== dependencies: - "@types/linkify-it" "^5" "@types/mdurl" "^2" + "@types/linkify-it" "^5" "@types/mdast@^4.0.0": version "4.0.4" @@ -7384,16 +6906,16 @@ integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node@^18.11.18": - version "18.19.112" - resolved "https://registry.npmjs.org/@types/node/-/node-18.19.112.tgz" - integrity sha512-i+Vukt9POdS/MBI7YrrkkI5fMfwFtOjphSmt4WXYLfwqsfr6z/HdCx7LqT9M7JktGob8WNgj8nFB4TbGNE4Cog== + version "18.19.120" + resolved "https://registry.npmjs.org/@types/node/-/node-18.19.120.tgz" + integrity sha512-WtCGHFXnVI8WHLxDAt5TbnCM4eSE+nI0QN2NJtwzcgMhht2eNz6V9evJrk+lwC8bCY8OWV5Ym8Jz7ZEyGnKnMA== dependencies: undici-types "~5.26.4" -"@types/node@*", "@types/node@>= 12", "@types/node@>=10.0.0", "@types/node@>=12", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^18.0.0 || >=20.0.0", "@types/node@^18.0.0 || ^20.0.0 || >=22.0.0", "@types/node@^20.19.0 || >=22.12.0", "@types/node@^24.0.3": - version "24.0.4" - resolved "https://registry.npmjs.org/@types/node/-/node-24.0.4.tgz" - integrity sha512-ulyqAkrhnuNq9pB76DRBTkcS6YsmDALy6Ua63V8OhrOBgbcYt6IOdzpw5P1+dyRIyMerzLkeYWBeOXPpA9GMAA== +"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^24.0.3": + version "24.1.0" + resolved "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz" + integrity sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w== dependencies: undici-types "~7.8.0" @@ -7402,8 +6924,8 @@ resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz" integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== dependencies: - "@types/node" "*" form-data "^4.0.0" + "@types/node" "*" "@types/normalize-package-data@^2.4.3": version "2.4.4" @@ -7435,14 +6957,14 @@ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react@*", "@types/react@>= 16", "@types/react@>=16.8", "@types/react@>=18", "@types/react@^18.0.0 || ^19.0.0", "@types/react@^19.0.0", "@types/react@^19.1.6": +"@types/react@*", "@types/react@>=18", "@types/react@^19", "@types/react@^19.1.6": version "19.1.8" resolved "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz" integrity sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g== dependencies: csstype "^3.0.2" -"@types/react-dom@*", "@types/react-dom@^18.0.0 || ^19.0.0", "@types/react-dom@^19.1.1": +"@types/react-dom@^19.1.1": version "19.1.6" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz" integrity sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw== @@ -7494,9 +7016,9 @@ resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz" integrity sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg== dependencies: - "@types/http-errors" "*" "@types/node" "*" "@types/send" "*" + "@types/http-errors" "*" "@types/shimmer@^1.0.2", "@types/shimmer@^1.2.0": version "1.2.0" @@ -7513,13 +7035,13 @@ resolved "https://registry.npmjs.org/@types/three/-/three-0.177.0.tgz" integrity sha512-/ZAkn4OLUijKQySNci47lFO+4JLE1TihEjsGWPUT+4jWqxtwOPPEwJV1C3k5MEx0mcBPCdkFjzRzDOnHEI1R+A== dependencies: - "@dimforge/rapier3d-compat" "~0.12.0" - "@tweenjs/tween.js" "~23.1.3" - "@types/stats.js" "*" + fflate "~0.8.2" "@types/webxr" "*" "@webgpu/types" "*" - fflate "~0.8.2" meshoptimizer "~0.18.1" + "@types/stats.js" "*" + "@tweenjs/tween.js" "~23.1.3" + "@dimforge/rapier3d-compat" "~0.12.0" "@types/tmp@^0.2.6": version "0.2.6" @@ -7590,77 +7112,78 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0": - version "8.35.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.35.0.tgz" - integrity sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg== + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.38.0.tgz" + integrity sha512-CPoznzpuAnIOl4nhj4tRr4gIPj5AfKgkiJmGQDaq+fQnRJTYlcBjbX3wbciGmpoPf8DREufuPRe1tNMZnGdanA== dependencies: "@eslint-community/regexpp" "^4.10.0" - "@typescript-eslint/scope-manager" "8.35.0" - "@typescript-eslint/type-utils" "8.35.0" - "@typescript-eslint/utils" "8.35.0" - "@typescript-eslint/visitor-keys" "8.35.0" + "@typescript-eslint/scope-manager" "8.38.0" + "@typescript-eslint/type-utils" "8.38.0" + "@typescript-eslint/utils" "8.38.0" + "@typescript-eslint/visitor-keys" "8.38.0" graphemer "^1.4.0" ignore "^7.0.0" natural-compare "^1.4.0" ts-api-utils "^2.1.0" -"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser@^8.35.0": - version "8.35.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.35.0.tgz" - integrity sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA== +"@typescript-eslint/parser@^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0", "@typescript-eslint/parser@^8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.38.0.tgz" + integrity sha512-Zhy8HCvBUEfBECzIl1PKqF4p11+d0aUJS1GeUiuqK9WmOug8YCmC4h4bjyBvMyAMI9sbRczmrYL5lKg/YMbrcQ== dependencies: - "@typescript-eslint/scope-manager" "8.35.0" - "@typescript-eslint/types" "8.35.0" - "@typescript-eslint/typescript-estree" "8.35.0" - "@typescript-eslint/visitor-keys" "8.35.0" + "@typescript-eslint/scope-manager" "8.38.0" + "@typescript-eslint/types" "8.38.0" + "@typescript-eslint/typescript-estree" "8.38.0" + "@typescript-eslint/visitor-keys" "8.38.0" debug "^4.3.4" -"@typescript-eslint/project-service@8.35.0": - version "8.35.0" - resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.35.0.tgz" - integrity sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ== +"@typescript-eslint/project-service@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.38.0.tgz" + integrity sha512-dbK7Jvqcb8c9QfH01YB6pORpqX1mn5gDZc9n63Ak/+jD67oWXn3Gs0M6vddAN+eDXBCS5EmNWzbSxsn9SzFWWg== dependencies: - "@typescript-eslint/tsconfig-utils" "^8.35.0" - "@typescript-eslint/types" "^8.35.0" + "@typescript-eslint/tsconfig-utils" "^8.38.0" + "@typescript-eslint/types" "^8.38.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@8.35.0": - version "8.35.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.35.0.tgz" - integrity sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA== +"@typescript-eslint/scope-manager@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.38.0.tgz" + integrity sha512-WJw3AVlFFcdT9Ri1xs/lg8LwDqgekWXWhH3iAF+1ZM+QPd7oxQ6jvtW/JPwzAScxitILUIFs0/AnQ/UWHzbATQ== dependencies: - "@typescript-eslint/types" "8.35.0" - "@typescript-eslint/visitor-keys" "8.35.0" + "@typescript-eslint/types" "8.38.0" + "@typescript-eslint/visitor-keys" "8.38.0" -"@typescript-eslint/tsconfig-utils@8.35.0", "@typescript-eslint/tsconfig-utils@^8.35.0": - version "8.35.0" - resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.35.0.tgz" - integrity sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA== +"@typescript-eslint/tsconfig-utils@8.38.0", "@typescript-eslint/tsconfig-utils@^8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.38.0.tgz" + integrity sha512-Lum9RtSE3EroKk/bYns+sPOodqb2Fv50XOl/gMviMKNvanETUuUcC9ObRbzrJ4VSd2JalPqgSAavwrPiPvnAiQ== -"@typescript-eslint/type-utils@8.35.0": - version "8.35.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.35.0.tgz" - integrity sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA== +"@typescript-eslint/type-utils@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.38.0.tgz" + integrity sha512-c7jAvGEZVf0ao2z+nnz8BUaHZD09Agbh+DY7qvBQqLiz8uJzRgVPj5YvOh8I8uEiH8oIUGIfHzMwUcGVco/SJg== dependencies: - "@typescript-eslint/typescript-estree" "8.35.0" - "@typescript-eslint/utils" "8.35.0" + "@typescript-eslint/types" "8.38.0" + "@typescript-eslint/typescript-estree" "8.38.0" + "@typescript-eslint/utils" "8.38.0" debug "^4.3.4" ts-api-utils "^2.1.0" -"@typescript-eslint/types@8.35.0", "@typescript-eslint/types@^8.35.0": - version "8.35.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.35.0.tgz" - integrity sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ== +"@typescript-eslint/types@8.38.0", "@typescript-eslint/types@^8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.38.0.tgz" + integrity sha512-wzkUfX3plUqij4YwWaJyqhiPE5UCRVlFpKn1oCRn2O1bJ592XxWJj8ROQ3JD5MYXLORW84063z3tZTb/cs4Tyw== -"@typescript-eslint/typescript-estree@8.35.0": - version "8.35.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.35.0.tgz" - integrity sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w== +"@typescript-eslint/typescript-estree@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.38.0.tgz" + integrity sha512-fooELKcAKzxux6fA6pxOflpNS0jc+nOQEEOipXFNjSlBS6fqrJOVY/whSn70SScHrcJ2LDsxWrneFoWYSVfqhQ== dependencies: - "@typescript-eslint/project-service" "8.35.0" - "@typescript-eslint/tsconfig-utils" "8.35.0" - "@typescript-eslint/types" "8.35.0" - "@typescript-eslint/visitor-keys" "8.35.0" + "@typescript-eslint/project-service" "8.38.0" + "@typescript-eslint/tsconfig-utils" "8.38.0" + "@typescript-eslint/types" "8.38.0" + "@typescript-eslint/visitor-keys" "8.38.0" debug "^4.3.4" fast-glob "^3.3.2" is-glob "^4.0.3" @@ -7668,32 +7191,32 @@ semver "^7.6.0" ts-api-utils "^2.1.0" -"@typescript-eslint/utils@8.35.0": - version "8.35.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.35.0.tgz" - integrity sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg== +"@typescript-eslint/utils@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.38.0.tgz" + integrity sha512-hHcMA86Hgt+ijJlrD8fX0j1j8w4C92zue/8LOPAFioIno+W0+L7KqE8QZKCcPGc/92Vs9x36w/4MPTJhqXdyvg== dependencies: "@eslint-community/eslint-utils" "^4.7.0" - "@typescript-eslint/scope-manager" "8.35.0" - "@typescript-eslint/types" "8.35.0" - "@typescript-eslint/typescript-estree" "8.35.0" + "@typescript-eslint/scope-manager" "8.38.0" + "@typescript-eslint/types" "8.38.0" + "@typescript-eslint/typescript-estree" "8.38.0" -"@typescript-eslint/visitor-keys@8.35.0": - version "8.35.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.35.0.tgz" - integrity sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g== +"@typescript-eslint/visitor-keys@8.38.0": + version "8.38.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.38.0.tgz" + integrity sha512-pWrTcoFNWuwHlA9CvlfSsGWs14JxfN1TH25zM5L7o0pRLhsoZkDnTsXfQRJBEWJoV5DL0jf+Z+sxiud+K0mq1g== dependencies: - "@typescript-eslint/types" "8.35.0" + "@typescript-eslint/types" "8.38.0" eslint-visitor-keys "^4.2.1" -"@typespec/ts-http-runtime@^0.2.2", "@typespec/ts-http-runtime@^0.2.3": - version "0.2.3" - resolved "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.2.3.tgz" - integrity sha512-oRhjSzcVjX8ExyaF8hC0zzTqxlVuRlgMHL/Bh4w3xB9+wjbm0FpXylVU/lBrn+kgphwYTrOk3tp+AVShGmlYCg== +"@typespec/ts-http-runtime@^0.3.0": + version "0.3.0" + resolved "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.0.tgz" + integrity sha512-sOx1PKSuFwnIl7z4RN0Ls7N9AQawmR9r66eI5rFCzLDIs8HTIYrIpH9QjYWoX0lkgGrkLxXhi4QnK7MizPRrIg== dependencies: + tslib "^2.6.2" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.0" - tslib "^2.6.2" "@uidotdev/usehooks@^2.4.1": version "2.4.1" @@ -7705,102 +7228,102 @@ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== -"@unrs/resolver-binding-android-arm-eabi@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.9.2.tgz" - integrity sha512-tS+lqTU3N0kkthU+rYp0spAYq15DU8ld9kXkaKg9sbQqJNF+WPMuNHZQGCgdxrUOEO0j22RKMwRVhF1HTl+X8A== - -"@unrs/resolver-binding-android-arm64@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.9.2.tgz" - integrity sha512-MffGiZULa/KmkNjHeuuflLVqfhqLv1vZLm8lWIyeADvlElJ/GLSOkoUX+5jf4/EGtfwrNFcEaB8BRas03KT0/Q== - -"@unrs/resolver-binding-darwin-arm64@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.9.2.tgz" - integrity sha512-dzJYK5rohS1sYl1DHdJ3mwfwClJj5BClQnQSyAgEfggbUwA9RlROQSSbKBLqrGfsiC/VyrDPtbO8hh56fnkbsQ== - -"@unrs/resolver-binding-darwin-x64@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.9.2.tgz" - integrity sha512-gaIMWK+CWtXcg9gUyznkdV54LzQ90S3X3dn8zlh+QR5Xy7Y+Efqw4Rs4im61K1juy4YNb67vmJsCDAGOnIeffQ== - -"@unrs/resolver-binding-freebsd-x64@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.9.2.tgz" - integrity sha512-S7QpkMbVoVJb0xwHFwujnwCAEDe/596xqY603rpi/ioTn9VDgBHnCCxh+UFrr5yxuMH+dliHfjwCZJXOPJGPnw== - -"@unrs/resolver-binding-linux-arm-gnueabihf@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.9.2.tgz" - integrity sha512-+XPUMCuCCI80I46nCDFbGum0ZODP5NWGiwS3Pj8fOgsG5/ctz+/zzuBlq/WmGa+EjWZdue6CF0aWWNv84sE1uw== - -"@unrs/resolver-binding-linux-arm-musleabihf@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.9.2.tgz" - integrity sha512-sqvUyAd1JUpwbz33Ce2tuTLJKM+ucSsYpPGl2vuFwZnEIg0CmdxiZ01MHQ3j6ExuRqEDUCy8yvkDKvjYFPb8Zg== - -"@unrs/resolver-binding-linux-arm64-gnu@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.9.2.tgz" - integrity sha512-UYA0MA8ajkEDCFRQdng/FVx3F6szBvk3EPnkTTQuuO9lV1kPGuTB+V9TmbDxy5ikaEgyWKxa4CI3ySjklZ9lFA== - -"@unrs/resolver-binding-linux-arm64-musl@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.9.2.tgz" - integrity sha512-P/CO3ODU9YJIHFqAkHbquKtFst0COxdphc8TKGL5yCX75GOiVpGqd1d15ahpqu8xXVsqP4MGFP2C3LRZnnL5MA== - -"@unrs/resolver-binding-linux-ppc64-gnu@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.9.2.tgz" - integrity sha512-uKStFlOELBxBum2s1hODPtgJhY4NxYJE9pAeyBgNEzHgTqTiVBPjfTlPFJkfxyTjQEuxZbbJlJnMCrRgD7ubzw== - -"@unrs/resolver-binding-linux-riscv64-gnu@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.9.2.tgz" - integrity sha512-LkbNnZlhINfY9gK30AHs26IIVEZ9PEl9qOScYdmY2o81imJYI4IMnJiW0vJVtXaDHvBvxeAgEy5CflwJFIl3tQ== - -"@unrs/resolver-binding-linux-riscv64-musl@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.9.2.tgz" - integrity sha512-vI+e6FzLyZHSLFNomPi+nT+qUWN4YSj8pFtQZSFTtmgFoxqB6NyjxSjAxEC1m93qn6hUXhIsh8WMp+fGgxCoRg== - -"@unrs/resolver-binding-linux-s390x-gnu@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.9.2.tgz" - integrity sha512-sSO4AlAYhSM2RAzBsRpahcJB1msc6uYLAtP6pesPbZtptF8OU/CbCPhSRW6cnYOGuVmEmWVW5xVboAqCnWTeHQ== - -"@unrs/resolver-binding-linux-x64-gnu@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.9.2.tgz" - integrity sha512-jkSkwch0uPFva20Mdu8orbQjv2A3G88NExTN2oPTI1AJ+7mZfYW3cDCTyoH6OnctBKbBVeJCEqh0U02lTkqD5w== - -"@unrs/resolver-binding-linux-x64-musl@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.9.2.tgz" - integrity sha512-Uk64NoiTpQbkpl+bXsbeyOPRpUoMdcUqa+hDC1KhMW7aN1lfW8PBlBH4mJ3n3Y47dYE8qi0XTxy1mBACruYBaw== - -"@unrs/resolver-binding-wasm32-wasi@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.9.2.tgz" - integrity sha512-EpBGwkcjDicjR/ybC0g8wO5adPNdVuMrNalVgYcWi+gYtC1XYNuxe3rufcO7dA76OHGeVabcO6cSkPJKVcbCXQ== +"@unrs/resolver-binding-android-arm-eabi@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz" + integrity sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw== + +"@unrs/resolver-binding-android-arm64@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz" + integrity sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g== + +"@unrs/resolver-binding-darwin-arm64@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz" + integrity sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g== + +"@unrs/resolver-binding-darwin-x64@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz" + integrity sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ== + +"@unrs/resolver-binding-freebsd-x64@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz" + integrity sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw== + +"@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz" + integrity sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw== + +"@unrs/resolver-binding-linux-arm-musleabihf@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz" + integrity sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw== + +"@unrs/resolver-binding-linux-arm64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz" + integrity sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ== + +"@unrs/resolver-binding-linux-arm64-musl@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz" + integrity sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w== + +"@unrs/resolver-binding-linux-ppc64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz" + integrity sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA== + +"@unrs/resolver-binding-linux-riscv64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz" + integrity sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ== + +"@unrs/resolver-binding-linux-riscv64-musl@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz" + integrity sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew== + +"@unrs/resolver-binding-linux-s390x-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz" + integrity sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg== + +"@unrs/resolver-binding-linux-x64-gnu@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz" + integrity sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w== + +"@unrs/resolver-binding-linux-x64-musl@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz" + integrity sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA== + +"@unrs/resolver-binding-wasm32-wasi@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz" + integrity sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ== dependencies: "@napi-rs/wasm-runtime" "^0.2.11" -"@unrs/resolver-binding-win32-arm64-msvc@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.9.2.tgz" - integrity sha512-EdFbGn7o1SxGmN6aZw9wAkehZJetFPao0VGZ9OMBwKx6TkvDuj6cNeLimF/Psi6ts9lMOe+Dt6z19fZQ9Ye2fw== +"@unrs/resolver-binding-win32-arm64-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz" + integrity sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw== -"@unrs/resolver-binding-win32-ia32-msvc@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.9.2.tgz" - integrity sha512-JY9hi1p7AG+5c/dMU8o2kWemM8I6VZxfGwn1GCtf3c5i+IKcMo2NQ8OjZ4Z3/itvY/Si3K10jOBQn7qsD/whUA== +"@unrs/resolver-binding-win32-ia32-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz" + integrity sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ== -"@unrs/resolver-binding-win32-x64-msvc@1.9.2": - version "1.9.2" - resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.9.2.tgz" - integrity sha512-ryoo+EB19lMxAd80ln9BVf8pdOAxLb97amrQ3SFN9OCRn/5M5wvwDgAe4i8ZjhpbiHoDeP8yavcTEnpKBo7lZg== +"@unrs/resolver-binding-win32-x64-msvc@1.11.1": + version "1.11.1" + resolved "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz" + integrity sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g== "@uploadthing/mime-types@0.3.5": version "0.3.5" @@ -7839,9 +7362,9 @@ "@upstash/core-analytics" "^0.0.10" "@upstash/redis@^1.28.3", "@upstash/redis@^1.34.2", "@upstash/redis@^1.34.3": - version "1.35.0" - resolved "https://registry.npmjs.org/@upstash/redis/-/redis-1.35.0.tgz" - integrity sha512-WUm0Jz1xN4DBDGeJIi2Y0kVsolWRB2tsVds4SExaiLg4wBdHFMB+8IfZtBWr+BP0FvhuBr5G1/VLrJ9xzIWHsg== + version "1.35.1" + resolved "https://registry.npmjs.org/@upstash/redis/-/redis-1.35.1.tgz" + integrity sha512-sIMuAMU9IYbE2bkgDby8KLoQKRiBMXn0moXxqLvUmQ7VUu2CvulZLtK8O0x3WQZFvvZhU5sRC2/lOVZdGfudkA== dependencies: uncrypto "^0.1.3" @@ -7858,19 +7381,19 @@ "@use-gesture/core" "10.3.1" "@vercel/sdk@^1.7.1": - version "1.9.0" - resolved "https://registry.npmjs.org/@vercel/sdk/-/sdk-1.9.0.tgz" - integrity sha512-Zic62YEexipOzJd8LNDjbxVjR6VSW4xaTbkxigJBUTFMh2NxS0zevmA1oeC4/DanBbs3lVcQpBZy+Owey1GN+w== + version "1.10.0" + resolved "https://registry.npmjs.org/@vercel/sdk/-/sdk-1.10.0.tgz" + integrity sha512-Z3bTFhDkQoEt2wviWxbvmkrkTPxVCYZaRlkV2Y3O/oRwVRnYiZ1tAK7NkjnSNtc19vARRkEAma/DfiaqVMlPzQ== "@vitejs/plugin-react@^4.2.1", "@vitejs/plugin-react@^4.6.0": - version "4.6.0" - resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.6.0.tgz" - integrity sha512-5Kgff+m8e2PB+9j51eGHEpn5kUzRKH2Ry0qGoe8ItJg7pqnkPrYPkDQZGgGmTa0EGarHrkjLvOdU3b1fzI8otQ== + version "4.7.0" + resolved "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz" + integrity sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA== dependencies: - "@babel/core" "^7.27.4" + "@babel/core" "^7.28.0" "@babel/plugin-transform-react-jsx-self" "^7.27.1" "@babel/plugin-transform-react-jsx-source" "^7.27.1" - "@rolldown/pluginutils" "1.0.0-beta.19" + "@rolldown/pluginutils" "1.0.0-beta.27" "@types/babel__core" "^7.20.5" react-refresh "^0.17.0" @@ -7879,11 +7402,11 @@ resolved "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz" integrity sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== dependencies: + chai "^5.2.0" "@types/chai" "^5.2.2" "@vitest/spy" "3.2.4" - "@vitest/utils" "3.2.4" - chai "^5.2.0" tinyrainbow "^2.0.0" + "@vitest/utils" "3.2.4" "@vitest/mocker@3.2.4": version "3.2.4" @@ -7891,8 +7414,8 @@ integrity sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ== dependencies: "@vitest/spy" "3.2.4" - estree-walker "^3.0.3" magic-string "^0.30.17" + estree-walker "^3.0.3" "@vitest/pretty-format@3.2.4", "@vitest/pretty-format@^3.2.4": version "3.2.4" @@ -7906,8 +7429,8 @@ resolved "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz" integrity sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ== dependencies: - "@vitest/utils" "3.2.4" pathe "^2.0.3" + "@vitest/utils" "3.2.4" strip-literal "^3.0.0" "@vitest/snapshot@3.2.4": @@ -7915,9 +7438,9 @@ resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz" integrity sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ== dependencies: - "@vitest/pretty-format" "3.2.4" - magic-string "^0.30.17" pathe "^2.0.3" + magic-string "^0.30.17" + "@vitest/pretty-format" "3.2.4" "@vitest/spy@3.2.4": version "3.2.4" @@ -7926,27 +7449,27 @@ dependencies: tinyspy "^4.0.3" -"@vitest/ui@3.2.4", "@vitest/ui@^3.2.4": +"@vitest/ui@^3.2.4": version "3.2.4" resolved "https://registry.npmjs.org/@vitest/ui/-/ui-3.2.4.tgz" integrity sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA== dependencies: - "@vitest/utils" "3.2.4" + sirv "^3.0.1" + pathe "^2.0.3" fflate "^0.8.2" flatted "^3.3.3" - pathe "^2.0.3" - sirv "^3.0.1" tinyglobby "^0.2.14" tinyrainbow "^2.0.0" + "@vitest/utils" "3.2.4" "@vitest/utils@3.2.4": version "3.2.4" resolved "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz" integrity sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== dependencies: - "@vitest/pretty-format" "3.2.4" loupe "^3.1.4" tinyrainbow "^2.0.0" + "@vitest/pretty-format" "3.2.4" "@vladfrangu/async_event_emitter@^2.2.4", "@vladfrangu/async_event_emitter@^2.4.6": version "2.4.6" @@ -7954,9 +7477,9 @@ integrity sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA== "@webgpu/types@*": - version "0.1.62" - resolved "https://registry.npmjs.org/@webgpu/types/-/types-0.1.62.tgz" - integrity sha512-eS+Go7OnNIILkrrh/w450XfzdyCfnJPmfAgJlNKIn1sR31Jhi9dbsIjFvP98z2U+AgtgNRfCk2lBQdczHCaOGQ== + version "0.1.64" + resolved "https://registry.npmjs.org/@webgpu/types/-/types-0.1.64.tgz" + integrity sha512-84kRIAGV46LJTlJZWxShiOrNL30A+9KokD7RB3dRCIqODFjodS5tCD5yyiZ8kIReGVZSDfA3XkkwyyOIF6K62A== "@xobotyi/scrollbar-width@^1.9.5": version "1.9.5" @@ -7968,8 +7491,8 @@ JSONStream@^1.3.5: resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: - jsonparse "^1.2.0" through ">=2.2.7 <3" + jsonparse "^1.2.0" abbrev@1: version "1.1.1" @@ -8024,9 +7547,9 @@ acorn-walk@^8.1.1: acorn "^8.11.0" agent-base@^7.1.0, agent-base@^7.1.2: - version "7.1.3" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" - integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + version "7.1.4" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz" + integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ== agentkeepalive@^4.2.1: version "4.6.0" @@ -8052,36 +7575,36 @@ aggregate-error@^5.0.0: indent-string "^5.0.0" ai@^4.3.16: - version "4.3.16" - resolved "https://registry.npmjs.org/ai/-/ai-4.3.16.tgz" - integrity sha512-KUDwlThJ5tr2Vw0A1ZkbDKNME3wzWhuVfAOwIvFUzl1TPVDFAXDFTXio3p+jaKneB+dKNCvFFlolYmmgHttG1g== + version "4.3.19" + resolved "https://registry.npmjs.org/ai/-/ai-4.3.19.tgz" + integrity sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q== dependencies: - "@ai-sdk/provider" "1.1.3" - "@ai-sdk/provider-utils" "2.2.8" "@ai-sdk/react" "1.2.12" + jsondiffpatch "0.6.0" + "@ai-sdk/provider" "1.1.3" "@ai-sdk/ui-utils" "1.2.11" "@opentelemetry/api" "1.9.0" - jsondiffpatch "0.6.0" + "@ai-sdk/provider-utils" "2.2.8" ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: + uri-js "^4.2.2" fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" json-schema-traverse "^0.4.1" - uri-js "^4.2.2" + fast-json-stable-stringify "^2.0.0" ajv@^8.11.0: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-deep-equal "^3.1.3" fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" + fast-deep-equal "^3.1.3" require-from-string "^2.0.2" + json-schema-traverse "^1.0.0" ansi-colors@^4.1.1: version "4.1.3" @@ -8151,8 +7674,8 @@ anymatch@~3.1.2: resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: - normalize-path "^3.0.0" picomatch "^2.0.4" + normalize-path "^3.0.0" aproba@^1.0.3: version "1.2.0" @@ -8160,9 +7683,9 @@ aproba@^1.0.3: integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== aproba@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz" - integrity sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== + version "2.1.0" + resolved "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz" + integrity sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew== archiver@^7.0.1: version "7.0.1" @@ -8370,7 +7893,7 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -asn1js@^3.0.5: +asn1js@^3.0.6: version "3.0.6" resolved "https://registry.npmjs.org/asn1js/-/asn1js-3.0.6.tgz" integrity sha512-UOCGPYbl0tv8+006qks/dTgV9ajs97X2p0FAbyS2iyCRrmLSRolDaHdp+v/CLgnzHc3fVB+CwYiUmei7ndFcgA== @@ -8426,11 +7949,11 @@ autoprefixer@^10.4.21: resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz" integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== dependencies: + picocolors "^1.1.1" + fraction.js "^4.3.7" browserslist "^4.24.4" caniuse-lite "^1.0.30001702" - fraction.js "^4.3.7" normalize-range "^0.1.2" - picocolors "^1.1.1" postcss-value-parser "^4.2.0" available-typed-arrays@^1.0.7: @@ -8460,18 +7983,18 @@ axios@1.8.2: resolved "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz" integrity sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg== dependencies: - follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" + follow-redirects "^1.15.6" axios@^1.6.8, axios@^1.7.4, axios@^1.7.9, axios@^1.8.2, axios@^1.8.3, axios@^1.9.0: version "1.10.0" resolved "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz" integrity sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw== dependencies: - follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" + follow-redirects "^1.15.6" axobject-query@^4.1.0: version "4.1.0" @@ -8502,15 +8025,15 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bare-events@*, bare-events@^2.2.0, bare-events@^2.5.4: - version "2.5.4" - resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz" - integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== +bare-events@^2.2.0, bare-events@^2.5.4: + version "2.6.0" + resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.6.0.tgz" + integrity sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg== bare-fs@^4.0.1: - version "4.1.5" - resolved "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.5.tgz" - integrity sha512-1zccWBMypln0jEE05LzZt+V/8y8AQsQQqxtklqaIyg5nu6OAYFhZxPXinJTSG+kU5qyNmeLgcn9AW7eHiCHVLA== + version "4.1.6" + resolved "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.6.tgz" + integrity sha512-25RsLF33BqooOEFNdMcEhMpJy8EoR88zSMrnOQOaM3USnOK2VmaJ1uaQEwPA6AQjrv1lXChScosN6CzbwbO9OQ== dependencies: bare-events "^2.5.4" bare-path "^3.0.0" @@ -8563,27 +8086,27 @@ before-after-hook@^4.0.0: integrity sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ== better-auth@^1.2.8: - version "1.2.10" - resolved "https://registry.npmjs.org/better-auth/-/better-auth-1.2.10.tgz" - integrity sha512-nEj1RG4DdLUuJiV5CR93ORyPCptGRBwksaPPCkUtGo9ka+UIlTpaiKoTaTqVLLYlqwX4bOj9tJ32oBNdf2G3Kg== + version "1.3.2" + resolved "https://registry.npmjs.org/better-auth/-/better-auth-1.3.2.tgz" + integrity sha512-510kOtFBTdp4z51hWtTEqk9yqSinXzyg7PkDFnXYMq1K0KvdXRY1A9t9J998i0CSf/tJA0wNoN3S8exkOgBvTw== dependencies: "@better-auth/utils" "0.2.5" "@better-fetch/fetch" "^1.1.18" "@noble/ciphers" "^0.6.0" - "@noble/hashes" "^1.6.1" + "@noble/hashes" "^1.8.0" "@simplewebauthn/browser" "^13.0.0" "@simplewebauthn/server" "^13.0.0" - better-call "^1.0.8" + better-call "^1.0.12" defu "^6.1.4" jose "^5.9.6" - kysely "^0.28.2" + kysely "^0.28.1" nanostores "^0.11.3" - zod "^3.24.1" + zod "^4.0.5" -better-call@^1.0.8: - version "1.0.9" - resolved "https://registry.npmjs.org/better-call/-/better-call-1.0.9.tgz" - integrity sha512-Qfm0gjk0XQz0oI7qvTK1hbqTsBY4xV2hsHAxF8LZfUYl3RaECCIifXuVqtPpZJWvlCCMlQSvkvhhyuApGUba6g== +better-call@^1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/better-call/-/better-call-1.0.12.tgz" + integrity sha512-ssq5OfB9Ungv2M1WVrRnMBomB0qz1VKuhkY2WxjHaLtlsHoSe9EPolj1xf7xf8LY9o3vfk3Rx6rCWI4oVHeBRg== dependencies: "@better-fetch/fetch" "^1.1.4" rou3 "^0.5.1" @@ -8603,9 +8126,9 @@ bin-links@^4.0.4: integrity sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA== dependencies: cmd-shim "^6.0.0" - npm-normalize-package-bin "^3.0.0" read-cmd-shim "^4.0.0" write-file-atomic "^5.0.0" + npm-normalize-package-bin "^3.0.0" bin-links@^5.0.0: version "5.0.0" @@ -8613,10 +8136,10 @@ bin-links@^5.0.0: integrity sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA== dependencies: cmd-shim "^7.0.0" - npm-normalize-package-bin "^4.0.0" proc-log "^5.0.0" read-cmd-shim "^5.0.0" write-file-atomic "^6.0.0" + npm-normalize-package-bin "^4.0.0" binary-extensions@^2.0.0, binary-extensions@^2.3.0: version "2.3.0" @@ -8635,18 +8158,18 @@ body-parser@1.20.3: resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz" integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: + qs "6.13.0" + depd "2.0.0" bytes "3.1.2" - content-type "~1.0.5" debug "2.6.9" - depd "2.0.0" + unpipe "1.0.0" destroy "1.2.0" - http-errors "2.0.0" + type-is "~1.6.18" + raw-body "2.5.2" iconv-lite "0.4.24" + http-errors "2.0.0" on-finished "2.4.1" - qs "6.13.0" - raw-body "2.5.2" - type-is "~1.6.18" - unpipe "1.0.0" + content-type "~1.0.5" bottleneck@^2.15.3: version "2.19.5" @@ -8718,10 +8241,10 @@ buffer-from@^1.0.0: resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -bun-types@1.2.17: - version "1.2.17" - resolved "https://registry.npmjs.org/bun-types/-/bun-types-1.2.17.tgz" - integrity sha512-ElC7ItwT3SCQwYZDYoAH+q6KT4Fxjl8DtZ6qDulUFBmXA8YB4xo+l54J9ZJN+k2pphfn9vk7kfubeSd5QfTVJQ== +bun-types@1.2.19: + version "1.2.19" + resolved "https://registry.npmjs.org/bun-types/-/bun-types-1.2.19.tgz" + integrity sha512-uAOTaZSPuYsWIXRpj7o56Let0g/wjihKCkeRqUBhlLVM/Bt+Fj9xTo+LhC1OV1XDaGkz4hNC80et5xgy+9KTHQ== dependencies: "@types/node" "*" @@ -8739,13 +8262,6 @@ bundle-require@^5.1.0: dependencies: load-tsconfig "^0.2.3" -busboy@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - bytes@3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" @@ -8761,36 +8277,36 @@ cacache@^18.0.0, cacache@^18.0.3: resolved "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz" integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ== dependencies: - "@npmcli/fs" "^3.1.0" - fs-minipass "^3.0.0" + tar "^6.1.11" glob "^10.2.2" - lru-cache "^10.0.1" + ssri "^10.0.0" + p-map "^4.0.0" minipass "^7.0.3" - minipass-collect "^2.0.1" + lru-cache "^10.0.1" + "@npmcli/fs" "^3.1.0" + fs-minipass "^3.0.0" minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^4.0.0" - ssri "^10.0.0" - tar "^6.1.11" unique-filename "^3.0.0" + minipass-collect "^2.0.1" + minipass-pipeline "^1.2.4" cacache@^19.0.0, cacache@^19.0.1: version "19.0.1" resolved "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz" integrity sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ== dependencies: - "@npmcli/fs" "^4.0.0" - fs-minipass "^3.0.0" + tar "^7.4.3" glob "^10.2.2" - lru-cache "^10.0.1" + ssri "^12.0.0" + p-map "^7.0.2" minipass "^7.0.3" - minipass-collect "^2.0.1" + lru-cache "^10.0.1" + "@npmcli/fs" "^4.0.0" + fs-minipass "^3.0.0" minipass-flush "^1.0.5" - minipass-pipeline "^1.2.4" - p-map "^7.0.2" - ssri "^12.0.0" - tar "^7.4.3" unique-filename "^4.0.0" + minipass-collect "^2.0.1" + minipass-pipeline "^1.2.4" cacheable-lookup@^5.0.3: version "5.0.4" @@ -8802,13 +8318,13 @@ cacheable-request@^7.0.2: resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz" integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" keyv "^4.0.0" - lowercase-keys "^2.0.0" - normalize-url "^6.0.1" + get-stream "^5.1.0" responselike "^2.0.0" + normalize-url "^6.0.1" + clone-response "^1.0.2" + lowercase-keys "^2.0.0" + http-cache-semantics "^4.0.0" call-bind@^1.0.2, call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" @@ -8846,15 +8362,15 @@ camelcase-css@^2.0.1: resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== -camera-controls@^2.9.0: - version "2.10.1" - resolved "https://registry.npmjs.org/camera-controls/-/camera-controls-2.10.1.tgz" - integrity sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w== +camera-controls@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/camera-controls/-/camera-controls-3.1.0.tgz" + integrity sha512-w5oULNpijgTRH0ARFJJ0R5ct1nUM3R3WP7/b8A6j9uTGpRfnsypc/RBMPQV8JQDPayUe37p/TZZY1PcUr4czOQ== caniuse-lite@^1.0.30001579, caniuse-lite@^1.0.30001702, caniuse-lite@^1.0.30001726: - version "1.0.30001726" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001726.tgz" - integrity sha512-VQAUIUzBiZ/UnlM28fSp2CRF3ivUn1BWEvxMcVTNwpw91Py1pGbPIyIKtd+tzct9C3ouceCVdGAXxZOpZAsgdw== + version "1.0.30001727" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz" + integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== canvas-confetti@^1.9.3: version "1.9.3" @@ -8872,9 +8388,9 @@ ccount@^2.0.0: integrity sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg== chai@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz" - integrity sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw== + version "5.2.1" + resolved "https://registry.npmjs.org/chai/-/chai-5.2.1.tgz" + integrity sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A== dependencies: assertion-error "^2.0.1" check-error "^2.1.1" @@ -8888,8 +8404,8 @@ chalk@^2.3.2: integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" supports-color "^5.3.0" + escape-string-regexp "^1.0.5" chalk@^3.0.0: version "3.0.0" @@ -8953,16 +8469,16 @@ chokidar@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== - optionalDependencies: - fsevents "~2.3.2" dependencies: - anymatch "~3.1.2" braces "~3.0.2" + is-glob "~4.0.1" + anymatch "~3.1.2" + readdirp "~3.6.0" glob-parent "~5.1.2" is-binary-path "~2.1.0" - is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" chokidar@^4.0.3: version "4.0.3" @@ -8981,18 +8497,18 @@ chownr@^3.0.0: resolved "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz" integrity sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== -chromium-bidi@5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-5.1.0.tgz" - integrity sha512-9MSRhWRVoRPDG0TgzkHrshFSJJNZzfY5UFqUMuksg7zL1yoZIZ3jLB0YAgHclbiAxPI86pBnwDX1tbzoiV8aFw== +chromium-bidi@7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-7.1.1.tgz" + integrity sha512-L2BKQ0rSLADgbPMIdDh3wnYHs3EiUiMay2Sq0CTolheaADmWIf6Pe+T9LJRcnh5rcMz0U7MVk0cQVvKsGRMa1g== dependencies: - mitt "^3.0.1" zod "^3.24.1" + mitt "^3.0.1" ci-info@^4.0.0, ci-info@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.2.0.tgz" - integrity sha512-cYY9mypksY8NRqgDB1XD1RiJL338v/551niynFTGkZOO2LHuB2OmOYxDIe/ttN9AHwrqdum1360G3ald0W9kCg== + version "4.3.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz" + integrity sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ== cidr-regex@^4.1.1: version "4.1.3" @@ -9001,6 +8517,13 @@ cidr-regex@^4.1.1: dependencies: ip-regex "^5.0.0" +citty@^0.1.6: + version "0.1.6" + resolved "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz" + integrity sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ== + dependencies: + consola "^3.2.3" + cjs-module-lexer@^1.2.2: version "1.4.3" resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz" @@ -9066,10 +8589,10 @@ cli-table3@^0.6.5: version "0.6.5" resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz" integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== - optionalDependencies: - "@colors/colors" "1.5.0" dependencies: string-width "^4.2.0" + optionalDependencies: + "@colors/colors" "1.5.0" client-only@0.0.1: version "0.0.1" @@ -9081,18 +8604,18 @@ cliui@^7.0.2: resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" wrap-ansi "^7.0.0" + strip-ansi "^6.0.0" + string-width "^4.2.0" cliui@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" wrap-ansi "^7.0.0" + strip-ansi "^6.0.1" + string-width "^4.2.0" clone-response@^1.0.2: version "1.0.3" @@ -9121,10 +8644,10 @@ cmdk@1.0.4: resolved "https://registry.npmjs.org/cmdk/-/cmdk-1.0.4.tgz" integrity sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg== dependencies: - "@radix-ui/react-dialog" "^1.1.2" "@radix-ui/react-id" "^1.1.0" - "@radix-ui/react-primitive" "^2.0.0" + "@radix-ui/react-dialog" "^1.1.2" use-sync-external-store "^1.2.2" + "@radix-ui/react-primitive" "^2.0.0" code-point-at@^1.0.0: version "1.1.0" @@ -9136,8 +8659,8 @@ color@^4.2.3: resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: - color-convert "^2.0.1" color-string "^1.9.0" + color-convert "^2.0.1" color-convert@^1.9.0: version "1.9.3" @@ -9217,8 +8740,8 @@ compress-commons@^6.0.2: integrity sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg== dependencies: crc-32 "^1.2.0" - crc32-stream "^6.0.0" is-stream "^2.0.1" + crc32-stream "^6.0.0" normalize-path "^3.0.0" readable-stream "^4.0.0" @@ -9245,15 +8768,20 @@ confbox@^0.1.8: resolved "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz" integrity sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w== +confbox@^0.2.2: + version "0.2.2" + resolved "https://registry.npmjs.org/confbox/-/confbox-0.2.2.tgz" + integrity sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ== + config-chain@^1.1.11: version "1.1.13" resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: - ini "^1.3.4" proto-list "~1.2.1" + ini "^1.3.4" -consola@^3.4.0: +consola@^3.2.3, consola@^3.4.0: version "3.4.2" resolved "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz" integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== @@ -9297,14 +8825,14 @@ conventional-changelog-conventionalcommits@^7.0.2: compare-func "^2.0.0" conventional-changelog-writer@^8.0.0: - version "8.1.0" - resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.1.0.tgz" - integrity sha512-dpC440QnORNCO81XYuRRFOLCsjKj4W7tMkUIn3lR6F/FAaJcWLi7iCj6IcEvSQY2zw6VUgwUKd5DEHKEWrpmEQ== + version "8.2.0" + resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.2.0.tgz" + integrity sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw== dependencies: - conventional-commits-filter "^5.0.0" handlebars "^4.7.7" meow "^13.0.0" semver "^7.5.2" + conventional-commits-filter "^5.0.0" conventional-commits-filter@^5.0.0: version "5.0.0" @@ -9316,10 +8844,10 @@ conventional-commits-parser@^5.0.0: resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz" integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== dependencies: - JSONStream "^1.3.5" - is-text-path "^2.0.0" meow "^12.0.1" split2 "^4.0.0" + JSONStream "^1.3.5" + is-text-path "^2.0.0" conventional-commits-parser@^6.0.0: version "6.2.0" @@ -9373,9 +8901,9 @@ copy-to-clipboard@^3.3.1: toggle-selection "^1.0.6" core-js@^3.38.1: - version "3.43.0" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.43.0.tgz" - integrity sha512-N6wEbTTZSYOY2rYAn85CuvWWkCK6QweMn7/4Nr3w+gDBeBhk/x4EJeY6FPo4QzDoJZxVTv8U7CMvgWk6pOHHqA== + version "3.44.0" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.44.0.tgz" + integrity sha512-aFCtd4l6GvAXwVEh3XbbVqJGHDJt0OZRa+5ePGx3LLwi12WfexqQxcsohb2wgsa/92xtl19Hd66G/L+TaAxDMw== core-util-is@1.0.2: version "1.0.2" @@ -9392,8 +8920,8 @@ cors@~2.8.5: resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: - object-assign "^4" vary "^1" + object-assign "^4" cosmiconfig@^7.0.0: version "7.1.0" @@ -9463,9 +8991,9 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.6: resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: + which "^2.0.1" path-key "^3.1.0" shebang-command "^2.0.0" - which "^2.0.1" crypto-random-string@^4.0.0: version "4.0.0" @@ -9504,8 +9032,8 @@ cssstyle@^4.2.1: resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz" integrity sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg== dependencies: - "@asamuzakjp/css-color" "^3.2.0" rrweb-cssom "^0.8.0" + "@asamuzakjp/css-color" "^3.2.0" csstype@^3.0.2, csstype@^3.1.2: version "3.1.3" @@ -9517,36 +9045,36 @@ d3@^7.9.0: resolved "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz" integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== dependencies: - d3-array "3" + d3-dsv "3" + d3-geo "3" d3-axis "3" + d3-drag "3" + d3-ease "3" + d3-path "3" + d3-time "3" + d3-zoom "3" + d3-array "3" d3-brush "3" d3-chord "3" d3-color "3" - d3-contour "4" - d3-delaunay "6" - d3-dispatch "3" - d3-drag "3" - d3-dsv "3" - d3-ease "3" d3-fetch "3" d3-force "3" + d3-scale "4" + d3-shape "3" + d3-timer "3" d3-format "3" - d3-geo "3" - d3-hierarchy "3" - d3-interpolate "3" - d3-path "3" + d3-random "3" + d3-contour "4" d3-polygon "3" + d3-delaunay "6" + d3-dispatch "3" d3-quadtree "3" - d3-random "3" - d3-scale "4" - d3-scale-chromatic "3" + d3-hierarchy "3" d3-selection "3" - d3-shape "3" - d3-time "3" - d3-time-format "4" - d3-timer "3" d3-transition "3" - d3-zoom "3" + d3-interpolate "3" + d3-time-format "4" + d3-scale-chromatic "3" "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.1.6, d3-array@^3.2.0: version "3.2.4" @@ -9849,7 +9377,7 @@ debug@~4.3.1, debug@~4.3.2, debug@~4.3.4: dependencies: ms "^2.1.3" -debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6, debug@^4.4.0, debug@^4.4.1: +debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.4.0, debug@^4.4.1: version "4.4.1" resolved "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz" integrity sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== @@ -9857,9 +9385,9 @@ debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, d ms "^2.1.3" decimal.js@^10.5.0: - version "10.5.0" - resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz" - integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== + version "10.6.0" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz" + integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== decimal.js-light@^2.4.1: version "2.5.1" @@ -10016,10 +9544,10 @@ devlop@^1.0.0, devlop@^1.1.0: dependencies: dequal "^2.0.0" -devtools-protocol@*, devtools-protocol@0.0.1452169: - version "0.0.1452169" - resolved "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1452169.tgz" - integrity sha512-FOFDVMGrAUNp0dDKsAU1TorWJUx2JOU1k9xdgBKKJF3IBh/Uhl2yswG5r3TEAOrCiGY2QRp1e6LVDQrCsTKO4g== +devtools-protocol@*, devtools-protocol@0.0.1464554: + version "0.0.1464554" + resolved "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1464554.tgz" + integrity sha512-CAoP3lYfwAGQTaAXYvA6JZR0fjGUb7qec1qf4mToyoH2TZgUFeIqYcjh6f9jNuhHfuZiEdH+PONHYrLhRQX6aw== didyoumean@^1.2.2: version "1.2.2" @@ -10049,28 +9577,28 @@ dir-glob@^3.0.0, dir-glob@^3.0.1: path-type "^4.0.0" discord-api-types@^0.38.1: - version "0.38.13" - resolved "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.13.tgz" - integrity sha512-FELWJRgLVQuR7Az8RhdEZE0k6QNjSW9PCUcU1iyP2Gke8HrJmnMceSS9pD93UM64s3tvZzJPajpPLjWZJylf4g== + version "0.38.16" + resolved "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.38.16.tgz" + integrity sha512-Cz42dC5WqJD17Yk0bRy7YLTJmh3NKo4FGpxZuA8MHqT0RPxKSrll5YhlODZ2z5DiEV/gpHMeTSrTFTWpSXjT1Q== discord.js@^14.7.1: version "14.21.0" resolved "https://registry.npmjs.org/discord.js/-/discord.js-14.21.0.tgz" integrity sha512-U5w41cEmcnSfwKYlLv5RJjB8Joa+QJyRwIJz5i/eg+v2Qvv6EYpCRhN9I2Rlf0900LuqSDg8edakUATrDZQncQ== dependencies: - "@discordjs/builders" "^1.11.2" - "@discordjs/collection" "1.5.3" - "@discordjs/formatters" "^0.6.1" + tslib "^2.6.3" + undici "6.21.3" + "@discordjs/ws" "^1.2.3" + magic-bytes.js "^1.10.0" "@discordjs/rest" "^2.5.1" "@discordjs/util" "^1.1.1" - "@discordjs/ws" "^1.2.3" - "@sapphire/snowflake" "3.5.3" - discord-api-types "^0.38.1" fast-deep-equal "3.1.3" lodash.snakecase "4.1.1" - magic-bytes.js "^1.10.0" - tslib "^2.6.3" - undici "6.21.3" + discord-api-types "^0.38.1" + "@discordjs/builders" "^1.11.2" + "@sapphire/snowflake" "3.5.3" + "@discordjs/collection" "1.5.3" + "@discordjs/formatters" "^0.6.1" dlv@^1.1.3: version "1.1.3" @@ -10108,8 +9636,8 @@ dom-helpers@^5.0.1: resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: - "@babel/runtime" "^7.8.7" csstype "^3.0.2" + "@babel/runtime" "^7.8.7" dom-serializer@^2.0.0: version "2.0.0" @@ -10166,9 +9694,9 @@ draco3d@^1.4.1: integrity sha512-m6WCKt/erDXcw+70IJXnG7M3awwQPAsZvJGX5zY7beBqpELw6RDGkYVU0W43AFxye4pDZ5i2Lbyc/NNGqwjUVQ== dub@^0.63.6: - version "0.63.6" - resolved "https://registry.npmjs.org/dub/-/dub-0.63.6.tgz" - integrity sha512-4iAJvOtj5MegRqsSpUc2H9Prvgh95vidGGEHXYrJO6bLUQ4TSfQwoRei+WdKJohV0t4klhEj4ruQx2olefMzuA== + version "0.63.7" + resolved "https://registry.npmjs.org/dub/-/dub-0.63.7.tgz" + integrity sha512-DhMF4ceWIPjMGA4ZU8L1pySJFtwdXRjcwchRLLWReN5t3C/MZohrLvrqbeJOBfdOE4VKGtqI8uYD3kBT+4nMSQ== dunder-proto@^1.0.0, dunder-proto@^1.0.1: version "1.0.1" @@ -10216,21 +9744,21 @@ effect@3.16.8: resolved "https://registry.npmjs.org/effect/-/effect-3.16.8.tgz" integrity sha512-E4U0MZFBun99myxOogy9ZZ1c3IYR47L/A5GqCP9Lp+6ORag0YLmGHOrYxQ3agN1FOMTrElgtJmciicwnHdE+Ug== dependencies: - "@standard-schema/spec" "^1.0.0" fast-check "^3.23.1" + "@standard-schema/spec" "^1.0.0" effect@^3.13.7, effect@^3.16.8: - version "3.16.10" - resolved "https://registry.npmjs.org/effect/-/effect-3.16.10.tgz" - integrity sha512-F0hDCOLax7i3SOy5wQnJZTzKP9aGg8OQNUJ2s8YoL5fVcCgRCgE+Ky+Hfz5qC7LgVVOWDDbRpCh5MPB20wRI8Q== + version "3.17.0" + resolved "https://registry.npmjs.org/effect/-/effect-3.17.0.tgz" + integrity sha512-szMlUsbPhP9lsrU+sDPXL9pQT2ew8PhcZvPm0p5dzYFbc+Jn/lH2i5thtmPQdm6Ut1rS4fS67SbuG7Qm0E0oZA== dependencies: "@standard-schema/spec" "^1.0.0" fast-check "^3.23.1" electron-to-chromium@^1.5.173: - version "1.5.176" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.176.tgz" - integrity sha512-2nDK9orkm7M9ZZkjO3PjbEd3VUulQLyg5T9O3enJdFvUg46Hzd4DUvTvAuEgbdHYXyFsiG4A5sO9IzToMH1cDg== + version "1.5.190" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.190.tgz" + integrity sha512-k4McmnB2091YIsdCgkS0fMVMPOJgxl93ltFzaryXqwip1AaxeDqKCGLxkXODDA5Ab/D+tV5EL5+aTx76RvLRxw== embla-carousel@8.5.1: version "8.5.1" @@ -10280,7 +9808,7 @@ encodeurl@~2.0.0: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encoding@^0.1.0, encoding@^0.1.13: +encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -10314,11 +9842,11 @@ engine.io-client@~6.5.2: resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz" integrity sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ== dependencies: - "@socket.io/component-emitter" "~3.1.0" + ws "~8.17.1" debug "~4.3.1" engine.io-parser "~5.2.1" - ws "~8.17.1" xmlhttprequest-ssl "~2.0.0" + "@socket.io/component-emitter" "~3.1.0" engine.io-parser@~5.2.1: version "5.2.3" @@ -10544,59 +10072,60 @@ esbuild@^0.20.1: integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== optionalDependencies: "@esbuild/aix-ppc64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" + "@esbuild/win32-x64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" "@esbuild/android-arm" "0.20.2" - "@esbuild/android-arm64" "0.20.2" "@esbuild/android-x64" "0.20.2" - "@esbuild/darwin-arm64" "0.20.2" - "@esbuild/darwin-x64" "0.20.2" - "@esbuild/freebsd-arm64" "0.20.2" "@esbuild/freebsd-x64" "0.20.2" - "@esbuild/linux-arm" "0.20.2" "@esbuild/linux-arm64" "0.20.2" - "@esbuild/linux-ia32" "0.20.2" - "@esbuild/linux-loong64" "0.20.2" - "@esbuild/linux-mips64el" "0.20.2" "@esbuild/linux-ppc64" "0.20.2" - "@esbuild/linux-riscv64" "0.20.2" "@esbuild/linux-s390x" "0.20.2" - "@esbuild/linux-x64" "0.20.2" - "@esbuild/netbsd-x64" "0.20.2" "@esbuild/openbsd-x64" "0.20.2" - "@esbuild/sunos-x64" "0.20.2" "@esbuild/win32-arm64" "0.20.2" - "@esbuild/win32-ia32" "0.20.2" - "@esbuild/win32-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/android-arm64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" esbuild@>=0.18, esbuild@^0.25.0: - version "0.25.5" - resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.5.tgz" - integrity sha512-P8OtKZRv/5J5hhz0cUAdu/cLuPIKXpQl1R9pZtvmHWQvrAUVd0UNIPT4IB4W3rNOqVO0rlqHmCIbSwxh/c9yUQ== + version "0.25.8" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.25.8.tgz" + integrity sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q== optionalDependencies: - "@esbuild/aix-ppc64" "0.25.5" - "@esbuild/android-arm" "0.25.5" - "@esbuild/android-arm64" "0.25.5" - "@esbuild/android-x64" "0.25.5" - "@esbuild/darwin-arm64" "0.25.5" - "@esbuild/darwin-x64" "0.25.5" - "@esbuild/freebsd-arm64" "0.25.5" - "@esbuild/freebsd-x64" "0.25.5" - "@esbuild/linux-arm" "0.25.5" - "@esbuild/linux-arm64" "0.25.5" - "@esbuild/linux-ia32" "0.25.5" - "@esbuild/linux-loong64" "0.25.5" - "@esbuild/linux-mips64el" "0.25.5" - "@esbuild/linux-ppc64" "0.25.5" - "@esbuild/linux-riscv64" "0.25.5" - "@esbuild/linux-s390x" "0.25.5" - "@esbuild/linux-x64" "0.25.5" - "@esbuild/netbsd-arm64" "0.25.5" - "@esbuild/netbsd-x64" "0.25.5" - "@esbuild/openbsd-arm64" "0.25.5" - "@esbuild/openbsd-x64" "0.25.5" - "@esbuild/sunos-x64" "0.25.5" - "@esbuild/win32-arm64" "0.25.5" - "@esbuild/win32-ia32" "0.25.5" - "@esbuild/win32-x64" "0.25.5" + "@esbuild/aix-ppc64" "0.25.8" + "@esbuild/android-arm" "0.25.8" + "@esbuild/android-arm64" "0.25.8" + "@esbuild/android-x64" "0.25.8" + "@esbuild/darwin-arm64" "0.25.8" + "@esbuild/darwin-x64" "0.25.8" + "@esbuild/freebsd-arm64" "0.25.8" + "@esbuild/freebsd-x64" "0.25.8" + "@esbuild/linux-arm" "0.25.8" + "@esbuild/linux-arm64" "0.25.8" + "@esbuild/linux-ia32" "0.25.8" + "@esbuild/linux-loong64" "0.25.8" + "@esbuild/linux-mips64el" "0.25.8" + "@esbuild/linux-ppc64" "0.25.8" + "@esbuild/linux-riscv64" "0.25.8" + "@esbuild/linux-s390x" "0.25.8" + "@esbuild/linux-x64" "0.25.8" + "@esbuild/netbsd-arm64" "0.25.8" + "@esbuild/netbsd-x64" "0.25.8" + "@esbuild/openbsd-arm64" "0.25.8" + "@esbuild/openbsd-x64" "0.25.8" + "@esbuild/openharmony-arm64" "0.25.8" + "@esbuild/sunos-x64" "0.25.8" + "@esbuild/win32-arm64" "0.25.8" + "@esbuild/win32-ia32" "0.25.8" + "@esbuild/win32-x64" "0.25.8" escalade@^3.1.1, escalade@^3.2.0: version "3.2.0" @@ -10627,25 +10156,25 @@ escodegen@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== - optionalDependencies: - source-map "~0.6.1" dependencies: - esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" + esprima "^4.0.1" + optionalDependencies: + source-map "~0.6.1" eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.23.0 || ^8.0.0 || ^9.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9: - version "9.29.0" - resolved "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz" - integrity sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ== + version "9.31.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz" + integrity sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ== dependencies: "@eslint-community/eslint-utils" "^4.2.0" "@eslint-community/regexpp" "^4.12.1" - "@eslint/config-array" "^0.20.1" - "@eslint/config-helpers" "^0.2.1" - "@eslint/core" "^0.14.0" + "@eslint/config-array" "^0.21.0" + "@eslint/config-helpers" "^0.3.0" + "@eslint/core" "^0.15.0" "@eslint/eslintrc" "^3.3.1" - "@eslint/js" "9.29.0" + "@eslint/js" "9.31.0" "@eslint/plugin-kit" "^0.3.1" "@humanfs/node" "^0.16.6" "@humanwhocodes/module-importer" "^1.0.1" @@ -10680,16 +10209,16 @@ eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.4.0-canary.85.tgz" integrity sha512-aI8S/cGs3AapI3po3ANDh5wnZ5JiZcFEn32n+P7FrfHwEY1IittY6ktTajt8HZEZqnhwFM38d2GH1PMscxP6bw== dependencies: - "@next/eslint-plugin-next" "15.4.0-canary.85" + eslint-plugin-react "^7.37.0" + eslint-plugin-import "^2.31.0" + eslint-plugin-jsx-a11y "^6.10.0" "@rushstack/eslint-patch" "^1.10.3" - "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" + "@next/eslint-plugin-next" "15.4.0-canary.85" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" + eslint-plugin-react-hooks "^5.0.0" eslint-import-resolver-node "^0.3.6" + "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" eslint-import-resolver-typescript "^3.5.2" - eslint-plugin-import "^2.31.0" - eslint-plugin-jsx-a11y "^6.10.0" - eslint-plugin-react "^7.37.0" - eslint-plugin-react-hooks "^5.0.0" eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: version "0.3.9" @@ -10705,13 +10234,13 @@ eslint-import-resolver-typescript@^3.5.2: resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz" integrity sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ== dependencies: - "@nolyfill/is-core-module" "1.0.39" debug "^4.4.0" + tinyglobby "^0.2.13" + stable-hash "^0.0.5" get-tsconfig "^4.10.0" is-bun-module "^2.0.0" - stable-hash "^0.0.5" - tinyglobby "^0.2.13" unrs-resolver "^1.6.2" + "@nolyfill/is-core-module" "1.0.39" eslint-module-utils@^2.12.1: version "2.12.1" @@ -10720,7 +10249,7 @@ eslint-module-utils@^2.12.1: dependencies: debug "^3.2.7" -eslint-plugin-import@*, eslint-plugin-import@^2.31.0: +eslint-plugin-import@^2.31.0: version "2.32.0" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz" integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== @@ -10924,14 +10453,14 @@ execa@^5.0.0, execa@^5.1.0: resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" + onetime "^5.1.2" is-stream "^2.0.0" + get-stream "^6.0.0" + cross-spawn "^7.0.3" + signal-exit "^3.0.3" merge-stream "^2.0.0" npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" + human-signals "^2.1.0" strip-final-newline "^2.0.0" execa@^8.0.0, execa@^8.0.1: @@ -10939,14 +10468,14 @@ execa@^8.0.0, execa@^8.0.1: resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: - cross-spawn "^7.0.3" - get-stream "^8.0.1" - human-signals "^5.0.0" + onetime "^6.0.0" is-stream "^3.0.0" + get-stream "^8.0.1" + cross-spawn "^7.0.3" + signal-exit "^4.1.0" merge-stream "^2.0.0" npm-run-path "^5.1.0" - onetime "^6.0.0" - signal-exit "^4.1.0" + human-signals "^5.0.0" strip-final-newline "^3.0.0" execa@^9.0.0: @@ -10968,51 +10497,56 @@ execa@^9.0.0: yoctocolors "^2.1.1" expect-type@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/expect-type/-/expect-type-1.2.1.tgz" - integrity sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw== + version "1.2.2" + resolved "https://registry.npmjs.org/expect-type/-/expect-type-1.2.2.tgz" + integrity sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA== exponential-backoff@^3.1.1: version "3.1.2" resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz" integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== -express@*, express@^4.21.0: +express@^4.21.0: version "4.21.2" resolved "https://registry.npmjs.org/express/-/express-4.21.2.tgz" integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.3" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.7.1" - cookie-signature "1.0.6" - debug "2.6.9" + qs "6.13.0" depd "2.0.0" - encodeurl "~2.0.0" - escape-html "~1.0.3" etag "~1.8.1" - finalhandler "1.3.1" + send "0.19.0" + vary "~1.1.2" + debug "2.6.9" fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.3" + cookie "0.7.1" + accepts "~1.3.8" methods "~1.1.2" - on-finished "2.4.1" + type-is "~1.6.18" parseurl "~1.3.3" - path-to-regexp "0.1.12" + statuses "2.0.1" + encodeurl "~2.0.0" proxy-addr "~2.0.7" - qs "6.13.0" - range-parser "~1.2.1" + body-parser "1.20.3" + escape-html "~1.0.3" + http-errors "2.0.0" + on-finished "2.4.1" safe-buffer "5.2.1" - send "0.19.0" + utils-merge "1.0.1" + content-type "~1.0.4" + finalhandler "1.3.1" + range-parser "~1.2.1" serve-static "1.16.2" + array-flatten "1.1.1" + path-to-regexp "0.1.12" setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" + cookie-signature "1.0.6" + merge-descriptors "1.0.3" + content-disposition "0.5.4" + +exsolve@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/exsolve/-/exsolve-1.0.7.tgz" + integrity sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw== extend@^3.0.0, extend@~3.0.2: version "3.0.2" @@ -11030,12 +10564,12 @@ extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== - optionalDependencies: - "@types/yauzl" "^2.9.1" dependencies: debug "^4.1.1" get-stream "^5.1.0" yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" @@ -11079,11 +10613,11 @@ fast-glob@3.3.1: resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.2" merge2 "^1.3.0" micromatch "^4.0.4" + glob-parent "^5.1.2" + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" fast-glob@^3.3.2, fast-glob@^3.3.3: version "3.3.3" @@ -11116,13 +10650,6 @@ fast-uri@^3.0.1: resolved "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz" integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== -fast-xml-parser@4.4.1: - version "4.4.1" - resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz" - integrity sha512-xkjOecfnKGkSsOwtZ5Pz7Us/T6mrbPQrq0nh+aCO5V9nk5NLWmasAHumTKjiPJPWANe+kAZ84Jc8ooJkzZ88Sw== - dependencies: - strnum "^1.0.5" - fast-xml-parser@5.2.5: version "5.2.5" resolved "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz" @@ -11222,17 +10749,17 @@ finalhandler@1.3.1: integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" + unpipe "~1.0.0" + parseurl "~1.3.3" + statuses "2.0.1" encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" find-my-way-ts@^0.1.5: - version "0.1.5" - resolved "https://registry.npmjs.org/find-my-way-ts/-/find-my-way-ts-0.1.5.tgz" - integrity sha512-4GOTMrpGQVzsCH2ruUn2vmwzV/02zF4q+ybhCIrw/Rkt3L8KWcycdC6aJMctJzwN4fXD4SD5F/4B9Sksh5rE0A== + version "0.1.6" + resolved "https://registry.npmjs.org/find-my-way-ts/-/find-my-way-ts-0.1.6.tgz" + integrity sha512-a85L9ZoXtNAey3Y6Z+eBWW658kO/MwR7zIafkIUPUMf3isZG0NCs2pjW2wtjxAKuJPxMAsHUIP4ZPGv0o5gyTA== find-root@^1.1.0: version "1.1.0" @@ -11303,8 +10830,8 @@ flat-cache@^4.0.0: resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: - flatted "^3.2.9" keyv "^4.5.4" + flatted "^3.2.9" flatted@^3.2.9, flatted@^3.3.3: version "3.3.3" @@ -11312,9 +10839,9 @@ flatted@^3.2.9, flatted@^3.3.3: integrity sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== fleetctl@^4.68.1: - version "4.69.0" - resolved "https://registry.npmjs.org/fleetctl/-/fleetctl-4.69.0.tgz" - integrity sha512-JbO/TuO8a5f7fYX1DhaMoE6WdFzi7Z/AbRQ0G8Xr9J7zTzUUfB0+F4HrAXD7V4zjvZzPYWnTYuKh52M1iIjUnQ== + version "4.70.1" + resolved "https://registry.npmjs.org/fleetctl/-/fleetctl-4.70.1.tgz" + integrity sha512-tk5o0p3/PwbEWTggTIy31dUkQBa83GH6smRIp773r4jsN0zw6bPvDNb40hg44tu4HOGXnPZhCsXJWuM6xEgfEg== dependencies: axios "1.8.2" rimraf "6.0.1" @@ -11351,30 +10878,31 @@ form-data@~2.3.2: integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" - combined-stream "^1.0.6" mime-types "^2.1.12" + combined-stream "^1.0.6" form-data@^2.5.0: - version "2.5.3" - resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.3.tgz" - integrity sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ== + version "2.5.5" + resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz" + integrity sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A== dependencies: + hasown "^2.0.2" asynckit "^0.4.0" - combined-stream "^1.0.8" - es-set-tostringtag "^2.1.0" mime-types "^2.1.35" safe-buffer "^5.2.1" + combined-stream "^1.0.8" + es-set-tostringtag "^2.1.0" form-data@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz" - integrity sha512-qsITQPfmvMOSAdeyZ+12I1c+CKSstAFAwu+97zrnWAbIr5u8wfsExUzCesVLC8NgHuRUqNN4Zy6UPWUTRGslcA== + version "4.0.4" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz" + integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== dependencies: + hasown "^2.0.2" asynckit "^0.4.0" + mime-types "^2.1.12" combined-stream "^1.0.8" es-set-tostringtag "^2.1.0" - hasown "^2.0.2" - mime-types "^2.1.12" form-data-encoder@1.7.2: version "1.7.2" @@ -11399,13 +10927,13 @@ fraction.js@^4.3.7: resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz" integrity sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew== -framer-motion@^12.18.1, framer-motion@^12.19.1: - version "12.19.1" - resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-12.19.1.tgz" - integrity sha512-nq9hwWAEKf4gzprbOZzKugLV5OVKF7zrNDY6UOVu+4D3ZgIkg8L9Jy6AMrpBM06fhbKJ6LEG6UY5+t7Eq6wNlg== +framer-motion@^12.18.1, framer-motion@^12.23.6: + version "12.23.6" + resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.6.tgz" + integrity sha512-dsJ389QImVE3lQvM8Mnk99/j8tiZDM/7706PCqvkQ8sSCnpmWxsgX+g0lj7r5OBVL0U36pIecCTBoIWcM2RuKw== dependencies: - motion-dom "^12.19.0" - motion-utils "^12.19.0" + motion-dom "^12.23.6" + motion-utils "^12.23.6" tslib "^2.4.0" fresh@0.5.2: @@ -11464,10 +10992,10 @@ fstream@^1.0.0, fstream@^1.0.12: resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" mkdirp ">=0.5 0" rimraf "2" + inherits "~2.0.0" + graceful-fs "^4.1.2" function-bind@^1.1.2: version "1.1.2" @@ -11502,13 +11030,13 @@ gauge@~2.7.3: integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== dependencies: aproba "^1.0.3" - console-control-strings "^1.0.0" + strip-ansi "^3.0.1" + wide-align "^1.1.0" has-unicode "^2.0.0" - object-assign "^4.1.0" signal-exit "^3.0.0" string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" + object-assign "^4.1.0" + console-control-strings "^1.0.0" geist@^1.3.1: version "1.4.2" @@ -11606,9 +11134,9 @@ get-tsconfig@^4.10.0: resolve-pkg-maps "^1.0.0" get-uri@^6.0.1: - version "6.0.4" - resolved "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz" - integrity sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ== + version "6.0.5" + resolved "https://registry.npmjs.org/get-uri/-/get-uri-6.0.5.tgz" + integrity sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg== dependencies: basic-ftp "^5.0.2" data-uri-to-buffer "^6.0.2" @@ -11638,8 +11166,8 @@ git-raw-commits@^4.0.0: resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz" integrity sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== dependencies: - dargs "^8.0.0" meow "^12.0.1" + dargs "^8.0.0" split2 "^4.0.0" gitmoji@^1.1.1: @@ -11655,11 +11183,11 @@ glob@^7.0.3, glob@^7.1.3: resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: - fs.realpath "^1.0.0" + once "^1.3.0" inflight "^1.0.4" inherits "2" minimatch "^3.1.1" - once "^1.3.0" + fs.realpath "^1.0.0" path-is-absolute "^1.0.0" glob@^10.0.0, glob@^10.2.2, glob@^10.3.10, glob@^10.4.5: @@ -11667,12 +11195,12 @@ glob@^10.0.0, glob@^10.2.2, glob@^10.3.10, glob@^10.4.5: resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: - foreground-child "^3.1.0" + minipass "^7.1.2" jackspeak "^3.1.2" minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" path-scurry "^1.11.1" + foreground-child "^3.1.0" + package-json-from-dist "^1.0.0" glob@^11.0.0: version "11.0.3" @@ -11707,11 +11235,6 @@ global-directory@^4.0.1: dependencies: ini "4.1.1" -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - globals@^14.0.0: version "14.0.0" resolved "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz" @@ -11762,17 +11285,17 @@ got@^11.8.6: resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== dependencies: + p-cancelable "^2.0.0" + responselike "^2.0.0" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" "@sindresorhus/is" "^4.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" - "@types/responselike" "^1.0.0" cacheable-lookup "^5.0.3" cacheable-request "^7.0.2" + "@types/responselike" "^1.0.0" decompress-response "^6.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" - p-cancelable "^2.0.0" - responselike "^2.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" graceful-fs@4.2.10: version "4.2.10" @@ -11803,13 +11326,13 @@ handlebars@^4.7.7: version "4.7.8" resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== - optionalDependencies: - uglify-js "^3.1.4" dependencies: minimist "^1.2.5" neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" har-schema@^2.0.0: version "2.0.0" @@ -11916,9 +11439,9 @@ highlight.js@~11.11.0: integrity sha512-Xwwo44whKBVCYoliBQwaPvtd/2tYFkRQtXDWj1nackaV2JPXx3L0+Jvd8/qCJ2p+ML0/XVkJ2q+Mr+UVdpJK5w== hls.js@^1.5.17: - version "1.6.5" - resolved "https://registry.npmjs.org/hls.js/-/hls.js-1.6.5.tgz" - integrity sha512-KMn5n7JBK+olC342740hDPHnGWfE8FiHtGMOdJPfUjRdARTWj9OB+8c13fnsf9sk1VtpuU2fKSgUjHvg4rNbzQ== + version "1.6.7" + resolved "https://registry.npmjs.org/hls.js/-/hls.js-1.6.7.tgz" + integrity sha512-QW2fnwDGKGc9DwQUGLbmMOz8G48UZK7PVNJPcOUql1b8jubKx4/eMHNP5mGqr6tYlJNDG1g10Lx2U/qPzL6zwQ== hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: version "3.3.2" @@ -11974,10 +11497,10 @@ htmlparser2@^8.0.2: resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz" integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" domutils "^3.0.1" entities "^4.4.0" + domhandler "^5.0.3" + domelementtype "^2.3.0" http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: version "4.2.0" @@ -11991,9 +11514,9 @@ http-errors@2.0.0: dependencies: depd "2.0.0" inherits "2.0.4" - setprototypeof "1.2.0" statuses "2.0.1" toidentifier "1.0.1" + setprototypeof "1.2.0" http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1, http-proxy-agent@^7.0.2: version "7.0.2" @@ -12008,9 +11531,9 @@ http-signature@~1.2.0: resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" sshpk "^1.7.0" + jsprim "^1.2.2" + assert-plus "^1.0.0" "http2-wrapper@^1.0.0-beta.5.2": version "1.0.3" @@ -12207,13 +11730,13 @@ init-package-json@^7.0.2: resolved "https://registry.npmjs.org/init-package-json/-/init-package-json-7.0.2.tgz" integrity sha512-Qg6nAQulaOQZjvaSzVLtYRqZmuqOi7gTknqqgdhZy7LV5oO+ppvHWq15tZYzGyxJLTH5BxRTqTa+cPDx2pSD9Q== dependencies: - "@npmcli/package-json" "^6.0.0" - npm-package-arg "^12.0.0" - promzard "^2.0.0" read "^4.0.0" semver "^7.3.5" - validate-npm-package-license "^3.0.4" + promzard "^2.0.0" + npm-package-arg "^12.0.0" + "@npmcli/package-json" "^6.0.0" validate-npm-package-name "^6.0.0" + validate-npm-package-license "^3.0.4" inline-style-parser@0.2.4: version "0.2.4" @@ -12706,10 +12229,10 @@ jackspeak@^3.1.2: version "3.4.3" resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - optionalDependencies: - "@pkgjs/parseargs" "^0.11.0" dependencies: "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" jackspeak@^4.1.1: version "4.1.1" @@ -12728,7 +12251,7 @@ jiti@^1.21.6: resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz" integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== -jiti@*, jiti@2.4.2, jiti@>=1.21.0, jiti@^2.4.1, jiti@^2.4.2: +jiti@2.4.2, jiti@^2.4.1, jiti@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz" integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== @@ -12783,31 +12306,31 @@ jsbn@1.1.0: resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== -jsdom@*, jsdom@^26.1.0: +jsdom@^26.1.0: version "26.1.0" resolved "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz" integrity sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg== dependencies: + ws "^8.18.0" + saxes "^6.0.0" + nwsapi "^2.2.16" + parse5 "^7.2.1" cssstyle "^4.2.1" data-urls "^5.0.0" decimal.js "^10.5.0" - html-encoding-sniffer "^4.0.0" - http-proxy-agent "^7.0.2" - https-proxy-agent "^7.0.6" - is-potential-custom-element-name "^1.0.1" - nwsapi "^2.2.16" - parse5 "^7.2.1" + whatwg-url "^14.1.1" rrweb-cssom "^0.8.0" - saxes "^6.0.0" symbol-tree "^3.2.4" tough-cookie "^5.1.1" - w3c-xmlserializer "^5.0.0" - webidl-conversions "^7.0.0" whatwg-encoding "^3.1.1" whatwg-mimetype "^4.0.0" - whatwg-url "^14.1.1" - ws "^8.18.0" + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.6" + w3c-xmlserializer "^5.0.0" + webidl-conversions "^7.0.0" xml-name-validator "^5.0.0" + html-encoding-sniffer "^4.0.0" + is-potential-custom-element-name "^1.0.1" jsesc@^3.0.2: version "3.1.0" @@ -12891,18 +12414,18 @@ jsondiffpatch@0.6.0: resolved "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz" integrity sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ== dependencies: - "@types/diff-match-patch" "^1.0.36" chalk "^5.3.0" diff-match-patch "^1.0.5" + "@types/diff-match-patch" "^1.0.36" jsonfile@^6.0.1, jsonfile@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - optionalDependencies: - graceful-fs "^4.1.6" dependencies: universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" @@ -12914,26 +12437,26 @@ jsonwebtoken@^9.0.0, jsonwebtoken@^9.0.2: resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz" integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== dependencies: + ms "^2.1.1" jws "^3.2.2" + semver "^7.5.4" + lodash.once "^4.0.0" lodash.includes "^4.3.0" + lodash.isnumber "^3.0.3" + lodash.isstring "^4.0.1" lodash.isboolean "^3.0.3" lodash.isinteger "^4.0.4" - lodash.isnumber "^3.0.3" lodash.isplainobject "^4.0.6" - lodash.isstring "^4.0.1" - lodash.once "^4.0.0" - ms "^2.1.1" - semver "^7.5.4" jsprim@^1.2.2: version "1.4.2" resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: - assert-plus "1.0.0" + verror "1.10.0" extsprintf "1.3.0" + assert-plus "1.0.0" json-schema "0.4.0" - verror "1.10.0" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" @@ -12952,8 +12475,8 @@ jszip@*, jszip@^3.10.1: dependencies: lie "~3.3.0" pako "~1.0.2" - readable-stream "~2.3.6" setimmediate "^1.0.5" + readable-stream "~2.3.6" just-diff@^6.0.0: version "6.0.2" @@ -12970,9 +12493,9 @@ jwa@^1.4.1: resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz" integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== dependencies: - buffer-equal-constant-time "^1.0.1" - ecdsa-sig-formatter "1.0.11" safe-buffer "^5.0.1" + ecdsa-sig-formatter "1.0.11" + buffer-equal-constant-time "^1.0.1" jws@^3.2.2: version "3.2.2" @@ -13006,10 +12529,10 @@ kleur@^3.0.3: resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -kysely@^0.28.2: - version "0.28.2" - resolved "https://registry.npmjs.org/kysely/-/kysely-0.28.2.tgz" - integrity sha512-4YAVLoF0Sf0UTqlhgQMFU9iQECdah7n+13ANkiuVfRvlK+uI0Etbgd7bVP36dKlG+NXWbhGua8vnGt+sdhvT7A== +kysely@^0.28.1: + version "0.28.3" + resolved "https://registry.npmjs.org/kysely/-/kysely-0.28.3.tgz" + integrity sha512-svKnkSH72APRdjfVCCOknxaC9Eb3nA2StHG9d5/sKOqRvHRp2Dtf1XwDvc92b4B5v6LV+EAGWXQbZ5jMOvHaDw== language-subtag-registry@^0.3.20: version "0.3.23" @@ -13119,14 +12642,14 @@ libnpmpublish@^10.0.1: resolved "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-10.0.1.tgz" integrity sha512-xNa1DQs9a8dZetNRV0ky686MNzv1MTqB3szgOlRR3Fr24x1gWRu7aB9OpLZsml0YekmtppgHBkyZ+8QZlzmEyw== dependencies: + ssri "^12.0.0" + semver "^7.3.7" ci-info "^4.0.0" - normalize-package-data "^7.0.0" - npm-package-arg "^12.0.0" - npm-registry-fetch "^18.0.1" proc-log "^5.0.0" - semver "^7.3.7" sigstore "^3.0.0" - ssri "^12.0.0" + npm-package-arg "^12.0.0" + npm-registry-fetch "^18.0.1" + normalize-package-data "^7.0.0" libnpmsearch@^8.0.0: version "8.0.0" @@ -13148,11 +12671,11 @@ libnpmversion@^7.0.0: resolved "https://registry.npmjs.org/libnpmversion/-/libnpmversion-7.0.0.tgz" integrity sha512-0xle91R6F8r/Q/4tHOnyKko+ZSquEXNdxwRdKCPv4kC1cOVBMFXRsKKrVtRKtXcFn362U8ZlJefk4Apu00424g== dependencies: + semver "^7.3.7" + proc-log "^5.0.0" "@npmcli/git" "^6.0.1" "@npmcli/run-script" "^9.0.1" json-parse-even-better-errors "^4.0.0" - proc-log "^5.0.0" - semver "^7.3.7" lie@^3.0.2, lie@~3.3.0: version "3.3.0" @@ -13161,23 +12684,23 @@ lie@^3.0.2, lie@~3.3.0: dependencies: immediate "~3.0.5" -lightningcss@1.30.1, lightningcss@^1.21.0: +lightningcss@1.30.1: version "1.30.1" resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz" integrity sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg== + dependencies: + detect-libc "^2.0.3" optionalDependencies: - lightningcss-darwin-arm64 "1.30.1" lightningcss-darwin-x64 "1.30.1" - lightningcss-freebsd-x64 "1.30.1" - lightningcss-linux-arm-gnueabihf "1.30.1" + lightningcss-linux-x64-gnu "1.30.1" + lightningcss-win32-x64-msvc "1.30.1" + lightningcss-win32-arm64-msvc "1.30.1" + lightningcss-darwin-arm64 "1.30.1" lightningcss-linux-arm64-gnu "1.30.1" + lightningcss-linux-arm-gnueabihf "1.30.1" lightningcss-linux-arm64-musl "1.30.1" - lightningcss-linux-x64-gnu "1.30.1" lightningcss-linux-x64-musl "1.30.1" - lightningcss-win32-arm64-msvc "1.30.1" - lightningcss-win32-x64-msvc "1.30.1" - dependencies: - detect-libc "^2.0.3" + lightningcss-freebsd-x64 "1.30.1" lightningcss-darwin-arm64@1.30.1: version "1.30.1" @@ -13514,35 +13037,35 @@ make-fetch-happen@^13.0.0, make-fetch-happen@^13.0.1: resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz" integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== dependencies: - "@npmcli/agent" "^2.0.0" + ssri "^10.0.0" cacache "^18.0.0" - http-cache-semantics "^4.1.1" - is-lambda "^1.0.1" minipass "^7.0.2" + proc-log "^4.2.0" + is-lambda "^1.0.1" + negotiator "^0.6.3" + "@npmcli/agent" "^2.0.0" + promise-retry "^2.0.1" minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - negotiator "^0.6.3" - proc-log "^4.2.0" - promise-retry "^2.0.1" - ssri "^10.0.0" + http-cache-semantics "^4.1.1" -make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.1, make-fetch-happen@^14.0.2, make-fetch-happen@^14.0.3: +make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.2, make-fetch-happen@^14.0.3: version "14.0.3" resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz" integrity sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ== dependencies: - "@npmcli/agent" "^3.0.0" + ssri "^12.0.0" cacache "^19.0.1" - http-cache-semantics "^4.1.1" minipass "^7.0.2" + proc-log "^5.0.0" + negotiator "^1.0.0" + "@npmcli/agent" "^3.0.0" + promise-retry "^2.0.1" minipass-fetch "^4.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - negotiator "^1.0.0" - proc-log "^5.0.0" - promise-retry "^2.0.1" - ssri "^12.0.0" + http-cache-semantics "^4.1.1" markdown-it@^14.0.0: version "14.1.0" @@ -13911,13 +13434,13 @@ micromark-extension-gfm-footnote@^2.0.0: integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== dependencies: devlop "^1.0.0" - micromark-core-commonmark "^2.0.0" + micromark-util-types "^2.0.0" + micromark-util-symbol "^2.0.0" micromark-factory-space "^2.0.0" micromark-util-character "^2.0.0" - micromark-util-normalize-identifier "^2.0.0" + micromark-core-commonmark "^2.0.0" micromark-util-sanitize-uri "^2.0.0" - micromark-util-symbol "^2.0.0" - micromark-util-types "^2.0.0" + micromark-util-normalize-identifier "^2.0.0" micromark-extension-gfm-strikethrough@^2.0.0: version "2.1.0" @@ -14051,10 +13574,10 @@ micromark-util-decode-string@^2.0.0: resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz" integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== dependencies: - decode-named-character-reference "^1.0.0" micromark-util-character "^2.0.0" micromark-util-decode-numeric-character-reference "^2.0.0" micromark-util-symbol "^2.0.0" + decode-named-character-reference "^1.0.0" micromark-util-encode@^2.0.0: version "2.0.1" @@ -14252,23 +13775,23 @@ minipass-fetch@^3.0.0: version "3.0.5" resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz" integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== - optionalDependencies: - encoding "^0.1.13" dependencies: minipass "^7.0.3" - minipass-sized "^1.0.3" minizlib "^2.1.2" + minipass-sized "^1.0.3" + optionalDependencies: + encoding "^0.1.13" minipass-fetch@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz" integrity sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ== - optionalDependencies: - encoding "^0.1.13" dependencies: minipass "^7.0.3" - minipass-sized "^1.0.3" minizlib "^3.0.1" + minipass-sized "^1.0.3" + optionalDependencies: + encoding "^0.1.13" minipass-flush@^1.0.5: version "1.0.5" @@ -14296,8 +13819,8 @@ minizlib@^2.1.1, minizlib@^2.1.2: resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: - minipass "^3.0.0" yallist "^4.0.0" + minipass "^3.0.0" minizlib@^3.0.1: version "3.0.2" @@ -14344,24 +13867,24 @@ module-details-from-path@^1.0.3: integrity sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w== motion@^12.9.2: - version "12.19.1" - resolved "https://registry.npmjs.org/motion/-/motion-12.19.1.tgz" - integrity sha512-OhoHWrht+zwDPccr2wGltJdwgz2elFBBt/sLei2g0hwICvy2hOBFUkA4Ylup3VnDgz+vUtecf694EV7bJK4XjA== + version "12.23.6" + resolved "https://registry.npmjs.org/motion/-/motion-12.23.6.tgz" + integrity sha512-6U55IW5i6Vut2ryKEhrZKg55490k9d6qdGXZoNSf98oQgDj5D7bqTnVJotQ6UW3AS6QfbW6KSLa7/e1gy+a07g== dependencies: - framer-motion "^12.19.1" + framer-motion "^12.23.6" tslib "^2.4.0" -motion-dom@^12.19.0: - version "12.19.0" - resolved "https://registry.npmjs.org/motion-dom/-/motion-dom-12.19.0.tgz" - integrity sha512-m96uqq8VbwxFLU0mtmlsIVe8NGGSdpBvBSHbnnOJQxniPaabvVdGgxSamhuDwBsRhwX7xPxdICgVJlOpzn/5bw== +motion-dom@^12.23.6: + version "12.23.6" + resolved "https://registry.npmjs.org/motion-dom/-/motion-dom-12.23.6.tgz" + integrity sha512-G2w6Nw7ZOVSzcQmsdLc0doMe64O/Sbuc2bVAbgMz6oP/6/pRStKRiVRV4bQfHp5AHYAKEGhEdVHTM+R3FDgi5w== dependencies: - motion-utils "^12.19.0" + motion-utils "^12.23.6" -motion-utils@^12.19.0: - version "12.19.0" - resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.19.0.tgz" - integrity sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw== +motion-utils@^12.23.6: + version "12.23.6" + resolved "https://registry.npmjs.org/motion-utils/-/motion-utils-12.23.6.tgz" + integrity sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ== mri@^1.2.0: version "1.2.0" @@ -14384,9 +13907,9 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2, ms@^2.1.3: integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== msgpackr@^1.11.4: - version "1.11.4" - resolved "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.4.tgz" - integrity sha512-uaff7RG9VIC4jacFW9xzL3jc0iM32DNHe4jYVycBcjUePT/Klnfj7pqtWJt9khvDFizmjN2TlYniYmSS2LIaZg== + version "1.11.5" + resolved "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz" + integrity sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA== optionalDependencies: msgpackr-extract "^3.0.2" @@ -14394,6 +13917,8 @@ msgpackr-extract@^3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz" integrity sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA== + dependencies: + node-gyp-build-optional-packages "5.2.2" optionalDependencies: "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.3" "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.3" @@ -14401,13 +13926,11 @@ msgpackr-extract@^3.0.2: "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.3" "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.3" "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.3" - dependencies: - node-gyp-build-optional-packages "5.2.2" multipasta@^0.2.5: - version "0.2.5" - resolved "https://registry.npmjs.org/multipasta/-/multipasta-0.2.5.tgz" - integrity sha512-c8eMDb1WwZcE02WVjHoOmUVk7fnKU/RmUcosHACglrWAuPQsEJv+E8430sXj6jNc1jHw0zrS16aCjQh4BcEb4A== + version "0.2.7" + resolved "https://registry.npmjs.org/multipasta/-/multipasta-0.2.7.tgz" + integrity sha512-KPA58d68KgGil15oDqXjkUBEBYc00XvbPj5/X+dyzeo/lWm9Nc25pQRlf1D+gv4OpK7NM0J1odrbu9JNNGvynA== mute-stream@^2.0.0: version "2.0.0" @@ -14452,10 +13975,10 @@ nanostores@^0.11.3: resolved "https://registry.npmjs.org/nanostores/-/nanostores-0.11.4.tgz" integrity sha512-k1oiVNN4hDK8NcNERSZLQiMfRzEGtfnvZvdBvey3SQbgn8Dcrk0h1I6vpxApjb10PFUflZrgJ2WEZyJQ+5v7YQ== -napi-postinstall@^0.2.4: - version "0.2.4" - resolved "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.4.tgz" - integrity sha512-ZEzHJwBhZ8qQSbknHqYcdtQVr8zUgGyM/q6h6qAyhtyVMNrSgDhrC4disf03dYW0e+czXyLnZINnCTEkWy0eJg== +napi-postinstall@^0.3.0: + version "0.3.2" + resolved "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.2.tgz" + integrity sha512-tWVJxJHmBWLy69PvO96TZMZDrzmw5KeiZBz3RHmiM2XZ9grBJ2WgMAFVVg25nqp3ZjTFUs2Ftw1JhscL3Teliw== natural-compare@^1.4.0: version "1.4.0" @@ -14487,54 +14010,31 @@ netmask@^2.0.2: resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== -"next@>= 14.0.0", next@>=13.2.0, "next@^13.0.0 || ^14.0.0 || ^15.0.0", next@^15.3.1: - version "15.3.4" - resolved "https://registry.npmjs.org/next/-/next-15.3.4.tgz" - integrity sha512-mHKd50C+mCjam/gcnwqL1T1vPx/XQNFlXqFIVdgQdVAFY9iIQtY0IfaVflEYzKiqjeA7B0cYYMaCrmAYFjs4rA== - optionalDependencies: - "@next/swc-darwin-arm64" "15.3.4" - "@next/swc-darwin-x64" "15.3.4" - "@next/swc-linux-arm64-gnu" "15.3.4" - "@next/swc-linux-arm64-musl" "15.3.4" - "@next/swc-linux-x64-gnu" "15.3.4" - "@next/swc-linux-x64-musl" "15.3.4" - "@next/swc-win32-arm64-msvc" "15.3.4" - "@next/swc-win32-x64-msvc" "15.3.4" - sharp "^0.34.1" - dependencies: - "@next/env" "15.3.4" - "@swc/counter" "0.1.3" - "@swc/helpers" "0.5.15" - busboy "1.6.0" - caniuse-lite "^1.0.30001579" - postcss "8.4.31" - styled-jsx "5.1.6" - -next@*, "next@15.4.0-canary.85", next@>=14.2.0: +"next@15.4.0-canary.85", "next@>= 14.0.0", next@>=13.2.0, "next@^13.0.0 || ^14.0.0 || ^15.0.0": version "15.4.0-canary.85" resolved "https://registry.npmjs.org/next/-/next-15.4.0-canary.85.tgz" integrity sha512-xD+Es5CYPkb20//rQ9/vmWhx1TCohe8V2BhVzwkMv9UwAF8wMUK4GCyHyyXnvxqlNRfGG8KhDjS4IaTxq1ShEg== + dependencies: + postcss "8.4.31" + "@next/env" "15.4.0-canary.85" + styled-jsx "5.1.6" + "@swc/helpers" "0.5.15" + caniuse-lite "^1.0.30001579" optionalDependencies: - "@next/swc-darwin-arm64" "15.4.0-canary.85" + sharp "^0.34.1" "@next/swc-darwin-x64" "15.4.0-canary.85" - "@next/swc-linux-arm64-gnu" "15.4.0-canary.85" - "@next/swc-linux-arm64-musl" "15.4.0-canary.85" + "@next/swc-darwin-arm64" "15.4.0-canary.85" "@next/swc-linux-x64-gnu" "15.4.0-canary.85" "@next/swc-linux-x64-musl" "15.4.0-canary.85" - "@next/swc-win32-arm64-msvc" "15.4.0-canary.85" "@next/swc-win32-x64-msvc" "15.4.0-canary.85" - sharp "^0.34.1" - dependencies: - "@next/env" "15.4.0-canary.85" - "@swc/helpers" "0.5.15" - caniuse-lite "^1.0.30001579" - postcss "8.4.31" - styled-jsx "5.1.6" + "@next/swc-linux-arm64-gnu" "15.4.0-canary.85" + "@next/swc-linux-arm64-musl" "15.4.0-canary.85" + "@next/swc-win32-arm64-msvc" "15.4.0-canary.85" next-safe-action@^8.0.3: - version "8.0.7" - resolved "https://registry.npmjs.org/next-safe-action/-/next-safe-action-8.0.7.tgz" - integrity sha512-clQRxsvf4nZktCYkP1seeNH5rOZjsx6VYSAlpphvXvW+INIBvGySEStKutwtAPFV0/uZFJmNPt77ankoepUYXQ== + version "8.0.8" + resolved "https://registry.npmjs.org/next-safe-action/-/next-safe-action-8.0.8.tgz" + integrity sha512-qh1wMMrv7vfxoL67ePn1+LDWOrEjlRe7bIgKI47e5TVWOQ2YCHY/ir2Wx687vwDWPF41ifUnHA7jm/HH8JQHNQ== next-themes@^0.4.4: version "0.4.6" @@ -14573,34 +14073,34 @@ node-gyp@^3.0.3: resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz" integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== dependencies: - fstream "^1.0.0" + tar "^2.0.0" glob "^7.0.3" - graceful-fs "^4.1.2" - mkdirp "^0.5.0" nopt "2 || 3" - npmlog "0 || 1 || 2 || 3 || 4" osenv "0" - request "^2.87.0" + which "1" + mkdirp "^0.5.0" + npmlog "0 || 1 || 2 || 3 || 4" rimraf "2" semver "~5.3.0" - tar "^2.0.0" - which "1" + fstream "^1.0.0" + request "^2.87.0" + graceful-fs "^4.1.2" node-gyp@^10.0.0: version "10.3.1" resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz" integrity sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ== dependencies: - env-paths "^2.2.0" - exponential-backoff "^3.1.1" + tar "^6.2.1" glob "^10.3.10" - graceful-fs "^4.2.6" - make-fetch-happen "^13.0.0" nopt "^7.0.0" - proc-log "^4.1.0" - semver "^7.3.5" - tar "^6.2.1" which "^4.0.0" + semver "^7.3.5" + proc-log "^4.1.0" + env-paths "^2.2.0" + graceful-fs "^4.2.6" + make-fetch-happen "^13.0.0" + exponential-backoff "^3.1.1" node-gyp@^11.0.0, node-gyp@^11.2.0: version "11.2.0" @@ -14656,14 +14156,14 @@ normalize-package-data@^6.0.0: resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz" integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== dependencies: - hosted-git-info "^7.0.0" semver "^7.3.5" + hosted-git-info "^7.0.0" validate-npm-package-license "^3.0.4" normalize-package-data@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.0.tgz" - integrity sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA== + version "7.0.1" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-7.0.1.tgz" + integrity sha512-linxNAT6M0ebEYZOx2tO6vBEFsVgnPpv+AVjk0wJHfaUIbq31Jm3T6vvZaarnOeWDh8ShnwXuaAyM7WT3RzErA== dependencies: hosted-git-info "^8.0.0" semver "^7.3.5" @@ -14811,9 +14311,9 @@ npm-package-arg@^11.0.0, npm-package-arg@^11.0.2: resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz" integrity sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw== dependencies: - hosted-git-info "^7.0.0" - proc-log "^4.0.0" semver "^7.3.5" + proc-log "^4.0.0" + hosted-git-info "^7.0.0" validate-npm-package-name "^5.0.0" npm-package-arg@^12.0.0, npm-package-arg@^12.0.2: @@ -14821,9 +14321,9 @@ npm-package-arg@^12.0.0, npm-package-arg@^12.0.2: resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz" integrity sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA== dependencies: - hosted-git-info "^8.0.0" - proc-log "^5.0.0" semver "^7.3.5" + proc-log "^5.0.0" + hosted-git-info "^8.0.0" validate-npm-package-name "^6.0.0" npm-packlist@^8.0.0: @@ -14845,56 +14345,56 @@ npm-pick-manifest@^9.0.0, npm-pick-manifest@^9.0.1: resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz" integrity sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA== dependencies: + semver "^7.3.5" + npm-package-arg "^11.0.0" npm-install-checks "^6.0.0" npm-normalize-package-bin "^3.0.0" - npm-package-arg "^11.0.0" - semver "^7.3.5" npm-pick-manifest@^10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz" integrity sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ== dependencies: + semver "^7.3.5" + npm-package-arg "^12.0.0" npm-install-checks "^7.1.0" npm-normalize-package-bin "^4.0.0" - npm-package-arg "^12.0.0" - semver "^7.3.5" npm-profile@^11.0.1: version "11.0.1" resolved "https://registry.npmjs.org/npm-profile/-/npm-profile-11.0.1.tgz" integrity sha512-HP5Cw9WHwFS9vb4fxVlkNAQBUhVL5BmW6rAR+/JWkpwqcFJid7TihKUdYDWqHl0NDfLd0mpucheGySqo8ysyfw== dependencies: - npm-registry-fetch "^18.0.0" proc-log "^5.0.0" + npm-registry-fetch "^18.0.0" npm-registry-fetch@^17.0.0, npm-registry-fetch@^17.0.1: version "17.1.0" resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz" integrity sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA== dependencies: - "@npmcli/redact" "^2.0.0" - jsonparse "^1.3.1" - make-fetch-happen "^13.0.0" minipass "^7.0.2" - minipass-fetch "^3.0.0" minizlib "^2.1.2" - npm-package-arg "^11.0.0" proc-log "^4.0.0" + jsonparse "^1.3.1" + "@npmcli/redact" "^2.0.0" + minipass-fetch "^3.0.0" + npm-package-arg "^11.0.0" + make-fetch-happen "^13.0.0" npm-registry-fetch@^18.0.0, npm-registry-fetch@^18.0.1, npm-registry-fetch@^18.0.2: version "18.0.2" resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz" integrity sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ== dependencies: - "@npmcli/redact" "^3.0.0" - jsonparse "^1.3.1" - make-fetch-happen "^14.0.0" minipass "^7.0.2" - minipass-fetch "^4.0.0" minizlib "^3.0.1" - npm-package-arg "^12.0.0" proc-log "^5.0.0" + jsonparse "^1.3.1" + "@npmcli/redact" "^3.0.0" + minipass-fetch "^4.0.0" + npm-package-arg "^12.0.0" + make-fetch-happen "^14.0.0" npm-run-path@^4.0.1: version "4.0.1" @@ -14928,10 +14428,10 @@ npm-user-validate@^3.0.0: resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" gauge "~2.7.3" set-blocking "~2.0.0" + are-we-there-yet "~1.1.2" + console-control-strings "~1.1.0" number-flow@0.5.8: version "0.5.8" @@ -14957,6 +14457,17 @@ nwsapi@^2.2.16: resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.20.tgz" integrity sha512-/ieB+mDe4MrrKMT8z+mQL8klXydZWGR5Dowt4RAGKbJ3kIGEx3X4ljUo+6V73IXtUPWgfOlU5B9MlGxFO5T+cA== +nypm@0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/nypm/-/nypm-0.6.0.tgz" + integrity sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg== + dependencies: + citty "^0.1.6" + consola "^3.4.0" + pathe "^2.0.3" + pkg-types "^2.0.0" + tinyexec "^0.3.2" + oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz" @@ -15069,26 +14580,26 @@ onetime@^7.0.0: mimic-function "^5.0.0" open@^10.1.0: - version "10.1.2" - resolved "https://registry.npmjs.org/open/-/open-10.1.2.tgz" - integrity sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw== + version "10.2.0" + resolved "https://registry.npmjs.org/open/-/open-10.2.0.tgz" + integrity sha512-YgBpdJHPyQ2UE5x+hlSXcnejzAvD0b22U2OuAP+8OnlJT+PjWPxtgmGqKKc+RgTM63U9gN0YzrYc71R2WT/hTA== dependencies: default-browser "^5.2.1" define-lazy-prop "^3.0.0" is-inside-container "^1.0.0" - is-wsl "^3.1.0" + wsl-utils "^0.1.0" optionator@^0.9.3: version "0.9.4" resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - deep-is "^0.1.3" - fast-levenshtein "^2.0.6" - levn "^0.4.1" prelude-ls "^1.2.1" - type-check "^0.4.0" + deep-is "^0.1.3" word-wrap "^1.2.5" + type-check "^0.4.0" + levn "^0.4.1" + fast-levenshtein "^2.0.6" ora@^8.0.0, ora@^8.2.0: version "8.2.0" @@ -15125,8 +14636,8 @@ osenv@0: resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: - os-homedir "^1.0.0" os-tmpdir "^1.0.0" + os-homedir "^1.0.0" own-keys@^1.0.1: version "1.0.1" @@ -15223,8 +14734,8 @@ p-queue@^6, p-queue@^6.6.1: resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== dependencies: - eventemitter3 "^4.0.4" p-timeout "^3.2.0" + eventemitter3 "^4.0.4" p-reduce@^2.0.0: version "2.1.0" @@ -15241,8 +14752,8 @@ p-retry@^4: resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - "@types/retry" "0.12.0" retry "^0.13.1" + "@types/retry" "0.12.0" p-timeout@^3.2.0: version "3.2.0" @@ -15288,69 +14799,69 @@ pacote@^18.0.0, pacote@^18.0.6: resolved "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz" integrity sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A== dependencies: - "@npmcli/git" "^5.0.0" - "@npmcli/installed-package-contents" "^2.0.1" - "@npmcli/package-json" "^5.1.0" - "@npmcli/promise-spawn" "^7.0.0" - "@npmcli/run-script" "^8.0.0" + tar "^6.1.11" + ssri "^10.0.0" cacache "^18.0.0" - fs-minipass "^3.0.0" minipass "^7.0.2" - npm-package-arg "^11.0.0" + proc-log "^4.0.0" + sigstore "^2.2.0" + "@npmcli/git" "^5.0.0" + fs-minipass "^3.0.0" npm-packlist "^8.0.0" + promise-retry "^2.0.1" + npm-package-arg "^11.0.0" npm-pick-manifest "^9.0.0" + "@npmcli/run-script" "^8.0.0" npm-registry-fetch "^17.0.0" - proc-log "^4.0.0" - promise-retry "^2.0.1" - sigstore "^2.2.0" - ssri "^10.0.0" - tar "^6.1.11" + "@npmcli/package-json" "^5.1.0" + "@npmcli/promise-spawn" "^7.0.0" + "@npmcli/installed-package-contents" "^2.0.1" pacote@^19.0.0, pacote@^19.0.1: version "19.0.1" resolved "https://registry.npmjs.org/pacote/-/pacote-19.0.1.tgz" integrity sha512-zIpxWAsr/BvhrkSruspG8aqCQUUrWtpwx0GjiRZQhEM/pZXrigA32ElN3vTcCPUDOFmHr6SFxwYrvVUs5NTEUg== dependencies: - "@npmcli/git" "^6.0.0" - "@npmcli/installed-package-contents" "^3.0.0" - "@npmcli/package-json" "^6.0.0" - "@npmcli/promise-spawn" "^8.0.0" - "@npmcli/run-script" "^9.0.0" + tar "^6.1.11" + ssri "^12.0.0" cacache "^19.0.0" - fs-minipass "^3.0.0" minipass "^7.0.2" - npm-package-arg "^12.0.0" + proc-log "^5.0.0" + sigstore "^3.0.0" + "@npmcli/git" "^6.0.0" + fs-minipass "^3.0.0" npm-packlist "^9.0.0" + promise-retry "^2.0.1" + npm-package-arg "^12.0.0" npm-pick-manifest "^10.0.0" + "@npmcli/run-script" "^9.0.0" npm-registry-fetch "^18.0.0" - proc-log "^5.0.0" - promise-retry "^2.0.1" - sigstore "^3.0.0" - ssri "^12.0.0" - tar "^6.1.11" + "@npmcli/package-json" "^6.0.0" + "@npmcli/promise-spawn" "^8.0.0" + "@npmcli/installed-package-contents" "^3.0.0" pacote@^20.0.0: version "20.0.0" resolved "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz" integrity sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A== dependencies: - "@npmcli/git" "^6.0.0" - "@npmcli/installed-package-contents" "^3.0.0" - "@npmcli/package-json" "^6.0.0" - "@npmcli/promise-spawn" "^8.0.0" - "@npmcli/run-script" "^9.0.0" + tar "^6.1.11" + ssri "^12.0.0" cacache "^19.0.0" - fs-minipass "^3.0.0" minipass "^7.0.2" - npm-package-arg "^12.0.0" + proc-log "^5.0.0" + sigstore "^3.0.0" + "@npmcli/git" "^6.0.0" + fs-minipass "^3.0.0" npm-packlist "^9.0.0" + promise-retry "^2.0.1" + npm-package-arg "^12.0.0" npm-pick-manifest "^10.0.0" + "@npmcli/run-script" "^9.0.0" npm-registry-fetch "^18.0.0" - proc-log "^5.0.0" - promise-retry "^2.0.1" - sigstore "^3.0.0" - ssri "^12.0.0" - tar "^6.1.11" + "@npmcli/package-json" "^6.0.0" + "@npmcli/promise-spawn" "^8.0.0" + "@npmcli/installed-package-contents" "^3.0.0" pako@~1.0.2: version "1.0.11" @@ -15369,18 +14880,18 @@ parse-conflict-json@^3.0.0: resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz" integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== dependencies: - json-parse-even-better-errors "^3.0.0" just-diff "^6.0.0" just-diff-apply "^5.2.0" + json-parse-even-better-errors "^3.0.0" parse-conflict-json@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-4.0.0.tgz" integrity sha512-37CN2VtcuvKgHUs8+0b1uJeEsbGn61GRHz469C94P5xiOoqpDYJYwjg4RY9Vmz39WyZAVkR5++nbJwLMIgOCnQ== dependencies: - json-parse-even-better-errors "^4.0.0" just-diff "^6.0.0" just-diff-apply "^5.2.0" + json-parse-even-better-errors "^4.0.0" parse-entities@^4.0.0: version "4.0.2" @@ -15408,10 +14919,10 @@ parse-json@^5.0.0, parse-json@^5.2.0: resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: - "@babel/code-frame" "^7.0.0" error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" + "@babel/code-frame" "^7.0.0" lines-and-columns "^1.1.6" + json-parse-even-better-errors "^2.3.0" parse-json@^8.0.0: version "8.3.0" @@ -15504,8 +15015,8 @@ path-scurry@^1.11.1: resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: - lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + lru-cache "^10.2.0" path-scurry@^2.0.0: version "2.0.0" @@ -15561,22 +15072,22 @@ performance-now@^2.1.0: integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== pg@>=8.0, pg@^8.11.3: - version "8.16.2" - resolved "https://registry.npmjs.org/pg/-/pg-8.16.2.tgz" - integrity sha512-OtLWF0mKLmpxelOt9BqVq83QV6bTfsS0XLegIeAKqKjurRnRKie1Dc1iL89MugmSLhftxw6NNCyZhm1yQFLMEQ== - optionalDependencies: - pg-cloudflare "^1.2.6" + version "8.16.3" + resolved "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz" + integrity sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw== dependencies: pg-connection-string "^2.9.1" pg-pool "^3.10.1" - pg-protocol "^1.10.2" + pg-protocol "^1.10.3" pg-types "2.2.0" pgpass "1.0.5" + optionalDependencies: + pg-cloudflare "^1.2.7" -pg-cloudflare@^1.2.6: - version "1.2.6" - resolved "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.6.tgz" - integrity sha512-uxmJAnmIgmYgnSFzgOf2cqGQBzwnRYcrEgXuFjJNEkpedEIPBSEzxY7ph4uA9k1mI+l/GR0HjPNS6FKNZe8SBQ== +pg-cloudflare@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz" + integrity sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg== pg-connection-string@^2.9.1: version "2.9.1" @@ -15593,10 +15104,10 @@ pg-pool@^3.10.1: resolved "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz" integrity sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg== -pg-protocol@^1.10.2: - version "1.10.2" - resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.2.tgz" - integrity sha512-Ci7jy8PbaWxfsck2dwZdERcDG2A0MG8JoQILs+uZNjABFuBuItAZCWUNz8sXRDMoui24rJw7WlXqgpMdBSN/vQ== +pg-protocol@^1.10.3: + version "1.10.3" + resolved "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz" + integrity sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ== pg-types@2.2.0: version "2.2.0" @@ -15631,10 +15142,10 @@ picomatch@^3.0.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz" integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== -"picomatch@^3 || ^4", picomatch@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz" - integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== +picomatch@^4.0.2: + version "4.0.3" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" + integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== pify@^2.3.0: version "2.3.0" @@ -15671,23 +15182,32 @@ pkg-types@^1.1.3, pkg-types@^1.3.0: resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz" integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== dependencies: - confbox "^0.1.8" mlly "^1.7.4" pathe "^2.0.1" + confbox "^0.1.8" + +pkg-types@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-2.2.0.tgz" + integrity sha512-2SM/GZGAEkPp3KWORxQZns4M+WSeXbC2HEvmOIJe3Cmiv6ieAJvdVhDldtHqM5J1Y7MrR1XhkBT/rMlhh9FdqQ== + dependencies: + confbox "^0.2.2" + exsolve "^1.0.7" + pathe "^2.0.3" -playwright@1.53.1: - version "1.53.1" - resolved "https://registry.npmjs.org/playwright/-/playwright-1.53.1.tgz" - integrity sha512-LJ13YLr/ocweuwxyGf1XNFWIU4M2zUSo149Qbp+A4cpwDjsxRPj7k6H25LBrEHiEwxvRbD8HdwvQmRMSvquhYw== +playwright@1.54.1: + version "1.54.1" + resolved "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz" + integrity sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g== + dependencies: + playwright-core "1.54.1" optionalDependencies: fsevents "2.3.2" - dependencies: - playwright-core "1.53.1" -playwright-core@1.53.1, playwright-core@^1.52.0: - version "1.53.1" - resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.53.1.tgz" - integrity sha512-Z46Oq7tLAyT0lGoFx4DOuB1IA9D1TPj0QkYxpPVUnGDqHHvDpCftu1J2hM2PiWsNMoZh8+LQaarAWcDfPBc6zg== +playwright-core@1.54.1, playwright-core@^1.52.0: + version "1.54.1" + resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.1.tgz" + integrity sha512-Nbjs2zjj0htNhzgiy5wu+3w09YetDx5pkrpI/kZotDlDUaYk0HVA5xrBVPdow4SAUIlhgKcJeJg4GRKW6xHusA== possible-typed-array-names@^1.0.0: version "1.1.0" @@ -15703,7 +15223,7 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@>=8.0.9, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.12, postcss@^8.4.21, postcss@^8.4.38, postcss@^8.4.41, postcss@^8.4.47, postcss@^8.5.3, postcss@^8.5.4, postcss@^8.5.6: +postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.38, postcss@^8.4.41, postcss@^8.4.47, postcss@^8.5.3, postcss@^8.5.4, postcss@^8.5.6: version "8.5.6" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== @@ -15717,9 +15237,9 @@ postcss-import@^15.1.0: resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: - postcss-value-parser "^4.0.0" - read-cache "^1.0.0" resolve "^1.1.7" + read-cache "^1.0.0" + postcss-value-parser "^4.0.0" postcss-js@^4.0.1: version "4.0.1" @@ -15733,8 +15253,8 @@ postcss-load-config@^4.0.2: resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: - lilconfig "^3.0.0" yaml "^2.3.4" + lilconfig "^3.0.0" postcss-load-config@^6.0.1: version "6.0.1" @@ -15807,9 +15327,9 @@ postgres-interval@^1.1.0: xtend "^4.0.0" posthog-js@^1.236.6: - version "1.255.1" - resolved "https://registry.npmjs.org/posthog-js/-/posthog-js-1.255.1.tgz" - integrity sha512-KMh0o9MhORhEZVjXpktXB5rJ8PfDk+poqBoTSoLzWgNjhJf6D8jcyB9jUMA6vVPfn4YeepVX5NuclDRqOwr5Mw== + version "1.257.2" + resolved "https://registry.npmjs.org/posthog-js/-/posthog-js-1.257.2.tgz" + integrity sha512-E+8wI/ahaiUGrmkilOtAB9aTFL+oELwOEsH1eO/2NyXB5WWcSUk6Rm1loixq8/lC4f3oR+Qqp9rHyXTSYbBDRQ== dependencies: core-js "^3.38.1" fflate "^0.4.8" @@ -15824,9 +15344,9 @@ posthog-node@^4.14.0: axios "^1.8.2" postprocessing@>=6.30.0, postprocessing@^6.36.6: - version "6.37.4" - resolved "https://registry.npmjs.org/postprocessing/-/postprocessing-6.37.4.tgz" - integrity sha512-O4dv29MDRSjXgMF1Luz3YHlT7NawKIliCfO2OgUCtIMTLNMCg+v0RLuT9/LQSDtVNXxUHGyy3mucbF3UePcElA== + version "6.37.6" + resolved "https://registry.npmjs.org/postprocessing/-/postprocessing-6.37.6.tgz" + integrity sha512-KrdKLf1257RkoIk3z3nhRS0aToKrX2xJgtR0lbnOQUjd+1I4GVNv1gQYsQlfRglvEXjpzrwqOA5fXfoDBimadg== potpack@^1.0.1: version "1.0.2" @@ -15844,28 +15364,28 @@ prelude-ls@^1.2.1: integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== prettier@>=2.0, prettier@^3.0, prettier@^3.5.3: - version "3.6.1" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.6.1.tgz" - integrity sha512-5xGWRa90Sp2+x1dQtNpIpeOQpTDBs9cZDmA/qs2vDNN2i18PdapqY7CmBeyLlMuGqXJRIOPaCaVZTLNQRWUH/A== + version "3.6.2" + resolved "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz" + integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== -prettier-plugin-organize-imports@*, prettier-plugin-organize-imports@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.1.0.tgz" - integrity sha512-5aWRdCgv645xaa58X8lOxzZoiHAldAPChljr/MT0crXVOWTZ+Svl4hIWlz+niYSlO6ikE5UXkN1JrRvIP2ut0A== +prettier-plugin-organize-imports@^4.1.0: + version "4.2.0" + resolved "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.2.0.tgz" + integrity sha512-Zdy27UhlmyvATZi67BTnLcKTo8fm6Oik59Sz6H64PgZJVs6NJpPD1mT240mmJn62c98/QaL+r3kx9Q3gRpDajg== prettier-plugin-tailwindcss@^0.6.0: - version "0.6.13" - resolved "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.13.tgz" - integrity sha512-uQ0asli1+ic8xrrSmIOaElDu0FacR4x69GynTh2oZjFY10JUt6EEumTQl5tB4fMeD6I1naKd+4rXQQ7esT2i1g== + version "0.6.14" + resolved "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.14.tgz" + integrity sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg== pretty-format@^27.0.2: version "27.5.1" resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: + react-is "^17.0.1" ansi-regex "^5.0.1" ansi-styles "^5.0.0" - react-is "^17.0.1" pretty-ms@^9.2.0: version "9.2.0" @@ -15874,13 +15394,13 @@ pretty-ms@^9.2.0: dependencies: parse-ms "^4.0.0" -prisma@*, prisma@^6.9.0: - version "6.10.1" - resolved "https://registry.npmjs.org/prisma/-/prisma-6.10.1.tgz" - integrity sha512-khhlC/G49E4+uyA3T3H5PRBut486HD2bDqE2+rvkU0pwk9IAqGFacLFUyIx9Uw+W2eCtf6XGwsp+/strUwMNPw== +prisma@^6.9.0: + version "6.12.0" + resolved "https://registry.npmjs.org/prisma/-/prisma-6.12.0.tgz" + integrity sha512-pmV7NEqQej9WjizN6RSNIwf7Y+jeh9mY1JEX2WjGxJi4YZWexClhde1yz/FuvAM+cTwzchcMytu2m4I6wPkIzg== dependencies: - "@prisma/config" "6.10.1" - "@prisma/engines" "6.10.1" + "@prisma/config" "6.12.0" + "@prisma/engines" "6.12.0" prismjs@^1.30.0: version "1.30.0" @@ -15965,7 +15485,7 @@ promise.allsettled@^1.0.2: get-intrinsic "^1.2.1" iterate-value "^1.0.2" -prompts@^2.4.2: +prompts@2.4.2, prompts@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== @@ -16014,8 +15534,8 @@ prosemirror-commands@^1.0.0, prosemirror-commands@^1.6.2: integrity sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w== dependencies: prosemirror-model "^1.0.0" - prosemirror-state "^1.0.0" prosemirror-transform "^1.10.2" + prosemirror-state "^1.0.0" prosemirror-dropcursor@^1.8.1: version "1.8.2" @@ -16023,8 +15543,8 @@ prosemirror-dropcursor@^1.8.1: integrity sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw== dependencies: prosemirror-state "^1.0.0" - prosemirror-transform "^1.1.0" prosemirror-view "^1.1.0" + prosemirror-transform "^1.1.0" prosemirror-gapcursor@^1.3.2: version "1.3.2" @@ -16059,17 +15579,17 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.2.2: resolved "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz" integrity sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw== dependencies: - prosemirror-state "^1.0.0" w3c-keyname "^2.2.0" + prosemirror-state "^1.0.0" prosemirror-markdown@^1.13.1: version "1.13.2" resolved "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz" integrity sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g== dependencies: - "@types/markdown-it" "^14.0.0" markdown-it "^14.0.0" prosemirror-model "^1.25.0" + "@types/markdown-it" "^14.0.0" prosemirror-menu@^1.2.4: version "1.2.5" @@ -16077,14 +15597,14 @@ prosemirror-menu@^1.2.4: integrity sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ== dependencies: crelt "^1.0.0" + prosemirror-state "^1.0.0" prosemirror-commands "^1.0.0" prosemirror-history "^1.0.0" - prosemirror-state "^1.0.0" prosemirror-model@^1.0.0, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.22.1, prosemirror-model@^1.23.0, prosemirror-model@^1.25.0: - version "1.25.1" - resolved "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.1.tgz" - integrity sha512-AUvbm7qqmpZa5d9fPKMvH1Q5bqYQvAZWOGRvxsB6iFLyycvC9MwNemNVjHVrWgjaoxAfY8XVg7DbvQ/qxvI9Eg== + version "1.25.2" + resolved "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.2.tgz" + integrity sha512-BVypCAJ4SL6jOiTsDffP3Wp6wD69lRhI4zg/iT8JXjp3ccZFiq5WyguxvMKmdKFC3prhaig7wSr8dneDToHE1Q== dependencies: orderedmap "^2.0.0" @@ -16101,8 +15621,8 @@ prosemirror-schema-list@^1.4.1: integrity sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q== dependencies: prosemirror-model "^1.0.0" - prosemirror-state "^1.0.0" prosemirror-transform "^1.7.3" + prosemirror-state "^1.0.0" prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.4.2, prosemirror-state@^1.4.3: version "1.4.3" @@ -16140,9 +15660,9 @@ prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transfor prosemirror-model "^1.21.0" prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.27.0, prosemirror-view@^1.31.0, prosemirror-view@^1.33.8, prosemirror-view@^1.37.0, prosemirror-view@^1.39.1: - version "1.40.0" - resolved "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.40.0.tgz" - integrity sha512-2G3svX0Cr1sJjkD/DYWSe3cfV5VPVTBOxI9XQEGWJDFEpsZb/gh4MV29ctv+OJx2RFX4BLt09i+6zaGM/ldkCw== + version "1.40.1" + resolved "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.40.1.tgz" + integrity sha512-pbwUjt3G7TlsQQHDiYSupWBhJswpLVB09xXm1YiJPdkjkh9Pe7Y51XdLh5VWIZmROLY8UpUpG03lkdhm9lzIBA== dependencies: prosemirror-model "^1.20.0" prosemirror-state "^1.0.0" @@ -16224,16 +15744,16 @@ punycode.js@^2.3.1: integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== puppeteer-core@^24.7.2: - version "24.10.2" - resolved "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.10.2.tgz" - integrity sha512-CnzhOgrZj8DvkDqI+Yx+9or33i3Y9uUYbKyYpP4C13jWwXx/keQ38RMTMmxuLCWQlxjZrOH0Foq7P2fGP7adDQ== + version "24.14.0" + resolved "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.14.0.tgz" + integrity sha512-NO9XpCl+i8oB0zJp81iPhzMo2QK8/JTj4ramSvTpGCo9CPCNo4AZ8qVOGpSgXzlcOfOT3VHOkzTfPo08GOE5jA== dependencies: - "@puppeteer/browsers" "2.10.5" - chromium-bidi "5.1.0" + "@puppeteer/browsers" "2.10.6" + chromium-bidi "7.1.1" debug "^4.4.1" - devtools-protocol "0.0.1452169" + devtools-protocol "0.0.1464554" typed-query-selector "^2.12.0" - ws "^8.18.2" + ws "^8.18.3" pure-rand@^6.1.0: version "6.1.0" @@ -16290,18 +15810,18 @@ raw-body@2.5.2, raw-body@^2.3.3: integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" unpipe "1.0.0" + iconv-lite "0.4.24" + http-errors "2.0.0" rc@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: - deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" + deep-extend "^0.6.0" strip-json-comments "~2.0.1" react@*, react@18.x, "react@>= 16.14", "react@>= 16.8 || 18.0.0", "react@>= 16.8.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", "react@>= 18.2.0", react@>=16, react@>=16.13, react@>=16.6.0, react@>=16.8, "react@>=16.8.0 || ^17.0.0 || ^18", react@>=17.0, react@>=18, "react@>=18.2.0 || ^19.0.0-0", "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", "react@^17 || ^18 || ^19", "react@^17.0.2 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0 || ^19.0", "react@^18.0 || ^19.0 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0 || ^19.0.0-rc", react@^18.2.0, "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react@^18.2.0 || ^19.0.0", react@^19, react@^19.1.0: @@ -16343,7 +15863,7 @@ react-dnd-html5-backend@^16.0.1: dependencies: dnd-core "^16.0.1" -react-dom@*, "react-dom@>= 18.2.0", react-dom@>=16.13, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=18.0.0, "react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", react-dom@^18.2.0, "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom@^18.2.0 || ^19.0.0", react-dom@^19, react-dom@^19.1.0: +react-dom@*, "react-dom@>= 18.2.0", react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=18.0.0, "react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", react-dom@^18.2.0, "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom@^18.2.0 || ^19.0.0", react-dom@^19.1.0: version "19.1.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz" integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== @@ -16360,9 +15880,9 @@ react-dropzone@^14.3.5: prop-types "^15.8.1" react-email@1.x, react-email@^4.0.15: - version "4.0.17" - resolved "https://registry.npmjs.org/react-email/-/react-email-4.0.17.tgz" - integrity sha512-Wppdxgio/QKNe3piccIhk6jvgiLwfOTAwud5t/NlWL8wepsirgXo09OyZCz62Qb9flFNBw+Hz5ahOkpk3JaizQ== + version "4.2.3" + resolved "https://registry.npmjs.org/react-email/-/react-email-4.2.3.tgz" + integrity sha512-LUKyk9nNVFuTqAyp4yCEQFQjBe+s8nl3VauMWuOhBZ4VhGnimbrnv01U8yD2YwzaHKtytS0U659x5dc/0+xu+Q== dependencies: "@babel/parser" "^7.27.0" "@babel/traverse" "^7.27.0" @@ -16372,18 +15892,20 @@ react-email@1.x, react-email@^4.0.15: debounce "^2.0.0" esbuild "^0.25.0" glob "^11.0.0" + jiti "2.4.2" log-symbols "^7.0.0" mime-types "^3.0.0" - next "^15.3.1" normalize-path "^3.0.0" + nypm "0.6.0" ora "^8.0.0" + prompts "2.4.2" socket.io "^4.8.1" tsconfig-paths "4.2.0" react-hook-form@^7.55.0, react-hook-form@^7.58.1: - version "7.58.1" - resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.58.1.tgz" - integrity sha512-Lml/KZYEEFfPhUVgE0RdCVpnC4yhW+PndRhbiTtdvSlQTL8IfVR+iQkBjLIvmmc6+GGoVeM11z37ktKFPAb0FA== + version "7.60.0" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.60.0.tgz" + integrity sha512-SBrYOvMbDB7cV8ZfNpaiLcgjH/a1c7aK0lK+aNigpf4xWLO8q+o4tcvVurv3c4EOyzn/3dCsYt4GKD42VvJ/+A== react-hotkeys-hook@^5.1.0: version "5.1.0" @@ -16420,17 +15942,17 @@ react-markdown@^9.1.0: resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz" integrity sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw== dependencies: + vfile "^6.0.0" + devlop "^1.0.0" + unified "^11.0.0" "@types/hast" "^3.0.0" "@types/mdast" "^4.0.0" - devlop "^1.0.0" - hast-util-to-jsx-runtime "^2.0.0" - html-url-attributes "^3.0.0" - mdast-util-to-hast "^13.0.0" remark-parse "^11.0.0" remark-rehype "^11.0.0" - unified "^11.0.0" unist-util-visit "^5.0.0" - vfile "^6.0.0" + mdast-util-to-hast "^13.0.0" + html-url-attributes "^3.0.0" + hast-util-to-jsx-runtime "^2.0.0" react-number-format@^5.4.2: version "5.4.4" @@ -16488,9 +16010,9 @@ react-resize-detector@^7.1.2: lodash "^4.17.21" react-select@^5.10.1: - version "5.10.1" - resolved "https://registry.npmjs.org/react-select/-/react-select-5.10.1.tgz" - integrity sha512-roPEZUL4aRZDx6DcsD+ZNreVl+fM8VsKn0Wtex1v4IazH60ILp5xhdlp464IsEAlJdXeD+BhDAFsBVMfvLQueA== + version "5.10.2" + resolved "https://registry.npmjs.org/react-select/-/react-select-5.10.2.tgz" + integrity sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ== dependencies: "@babel/runtime" "^7.12.0" "@emotion/cache" "^11.4.0" @@ -16516,8 +16038,8 @@ react-style-singleton@^2.2.2, react-style-singleton@^2.2.3: resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz" integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== dependencies: - get-nonce "^1.0.0" tslib "^2.0.0" + get-nonce "^1.0.0" react-textarea-autosize@^8.5.9: version "8.5.9" @@ -16607,16 +16129,16 @@ read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz" integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== dependencies: - json-parse-even-better-errors "^3.0.0" npm-normalize-package-bin "^3.0.0" + json-parse-even-better-errors "^3.0.0" read-package-json-fast@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz" integrity sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg== dependencies: - json-parse-even-better-errors "^4.0.0" npm-normalize-package-bin "^4.0.0" + json-parse-even-better-errors "^4.0.0" read-package-up@^11.0.0: version "11.0.0" @@ -16651,13 +16173,13 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" isarray "~1.0.0" - process-nextick-args "~2.0.0" + inherits "~2.0.3" safe-buffer "~5.1.1" + core-util-is "~1.0.0" string_decoder "~1.1.1" util-deprecate "~1.0.1" + process-nextick-args "~2.0.0" readable-stream@^4.0.0: version "4.7.0" @@ -16695,10 +16217,10 @@ recharts@2.15.0: integrity sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw== dependencies: clsx "^2.0.0" - eventemitter3 "^4.0.1" lodash "^4.17.21" react-is "^18.3.1" react-smooth "^4.0.0" + eventemitter3 "^4.0.1" recharts-scale "^0.4.4" tiny-invariant "^1.3.1" victory-vendor "^36.6.8" @@ -16805,26 +16327,26 @@ request@^2.87.0: resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: - aws-sign2 "~0.7.0" + qs "~6.5.2" aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" + uuid "^3.3.2" extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" + caseless "~0.12.0" isstream "~0.1.2" - json-stringify-safe "~5.0.1" + aws-sign2 "~0.7.0" + form-data "~2.3.2" mime-types "~2.1.19" oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" safe-buffer "^5.1.2" tough-cookie "~2.5.0" tunnel-agent "^0.6.0" - uuid "^3.3.2" + forever-agent "~0.6.1" + har-validator "~5.1.3" + is-typedarray "~1.0.0" + http-signature "~1.2.0" + combined-stream "~1.0.6" + performance-now "^2.1.0" + json-stringify-safe "~5.0.1" require-directory@^2.1.1: version "2.1.1" @@ -16846,9 +16368,9 @@ require-in-the-middle@^7.1.1: resolve "^1.22.8" resend@^4.4.1: - version "4.6.0" - resolved "https://registry.npmjs.org/resend/-/resend-4.6.0.tgz" - integrity sha512-D5T2I82FvEUYFlrHzaDvVtr5ADHdhuoLaXgLFGABKyNtQgPWIuz0Vp2L2Evx779qjK37aF4kcw1yXJDHhA2JnQ== + version "4.7.0" + resolved "https://registry.npmjs.org/resend/-/resend-4.7.0.tgz" + integrity sha512-30IbXGBUbmDweQH2IlO53XOXX7ndjYV9xFZ8IEBiWqefqQ/qmTsgrX0Ab6MUnmobJXbpdReVv+iXGRQPubQL5Q== dependencies: "@react-email/render" "1.1.2" @@ -16871,8 +16393,8 @@ resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.4, resolve@^1.22.8: resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.13.0" path-parse "^1.0.7" + is-core-module "^2.13.0" supports-preserve-symlinks-flag "^1.0.0" resolve-alpn@^1.0.0: @@ -16951,33 +16473,33 @@ robust-predicates@^3.0.2: integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg== rollup@^4.13.0, rollup@^4.34.8, rollup@^4.34.9, rollup@^4.40.0: - version "4.44.1" - resolved "https://registry.npmjs.org/rollup/-/rollup-4.44.1.tgz" - integrity sha512-x8H8aPvD+xbl0Do8oez5f5o8eMS3trfCghc4HhLAnCkj7Vl0d1JWGs0UF/D886zLW2rOj2QymV/JcSSsw+XDNg== - optionalDependencies: - "@rollup/rollup-android-arm-eabi" "4.44.1" - "@rollup/rollup-android-arm64" "4.44.1" - "@rollup/rollup-darwin-arm64" "4.44.1" - "@rollup/rollup-darwin-x64" "4.44.1" - "@rollup/rollup-freebsd-arm64" "4.44.1" - "@rollup/rollup-freebsd-x64" "4.44.1" - "@rollup/rollup-linux-arm-gnueabihf" "4.44.1" - "@rollup/rollup-linux-arm-musleabihf" "4.44.1" - "@rollup/rollup-linux-arm64-gnu" "4.44.1" - "@rollup/rollup-linux-arm64-musl" "4.44.1" - "@rollup/rollup-linux-loongarch64-gnu" "4.44.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.44.1" - "@rollup/rollup-linux-riscv64-gnu" "4.44.1" - "@rollup/rollup-linux-riscv64-musl" "4.44.1" - "@rollup/rollup-linux-s390x-gnu" "4.44.1" - "@rollup/rollup-linux-x64-gnu" "4.44.1" - "@rollup/rollup-linux-x64-musl" "4.44.1" - "@rollup/rollup-win32-arm64-msvc" "4.44.1" - "@rollup/rollup-win32-ia32-msvc" "4.44.1" - "@rollup/rollup-win32-x64-msvc" "4.44.1" - fsevents "~2.3.2" + version "4.45.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz" + integrity sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw== dependencies: "@types/estree" "1.0.8" + optionalDependencies: + fsevents "~2.3.2" + "@rollup/rollup-darwin-arm64" "4.45.1" + "@rollup/rollup-android-arm64" "4.45.1" + "@rollup/rollup-win32-arm64-msvc" "4.45.1" + "@rollup/rollup-freebsd-arm64" "4.45.1" + "@rollup/rollup-linux-arm64-gnu" "4.45.1" + "@rollup/rollup-linux-arm64-musl" "4.45.1" + "@rollup/rollup-android-arm-eabi" "4.45.1" + "@rollup/rollup-linux-arm-gnueabihf" "4.45.1" + "@rollup/rollup-linux-arm-musleabihf" "4.45.1" + "@rollup/rollup-win32-ia32-msvc" "4.45.1" + "@rollup/rollup-linux-loongarch64-gnu" "4.45.1" + "@rollup/rollup-linux-riscv64-gnu" "4.45.1" + "@rollup/rollup-linux-riscv64-musl" "4.45.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.45.1" + "@rollup/rollup-linux-s390x-gnu" "4.45.1" + "@rollup/rollup-darwin-x64" "4.45.1" + "@rollup/rollup-win32-x64-msvc" "4.45.1" + "@rollup/rollup-freebsd-x64" "4.45.1" + "@rollup/rollup-linux-x64-gnu" "4.45.1" + "@rollup/rollup-linux-x64-musl" "4.45.1" rope-sequence@^1.3.0: version "1.3.4" @@ -17122,15 +16644,15 @@ selderee@^0.11.0: dependencies: parseley "^0.12.0" -semantic-release@24.2.5, semantic-release@>=18.0.0, semantic-release@>=20.1.0, semantic-release@>=24.1.0, semantic-release@^24.2.5: - version "24.2.5" - resolved "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.5.tgz" - integrity sha512-9xV49HNY8C0/WmPWxTlaNleiXhWb//qfMzG2c5X8/k7tuWcu8RssbuS+sujb/h7PiWSXv53mrQvV9hrO9b7vuQ== +semantic-release@24.2.7, semantic-release@>=18.0.0, semantic-release@>=20.1.0, semantic-release@>=24.1.0, semantic-release@^24.2.5: + version "24.2.7" + resolved "https://registry.npmjs.org/semantic-release/-/semantic-release-24.2.7.tgz" + integrity sha512-g7RssbTAbir1k/S7uSwSVZFfFXwpomUB9Oas0+xi9KStSCmeDXcA7rNhiskjLqvUe/Evhx8fVCT16OSa34eM5g== dependencies: "@semantic-release/commit-analyzer" "^13.0.0-beta.1" "@semantic-release/error" "^4.0.0" "@semantic-release/github" "^11.0.0" - "@semantic-release/npm" "^12.0.0" + "@semantic-release/npm" "^12.0.2" "@semantic-release/release-notes-generator" "^14.0.0-beta.1" aggregate-error "^5.0.0" cosmiconfig "^9.0.0" @@ -17166,11 +16688,11 @@ semantic-release-discord@^1.2.0: discord.js "^14.7.1" semantic-release-discord-notifier@^1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/semantic-release-discord-notifier/-/semantic-release-discord-notifier-1.0.11.tgz" - integrity sha512-EJ8qzlAKGJgZG2wp+cb2MQFhhtzb/ISCVvniBCfAc7YGXKnu40XAD6TRmiV2BkHH/+0wojZdv2fg5P/nj53mEg== + version "1.0.13" + resolved "https://registry.npmjs.org/semantic-release-discord-notifier/-/semantic-release-discord-notifier-1.0.13.tgz" + integrity sha512-Ds1idoxKTnj6SzzRjjJmV6DCIKRHjJS9X8clZMIWAv5WgyokrKIUr22jPvozpea/Q/dleASmYjwp2Z57ci1cXQ== dependencies: - semantic-release "24.2.5" + semantic-release "24.2.7" semver@~5.3.0: version "5.3.0" @@ -17209,29 +16731,29 @@ send@0.19.0: resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: - debug "2.6.9" + ms "2.1.3" depd "2.0.0" + etag "~1.8.1" + mime "1.6.0" + debug "2.6.9" + fresh "0.5.2" destroy "1.2.0" + statuses "2.0.1" encodeurl "~1.0.2" escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" on-finished "2.4.1" range-parser "~1.2.1" - statuses "2.0.1" serve-static@1.16.2: version "1.16.2" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: + send "0.19.0" + parseurl "~1.3.3" encodeurl "~2.0.0" escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.19.0" server-only@0.0.1, server-only@^0.0.1: version "0.0.1" @@ -17295,35 +16817,36 @@ setprototypeof@1.2.0: integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== sharp@^0.34.1, sharp@^0.34.2: - version "0.34.2" - resolved "https://registry.npmjs.org/sharp/-/sharp-0.34.2.tgz" - integrity sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg== - optionalDependencies: - "@img/sharp-darwin-arm64" "0.34.2" - "@img/sharp-darwin-x64" "0.34.2" - "@img/sharp-libvips-darwin-arm64" "1.1.0" - "@img/sharp-libvips-darwin-x64" "1.1.0" - "@img/sharp-libvips-linux-arm" "1.1.0" - "@img/sharp-libvips-linux-arm64" "1.1.0" - "@img/sharp-libvips-linux-ppc64" "1.1.0" - "@img/sharp-libvips-linux-s390x" "1.1.0" - "@img/sharp-libvips-linux-x64" "1.1.0" - "@img/sharp-libvips-linuxmusl-arm64" "1.1.0" - "@img/sharp-libvips-linuxmusl-x64" "1.1.0" - "@img/sharp-linux-arm" "0.34.2" - "@img/sharp-linux-arm64" "0.34.2" - "@img/sharp-linux-s390x" "0.34.2" - "@img/sharp-linux-x64" "0.34.2" - "@img/sharp-linuxmusl-arm64" "0.34.2" - "@img/sharp-linuxmusl-x64" "0.34.2" - "@img/sharp-wasm32" "0.34.2" - "@img/sharp-win32-arm64" "0.34.2" - "@img/sharp-win32-ia32" "0.34.2" - "@img/sharp-win32-x64" "0.34.2" + version "0.34.3" + resolved "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz" + integrity sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg== dependencies: color "^4.2.3" detect-libc "^2.0.4" semver "^7.7.2" + optionalDependencies: + "@img/sharp-darwin-arm64" "0.34.3" + "@img/sharp-darwin-x64" "0.34.3" + "@img/sharp-libvips-darwin-arm64" "1.2.0" + "@img/sharp-libvips-darwin-x64" "1.2.0" + "@img/sharp-libvips-linux-arm" "1.2.0" + "@img/sharp-libvips-linux-arm64" "1.2.0" + "@img/sharp-libvips-linux-ppc64" "1.2.0" + "@img/sharp-libvips-linux-s390x" "1.2.0" + "@img/sharp-libvips-linux-x64" "1.2.0" + "@img/sharp-libvips-linuxmusl-arm64" "1.2.0" + "@img/sharp-libvips-linuxmusl-x64" "1.2.0" + "@img/sharp-linux-arm" "0.34.3" + "@img/sharp-linux-arm64" "0.34.3" + "@img/sharp-linux-ppc64" "0.34.3" + "@img/sharp-linux-s390x" "0.34.3" + "@img/sharp-linux-x64" "0.34.3" + "@img/sharp-linuxmusl-arm64" "0.34.3" + "@img/sharp-linuxmusl-x64" "0.34.3" + "@img/sharp-wasm32" "0.34.3" + "@img/sharp-win32-arm64" "0.34.3" + "@img/sharp-win32-ia32" "0.34.3" + "@img/sharp-win32-x64" "0.34.3" shebang-command@^2.0.0: version "2.0.0" @@ -17416,12 +16939,12 @@ sigstore@^2.2.0: resolved "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz" integrity sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ== dependencies: - "@sigstore/bundle" "^2.3.2" + "@sigstore/tuf" "^2.3.4" "@sigstore/core" "^1.0.0" - "@sigstore/protobuf-specs" "^0.3.2" "@sigstore/sign" "^2.3.2" - "@sigstore/tuf" "^2.3.4" + "@sigstore/bundle" "^2.3.2" "@sigstore/verify" "^1.2.1" + "@sigstore/protobuf-specs" "^0.3.2" sigstore@^3.0.0: version "3.1.0" @@ -17483,13 +17006,13 @@ socket.io@^4.8.1: resolved "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz" integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== dependencies: - accepts "~1.3.4" - base64id "~2.0.0" cors "~2.8.5" debug "~4.3.2" + accepts "~1.3.4" + base64id "~2.0.0" engine.io "~6.6.0" - socket.io-adapter "~2.5.2" socket.io-parser "~4.2.4" + socket.io-adapter "~2.5.2" socket.io-adapter@~2.5.2: version "2.5.5" @@ -17504,23 +17027,23 @@ socket.io-client@4.7.5: resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz" integrity sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ== dependencies: - "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" engine.io-client "~6.5.2" socket.io-parser "~4.2.4" + "@socket.io/component-emitter" "~3.1.0" socket.io-parser@~4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz" integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== dependencies: - "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" + "@socket.io/component-emitter" "~3.1.0" socks@^2.8.3: - version "2.8.5" - resolved "https://registry.npmjs.org/socks/-/socks-2.8.5.tgz" - integrity sha512-iF+tNDQla22geJdTyJB1wM/qrX9DMRwWrciEPwWLPRWAUEM8sQiyxgckLxWT1f7+9VabJS0jTGGr4QgBuvi6Ww== + version "2.8.6" + resolved "https://registry.npmjs.org/socks/-/socks-2.8.6.tgz" + integrity sha512-pe4Y2yzru68lXCb38aAqRf5gvN8YdjP1lok5o0J7BOHljkyCGKVz7H3vpVIXKD27rj2giOJ7DwVyk/GWrPHDWA== dependencies: ip-address "^9.0.5" smart-buffer "^4.2.0" @@ -17535,9 +17058,9 @@ socks-proxy-agent@^8.0.3, socks-proxy-agent@^8.0.5: socks "^2.8.3" sonner@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/sonner/-/sonner-2.0.5.tgz" - integrity sha512-YwbHQO6cSso3HBXlbCkgrgzDNIhws14r4MO87Ofy+cV2X7ES4pOoAK3+veSmVTvqNx1BWUxlhPmZzP00Crk2aQ== + version "2.0.6" + resolved "https://registry.npmjs.org/sonner/-/sonner-2.0.6.tgz" + integrity sha512-yHFhk8T/DK3YxjFQXIrcHT1rGEeTLliVzWbO0xN8GberVun2RiBnxAjXAYpZrqwEVHBG9asI/Li8TAAhN9m59Q== source-map@0.5.6: version "0.5.6" @@ -17651,14 +17174,14 @@ sshpk@^1.7.0: integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" + jsbn "~0.1.0" + getpass "^0.1.1" dashdash "^1.12.0" ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" tweetnacl "~0.14.0" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + safer-buffer "^2.0.2" ssri@^10.0.0, ssri@^10.0.6: version "10.0.6" @@ -17718,8 +17241,8 @@ stats-gl@^2.2.8: resolved "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz" integrity sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ== dependencies: - "@types/three" "*" three "^0.170.0" + "@types/three" "*" stats.js@^0.17.0: version "0.17.0" @@ -17762,47 +17285,42 @@ stream-combiner2@~1.1.1: duplexer2 "~0.1.0" readable-stream "^2.0.2" -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - streamx@^2.15.0, streamx@^2.21.0: version "2.22.1" resolved "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz" integrity sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA== - optionalDependencies: - bare-events "^2.2.0" dependencies: fast-fifo "^1.3.2" text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" string-width@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: + strip-ansi "^3.0.0" code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3, "string-width@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: + strip-ansi "^6.0.1" emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" strip-ansi "^7.0.1" + emoji-regex "^9.2.2" + eastasianwidth "^0.2.0" string-width@^7.2.0: version "7.2.0" @@ -17978,11 +17496,6 @@ strip-literal@^3.0.0: dependencies: js-tokens "^9.0.1" -strnum@^1.0.5: - version "1.1.2" - resolved "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz" - integrity sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA== - strnum@^2.1.0: version "2.1.1" resolved "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz" @@ -18100,9 +17613,9 @@ suspend-react@^0.1.3: integrity sha512-aqldKgX9aZqpoDp3e8/BZ8Dm7x1pJl+qI3ZKxDN0i/IQTWUwBx/ManmlVJ3wowqbno6c2bmiIfs+Um6LbsjJyQ== swr@^2.2.5: - version "2.3.3" - resolved "https://registry.npmjs.org/swr/-/swr-2.3.3.tgz" - integrity sha512-dshNvs3ExOqtZ6kJBaAsabhPdHyeY4P2cKwRCniDVifBMoG/SVI7tfLWqPXriVspf2Rg4tPzXJTnwaihIeFw2A== + version "2.3.4" + resolved "https://registry.npmjs.org/swr/-/swr-2.3.4.tgz" + integrity sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg== dependencies: dequal "^2.0.3" use-sync-external-store "^1.4.0" @@ -18117,23 +17630,23 @@ syncpack@^13.0.4: resolved "https://registry.npmjs.org/syncpack/-/syncpack-13.0.4.tgz" integrity sha512-kJ9VlRxNCsBD5pJAE29oXeBYbPLhEySQmK4HdpsLv81I6fcDDW17xeJqMwiU3H7/woAVsbgq25DJNS8BeiN5+w== dependencies: + ora "^8.2.0" chalk "^5.4.1" - chalk-template "^1.1.0" - commander "^13.1.0" - cosmiconfig "^9.0.0" effect "^3.13.7" - enquirer "^2.4.1" - fast-check "^3.23.2" globby "^14.1.0" - jsonc-parser "^3.3.1" - minimatch "9.0.5" - npm-package-arg "^12.0.2" - ora "^8.2.0" - prompts "^2.4.2" - read-yaml-file "^2.1.0" semver "^7.7.1" + prompts "^2.4.2" + enquirer "^2.4.1" + commander "^13.1.0" + minimatch "9.0.5" tightrope "0.2.0" + fast-check "^3.23.2" + cosmiconfig "^9.0.0" ts-toolbelt "^9.6.0" + jsonc-parser "^3.3.1" + chalk-template "^1.1.0" + read-yaml-file "^2.1.0" + npm-package-arg "^12.0.2" tailwind-merge@^1.13.2: version "1.14.0" @@ -18150,30 +17663,30 @@ tailwindcss@^3.3.3: resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz" integrity sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og== dependencies: - "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" - chokidar "^3.6.0" - didyoumean "^1.2.2" dlv "^1.1.3" - fast-glob "^3.3.2" - glob-parent "^6.0.2" - is-glob "^4.0.3" jiti "^1.21.6" + is-glob "^4.0.3" + postcss "^8.4.47" + resolve "^1.22.8" + sucrase "^3.35.0" + chokidar "^3.6.0" + fast-glob "^3.3.2" lilconfig "^3.1.3" + didyoumean "^1.2.2" micromatch "^4.0.8" - normalize-path "^3.0.0" - object-hash "^3.0.0" picocolors "^1.1.1" - postcss "^8.4.47" - postcss-import "^15.1.0" postcss-js "^4.0.1" - postcss-load-config "^4.0.2" + glob-parent "^6.0.2" + object-hash "^3.0.0" + normalize-path "^3.0.0" + postcss-import "^15.1.0" postcss-nested "^6.2.0" + "@alloc/quick-lru" "^5.2.0" + postcss-load-config "^4.0.2" postcss-selector-parser "^6.1.2" - resolve "^1.22.8" - sucrase "^3.35.0" -tailwindcss@4.1.11, "tailwindcss@>=3.0.0 || insiders", "tailwindcss@>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1", "tailwindcss@^3.0.0 || ^4.0.0-beta.0", tailwindcss@^4.1.8: +tailwindcss@4.1.11, "tailwindcss@>=3.0.0 || insiders", "tailwindcss@>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1", tailwindcss@^4.1.8: version "4.1.11" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz" integrity sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA== @@ -18193,9 +17706,9 @@ tar@^2.0.0: resolved "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz" integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== dependencies: - block-stream "*" fstream "^1.0.12" inherits "2" + block-stream "*" tar@^6.1.11, tar@^6.2.1: version "6.2.1" @@ -18203,11 +17716,11 @@ tar@^6.1.11, tar@^6.2.1: integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" - fs-minipass "^2.0.0" - minipass "^5.0.0" - minizlib "^2.1.1" mkdirp "^1.0.3" yallist "^4.0.0" + minipass "^5.0.0" + minizlib "^2.1.1" + fs-minipass "^2.0.0" tar@7.4.3, tar@^7.4.3: version "7.4.3" @@ -18221,16 +17734,16 @@ tar@7.4.3, tar@^7.4.3: mkdirp "^3.0.1" yallist "^5.0.0" -tar-fs@^3.0.8: - version "3.0.10" - resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.10.tgz" - integrity sha512-C1SwlQGNLe/jPNqapK8epDsXME7CAJR5RL3GcE6KWx1d9OUByzoHVcbu1VPI8tevg9H8Alae0AApHHFGzrD5zA== - optionalDependencies: - bare-fs "^4.0.1" - bare-path "^3.0.0" +tar-fs@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz" + integrity sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w== dependencies: pump "^3.0.0" tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^4.0.1" + bare-path "^3.0.0" tar-stream@^3.0.0, tar-stream@^3.1.5: version "3.1.7" @@ -18305,7 +17818,7 @@ three@^0.170.0: resolved "https://registry.npmjs.org/three/-/three-0.170.0.tgz" integrity sha512-FQK+LEpYc0fBD+J8g6oSEyyNzjp+Q7Ks1C568WWaoMRLW+TkNNWmenWeGgJjV105Gd+p/2ql1ZcjYvNiPZBhuQ== -"three@>= 0.156.0", "three@>= 0.157.0 < 0.178.0", "three@>= 0.159.0", three@>=0.125.0, three@>=0.126.1, three@>=0.128.0, three@>=0.134.0, three@>=0.137, three@>=0.144.0, three@>=0.156, three@>=0.159, three@^0.177.0: +"three@>= 0.156.0", "three@>= 0.157.0 < 0.179.0", "three@>= 0.159.0", three@>=0.125.0, three@>=0.126.1, three@>=0.128.0, three@>=0.134.0, three@>=0.137, three@>=0.144.0, three@>=0.156, three@>=0.159, three@^0.177.0: version "0.177.0" resolved "https://registry.npmjs.org/three/-/three-0.177.0.tgz" integrity sha512-EiXv5/qWAaGI+Vz2A+JfavwYCMdGjxVsrn3oBwllUoqYeaBO75J63ZfyaQKoiLrqNHoTlUc6PFgMXnS0kI45zg== @@ -18555,24 +18068,24 @@ ts-mixer@^6.0.4: resolved "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz" integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== -"ts-node@>= 7.0.1 < 12", ts-node@>=9.0.0, ts-node@^10.9.2: +ts-node@^10.9.2: version "10.9.2" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: - "@cspotcode/source-map-support" "^0.8.0" + yn "3.1.1" + arg "^4.1.0" + diff "^4.0.1" + acorn "^8.4.1" + acorn-walk "^8.1.1" + make-error "^1.1.1" + create-require "^1.1.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" "@tsconfig/node16" "^1.0.2" - acorn "^8.4.1" - acorn-walk "^8.1.1" - arg "^4.1.0" - create-require "^1.1.0" - diff "^4.0.1" - make-error "^1.1.1" v8-compile-cache-lib "^3.0.1" - yn "3.1.1" + "@cspotcode/source-map-support" "^0.8.0" ts-pattern@^5.7.0: version "5.7.1" @@ -18599,10 +18112,10 @@ tsconfig-paths@^3.15.0: resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: - "@types/json5" "^0.0.29" json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" + "@types/json5" "^0.0.29" tsconfig-paths@4.2.0: version "4.2.0" @@ -18651,18 +18164,18 @@ tuf-js@^2.2.1: resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz" integrity sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA== dependencies: - "@tufjs/models" "2.0.1" debug "^4.3.4" + "@tufjs/models" "2.0.1" make-fetch-happen "^13.0.1" tuf-js@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-3.0.1.tgz" - integrity sha512-+68OP1ZzSF84rTckf3FA95vJ1Zlx/uaXyiiKyPd1pA4rZNkpEvDAKmsu1xUSmbF/chCRYgZ6UZkDwC7PmzmAyA== + version "3.1.0" + resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-3.1.0.tgz" + integrity sha512-3T3T04WzowbwV2FDiGXBbr81t64g1MUGGJRgT4x5o97N+8ArdhVCAF9IxFrxuSJmM3E5Asn7nKHkao0ibcZXAg== dependencies: "@tufjs/models" "3.0.1" - debug "^4.3.6" - make-fetch-happen "^14.0.1" + debug "^4.4.1" + make-fetch-happen "^14.0.3" tunnel@^0.0.6: version "0.0.6" @@ -18684,46 +18197,46 @@ tunnel-rat@^0.1.2: zustand "^4.3.2" turbo@^2.5.4: - version "2.5.4" - resolved "https://registry.npmjs.org/turbo/-/turbo-2.5.4.tgz" - integrity sha512-kc8ZibdRcuWUG1pbYSBFWqmIjynlD8Lp7IB6U3vIzvOv9VG+6Sp8bzyeBWE3Oi8XV5KsQrznyRTBPvrf99E4mA== + version "2.5.5" + resolved "https://registry.npmjs.org/turbo/-/turbo-2.5.5.tgz" + integrity sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A== optionalDependencies: - turbo-darwin-64 "2.5.4" - turbo-darwin-arm64 "2.5.4" - turbo-linux-64 "2.5.4" - turbo-linux-arm64 "2.5.4" - turbo-windows-64 "2.5.4" - turbo-windows-arm64 "2.5.4" - -turbo-darwin-64@2.5.4: - version "2.5.4" - resolved "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.5.4.tgz" - integrity sha512-ah6YnH2dErojhFooxEzmvsoZQTMImaruZhFPfMKPBq8sb+hALRdvBNLqfc8NWlZq576FkfRZ/MSi4SHvVFT9PQ== - -turbo-darwin-arm64@2.5.4: - version "2.5.4" - resolved "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.5.4.tgz" - integrity sha512-2+Nx6LAyuXw2MdXb7pxqle3MYignLvS7OwtsP9SgtSBaMlnNlxl9BovzqdYAgkUW3AsYiQMJ/wBRb7d+xemM5A== - -turbo-linux-64@2.5.4: - version "2.5.4" - resolved "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.5.4.tgz" - integrity sha512-5May2kjWbc8w4XxswGAl74GZ5eM4Gr6IiroqdLhXeXyfvWEdm2mFYCSWOzz0/z5cAgqyGidF1jt1qzUR8hTmOA== - -turbo-linux-arm64@2.5.4: - version "2.5.4" - resolved "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.5.4.tgz" - integrity sha512-/2yqFaS3TbfxV3P5yG2JUI79P7OUQKOUvAnx4MV9Bdz6jqHsHwc9WZPpO4QseQm+NvmgY6ICORnoVPODxGUiJg== - -turbo-windows-64@2.5.4: - version "2.5.4" - resolved "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.5.4.tgz" - integrity sha512-EQUO4SmaCDhO6zYohxIjJpOKRN3wlfU7jMAj3CgcyTPvQR/UFLEKAYHqJOnJtymbQmiiM/ihX6c6W6Uq0yC7mA== - -turbo-windows-arm64@2.5.4: - version "2.5.4" - resolved "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.5.4.tgz" - integrity sha512-oQ8RrK1VS8lrxkLriotFq+PiF7iiGgkZtfLKF4DDKsmdbPo0O9R2mQxm7jHLuXraRCuIQDWMIw6dpcr7Iykf4A== + turbo-linux-64 "2.5.5" + turbo-darwin-64 "2.5.5" + turbo-windows-64 "2.5.5" + turbo-linux-arm64 "2.5.5" + turbo-darwin-arm64 "2.5.5" + turbo-windows-arm64 "2.5.5" + +turbo-darwin-64@2.5.5: + version "2.5.5" + resolved "https://registry.npmjs.org/turbo-darwin-64/-/turbo-darwin-64-2.5.5.tgz" + integrity sha512-RYnTz49u4F5tDD2SUwwtlynABNBAfbyT2uU/brJcyh5k6lDLyNfYKdKmqd3K2ls4AaiALWrFKVSBsiVwhdFNzQ== + +turbo-darwin-arm64@2.5.5: + version "2.5.5" + resolved "https://registry.npmjs.org/turbo-darwin-arm64/-/turbo-darwin-arm64-2.5.5.tgz" + integrity sha512-Tk+ZeSNdBobZiMw9aFypQt0DlLsWSFWu1ymqsAdJLuPoAH05qCfYtRxE1pJuYHcJB5pqI+/HOxtJoQ40726Btw== + +turbo-linux-64@2.5.5: + version "2.5.5" + resolved "https://registry.npmjs.org/turbo-linux-64/-/turbo-linux-64-2.5.5.tgz" + integrity sha512-2/XvMGykD7VgsvWesZZYIIVXMlgBcQy+ZAryjugoTcvJv8TZzSU/B1nShcA7IAjZ0q7OsZ45uP2cOb8EgKT30w== + +turbo-linux-arm64@2.5.5: + version "2.5.5" + resolved "https://registry.npmjs.org/turbo-linux-arm64/-/turbo-linux-arm64-2.5.5.tgz" + integrity sha512-DW+8CjCjybu0d7TFm9dovTTVg1VRnlkZ1rceO4zqsaLrit3DgHnN4to4uwyuf9s2V/BwS3IYcRy+HG9BL596Iw== + +turbo-windows-64@2.5.5: + version "2.5.5" + resolved "https://registry.npmjs.org/turbo-windows-64/-/turbo-windows-64-2.5.5.tgz" + integrity sha512-q5p1BOy8ChtSZfULuF1BhFMYIx6bevXu4fJ+TE/hyNfyHJIfjl90Z6jWdqAlyaFLmn99X/uw+7d6T/Y/dr5JwQ== + +turbo-windows-arm64@2.5.5: + version "2.5.5" + resolved "https://registry.npmjs.org/turbo-windows-arm64/-/turbo-windows-arm64-2.5.5.tgz" + integrity sha512-AXbF1KmpHUq3PKQwddMGoKMYhHsy5t1YBQO8HZ04HLMR0rWv9adYlQ8kaeQJTko1Ay1anOBFTqaxfVOOsu7+1Q== tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" @@ -18747,12 +18260,12 @@ type-fest@^2.12.2: resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== -type-fest@4.32.0, type-fest@^4.6.0: +type-fest@4.32.0: version "4.32.0" resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.32.0.tgz" integrity sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw== -type-fest@^4.39.1: +type-fest@^4.39.1, type-fest@^4.6.0: version "4.41.0" resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz" integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA== @@ -18762,8 +18275,8 @@ type-is@~1.6.18: resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: - media-typer "0.3.0" mime-types "~2.1.24" + media-typer "0.3.0" typed-array-buffer@^1.0.3: version "1.0.3" @@ -18815,7 +18328,7 @@ typed-query-selector@^2.12.0: resolved "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz" integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== -"typescript@>= 3.8.3 < 6", typescript@>=2.7, typescript@>=2.9, typescript@>=3.3.1, typescript@>=4.5.0, typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0", typescript@>=4.9.5, typescript@>=5, typescript@>=5.1.0, typescript@>=5.4.5, typescript@^5.0.0, typescript@^5.8.2, typescript@^5.8.3: +typescript@>=2.7, typescript@>=2.9, typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0", typescript@>=5, typescript@^5.0.0, typescript@^5.8.2, typescript@^5.8.3: version "5.8.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz" integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== @@ -18992,31 +18505,31 @@ unpipe@1.0.0, unpipe@~1.0.0: integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== unrs-resolver@^1.6.2: - version "1.9.2" - resolved "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.9.2.tgz" - integrity sha512-VUyWiTNQD7itdiMuJy+EuLEErLj3uwX/EpHQF8EOf33Dq3Ju6VW1GXm+swk6+1h7a49uv9fKZ+dft9jU7esdLA== + version "1.11.1" + resolved "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz" + integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg== + dependencies: + napi-postinstall "^0.3.0" optionalDependencies: - "@unrs/resolver-binding-android-arm-eabi" "1.9.2" - "@unrs/resolver-binding-android-arm64" "1.9.2" - "@unrs/resolver-binding-darwin-arm64" "1.9.2" - "@unrs/resolver-binding-darwin-x64" "1.9.2" - "@unrs/resolver-binding-freebsd-x64" "1.9.2" - "@unrs/resolver-binding-linux-arm-gnueabihf" "1.9.2" - "@unrs/resolver-binding-linux-arm-musleabihf" "1.9.2" - "@unrs/resolver-binding-linux-arm64-gnu" "1.9.2" - "@unrs/resolver-binding-linux-arm64-musl" "1.9.2" - "@unrs/resolver-binding-linux-ppc64-gnu" "1.9.2" - "@unrs/resolver-binding-linux-riscv64-gnu" "1.9.2" - "@unrs/resolver-binding-linux-riscv64-musl" "1.9.2" - "@unrs/resolver-binding-linux-s390x-gnu" "1.9.2" - "@unrs/resolver-binding-linux-x64-gnu" "1.9.2" - "@unrs/resolver-binding-linux-x64-musl" "1.9.2" - "@unrs/resolver-binding-wasm32-wasi" "1.9.2" - "@unrs/resolver-binding-win32-arm64-msvc" "1.9.2" - "@unrs/resolver-binding-win32-ia32-msvc" "1.9.2" - "@unrs/resolver-binding-win32-x64-msvc" "1.9.2" - dependencies: - napi-postinstall "^0.2.4" + "@unrs/resolver-binding-win32-x64-msvc" "1.11.1" + "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1" + "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1" + "@unrs/resolver-binding-linux-x64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-musl" "1.11.1" + "@unrs/resolver-binding-freebsd-x64" "1.11.1" + "@unrs/resolver-binding-android-arm64" "1.11.1" + "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-arm64-musl" "1.11.1" + "@unrs/resolver-binding-android-arm-eabi" "1.11.1" + "@unrs/resolver-binding-linux-arm-gnueabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm-musleabihf" "1.11.1" + "@unrs/resolver-binding-linux-ppc64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-riscv64-musl" "1.11.1" + "@unrs/resolver-binding-linux-s390x-gnu" "1.11.1" + "@unrs/resolver-binding-darwin-x64" "1.11.1" + "@unrs/resolver-binding-darwin-arm64" "1.11.1" + "@unrs/resolver-binding-wasm32-wasi" "1.11.1" upath@^1.1.0: version "1.2.0" @@ -19096,7 +18609,7 @@ use-sidecar@^1.1.3: detect-node-es "^1.1.0" tslib "^2.0.0" -use-sync-external-store@>=1.2.0, use-sync-external-store@^1, use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0, use-sync-external-store@^1.5.0: +use-sync-external-store@^1, use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0, use-sync-external-store@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz" integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A== @@ -19150,9 +18663,9 @@ validate-npm-package-name@^5.0.0: integrity sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ== validate-npm-package-name@^6.0.0, validate-npm-package-name@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.1.tgz" - integrity sha512-OaI//3H0J7ZkR1OqlhGA8cA+Cbk/2xFOQpJOt5+s27/ta9eZwpeervh4Mxh4w0im/kdgktowaqVNR7QOrUd7Yg== + version "6.0.2" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-6.0.2.tgz" + integrity sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ== vary@^1, vary@~1.1.2: version "1.1.2" @@ -19171,9 +18684,9 @@ verror@1.10.0: resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: + extsprintf "^1.2.0" assert-plus "^1.0.0" core-util-is "1.0.2" - extsprintf "^1.2.0" vfile@^6.0.0: version "6.0.3" @@ -19196,52 +18709,50 @@ victory-vendor@^36.6.8: resolved "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz" integrity sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ== dependencies: - "@types/d3-array" "^3.0.3" - "@types/d3-ease" "^3.0.0" - "@types/d3-interpolate" "^3.0.1" - "@types/d3-scale" "^4.0.2" - "@types/d3-shape" "^3.1.0" - "@types/d3-time" "^3.0.0" - "@types/d3-timer" "^3.0.0" - d3-array "^3.1.6" d3-ease "^3.0.1" - d3-interpolate "^3.0.1" + d3-time "^3.0.0" + d3-array "^3.1.6" d3-scale "^4.0.2" d3-shape "^3.1.0" - d3-time "^3.0.0" d3-timer "^3.0.1" + "@types/d3-ease" "^3.0.0" + "@types/d3-time" "^3.0.0" + d3-interpolate "^3.0.1" + "@types/d3-array" "^3.0.3" + "@types/d3-scale" "^4.0.2" + "@types/d3-shape" "^3.1.0" + "@types/d3-timer" "^3.0.0" + "@types/d3-interpolate" "^3.0.1" vite@5.2.9: version "5.2.9" resolved "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz" integrity sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw== - optionalDependencies: - fsevents "~2.3.3" dependencies: + rollup "^4.13.0" esbuild "^0.20.1" postcss "^8.4.38" - rollup "^4.13.0" + optionalDependencies: + fsevents "~2.3.3" vite@^6.3.4: version "6.3.5" resolved "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz" integrity sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ== - optionalDependencies: - fsevents "~2.3.3" dependencies: - esbuild "^0.25.0" fdir "^6.4.4" - picomatch "^4.0.2" - postcss "^8.5.3" rollup "^4.34.9" + esbuild "^0.25.0" + postcss "^8.5.3" + picomatch "^4.0.2" tinyglobby "^0.2.13" - -vite@*, "vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0", "vite@^5.0.0 || ^6.0.0 || ^7.0.0-0": - version "7.0.0" - resolved "https://registry.npmjs.org/vite/-/vite-7.0.0.tgz" - integrity sha512-ixXJB1YRgDIw2OszKQS9WxGHKwLdCsbQNkpJN171udl6szi/rIySHL6/Os3s2+oE4P/FLD4dxg4mD7Wust+u5g== optionalDependencies: fsevents "~2.3.3" + +"vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "vite@^5.0.0 || ^6.0.0 || ^7.0.0-0": + version "7.0.5" + resolved "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz" + integrity sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw== dependencies: esbuild "^0.25.0" fdir "^6.4.6" @@ -19249,6 +18760,8 @@ vite@*, "vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0-beta.0", "vite@^5.0.0 || ^6.0 postcss "^8.5.6" rollup "^4.40.0" tinyglobby "^0.2.14" + optionalDependencies: + fsevents "~2.3.3" vite-node@3.2.4: version "3.2.4" @@ -19256,10 +18769,10 @@ vite-node@3.2.4: integrity sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg== dependencies: cac "^6.7.14" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" debug "^4.4.1" - es-module-lexer "^1.7.0" pathe "^2.0.3" - vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + es-module-lexer "^1.7.0" vite-tsconfig-paths@^5.1.4: version "5.1.4" @@ -19275,29 +18788,29 @@ vitest@3.2.4, vitest@^3.2.4: resolved "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz" integrity sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A== dependencies: - "@types/chai" "^5.2.2" - "@vitest/expect" "3.2.4" - "@vitest/mocker" "3.2.4" - "@vitest/pretty-format" "^3.2.4" - "@vitest/runner" "3.2.4" - "@vitest/snapshot" "3.2.4" - "@vitest/spy" "3.2.4" - "@vitest/utils" "3.2.4" chai "^5.2.0" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" debug "^4.4.1" - expect-type "^1.2.1" - magic-string "^0.30.17" pathe "^2.0.3" - picomatch "^4.0.2" std-env "^3.9.0" - tinybench "^2.9.0" tinyexec "^0.3.2" - tinyglobby "^0.2.14" tinypool "^1.1.1" - tinyrainbow "^2.0.0" - vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + picomatch "^4.0.2" + tinybench "^2.9.0" vite-node "3.2.4" + tinyglobby "^0.2.14" + "@types/chai" "^5.2.2" + "@vitest/spy" "3.2.4" + expect-type "^1.2.1" + tinyrainbow "^2.0.0" + magic-string "^0.30.17" + "@vitest/utils" "3.2.4" + "@vitest/expect" "3.2.4" + "@vitest/mocker" "3.2.4" + "@vitest/runner" "3.2.4" + "@vitest/snapshot" "3.2.4" why-is-node-running "^2.3.0" + "@vitest/pretty-format" "^3.2.4" w3c-keyname@^2.2.0: version "2.2.8" @@ -19381,8 +18894,8 @@ whatwg-url@^7.0.0: resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== dependencies: - lodash.sortby "^4.7.0" tr46 "^1.0.1" + lodash.sortby "^4.7.0" webidl-conversions "^4.0.2" whatwg-url@^14.0.0, whatwg-url@^14.1.1: @@ -19548,10 +19061,17 @@ ws@~8.17.1: resolved "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz" integrity sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ== -ws@^8.11.0, ws@^8.17.0, ws@^8.18.0, ws@^8.18.2: - version "8.18.2" - resolved "https://registry.npmjs.org/ws/-/ws-8.18.2.tgz" - integrity sha512-DMricUmwGZUVr++AEAe2uiVM7UoO9MAVZMDu05UQOaUII0lp+zOzLLU4Xqh/JvTqklB1T4uELaaPBKyjE1r4fQ== +ws@^8.11.0, ws@^8.17.0, ws@^8.18.0, ws@^8.18.3: + version "8.18.3" + resolved "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz" + integrity sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== + +wsl-utils@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.1.0.tgz" + integrity sha512-h3Fbisa2nKGPxCpm89Hk33lBLsnaGBvctQopaBSOW/uIs6FTe1ATyAnKFJrzVs9vpGdsTe73WF3V4lIsk4Gacw== + dependencies: + is-wsl "^3.1.0" xml-name-validator@^5.0.0: version "5.0.0" @@ -19619,7 +19139,7 @@ yaml@^1.10.0: resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^2.3.4, yaml@^2.4.2: +yaml@^2.3.4: version "2.8.0" resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz" integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== @@ -19629,26 +19149,26 @@ yargs@^16.0.0: resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: + y18n "^5.0.5" cliui "^7.0.2" escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" string-width "^4.2.0" - y18n "^5.0.5" yargs-parser "^20.2.2" + get-caller-file "^2.0.5" + require-directory "^2.1.1" yargs@^17.0.0, yargs@^17.5.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: + y18n "^5.0.5" cliui "^8.0.1" escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" string-width "^4.2.3" - y18n "^5.0.5" yargs-parser "^21.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" yargs-parser@^20.2.2: version "20.2.9" @@ -19665,8 +19185,8 @@ yauzl@^2.10.0: resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: - buffer-crc32 "~0.2.3" fd-slicer "~1.1.0" + buffer-crc32 "~0.2.3" yn@3.1.1: version "3.1.1" @@ -19699,19 +19219,24 @@ zip-stream@^6.0.1: integrity sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA== dependencies: archiver-utils "^5.0.0" - compress-commons "^6.0.2" readable-stream "^4.0.0" + compress-commons "^6.0.2" zod@3.23.8: version "3.23.8" resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== -zod@3.25.67, "zod@>= 3", zod@^3.0.0, zod@^3.18.0, zod@^3.20.2, zod@^3.23.8, "zod@^3.24.0 || ^4.0.0-beta.0", zod@^3.24.1, zod@^3.24.4: +zod@3.25.67, zod@^3, zod@^3.18.0, zod@^3.20.2, zod@^3.23.8, zod@^3.24.1, zod@^3.24.4: version "3.25.67" resolved "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz" integrity sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw== +"zod@>= 3", zod@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/zod/-/zod-4.0.5.tgz" + integrity sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA== + zod-error@1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/zod-error/-/zod-error-1.5.0.tgz" From c4019e1000fb9759887d92b0a51550d3022cf963 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 19:02:58 -0400 Subject: [PATCH 029/107] chore: enhance buildspec.yml with improved logging and directory navigation - Updated buildspec.yml to provide clearer logging for current working directory and repository structure. - Simplified lockfile checks and ensured proper navigation to the app directory during various build phases. - Added checks for the Prisma schema file to enhance error handling and visibility during the build process. --- apps/app/buildspec.yml | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index ca9a0ebfc..a2344f99c 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -18,29 +18,23 @@ phases: - echo "DATABASE_URL (masked):" $(echo "$DATABASE_URL" | sed 's/:[^@]*@/:***@/') - echo "NODE_ENV:" $NODE_ENV - echo "=== INSTALLING DEPENDENCIES ===" - - echo "Current working directory:" + - echo "Current working directory (should be repository root):" - pwd - echo "Repository structure:" - ls -la - - echo "Navigating to app directory..." - - cd apps/app - - echo "App directory contents:" - - ls -la - export PATH="/root/.bun/bin:$PATH" - export PGSSLMODE=require - export NEXT_TELEMETRY_DISABLED=1 - echo "Installing dependencies with parallel processing..." - echo "Using aggressive caching with 72GB memory..." - - echo "Checking lockfile status..." - - ls -la ../../bun.lock* || echo "No root lockfile found" - - ls -la bun.lock* || echo "No local lockfile found" - - echo "Installing dependencies from monorepo root..." - - cd ../../ + - echo "Checking lockfile status:" + - ls -la bun.lock* || echo "No lockfile found" - echo "Attempting frozen lockfile install first..." - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile --concurrent 36 || (echo "Frozen lockfile failed, installing with updates..." && SKIP_ENV_VALIDATION=true bun install --concurrent 36) - - cd apps/app - echo "Re-generating Prisma client in app context for runtime compatibility..." - - bun x prisma generate --schema=../packages/db/prisma/schema.prisma + - echo "Checking for schema file:" + - ls -la packages/db/prisma/schema.prisma || echo "Schema not found" + - bun x prisma generate --schema=packages/db/prisma/schema.prisma - echo "=== GENERATING PRISMA CLIENT ===" - echo "Current directory before Prisma generation:" @@ -50,12 +44,15 @@ phases: - bun x prisma generate - echo "Verifying generated binary targets..." - ls -la node_modules/.prisma/client/ - - cd ../../apps/app + - cd ../../ - echo "=== TYPE CHECKING ===" - echo "Running TypeScript type checking with parallel processing..." + - echo "Navigating to app directory for type checking..." + - cd apps/app - bun run typecheck - echo "✅ Type checking passed" + - cd ../../ - echo "=== VALIDATING APPLICATION ENVIRONMENT VARIABLES ===" - echo "Checking required Next.js environment variables..." @@ -74,14 +71,19 @@ phases: - echo "Checking security groups and network..." - curl -s http://169.254.169.254/latest/meta-data/local-ipv4 || echo "Metadata service not accessible (expected in VPC mode)" - echo "Running migrations before build..." + - echo "Navigating to app directory for migrations..." + - cd apps/app - NODE_TLS_REJECT_UNAUTHORIZED=0 bun run apply-migrations - echo "✅ Database migrations completed" + - cd ../../ - echo "=== BUILDING NEXT.JS ON CODEBUILD HOST (WITH MIGRATED DATABASE) ===" - echo "Running Next.js build with database access for SSG..." - echo "Optimizing build for 36 vCPUs..." - export UV_THREADPOOL_SIZE=36 - export NODE_OPTIONS="--max-old-space-size=65536" + - echo "Navigating to app directory for build..." + - cd apps/app - NODE_TLS_REJECT_UNAUTHORIZED=0 bun run build - echo "✅ Next.js build completed with database access" From 2bcbacc148844aad3ca1396e048376fa894aac90 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 19:09:44 -0400 Subject: [PATCH 030/107] chore: enhance buildspec.yml with additional checks for Prisma client locations - Updated buildspec.yml to include more comprehensive checks for the presence of the Prisma client in various directories. - Improved logging to provide clearer feedback on the status of the Prisma client during the build process. - Adjusted directory navigation logic to ensure correct copying of the Prisma client based on its location. --- apps/app/buildspec.yml | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index a2344f99c..98e1688e6 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -43,7 +43,12 @@ phases: - echo "Generating Prisma client with all binary targets..." - bun x prisma generate - echo "Verifying generated binary targets..." - - ls -la node_modules/.prisma/client/ + - echo "Checking local node_modules..." + - ls -la node_modules/.prisma/client/ || echo "Not found locally" + - echo "Checking root node_modules..." + - ls -la ../../node_modules/.prisma/client/ || echo "Not found in root" + - echo "Checking @prisma/client location..." + - ls -la ../../node_modules/@prisma/client/ || echo "@prisma/client not found" - cd ../../ - echo "=== TYPE CHECKING ===" @@ -95,10 +100,13 @@ phases: - mkdir -p .next/standalone/node_modules/.prisma - 'mkdir -p ".next/standalone/node_modules/@prisma"' - echo "Checking available Prisma client locations..." + - ls -la ../../node_modules/.prisma/client/ || echo "No .prisma client in root" - ls -la ../../packages/db/node_modules/.prisma/client/ || echo "No .prisma client in packages/db" - ls -la node_modules/.prisma/client/ || echo "No .prisma client in apps/app" - echo "Copying .prisma client directory..." - - if [ -d "../../packages/db/node_modules/.prisma/client" ]; then + - if [ -d "../../node_modules/.prisma/client" ]; then + cp -r ../../node_modules/.prisma/client .next/standalone/node_modules/.prisma/; + elif [ -d "../../packages/db/node_modules/.prisma/client" ]; then cp -r ../../packages/db/node_modules/.prisma/client .next/standalone/node_modules/.prisma/; elif [ -d "node_modules/.prisma/client" ]; then cp -r node_modules/.prisma/client .next/standalone/node_modules/.prisma/; @@ -106,7 +114,9 @@ phases: echo "❌ No .prisma client found"; exit 1; fi - echo "Copying @prisma/client directory..." - - if [ -d "../../packages/db/node_modules/@prisma/client" ]; then + - if [ -d "../../node_modules/@prisma/client" ]; then + cp -r "../../node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/"; + elif [ -d "../../packages/db/node_modules/@prisma/client" ]; then cp -r "../../packages/db/node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/"; elif [ -d "node_modules/@prisma/client" ]; then cp -r "node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/"; From 7b7050c5862c5c9232328ed3e7b2708c8659ac3d Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 19:18:39 -0400 Subject: [PATCH 031/107] chore: enhance buildspec.yml with additional build artifact checks - Added checks for the presence of build artifacts in the .next and public directories to improve build reliability. - Enhanced logging to provide clearer feedback on the status of copied static and public assets. - Included verification steps to ensure that the necessary files are correctly copied to the standalone build. --- apps/app/buildspec.yml | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 98e1688e6..1a6dc92df 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -94,8 +94,18 @@ phases: - echo "=== PREPARING STANDALONE BUILD FILES ===" - echo "Next.js standalone build requires manual copying of static files..." + - echo "Checking build artifacts..." + - ls -la .next/ || echo "No .next directory found" + - ls -la .next/static/ || echo "No .next/static directory found" + - ls -la public/ || echo "No public directory found" + - echo "Copying public assets..." - cp -r public .next/standalone/ || echo "No public folder found" - - cp -r .next/static .next/standalone/.next/ || echo "No static folder found" + - echo "Copying static assets..." + - mkdir -p .next/standalone/.next/static + - cp -r .next/static/* .next/standalone/.next/static/ || echo "No static files found" + - echo "Verifying copied static files..." + - ls -la .next/standalone/.next/static/ || echo "Static files not copied" + - ls -la .next/standalone/public/ || echo "Public files not copied" - echo "Copying Prisma client to standalone build..." - mkdir -p .next/standalone/node_modules/.prisma - 'mkdir -p ".next/standalone/node_modules/@prisma"' @@ -127,6 +137,9 @@ phases: - ls -la .next/standalone/node_modules/.prisma/client/ - echo "Checking for required binary targets..." - ls -la .next/standalone/node_modules/.prisma/client/ | grep -E "(linux-musl|debian)" || echo "Warning Expected binary targets not found" + - echo "Detailed binary files in copied Prisma client:" + - find .next/standalone/node_modules/.prisma/client/ -name "*linux-musl*" 2>/dev/null || echo "No linux-musl binaries found" + - find .next/standalone/node_modules/.prisma/client/ -name "*debian*" 2>/dev/null || echo "No debian binaries found" - echo "✅ Standalone files prepared" - echo "=== VERIFYING BUILD ARTIFACTS ===" From c71e88ae89b4e07bc3ca060a0d78ca5798473946 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 19:20:07 -0400 Subject: [PATCH 032/107] chore: streamline buildspec.yml for improved clarity and efficiency - Refactored build commands to enhance readability and organization, grouping related tasks together. - Simplified dependency installation and Prisma client generation steps, reducing unnecessary logging. - Improved validation of environment variables and streamlined database migration commands. - Enhanced Docker image build process with clearer logging and reduced redundancy in commands. --- apps/app/buildspec.yml | 153 +++++++++-------------------------------- 1 file changed, 33 insertions(+), 120 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 1a6dc92df..2f0187c58 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -12,153 +12,67 @@ phases: build: commands: - - echo "=== BUILD ENVIRONMENT DEBUG ===" - - echo "DATABASE_URL exists:" $(test -n "$DATABASE_URL" && echo "YES" || echo "NO") - - echo "DATABASE_URL length:" ${#DATABASE_URL} - - echo "DATABASE_URL (masked):" $(echo "$DATABASE_URL" | sed 's/:[^@]*@/:***@/') - - echo "NODE_ENV:" $NODE_ENV - - echo "=== INSTALLING DEPENDENCIES ===" - - echo "Current working directory (should be repository root):" - - pwd - - echo "Repository structure:" - - ls -la + # Environment setup - export PATH="/root/.bun/bin:$PATH" - export PGSSLMODE=require - export NEXT_TELEMETRY_DISABLED=1 - - echo "Installing dependencies with parallel processing..." - - echo "Using aggressive caching with 72GB memory..." - - echo "Checking lockfile status:" - - ls -la bun.lock* || echo "No lockfile found" - - echo "Attempting frozen lockfile install first..." - - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile --concurrent 36 || (echo "Frozen lockfile failed, installing with updates..." && SKIP_ENV_VALIDATION=true bun install --concurrent 36) - - echo "Re-generating Prisma client in app context for runtime compatibility..." - - echo "Checking for schema file:" - - ls -la packages/db/prisma/schema.prisma || echo "Schema not found" - - bun x prisma generate --schema=packages/db/prisma/schema.prisma + - export UV_THREADPOOL_SIZE=36 + - export NODE_OPTIONS="--max-old-space-size=65536" - - echo "=== GENERATING PRISMA CLIENT ===" - - echo "Current directory before Prisma generation:" - - pwd - - cd packages/db - - echo "Generating Prisma client with all binary targets..." - - bun x prisma generate - - echo "Verifying generated binary targets..." - - echo "Checking local node_modules..." - - ls -la node_modules/.prisma/client/ || echo "Not found locally" - - echo "Checking root node_modules..." - - ls -la ../../node_modules/.prisma/client/ || echo "Not found in root" - - echo "Checking @prisma/client location..." - - ls -la ../../node_modules/@prisma/client/ || echo "@prisma/client not found" - - cd ../../ + # Install dependencies + - echo "Installing dependencies..." + - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile --concurrent 36 || SKIP_ENV_VALIDATION=true bun install --concurrent 36 - - echo "=== TYPE CHECKING ===" - - echo "Running TypeScript type checking with parallel processing..." - - echo "Navigating to app directory for type checking..." - - cd apps/app - - bun run typecheck - - echo "✅ Type checking passed" - - cd ../../ + # Generate Prisma client + - echo "Generating Prisma client..." + - bun x prisma generate --schema=packages/db/prisma/schema.prisma + - cd packages/db && bun x prisma generate && cd ../../ - - echo "=== VALIDATING APPLICATION ENVIRONMENT VARIABLES ===" - - echo "Checking required Next.js environment variables..." + # Validate environment variables + - echo "Validating environment variables..." - '[ -n "$AUTH_SECRET" ] || { echo "❌ AUTH_SECRET is not set"; exit 1; }' - '[ -n "$RESEND_API_KEY" ] || { echo "❌ RESEND_API_KEY is not set"; exit 1; }' - '[ -n "$REVALIDATION_SECRET" ] || { echo "❌ REVALIDATION_SECRET is not set"; exit 1; }' - '[ -n "$NEXT_PUBLIC_PORTAL_URL" ] || { echo "❌ NEXT_PUBLIC_PORTAL_URL is not set"; exit 1; }' - - echo "✅ All required environment variables are set" - - echo "=== RUNNING DATABASE MIGRATIONS ===" - - echo "Testing database connectivity..." - - echo "DATABASE_URL endpoint:" $(echo "$DATABASE_URL" | sed 's/.*@\([^:]*\):.*/\1/') - - nslookup $(echo "$DATABASE_URL" | sed 's/.*@\([^:]*\):.*/\1/') || echo "DNS lookup failed" - - echo "Testing TCP connectivity to database..." - - timeout 10 bash -c "/dev/null || echo "No linux-musl binaries found" - - find .next/standalone/node_modules/.prisma/client/ -name "*debian*" 2>/dev/null || echo "No debian binaries found" - - echo "✅ Standalone files prepared" - - - echo "=== VERIFYING BUILD ARTIFACTS ===" - - echo "Checking if required files exist..." - - ls -la .next/standalone/ || echo "❌ .next/standalone/ not found" - - ls -la .next/standalone/.next/static/ || echo "❌ .next/standalone/.next/static/ not found" - - ls -la .next/standalone/public/ || echo "❌ .next/standalone/public/ not found" - - ls -la .next/standalone/server.js || echo "❌ server.js not found" - - echo "Contents of .next/standalone directory:" - - find .next/standalone -type f -name "*.js" | head -20 - - echo "Looking for server entry points:" - - find .next/standalone -name "server.*" -o -name "index.*" -o -name "start.*" | head -10 - - echo "Checking package.json in standalone build:" - - cat .next/standalone/package.json || echo "No package.json found" - - echo "=== BUILDING DOCKER RUNTIME IMAGE WITH PRE-BUILT ARTIFACTS ===" - - echo "Creating runtime-only Docker image with build artifacts..." - - echo "Using parallel Docker build with 36 cores..." - - docker build --progress=plain --build-arg BUILDKIT_INLINE_CACHE=1 -f Dockerfile -t $IMAGE_REPO_NAME:$IMAGE_TAG . + # Build Docker image + - echo "Building Docker image..." + - docker build --build-arg BUILDKIT_INLINE_CACHE=1 -f Dockerfile -t $IMAGE_REPO_NAME:$IMAGE_TAG . - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:latest @@ -167,9 +81,8 @@ phases: - echo "Pushing images to ECR..." - docker push $REPOSITORY_URI:$IMAGE_TAG - docker push $REPOSITORY_URI:latest - - echo "Updating ECS service to deploy new image..." - - aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment || (echo "❌ Failed to update ECS service" && exit 1) - - echo "Writing image definitions file..." + - echo "Updating ECS service..." + - aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment - 'printf "[{\"name\":\"%s-app\",\"imageUri\":\"%s\"}]" $IMAGE_REPO_NAME $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json' cache: From 02a64a90fad717a2026e18855b4eb274f8a6bd4c Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 19:28:56 -0400 Subject: [PATCH 033/107] chore: enhance buildspec.yml with additional debug logging and file verification - Added debug logging to track the build output structure and file copying process. - Implemented checks to verify the presence of static files and the overall directory structure in the standalone build. - Improved error handling for missing directories to enhance build reliability. --- apps/app/buildspec.yml | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 2f0187c58..a9fca0ac8 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -52,9 +52,16 @@ phases: # Prepare standalone build - echo "Preparing standalone build..." + - echo "DEBUG - Checking build output structure..." + - ls -la .next/ + - ls -la .next/static/ || echo "No static directory found" + - echo "DEBUG - Copying files..." - cp -r public .next/standalone/ || echo "No public folder" - mkdir -p .next/standalone/.next/static - - cp -r .next/static/* .next/standalone/.next/static/ || echo "No static files" + - if [ -d ".next/static" ]; then cp -r .next/static/* .next/standalone/.next/static/; else echo "No .next/static directory"; fi + - echo "DEBUG - Verifying copied files..." + - ls -la .next/standalone/.next/ || echo "No .next in standalone" + - ls -la .next/standalone/.next/static/ || echo "No static in standalone" # Copy Prisma client - echo "Copying Prisma client..." From 4b5b184756769d660c72962ea2ba6f4d64c39f11 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 19:44:02 -0400 Subject: [PATCH 034/107] chore: enhance buildspec.yml with improved debug logging and final verification steps - Updated debug logging to provide clearer insights into the Next.js build output and static file presence. - Added final verification checks for the standalone build, including checks for CSS and JS files. - Improved error handling for missing directories to ensure a more robust build process. --- apps/app/buildspec.yml | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index a9fca0ac8..6dd18522e 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -52,16 +52,19 @@ phases: # Prepare standalone build - echo "Preparing standalone build..." - - echo "DEBUG - Checking build output structure..." + - echo "DEBUG - Checking what Next.js built..." - ls -la .next/ + - ls -la .next/standalone/ || echo "No standalone directory" + - echo "DEBUG - Checking if static files exist..." - ls -la .next/static/ || echo "No static directory found" - - echo "DEBUG - Copying files..." + - echo "DEBUG - Copying static files to standalone..." - cp -r public .next/standalone/ || echo "No public folder" - mkdir -p .next/standalone/.next/static - if [ -d ".next/static" ]; then cp -r .next/static/* .next/standalone/.next/static/; else echo "No .next/static directory"; fi - - echo "DEBUG - Verifying copied files..." - - ls -la .next/standalone/.next/ || echo "No .next in standalone" - - ls -la .next/standalone/.next/static/ || echo "No static in standalone" + - echo "DEBUG - Final verification..." + - ls -la .next/standalone/ || echo "Standalone empty" + - find .next/standalone -name "*.css" | head -3 || echo "No CSS files found" + - find .next/standalone -name "*.js" | head -3 || echo "No JS files found" # Copy Prisma client - echo "Copying Prisma client..." From 12adfa621f5ed8b6ebae8227fb07fc4055a63ee5 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 19:58:10 -0400 Subject: [PATCH 035/107] fix: correct static file paths for next.js standalone monorepo structure - update buildspec.yml to copy static files to correct paths within standalone build - copy public files to .next/standalone/apps/app/public/ - copy static files to .next/standalone/apps/app/.next/static/ - resolves 404 errors for css, js, and font files in deployed application --- apps/app/buildspec.yml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 6dd18522e..c82279f84 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -63,8 +63,13 @@ phases: - if [ -d ".next/static" ]; then cp -r .next/static/* .next/standalone/.next/static/; else echo "No .next/static directory"; fi - echo "DEBUG - Final verification..." - ls -la .next/standalone/ || echo "Standalone empty" - - find .next/standalone -name "*.css" | head -3 || echo "No CSS files found" - - find .next/standalone -name "*.js" | head -3 || echo "No JS files found" + - echo "Looking for static files in standalone..." + - find .next/standalone -type f -name "*.css" | head -5 || echo "No CSS files found" + - find .next/standalone -type f -name "*.js" | head -5 || echo "No JS files found" + - find .next/standalone -type f -name "*.ttf" | head -3 || echo "No font files found" + - echo "Checking specific paths..." + - ls -la .next/standalone/.next/static/chunks/ || echo "No chunks directory" + - ls -la .next/standalone/.next/static/media/ || echo "No media directory" # Copy Prisma client - echo "Copying Prisma client..." From 02b7df520866a210f4bbb612f3d9f003c1d2f6c3 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 19:58:28 -0400 Subject: [PATCH 036/107] feat: add debug scripts for ECS and CodeBuild log retrieval - Introduced debug_logs.sh to fetch and display ECS and CodeBuild log streams for easier troubleshooting. - Added run_debug_task.sh to execute a debug task in ECS, providing insights into container state and static file presence. - Enhances the debugging process for the infrastructure setup, improving visibility into log management. --- apps/infra/debug_logs.sh | 6 + apps/infra/run_debug_task.sh | 1 + buildspec.yml | 19 + yarn.lock | 2324 +++++++++++++++++----------------- 4 files changed, 1193 insertions(+), 1157 deletions(-) create mode 100644 apps/infra/debug_logs.sh create mode 100644 apps/infra/run_debug_task.sh create mode 100644 buildspec.yml diff --git a/apps/infra/debug_logs.sh b/apps/infra/debug_logs.sh new file mode 100644 index 000000000..1012ff583 --- /dev/null +++ b/apps/infra/debug_logs.sh @@ -0,0 +1,6 @@ +#!/bin/bash +echo "=== Getting ECS Log Streams ===" +aws logs describe-log-streams --log-group-name "/aws/ecs/comp-mariano-test" --region us-east-1 --query 'logStreams[0:2].{name:logStreamName,time:lastEventTime}' --output table +echo "" +echo "=== Getting CodeBuild Log Streams ===" +aws logs describe-log-streams --log-group-name "/aws/codebuild/comp-mariano-test-app-build" --region us-east-1 --query 'logStreams[0:2].{name:logStreamName,time:lastEventTime}' --output table diff --git a/apps/infra/run_debug_task.sh b/apps/infra/run_debug_task.sh new file mode 100644 index 000000000..e98c850c5 --- /dev/null +++ b/apps/infra/run_debug_task.sh @@ -0,0 +1 @@ +aws ecs run-task --cluster comp-mariano-test --task-definition comp-mariano-test --launch-type FARGATE --overrides "{\"containerOverrides\":[{\"name\":\"comp-mariano-test-app\",\"command\":[\"sh\",\"-c\",\"echo === Container Debug === && ls -la /app && echo === Static Check === && ls -la /app/.next/static/ || echo No static && echo === End === && sleep 120\"]}]}" --region us-east-1 diff --git a/buildspec.yml b/buildspec.yml new file mode 100644 index 000000000..8023ed464 --- /dev/null +++ b/buildspec.yml @@ -0,0 +1,19 @@ +# Prepare standalone build +- echo "Preparing standalone build..." +- echo "DEBUG - Checking what Next.js built..." +- ls -la .next/ +- ls -la .next/standalone/ || echo "No standalone directory" +- echo "DEBUG - Checking if static files exist..." +- ls -la .next/static/ || echo "No static directory found" +- echo "DEBUG - Copying static files to standalone..." +- cp -r public .next/standalone/apps/app/ || echo "No public folder" +- cp -r .next/static .next/standalone/apps/app/.next/ || echo "No .next/static directory" +- echo "DEBUG - Final verification..." +- ls -la .next/standalone/ || echo "Standalone empty" +- echo "Looking for static files in standalone..." +- find .next/standalone -type f -name "*.css" | head -5 || echo "No CSS files found" +- find .next/standalone -type f -name "*.js" | head -5 || echo "No JS files found" +- find .next/standalone -type f -name "*.ttf" | head -3 || echo "No font files found" +- echo "Checking specific paths..." +- ls -la .next/standalone/apps/app/.next/static/chunks/ || echo "No chunks directory" +- ls -la .next/standalone/apps/app/.next/static/media/ || echo "No media directory" diff --git a/yarn.lock b/yarn.lock index 30ff0e91e..e4fe48a5f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,6 +1,6 @@ # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. # yarn lockfile v1 -# bun ./bun.lockb --hash: 713737C131024FEA-fca7d31c5527c180-03CD25DE6A583D96-25c4f14a138621ee +# bun ./bun.lockb --hash: 0000000000000000-0000000000000000-0000000000000000-0000000000000000 "@adobe/css-tools@^4.4.0": @@ -36,8 +36,8 @@ resolved "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz" integrity sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA== dependencies: - nanoid "^3.3.8" "@ai-sdk/provider" "1.1.3" + nanoid "^3.3.8" secure-json-parse "^2.7.0" "@ai-sdk/react@1.2.12", "@ai-sdk/react@^1.2.9": @@ -45,10 +45,10 @@ resolved "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz" integrity sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g== dependencies: + "@ai-sdk/provider-utils" "2.2.8" + "@ai-sdk/ui-utils" "1.2.11" swr "^2.2.5" throttleit "2.1.0" - "@ai-sdk/ui-utils" "1.2.11" - "@ai-sdk/provider-utils" "2.2.8" "@ai-sdk/ui-utils@1.2.11": version "1.2.11" @@ -77,11 +77,11 @@ resolved "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz" integrity sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw== dependencies: - lru-cache "^10.4.3" "@csstools/css-calc" "^2.1.3" - "@csstools/css-tokenizer" "^3.0.3" "@csstools/css-color-parser" "^3.0.9" "@csstools/css-parser-algorithms" "^3.0.4" + "@csstools/css-tokenizer" "^3.0.3" + lru-cache "^10.4.3" "@aws-crypto/crc32@5.2.0": version "5.2.0" @@ -131,9 +131,9 @@ resolved "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz" integrity sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA== dependencies: - tslib "^2.6.2" - "@aws-sdk/types" "^3.222.0" "@aws-crypto/util" "^5.2.0" + "@aws-sdk/types" "^3.222.0" + tslib "^2.6.2" "@aws-crypto/supports-web-crypto@^5.2.0": version "5.2.0" @@ -147,9 +147,9 @@ resolved "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz" integrity sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ== dependencies: - tslib "^2.6.2" "@aws-sdk/types" "^3.222.0" "@smithy/util-utf8" "^2.0.0" + tslib "^2.6.2" "@aws-sdk/client-ecs@^3.405.0": version "3.848.0" @@ -830,63 +830,63 @@ resolved "https://registry.npmjs.org/@azure/core-auth/-/core-auth-1.10.0.tgz" integrity sha512-88Djs5vBvGbHQHf5ZZcaoNHo6Y8BKZkt3cw2iuJIQzLEgH4Ox6Tm4hjFhbqOxyYsgIG/eJbFEHpxRIfEEWv5Ow== dependencies: - tslib "^2.6.2" - "@azure/core-util" "^1.11.0" "@azure/abort-controller" "^2.0.0" + "@azure/core-util" "^1.11.0" + tslib "^2.6.2" "@azure/core-client@^1.9.2": version "1.10.0" resolved "https://registry.npmjs.org/@azure/core-client/-/core-client-1.10.0.tgz" integrity sha512-O4aP3CLFNodg8eTHXECaH3B3CjicfzkxVtnrfLkOq0XNP7TIECGfHpK/C6vADZkWP75wzmdBnsIA8ksuJMk18g== dependencies: - tslib "^2.6.2" - "@azure/logger" "^1.0.0" - "@azure/core-auth" "^1.4.0" - "@azure/core-util" "^1.6.1" - "@azure/core-tracing" "^1.0.0" "@azure/abort-controller" "^2.0.0" + "@azure/core-auth" "^1.4.0" "@azure/core-rest-pipeline" "^1.20.0" + "@azure/core-tracing" "^1.0.0" + "@azure/core-util" "^1.6.1" + "@azure/logger" "^1.0.0" + tslib "^2.6.2" "@azure/core-http@^3.0.5": version "3.0.5" resolved "https://registry.npmjs.org/@azure/core-http/-/core-http-3.0.5.tgz" integrity sha512-T8r2q/c3DxNu6mEJfPuJtptUVqwchxzjj32gKcnMi06rdiVONS9rar7kT9T2Am+XvER7uOzpsP79WsqNbdgdWg== dependencies: - uuid "^8.3.0" - tslib "^2.2.0" - tunnel "^0.0.6" - xml2js "^0.5.0" - process "^0.11.10" - form-data "^4.0.0" - node-fetch "^2.6.7" - "@azure/logger" "^1.0.0" - "@types/tunnel" "^0.0.3" + "@azure/abort-controller" "^1.0.0" "@azure/core-auth" "^1.3.0" + "@azure/core-tracing" "1.0.0-preview.13" "@azure/core-util" "^1.1.1" + "@azure/logger" "^1.0.0" "@types/node-fetch" "^2.5.0" - "@azure/core-tracing" "1.0.0-preview.13" - "@azure/abort-controller" "^1.0.0" + "@types/tunnel" "^0.0.3" + form-data "^4.0.0" + node-fetch "^2.6.7" + process "^0.11.10" + tslib "^2.2.0" + tunnel "^0.0.6" + uuid "^8.3.0" + xml2js "^0.5.0" "@azure/core-rest-pipeline@^1.17.0", "@azure/core-rest-pipeline@^1.20.0", "@azure/core-rest-pipeline@^1.21.0": version "1.22.0" resolved "https://registry.npmjs.org/@azure/core-rest-pipeline/-/core-rest-pipeline-1.22.0.tgz" integrity sha512-OKHmb3/Kpm06HypvB3g6Q3zJuvyXcpxDpCS1PnU8OV6AJgSFaee/covXBcPbWc6XDDxtEPlbi3EMQ6nUiPaQtw== dependencies: - tslib "^2.6.2" - "@azure/logger" "^1.0.0" + "@azure/abort-controller" "^2.0.0" "@azure/core-auth" "^1.8.0" - "@azure/core-util" "^1.11.0" "@azure/core-tracing" "^1.0.1" - "@azure/abort-controller" "^2.0.0" + "@azure/core-util" "^1.11.0" + "@azure/logger" "^1.0.0" "@typespec/ts-http-runtime" "^0.3.0" + tslib "^2.6.2" "@azure/core-tracing@1.0.0-preview.13": version "1.0.0-preview.13" resolved "https://registry.npmjs.org/@azure/core-tracing/-/core-tracing-1.0.0-preview.13.tgz" integrity sha512-KxDlhXyMlh2Jhj2ykX6vNEU0Vou4nHr025KoSEiz7cS3BNiHNaZcdECk/DmLkEB0as5T7b/TpRcehJ5yV6NeXQ== dependencies: - tslib "^2.2.0" "@opentelemetry/api" "^1.0.1" + tslib "^2.2.0" "@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.0.1", "@azure/core-tracing@^1.2.0": version "1.3.0" @@ -900,34 +900,34 @@ resolved "https://registry.npmjs.org/@azure/core-util/-/core-util-1.13.0.tgz" integrity sha512-o0psW8QWQ58fq3i24Q1K2XfS/jYTxr7O1HRcyUE9bV9NttLU+kYOH82Ixj8DGlMTOWgxm1Sss2QAfKK5UkSPxw== dependencies: - tslib "^2.6.2" "@azure/abort-controller" "^2.0.0" "@typespec/ts-http-runtime" "^0.3.0" + tslib "^2.6.2" "@azure/identity@^4.10.0": version "4.10.2" resolved "https://registry.npmjs.org/@azure/identity/-/identity-4.10.2.tgz" integrity sha512-Uth4vz0j+fkXCkbvutChUj03PDCokjbC6Wk9JT8hHEUtpy/EurNKAseb3+gO6Zi9VYBvwt61pgbzn1ovk942Qg== dependencies: - open "^10.1.0" - tslib "^2.2.0" - "@azure/logger" "^1.0.0" + "@azure/abort-controller" "^2.0.0" "@azure/core-auth" "^1.9.0" - "@azure/core-util" "^1.11.0" - "@azure/msal-node" "^3.5.0" "@azure/core-client" "^1.9.2" + "@azure/core-rest-pipeline" "^1.17.0" "@azure/core-tracing" "^1.0.0" + "@azure/core-util" "^1.11.0" + "@azure/logger" "^1.0.0" "@azure/msal-browser" "^4.2.0" - "@azure/abort-controller" "^2.0.0" - "@azure/core-rest-pipeline" "^1.17.0" + "@azure/msal-node" "^3.5.0" + open "^10.1.0" + tslib "^2.2.0" "@azure/logger@^1.0.0": version "1.3.0" resolved "https://registry.npmjs.org/@azure/logger/-/logger-1.3.0.tgz" integrity sha512-fCqPIfOcLE+CGqGPd66c8bZpwAji98tZ4JI9i/mlTNTlsIWslCfpg48s/ypyLxZTump5sypjrKn2/kY7q8oAbA== dependencies: - tslib "^2.6.2" "@typespec/ts-http-runtime" "^0.3.0" + tslib "^2.6.2" "@azure/msal-browser@^4.2.0": version "4.15.0" @@ -955,9 +955,9 @@ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz" integrity sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== dependencies: + "@babel/helper-validator-identifier" "^7.27.1" js-tokens "^4.0.0" picocolors "^1.1.1" - "@babel/helper-validator-identifier" "^7.27.1" "@babel/compat-data@^7.27.2": version "7.28.0" @@ -969,43 +969,43 @@ resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz" integrity sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ== dependencies: - debug "^4.1.0" - json5 "^2.2.3" - semver "^6.3.1" - gensync "^1.0.0-beta.2" - "@babel/types" "^7.28.0" - "@babel/parser" "^7.28.0" + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" + "@babel/helper-compilation-targets" "^7.27.2" + "@babel/helper-module-transforms" "^7.27.3" "@babel/helpers" "^7.27.6" + "@babel/parser" "^7.28.0" "@babel/template" "^7.27.2" "@babel/traverse" "^7.28.0" - "@babel/generator" "^7.28.0" - "@babel/code-frame" "^7.27.1" + "@babel/types" "^7.28.0" convert-source-map "^2.0.0" - "@ampproject/remapping" "^2.2.0" - "@babel/helper-module-transforms" "^7.27.3" - "@babel/helper-compilation-targets" "^7.27.2" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" "@babel/generator@^7.28.0": version "7.28.0" resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz" integrity sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg== dependencies: - jsesc "^3.0.2" - "@babel/types" "^7.28.0" "@babel/parser" "^7.28.0" + "@babel/types" "^7.28.0" "@jridgewell/gen-mapping" "^0.3.12" "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" "@babel/helper-compilation-targets@^7.27.2": version "7.27.2" resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz" integrity sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== dependencies: - semver "^6.3.1" - lru-cache "^5.1.1" - browserslist "^4.24.0" "@babel/compat-data" "^7.27.2" "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" "@babel/helper-globals@^7.28.0": version "7.28.0" @@ -1017,17 +1017,17 @@ resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz" integrity sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== dependencies: - "@babel/types" "^7.27.1" "@babel/traverse" "^7.27.1" + "@babel/types" "^7.27.1" "@babel/helper-module-transforms@^7.27.3": version "7.27.3" resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz" integrity sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg== dependencies: - "@babel/traverse" "^7.27.3" "@babel/helper-module-imports" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" + "@babel/traverse" "^7.27.3" "@babel/helper-plugin-utils@^7.27.1": version "7.27.1" @@ -1054,8 +1054,8 @@ resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz" integrity sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug== dependencies: - "@babel/types" "^7.27.6" "@babel/template" "^7.27.2" + "@babel/types" "^7.27.6" "@babel/parser@^7.1.0", "@babel/parser@^7.20.7", "@babel/parser@^7.27.0", "@babel/parser@^7.27.2", "@babel/parser@^7.28.0": version "7.28.0" @@ -1088,22 +1088,22 @@ resolved "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz" integrity sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== dependencies: - "@babel/types" "^7.27.1" - "@babel/parser" "^7.27.2" "@babel/code-frame" "^7.27.1" + "@babel/parser" "^7.27.2" + "@babel/types" "^7.27.1" "@babel/traverse@^7.27.0", "@babel/traverse@^7.27.1", "@babel/traverse@^7.27.3", "@babel/traverse@^7.28.0": version "7.28.0" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz" integrity sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg== dependencies: - debug "^4.3.1" - "@babel/types" "^7.28.0" - "@babel/parser" "^7.28.0" - "@babel/template" "^7.27.2" - "@babel/generator" "^7.28.0" "@babel/code-frame" "^7.27.1" + "@babel/generator" "^7.28.0" "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.28.0" + "@babel/template" "^7.27.2" + "@babel/types" "^7.28.0" + debug "^4.3.1" "@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.27.1", "@babel/types@^7.27.6", "@babel/types@^7.28.0": version "7.28.1" @@ -1144,20 +1144,20 @@ resolved "https://registry.npmjs.org/@calcom/atoms/-/atoms-1.1.1.tgz" integrity sha512-cq0HAUzkaiXw5tT/5bUozj4o83swg8GDCeEeKgtu9e7yjFJ9YqWRz+OVFc5andX1pUzmbkUpuH1hGxIziSFxaQ== dependencies: + "@radix-ui/react-dialog-atoms" "npm:@radix-ui/react-dialog@^1.0.4" + "@radix-ui/react-slot" "^1.0.2" + "@radix-ui/react-switch" "^1.1.0" + "@radix-ui/react-toast" "^1.1.5" + "@radix-ui/react-tooltip-atoms" "npm:@radix-ui/react-tooltip@^1.0.0" + "@tanstack/react-query" "^5.17.15" + class-variance-authority "^0.7.0" clsx "^2.0.0" - marked "^15.0.3" dompurify "^3.2.3" + marked "^15.0.3" react-use "^17.4.2" - tailwindcss "^3.3.3" tailwind-merge "^1.13.2" + tailwindcss "^3.3.3" tailwindcss-animate "^1.0.6" - "@radix-ui/react-slot" "^1.0.2" - "@radix-ui/react-toast" "^1.1.5" - "@tanstack/react-query" "^5.17.15" - "@radix-ui/react-switch" "^1.1.0" - class-variance-authority "^0.7.0" - "@radix-ui/react-dialog-atoms" "npm:@radix-ui/react-dialog@^1.0.4" - "@radix-ui/react-tooltip-atoms" "npm:@radix-ui/react-tooltip@^1.0.0" "@calcom/embed-core@1.5.3": version "1.5.3" @@ -1339,14 +1339,14 @@ "@types/conventional-commits-parser" "^5.0.0" chalk "^5.3.0" -"@comp/analytics@packages/analytics": +"@comp/analytics@^workspace:packages/analytics": version "workspace:packages/analytics" resolved "workspace:packages/analytics" dependencies: posthog-js "^1.236.6" posthog-node "^4.14.0" -"@comp/app@apps/app", "@comp/app@workspace:*": +"@comp/app@^workspace:apps/app", "@comp/app@workspace:*": version "workspace:apps/app" resolved "workspace:apps/app" devDependencies: @@ -1384,7 +1384,9 @@ "@browserbasehq/sdk" "^2.5.0" "@calcom/atoms" "^1.0.102-framer" "@calcom/embed-react" "^1.5.3" + dependencies: "@comp/db" "workspace:*" + dependencies: "@date-fns/tz" "^1.2.0" "@dnd-kit/core" "^6.3.1" "@dnd-kit/modifiers" "^9.0.0" @@ -1454,18 +1456,19 @@ zaraz-ts "^1.2.0" zustand "^5.0.3" -"@comp/db@packages/db", "@comp/db@workspace:*": +"@comp/db@^workspace:packages/db", "@comp/db@workspace:*": version "workspace:packages/db" resolved "workspace:packages/db" devDependencies: "@comp/tsconfig" "workspace:*" + devDependencies: prisma "^6.9.0" ts-node "^10.9.2" typescript "^5.8.3" dependencies: "@prisma/client" "6.9.0" -"@comp/email@packages/email": +"@comp/email@^workspace:packages/email": version "workspace:packages/email" resolved "workspace:packages/email" devDependencies: @@ -1476,6 +1479,7 @@ dependencies: "@comp/ui" "workspace:*" "@comp/utils" "workspace:*" + dependencies: "@react-email/components" "^0.0.41" "@react-email/render" "^1.1.2" "@react-email/tailwind" "1.0.5" @@ -1484,7 +1488,7 @@ react-email "^4.0.15" responsive-react-email "^0.0.5" -"@comp/framework-editor@apps/framework-editor": +"@comp/framework-editor@^workspace:apps/framework-editor": version "workspace:apps/framework-editor" resolved "workspace:apps/framework-editor" devDependencies: @@ -1500,6 +1504,7 @@ dependencies: "@comp/db" "workspace:*" "@comp/ui" "workspace:*" + dependencies: "@hookform/resolvers" "^5.1.1" "@tanstack/react-table" "^8.21.3" "@tanstack/react-virtual" "^3.13.8" @@ -1513,7 +1518,7 @@ tippy.js "^6.3.7" zod "3.25.67" -"@comp/infra@apps/infra": +"@comp/infra@^workspace:apps/infra": version "workspace:apps/infra" resolved "workspace:apps/infra" devDependencies: @@ -1529,7 +1534,7 @@ "@pulumi/tailscale" "^0.17.0" dotenv "^17.2.0" -"@comp/integrations@packages/integrations": +"@comp/integrations@^workspace:packages/integrations": version "workspace:packages/integrations" resolved "workspace:packages/integrations" devDependencies: @@ -1540,7 +1545,9 @@ "@ai-sdk/openai" "^1.3.19" "@aws-sdk/client-securityhub" "^3.0.0" "@azure/identity" "^4.10.0" + dependencies: "@comp/app" "workspace:*" + dependencies: "@slack/bolt" "^3.22.0" "@slack/web-api" "^7.8.0" ai "^4.3.16" @@ -1550,14 +1557,14 @@ stoppable "^1.1.0" zod "3.25.67" -"@comp/kv@packages/kv": +"@comp/kv@^workspace:packages/kv": version "workspace:packages/kv" resolved "workspace:packages/kv" dependencies: "@upstash/redis" "^1.34.2" server-only "0.0.1" -"@comp/portal@apps/portal": +"@comp/portal@^workspace:apps/portal": version "workspace:apps/portal" resolved "workspace:apps/portal" devDependencies: @@ -1573,8 +1580,10 @@ typescript "^5.8.3" dependencies: "@aws-sdk/s3-request-presigner" "^3.832.0" + dependencies: "@comp/db" "workspace:*" "@comp/ui" "workspace:*" + dependencies: "@react-email/components" "^0.0.41" "@react-email/render" "^1.1.2" "@t3-oss/env-nextjs" "^0.13.8" @@ -1586,7 +1595,7 @@ next "15.4.0-canary.85" react-email "^4.0.15" -"@comp/trust@apps/trust": +"@comp/trust@^workspace:apps/trust": version "workspace:apps/trust" resolved "workspace:apps/trust" devDependencies: @@ -1603,15 +1612,16 @@ dependencies: "@comp/db" "workspace:*" "@comp/ui" "workspace:*" + dependencies: "@lottiefiles/dotlottie-react" "^0.14.2" lucide-react "^0.518.0" next "15.4.0-canary.85" -"@comp/tsconfig@packages/tsconfig", "@comp/tsconfig@workspace:*": +"@comp/tsconfig@^workspace:packages/tsconfig", "@comp/tsconfig@workspace:*": version "workspace:packages/tsconfig" resolved "workspace:packages/tsconfig" -"@comp/ui@packages/ui", "@comp/ui@workspace:*": +"@comp/ui@^workspace:packages/ui", "@comp/ui@workspace:*": version "workspace:packages/ui" resolved "workspace:packages/ui" devDependencies: @@ -1694,7 +1704,7 @@ use-debounce "^10.0.4" vaul "^0.9.6" -"@comp/utils@packages/utils", "@comp/utils@workspace:*": +"@comp/utils@^workspace:packages/utils", "@comp/utils@workspace:*": version "workspace:packages/utils" resolved "workspace:packages/utils" devDependencies: @@ -1750,13 +1760,13 @@ resolved "https://registry.npmjs.org/@discordjs/builders/-/builders-1.11.2.tgz" integrity sha512-F1WTABdd8/R9D1icJzajC4IuLyyS8f3rTOz66JsSI3pKvpCAtsMBweu8cyNYsIyvcrKAVn9EPK+Psoymq+XC0A== dependencies: - tslib "^2.6.3" - ts-mixer "^6.0.4" + "@discordjs/formatters" "^0.6.1" "@discordjs/util" "^1.1.1" - fast-deep-equal "^3.1.3" - discord-api-types "^0.38.1" "@sapphire/shapeshift" "^4.0.0" - "@discordjs/formatters" "^0.6.1" + discord-api-types "^0.38.1" + fast-deep-equal "^3.1.3" + ts-mixer "^6.0.4" + tslib "^2.6.3" "@discordjs/collection@1.5.3": version "1.5.3" @@ -1780,15 +1790,15 @@ resolved "https://registry.npmjs.org/@discordjs/rest/-/rest-2.5.1.tgz" integrity sha512-Tg9840IneBcbrAjcGaQzHUJWFNq1MMWZjTdjJ0WS/89IffaNKc++iOvffucPxQTF/gviO9+9r8kEPea1X5J2Dw== dependencies: - tslib "^2.6.3" - undici "6.21.3" - magic-bytes.js "^1.10.0" - "@discordjs/util" "^1.1.1" - discord-api-types "^0.38.1" - "@sapphire/snowflake" "^3.5.3" "@discordjs/collection" "^2.1.1" + "@discordjs/util" "^1.1.1" "@sapphire/async-queue" "^1.5.3" + "@sapphire/snowflake" "^3.5.3" "@vladfrangu/async_event_emitter" "^2.4.6" + discord-api-types "^0.38.1" + magic-bytes.js "^1.10.0" + tslib "^2.6.3" + undici "6.21.3" "@discordjs/util@^1.1.0", "@discordjs/util@^1.1.1": version "1.1.1" @@ -1800,15 +1810,15 @@ resolved "https://registry.npmjs.org/@discordjs/ws/-/ws-1.2.3.tgz" integrity sha512-wPlQDxEmlDg5IxhJPuxXr3Vy9AjYq5xCvFWGJyD7w7Np8ZGu+Mc+97LCoEc/+AYCo2IDpKioiH0/c/mj5ZR9Uw== dependencies: - ws "^8.17.0" - tslib "^2.6.2" - "@types/ws" "^8.5.10" + "@discordjs/collection" "^2.1.0" "@discordjs/rest" "^2.5.1" "@discordjs/util" "^1.1.0" - discord-api-types "^0.38.1" - "@discordjs/collection" "^2.1.0" "@sapphire/async-queue" "^1.5.2" + "@types/ws" "^8.5.10" "@vladfrangu/async_event_emitter" "^2.2.4" + discord-api-types "^0.38.1" + tslib "^2.6.2" + ws "^8.17.0" "@dnd-kit/accessibility@^3.1.1": version "3.1.1" @@ -1822,9 +1832,9 @@ resolved "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz" integrity sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ== dependencies: - tslib "^2.0.0" "@dnd-kit/accessibility" "^3.1.1" "@dnd-kit/utilities" "^3.2.2" + tslib "^2.0.0" "@dnd-kit/modifiers@^9.0.0": version "9.0.0" @@ -1875,18 +1885,18 @@ resolved "https://registry.npmjs.org/@dub/embed-react/-/embed-react-0.0.15.tgz" integrity sha512-GLLAMGpn6WLXbM8q4n0lPOrjsYkmI0W3LvAAMFbb+FeQ6OwFvz390xwWW2ygfUo74wvWLSYVEOoHymiuoSrb7Q== dependencies: - vite "5.2.9" "@dub/embed-core" "^0.0.15" class-variance-authority "^0.7.0" + vite "5.2.9" "@effect/platform@0.85.2": version "0.85.2" resolved "https://registry.npmjs.org/@effect/platform/-/platform-0.85.2.tgz" integrity sha512-zIRixbQeO6QniR0k2mwR7DmR2HO1w6+qQlzQ5nb8lyPyPgd1gV9wo/9yBeB6zRC+CGnxiUiYsRMamclVISuxLw== dependencies: + find-my-way-ts "^0.1.5" msgpackr "^1.11.4" multipasta "^0.2.5" - find-my-way-ts "^0.1.5" "@electric-sql/client@1.0.0-beta.1": version "1.0.0-beta.1" @@ -2361,10 +2371,10 @@ resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz" integrity sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ== dependencies: + lodash.camelcase "^4.3.0" long "^5.0.0" - yargs "^17.7.2" protobufjs "^7.2.5" - lodash.camelcase "^4.3.0" + yargs "^17.7.2" "@hexagon/base64@^1.1.27": version "1.1.28" @@ -2388,8 +2398,8 @@ resolved "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz" integrity sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== dependencies: - "@humanwhocodes/retry" "^0.3.0" "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.3.0" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" @@ -2648,10 +2658,10 @@ resolved "https://registry.npmjs.org/@mendable/firecrawl-js/-/firecrawl-js-1.29.1.tgz" integrity sha512-w7mXja6hSNL6li7BHgY6LQLnBJ9RIxWkmZ16y2MCOr3w6MlR7k2ZcTxro6vEJrUoshhyoOqhcFCyD1P0ckBuRw== dependencies: + axios "^1.6.8" typescript-event-target "^1.1.1" zod "^3.23.8" zod-to-json-schema "^3.23.0" - axios "^1.6.8" "@monogrid/gainmap-js@^3.0.6": version "3.1.0" @@ -2703,8 +2713,8 @@ integrity sha512-G7oC4QsJrmLjAWQmvB7gY8hE0UMr8PofAY/pPsk/0sHIM1YWeealBI7RiPeN4UluArT7w+OoUvMQd+jtrTh9Lw== dependencies: axios "^1.7.9" - type-fest "4.32.0" json-schema "0.4.0" + type-fest "4.32.0" "@napi-rs/wasm-runtime@^0.2.11": version "0.2.12" @@ -2789,8 +2799,8 @@ resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== dependencies: - run-parallel "^1.1.9" "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" "@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" @@ -2802,8 +2812,8 @@ resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== dependencies: - fastq "^1.6.0" "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" "@nolyfill/is-core-module@1.0.39": version "1.0.39" @@ -2815,10 +2825,10 @@ resolved "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz" integrity sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og== dependencies: - lru-cache "^10.0.1" agent-base "^7.1.0" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" socks-proxy-agent "^8.0.3" "@npmcli/agent@^3.0.0": @@ -2826,10 +2836,10 @@ resolved "https://registry.npmjs.org/@npmcli/agent/-/agent-3.0.0.tgz" integrity sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q== dependencies: - lru-cache "^10.0.1" agent-base "^7.1.0" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.1" + lru-cache "^10.0.1" socks-proxy-agent "^8.0.3" "@npmcli/arborist@^7.3.1": @@ -2837,41 +2847,41 @@ resolved "https://registry.npmjs.org/@npmcli/arborist/-/arborist-7.5.4.tgz" integrity sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g== dependencies: - nopt "^7.2.1" - ssri "^10.0.6" - pacote "^18.0.6" - proggy "^2.0.0" - semver "^7.3.7" - cacache "^18.0.3" - proc-log "^4.2.0" - bin-links "^4.0.4" - lru-cache "^10.2.2" - minimatch "^9.0.4" - treeverse "^3.0.0" + "@isaacs/string-locale-compare" "^1.1.0" "@npmcli/fs" "^3.1.1" - walk-up-path "^3.0.1" + "@npmcli/installed-package-contents" "^2.1.0" + "@npmcli/map-workspaces" "^3.0.2" + "@npmcli/metavuln-calculator" "^7.1.1" + "@npmcli/name-from-folder" "^2.0.0" + "@npmcli/node-gyp" "^3.0.0" + "@npmcli/package-json" "^5.1.0" "@npmcli/query" "^3.1.0" "@npmcli/redact" "^2.0.0" + "@npmcli/run-script" "^8.1.0" + bin-links "^4.0.4" + cacache "^18.0.3" + common-ancestor-path "^1.0.1" hosted-git-info "^7.0.2" + json-parse-even-better-errors "^3.0.2" + json-stringify-nice "^1.1.4" + lru-cache "^10.2.2" + minimatch "^9.0.4" + nopt "^7.2.1" + npm-install-checks "^6.2.0" npm-package-arg "^11.0.2" - "@npmcli/node-gyp" "^3.0.0" npm-pick-manifest "^9.0.1" - "@npmcli/run-script" "^8.1.0" - npm-install-checks "^6.2.0" npm-registry-fetch "^17.0.1" - promise-call-limit "^3.0.1" - json-stringify-nice "^1.1.4" + pacote "^18.0.6" parse-conflict-json "^3.0.0" - "@npmcli/package-json" "^5.1.0" - common-ancestor-path "^1.0.1" - "@npmcli/map-workspaces" "^3.0.2" - read-package-json-fast "^3.0.2" + proc-log "^4.2.0" + proggy "^2.0.0" promise-all-reject-late "^1.0.0" - "@npmcli/name-from-folder" "^2.0.0" - "@npmcli/metavuln-calculator" "^7.1.1" - "@isaacs/string-locale-compare" "^1.1.0" - json-parse-even-better-errors "^3.0.2" - "@npmcli/installed-package-contents" "^2.1.0" + promise-call-limit "^3.0.1" + read-package-json-fast "^3.0.2" + semver "^7.3.7" + ssri "^10.0.6" + treeverse "^3.0.0" + walk-up-path "^3.0.1" "@npmcli/arborist@^8.0.1": version "8.0.1" @@ -2919,14 +2929,14 @@ resolved "https://registry.npmjs.org/@npmcli/config/-/config-9.0.0.tgz" integrity sha512-P5Vi16Y+c8E0prGIzX112ug7XxqfaPFUVW/oXAV+2VsxplKZEnJozqZ0xnK8V8w/SEsBf+TXhUihrEIAU4CA5Q== dependencies: + "@npmcli/map-workspaces" "^4.0.1" + "@npmcli/package-json" "^6.0.1" + ci-info "^4.0.0" ini "^5.0.0" nopt "^8.0.0" - semver "^7.3.5" - ci-info "^4.0.0" proc-log "^5.0.0" + semver "^7.3.5" walk-up-path "^3.0.1" - "@npmcli/package-json" "^6.0.1" - "@npmcli/map-workspaces" "^4.0.1" "@npmcli/fs@^3.1.0", "@npmcli/fs@^3.1.1": version "3.1.1" @@ -2947,29 +2957,29 @@ resolved "https://registry.npmjs.org/@npmcli/git/-/git-5.0.8.tgz" integrity sha512-liASfw5cqhjNW9UFd+ruwwdEf/lbOAQjLL2XY2dFW/bkJheXDYZgOyul/4gVvEV4BWkTXjYGmDqMw9uegdbJNQ== dependencies: + "@npmcli/promise-spawn" "^7.0.0" ini "^4.1.3" - which "^4.0.0" - semver "^7.3.5" - proc-log "^4.0.0" lru-cache "^10.0.1" - promise-retry "^2.0.1" - promise-inflight "^1.0.1" npm-pick-manifest "^9.0.0" - "@npmcli/promise-spawn" "^7.0.0" + proc-log "^4.0.0" + promise-inflight "^1.0.1" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^4.0.0" "@npmcli/git@^6.0.0", "@npmcli/git@^6.0.1": version "6.0.3" resolved "https://registry.npmjs.org/@npmcli/git/-/git-6.0.3.tgz" integrity sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ== dependencies: + "@npmcli/promise-spawn" "^8.0.0" ini "^5.0.0" - which "^5.0.0" - semver "^7.3.5" - proc-log "^5.0.0" lru-cache "^10.0.1" - promise-retry "^2.0.1" npm-pick-manifest "^10.0.0" - "@npmcli/promise-spawn" "^8.0.0" + proc-log "^5.0.0" + promise-retry "^2.0.1" + semver "^7.3.5" + which "^5.0.0" "@npmcli/installed-package-contents@^2.0.1", "@npmcli/installed-package-contents@^2.1.0": version "2.1.0" @@ -2992,42 +3002,42 @@ resolved "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-3.0.6.tgz" integrity sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA== dependencies: + "@npmcli/name-from-folder" "^2.0.0" glob "^10.2.2" minimatch "^9.0.0" read-package-json-fast "^3.0.0" - "@npmcli/name-from-folder" "^2.0.0" "@npmcli/map-workspaces@^4.0.1", "@npmcli/map-workspaces@^4.0.2": version "4.0.2" resolved "https://registry.npmjs.org/@npmcli/map-workspaces/-/map-workspaces-4.0.2.tgz" integrity sha512-mnuMuibEbkaBTYj9HQ3dMe6L0ylYW+s/gfz7tBDMFY/la0w9Kf44P9aLn4/+/t3aTR3YUHKoT6XQL9rlicIe3Q== dependencies: + "@npmcli/name-from-folder" "^3.0.0" + "@npmcli/package-json" "^6.0.0" glob "^10.2.2" minimatch "^9.0.0" - "@npmcli/package-json" "^6.0.0" - "@npmcli/name-from-folder" "^3.0.0" "@npmcli/metavuln-calculator@^7.1.1": version "7.1.1" resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-7.1.1.tgz" integrity sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g== dependencies: - pacote "^18.0.0" - semver "^7.3.5" cacache "^18.0.0" - proc-log "^4.1.0" json-parse-even-better-errors "^3.0.0" + pacote "^18.0.0" + proc-log "^4.1.0" + semver "^7.3.5" "@npmcli/metavuln-calculator@^8.0.0": version "8.0.1" resolved "https://registry.npmjs.org/@npmcli/metavuln-calculator/-/metavuln-calculator-8.0.1.tgz" integrity sha512-WXlJx9cz3CfHSt9W9Opi1PTFc4WZLFomm5O8wekxQZmkyljrBRwATwDxfC9iOXJwYVmfiW1C1dUe0W2aN0UrSg== dependencies: - pacote "^20.0.0" - semver "^7.3.5" cacache "^19.0.0" - proc-log "^5.0.0" json-parse-even-better-errors "^4.0.0" + pacote "^20.0.0" + proc-log "^5.0.0" + semver "^7.3.5" "@npmcli/name-from-folder@^2.0.0": version "2.0.0" @@ -3054,13 +3064,13 @@ resolved "https://registry.npmjs.org/@npmcli/package-json/-/package-json-5.2.1.tgz" integrity sha512-f7zYC6kQautXHvNbLEWgD/uGu1+xCn9izgqBfgItWSx22U0ZDekxN08A1vM8cTxj/cRVe0Q94Ode+tdoYmIOOQ== dependencies: - glob "^10.2.2" - semver "^7.5.3" - proc-log "^4.0.0" "@npmcli/git" "^5.0.0" + glob "^10.2.2" hosted-git-info "^7.0.0" - normalize-package-data "^6.0.0" json-parse-even-better-errors "^3.0.0" + normalize-package-data "^6.0.0" + proc-log "^4.0.0" + semver "^7.5.3" "@npmcli/package-json@^6.0.0", "@npmcli/package-json@^6.0.1", "@npmcli/package-json@^6.2.0": version "6.2.0" @@ -3118,24 +3128,24 @@ resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-8.1.0.tgz" integrity sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg== dependencies: - which "^4.0.0" - node-gyp "^10.0.0" - proc-log "^4.0.0" "@npmcli/node-gyp" "^3.0.0" "@npmcli/package-json" "^5.0.0" "@npmcli/promise-spawn" "^7.0.0" + node-gyp "^10.0.0" + proc-log "^4.0.0" + which "^4.0.0" "@npmcli/run-script@^9.0.0", "@npmcli/run-script@^9.0.1", "@npmcli/run-script@^9.1.0": version "9.1.0" resolved "https://registry.npmjs.org/@npmcli/run-script/-/run-script-9.1.0.tgz" integrity sha512-aoNSbxtkePXUlbZB+anS1LqsJdctG5n3UVhfU47+CDdwMi6uNTBMF9gPcQRnqghQd2FGzcwwIFBruFMxjhBewg== dependencies: - which "^5.0.0" - node-gyp "^11.0.0" - proc-log "^5.0.0" "@npmcli/node-gyp" "^4.0.0" "@npmcli/package-json" "^6.0.0" "@npmcli/promise-spawn" "^8.0.0" + node-gyp "^11.0.0" + proc-log "^5.0.0" + which "^5.0.0" "@number-flow/react@^0.5.9": version "0.5.10" @@ -3155,13 +3165,13 @@ resolved "https://registry.npmjs.org/@octokit/core/-/core-7.0.3.tgz" integrity sha512-oNXsh2ywth5aowwIa7RKtawnkdH6LgU1ztfP9AIUCQCvzysB+WeU8o2kyyosDPwBZutPpjZDKPQGIzzrfTWweQ== dependencies: - "@octokit/types" "^14.0.0" + "@octokit/auth-token" "^6.0.0" "@octokit/graphql" "^9.0.1" "@octokit/request" "^10.0.2" + "@octokit/request-error" "^7.0.0" + "@octokit/types" "^14.0.0" before-after-hook "^4.0.0" - "@octokit/auth-token" "^6.0.0" universal-user-agent "^7.0.0" - "@octokit/request-error" "^7.0.0" "@octokit/endpoint@^11.0.0": version "11.0.0" @@ -3214,11 +3224,11 @@ resolved "https://registry.npmjs.org/@octokit/request/-/request-10.0.3.tgz" integrity sha512-V6jhKokg35vk098iBqp2FBKunk3kMTXlmq+PtbV9Gl3TfskWlebSofU9uunVKhUN7xl+0+i5vt0TGTG8/p/7HA== dependencies: - "@octokit/types" "^14.0.0" "@octokit/endpoint" "^11.0.0" - universal-user-agent "^7.0.2" "@octokit/request-error" "^7.0.0" + "@octokit/types" "^14.0.0" fast-content-type-parse "^3.0.0" + universal-user-agent "^7.0.2" "@octokit/request-error@^7.0.0": version "7.0.0" @@ -3234,7 +3244,7 @@ dependencies: "@octokit/openapi-types" "^25.1.0" -"@opentelemetry/api@1.9.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0", "@opentelemetry/api@>=1.4.0 <1.10.0", "@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.0.1", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.8", "@opentelemetry/api@^1.9": +"@opentelemetry/api@1.9.0", "@opentelemetry/api@>=1.0.0 <1.10.0", "@opentelemetry/api@>=1.3.0 <1.10.0", "@opentelemetry/api@>=1.4.0 <1.10.0", "@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.0.1", "@opentelemetry/api@^1.1.0", "@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.8", "@opentelemetry/api@^1.9": version "1.9.0" resolved "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz" integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg== @@ -3289,11 +3299,11 @@ resolved "https://registry.npmjs.org/@opentelemetry/exporter-logs-otlp-http/-/exporter-logs-otlp-http-0.52.1.tgz" integrity sha512-qKgywId2DbdowPZpOBXQKp0B8DfhfIArmSic15z13Nk/JAOccBUQdPwDjDnjsM5f0ckZFMVR2t/tijTUAqDZoA== dependencies: - "@opentelemetry/core" "1.25.1" "@opentelemetry/api-logs" "0.52.1" - "@opentelemetry/sdk-logs" "0.52.1" - "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/core" "1.25.1" "@opentelemetry/otlp-exporter-base" "0.52.1" + "@opentelemetry/otlp-transformer" "0.52.1" + "@opentelemetry/sdk-logs" "0.52.1" "@opentelemetry/exporter-trace-otlp-grpc@0.52.1": version "0.52.1" @@ -3302,10 +3312,10 @@ dependencies: "@grpc/grpc-js" "^1.7.1" "@opentelemetry/core" "1.25.1" + "@opentelemetry/otlp-grpc-exporter-base" "0.52.1" + "@opentelemetry/otlp-transformer" "0.52.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" - "@opentelemetry/otlp-transformer" "0.52.1" - "@opentelemetry/otlp-grpc-exporter-base" "0.52.1" "@opentelemetry/exporter-trace-otlp-http@0.52.1": version "0.52.1" @@ -3313,10 +3323,10 @@ integrity sha512-05HcNizx0BxcFKKnS5rwOV+2GevLTVIRA0tRgWYyw4yCgR53Ic/xk83toYKts7kbzcI+dswInUg/4s8oyA+tqg== dependencies: "@opentelemetry/core" "1.25.1" + "@opentelemetry/otlp-exporter-base" "0.52.1" + "@opentelemetry/otlp-transformer" "0.52.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" - "@opentelemetry/otlp-transformer" "0.52.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/exporter-trace-otlp-proto@0.52.1": version "0.52.1" @@ -3324,10 +3334,10 @@ integrity sha512-pt6uX0noTQReHXNeEslQv7x311/F1gJzMnp1HD2qgypLRPbXDeMzzeTngRTUaUbP6hqWNtPxuLr4DEoZG+TcEQ== dependencies: "@opentelemetry/core" "1.25.1" + "@opentelemetry/otlp-exporter-base" "0.52.1" + "@opentelemetry/otlp-transformer" "0.52.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" - "@opentelemetry/otlp-transformer" "0.52.1" - "@opentelemetry/otlp-exporter-base" "0.52.1" "@opentelemetry/exporter-zipkin@1.25.1": version "1.25.1" @@ -3354,36 +3364,36 @@ resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.52.1.tgz" integrity sha512-uXJbYU/5/MBHjMp1FqrILLRuiJCs3Ofk0MeRDk8g1S1gD47U8X3JnSwcMO1rtRo1x1a7zKaQHaoYu49p/4eSKw== dependencies: - semver "^7.5.2" - shimmer "^1.2.1" + "@opentelemetry/api-logs" "0.52.1" "@types/shimmer" "^1.0.2" import-in-the-middle "^1.8.1" require-in-the-middle "^7.1.1" - "@opentelemetry/api-logs" "0.52.1" + semver "^7.5.2" + shimmer "^1.2.1" "@opentelemetry/instrumentation@0.55.0", "@opentelemetry/instrumentation@^0.55": version "0.55.0" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.55.0.tgz" integrity sha512-YDCMlaQRZkziLL3t6TONRgmmGxDx6MyQDXRD0dknkkgUZtOK5+8MWft1OXzmNu6XfBOdT12MKN5rz+jHUkafKQ== dependencies: - semver "^7.5.2" - shimmer "^1.2.1" + "@opentelemetry/api-logs" "0.55.0" "@types/shimmer" "^1.2.0" import-in-the-middle "^1.8.1" require-in-the-middle "^7.1.1" - "@opentelemetry/api-logs" "0.55.0" + semver "^7.5.2" + shimmer "^1.2.1" "@opentelemetry/instrumentation@^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0": version "0.57.2" resolved "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz" integrity sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg== dependencies: - semver "^7.5.2" - shimmer "^1.2.1" + "@opentelemetry/api-logs" "0.57.2" "@types/shimmer" "^1.2.0" import-in-the-middle "^1.8.1" require-in-the-middle "^7.1.1" - "@opentelemetry/api-logs" "0.57.2" + semver "^7.5.2" + shimmer "^1.2.1" "@opentelemetry/instrumentation-grpc@^0.55": version "0.55.0" @@ -3408,21 +3418,21 @@ dependencies: "@grpc/grpc-js" "^1.7.1" "@opentelemetry/core" "1.25.1" - "@opentelemetry/otlp-transformer" "0.52.1" "@opentelemetry/otlp-exporter-base" "0.52.1" + "@opentelemetry/otlp-transformer" "0.52.1" "@opentelemetry/otlp-transformer@0.52.1": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/otlp-transformer/-/otlp-transformer-0.52.1.tgz" integrity sha512-I88uCZSZZtVa0XniRqQWKbjAUm73I8tpEy/uJYPPYw5d7BRdVk0RfTBQw8kSUl01oVWEuqxLDa802222MYyWHg== dependencies: - protobufjs "^7.3.0" - "@opentelemetry/core" "1.25.1" "@opentelemetry/api-logs" "0.52.1" - "@opentelemetry/sdk-logs" "0.52.1" + "@opentelemetry/core" "1.25.1" "@opentelemetry/resources" "1.25.1" + "@opentelemetry/sdk-logs" "0.52.1" "@opentelemetry/sdk-metrics" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" + protobufjs "^7.3.0" "@opentelemetry/propagator-b3@1.25.1": version "1.25.1" @@ -3473,8 +3483,8 @@ resolved "https://registry.npmjs.org/@opentelemetry/sdk-logs/-/sdk-logs-0.52.1.tgz" integrity sha512-MBYh+WcPPsN8YpRHRmK1Hsca9pVlyyKd4BxOC4SsgHACnl/bPp4Cri9hWhVm5+2tiQ9Zf4qSc1Jshw9tOLGWQA== dependencies: - "@opentelemetry/core" "1.25.1" "@opentelemetry/api-logs" "0.52.1" + "@opentelemetry/core" "1.25.1" "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-metrics@1.25.1": @@ -3482,28 +3492,28 @@ resolved "https://registry.npmjs.org/@opentelemetry/sdk-metrics/-/sdk-metrics-1.25.1.tgz" integrity sha512-9Mb7q5ioFL4E4dDrc4wC/A3NTHDat44v4I3p2pLPSxRvqUbDIQyMVr9uK+EU69+HWhlET1VaSrRzwdckWqY15Q== dependencies: - lodash.merge "^4.6.2" "@opentelemetry/core" "1.25.1" "@opentelemetry/resources" "1.25.1" + lodash.merge "^4.6.2" "@opentelemetry/sdk-node@0.52.1": version "0.52.1" resolved "https://registry.npmjs.org/@opentelemetry/sdk-node/-/sdk-node-0.52.1.tgz" integrity sha512-uEG+gtEr6eKd8CVWeKMhH2olcCHM9dEK68pe0qE0be32BcCRsvYURhHaD1Srngh1SQcnQzZ4TP324euxqtBOJA== dependencies: - "@opentelemetry/core" "1.25.1" "@opentelemetry/api-logs" "0.52.1" - "@opentelemetry/sdk-logs" "0.52.1" + "@opentelemetry/core" "1.25.1" + "@opentelemetry/exporter-trace-otlp-grpc" "0.52.1" + "@opentelemetry/exporter-trace-otlp-http" "0.52.1" + "@opentelemetry/exporter-trace-otlp-proto" "0.52.1" + "@opentelemetry/exporter-zipkin" "1.25.1" + "@opentelemetry/instrumentation" "0.52.1" "@opentelemetry/resources" "1.25.1" + "@opentelemetry/sdk-logs" "0.52.1" "@opentelemetry/sdk-metrics" "1.25.1" "@opentelemetry/sdk-trace-base" "1.25.1" "@opentelemetry/sdk-trace-node" "1.25.1" - "@opentelemetry/exporter-zipkin" "1.25.1" - "@opentelemetry/instrumentation" "0.52.1" "@opentelemetry/semantic-conventions" "1.25.1" - "@opentelemetry/exporter-trace-otlp-grpc" "0.52.1" - "@opentelemetry/exporter-trace-otlp-http" "0.52.1" - "@opentelemetry/exporter-trace-otlp-proto" "0.52.1" "@opentelemetry/sdk-trace-base@1.25.1": version "1.25.1" @@ -3528,24 +3538,24 @@ resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.25.1.tgz" integrity sha512-nMcjFIKxnFqoez4gUmihdBrbpsEnAX/Xj16sGvZm+guceYE0NE00vLhpDVK6f3q8Q4VFI5xG8JjlXKMB/SkTTQ== dependencies: - semver "^7.5.2" + "@opentelemetry/context-async-hooks" "1.25.1" "@opentelemetry/core" "1.25.1" "@opentelemetry/propagator-b3" "1.25.1" - "@opentelemetry/sdk-trace-base" "1.25.1" "@opentelemetry/propagator-jaeger" "1.25.1" - "@opentelemetry/context-async-hooks" "1.25.1" + "@opentelemetry/sdk-trace-base" "1.25.1" + semver "^7.5.2" "@opentelemetry/sdk-trace-node@^1.28": version "1.30.1" resolved "https://registry.npmjs.org/@opentelemetry/sdk-trace-node/-/sdk-trace-node-1.30.1.tgz" integrity sha512-cBjYOINt1JxXdpw1e5MlHmFRc5fgj4GW/86vsKFxJCJ8AL4PdVtYH41gWwl4qd4uQjqEL1oJVrXkSy5cnduAnQ== dependencies: - semver "^7.5.2" + "@opentelemetry/context-async-hooks" "1.30.1" "@opentelemetry/core" "1.30.1" "@opentelemetry/propagator-b3" "1.30.1" - "@opentelemetry/sdk-trace-base" "1.30.1" "@opentelemetry/propagator-jaeger" "1.30.1" - "@opentelemetry/context-async-hooks" "1.30.1" + "@opentelemetry/sdk-trace-base" "1.30.1" + semver "^7.5.2" "@opentelemetry/semantic-conventions@1.25.1": version "1.25.1" @@ -3566,25 +3576,25 @@ version "2.5.1" resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz" integrity sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== + optionalDependencies: + "@parcel/watcher-android-arm64" "2.5.1" + "@parcel/watcher-darwin-arm64" "2.5.1" + "@parcel/watcher-darwin-x64" "2.5.1" + "@parcel/watcher-freebsd-x64" "2.5.1" + "@parcel/watcher-linux-arm-glibc" "2.5.1" + "@parcel/watcher-linux-arm-musl" "2.5.1" + "@parcel/watcher-linux-arm64-glibc" "2.5.1" + "@parcel/watcher-linux-arm64-musl" "2.5.1" + "@parcel/watcher-linux-x64-glibc" "2.5.1" + "@parcel/watcher-linux-x64-musl" "2.5.1" + "@parcel/watcher-win32-arm64" "2.5.1" + "@parcel/watcher-win32-ia32" "2.5.1" + "@parcel/watcher-win32-x64" "2.5.1" dependencies: detect-libc "^1.0.3" is-glob "^4.0.3" micromatch "^4.0.5" node-addon-api "^7.0.0" - optionalDependencies: - "@parcel/watcher-darwin-x64" "2.5.1" - "@parcel/watcher-darwin-arm64" "2.5.1" - "@parcel/watcher-win32-x64" "2.5.1" - "@parcel/watcher-win32-arm64" "2.5.1" - "@parcel/watcher-win32-ia32" "2.5.1" - "@parcel/watcher-linux-x64-glibc" "2.5.1" - "@parcel/watcher-linux-x64-musl" "2.5.1" - "@parcel/watcher-linux-arm64-glibc" "2.5.1" - "@parcel/watcher-linux-arm64-musl" "2.5.1" - "@parcel/watcher-linux-arm-glibc" "2.5.1" - "@parcel/watcher-linux-arm-musl" "2.5.1" - "@parcel/watcher-android-arm64" "2.5.1" - "@parcel/watcher-freebsd-x64" "2.5.1" "@parcel/watcher-android-arm64@2.5.1": version "2.5.1" @@ -3709,19 +3719,19 @@ resolved "https://registry.npmjs.org/@playwright/experimental-ct-core/-/experimental-ct-core-1.54.1.tgz" integrity sha512-iwFdf95m9RCze47jv4hVbg3tDtsh3GFU1StiLludrPStHlZOtDj9/0GImTKrRmXHQCDcQRmQ9HZfJuGGxlWM3g== dependencies: - vite "^6.3.4" playwright "1.54.1" playwright-core "1.54.1" + vite "^6.3.4" "@playwright/experimental-ct-react@^1.53.1": version "1.54.1" resolved "https://registry.npmjs.org/@playwright/experimental-ct-react/-/experimental-ct-react-1.54.1.tgz" integrity sha512-hqa/JhMK3qUqwqx8jm0/RJ3lbpGojA3f7UBhp3clFy8hnzMVu0SDba3JemWikS+JhiqYHjxL6Bn6dGxyikCImA== dependencies: - "@vitejs/plugin-react" "^4.2.1" "@playwright/experimental-ct-core" "1.54.1" + "@vitejs/plugin-react" "^4.2.1" -"@playwright/test@^1.53.1": +"@playwright/test@^1.51.1", "@playwright/test@^1.53.1": version "1.54.1" resolved "https://registry.npmjs.org/@playwright/test/-/test-1.54.1.tgz" integrity sha512-FS8hQ12acieG2dYSksmLOF7BNxnVf2afRJdCuM1eMSxj6QTSE6G4InGF7oApGgDb65MX7AwMVlIkpru0yZA4Xw== @@ -3745,9 +3755,9 @@ resolved "https://registry.npmjs.org/@pnpm/npm-conf/-/npm-conf-2.3.1.tgz" integrity sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw== dependencies: - config-chain "^1.1.11" - "@pnpm/network.ca-file" "^1.0.1" "@pnpm/config.env-replace" "^1.1.0" + "@pnpm/network.ca-file" "^1.0.1" + config-chain "^1.1.11" "@polka/url@^1.0.0-next.24": version "1.0.0-next.29" @@ -3764,8 +3774,8 @@ resolved "https://registry.npmjs.org/@prisma/adapter-pg/-/adapter-pg-6.10.1.tgz" integrity sha512-4Kpz5EV1jEOsKDuKYMjfJKMiIIcsuR9Ou1B8zLzehYtB7/oi+1ooDoK1K+T7sMisHkP69aYat5j0dskxvJTgdQ== dependencies: - postgres-array "3.0.4" "@prisma/driver-adapter-utils" "6.10.1" + postgres-array "3.0.4" "@prisma/client@6.9.0": version "6.9.0" @@ -3802,9 +3812,9 @@ integrity sha512-4BRZZUaAuB4p0XhTauxelvFs7IllhPmNLvmla0bO1nkECs8n/o1pUvAVbQ/VOrZR5DnF4HED0PrGai+rIOVePA== dependencies: "@prisma/debug" "6.12.0" + "@prisma/engines-version" "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc" "@prisma/fetch-engine" "6.12.0" "@prisma/get-platform" "6.12.0" - "@prisma/engines-version" "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc" "@prisma/engines-version@6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc": version "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc" @@ -3817,8 +3827,8 @@ integrity sha512-EamoiwrK46rpWaEbLX9aqKDPOd8IyLnZAkiYXFNuq0YsU0Z8K09/rH8S7feOWAVJ3xzeSgcEJtBlVDrajM9Sag== dependencies: "@prisma/debug" "6.12.0" - "@prisma/get-platform" "6.12.0" "@prisma/engines-version" "6.12.0-15.8047c96bbd92db98a2abc7c9323ce77c02c89dbc" + "@prisma/get-platform" "6.12.0" "@prisma/get-platform@6.12.0": version "6.12.0" @@ -3892,22 +3902,22 @@ resolved "https://registry.npmjs.org/@pulumi/aws/-/aws-6.83.0.tgz" integrity sha512-uYpYSA5aaDERFuxy3D+FDWiwH7YYNHSwGLpHVuARAzBfQ/SQDkS/tfJI5NNo7/+KCmje3rloKE2enUK/Q9bVBg== dependencies: - mime "^2.0.0" "@pulumi/pulumi" "^3.142.0" + mime "^2.0.0" "@pulumi/awsx@^2.22.0": version "2.22.0" resolved "https://registry.npmjs.org/@pulumi/awsx/-/awsx-2.22.0.tgz" integrity sha512-uajrWX6zkk8G9DCCkCkRaH2yzeGRkCElkC8FOE9viUtb9WyVt01EbNqJkje+QwYq4g055jWqcq2YRn7xT1Y44w== dependencies: - mime "^2.0.0" + "@aws-sdk/client-ecs" "^3.405.0" "@pulumi/aws" "^6.66.3" "@pulumi/docker" "^4.6.0" + "@pulumi/docker-build" "^0.0.8" "@pulumi/pulumi" "^3.142.0" - docker-classic "npm:@pulumi/docker@3.6.1" "@types/aws-lambda" "^8.10.23" - "@aws-sdk/client-ecs" "^3.405.0" - "@pulumi/docker-build" "^0.0.8" + docker-classic "npm:@pulumi/docker@3.6.1" + mime "^2.0.0" "@pulumi/command@^1.1.0": version "1.1.0" @@ -3921,16 +3931,16 @@ resolved "https://registry.npmjs.org/@pulumi/docker/-/docker-3.6.1.tgz" integrity sha512-BZME50QkT556v+LvmTXPT8ssB2xxNkp9+msB5xYFEnUnWcdGAx5yUysQw70RJCb+U0GbkJSbxtlgMJgOQf/now== dependencies: - semver "^5.4.0" "@pulumi/pulumi" "^3.0.0" + semver "^5.4.0" "@pulumi/docker@^4.6.0": version "4.8.0" resolved "https://registry.npmjs.org/@pulumi/docker/-/docker-4.8.0.tgz" integrity sha512-R1jDAokbz71VbljF6TJ4yNA4Tp1Gd+ISgIQmrcsUf/gNCP1hoA7putyTIta5q0zzy83aPeeeySYwx54iOfHrvQ== dependencies: - semver "^5.4.0" "@pulumi/pulumi" "^3.142.0" + semver "^5.4.0" "@pulumi/docker-build@^0.0.8": version "0.0.8" @@ -3951,34 +3961,34 @@ resolved "https://registry.npmjs.org/@pulumi/pulumi/-/pulumi-3.185.0.tgz" integrity sha512-J8Ha8EDxw503hMmVu1i+qd7atQRJkB6VD0En5ibUgm+B4453AfWclGTHoFcz/QLCneYRQhH+SUS2zy1+sqggdw== dependencies: - got "^11.8.6" - ini "^2.0.0" - tmp "^0.2.1" - fdir "^6.1.1" - execa "^5.1.0" - upath "^1.1.0" - semver "^7.5.2" - js-yaml "^3.14.0" - pkg-dir "^7.0.0" - minimist "^1.2.6" - picomatch "^3.0.1" - "@types/tmp" "^0.2.6" "@grpc/grpc-js" "^1.10.1" - "@types/semver" "^7.5.6" - google-protobuf "^3.5.0" - "@npmcli/arborist" "^7.3.1" "@logdna/tail-file" "^2.0.6" + "@npmcli/arborist" "^7.3.1" "@opentelemetry/api" "^1.9" - source-map-support "^0.5.6" - require-from-string "^2.0.1" - "@types/google-protobuf" "^3.15.5" - normalize-package-data "^6.0.0" - "@opentelemetry/resources" "^1.28" - "@opentelemetry/sdk-trace-base" "^1.28" - "@opentelemetry/sdk-trace-node" "^1.28" "@opentelemetry/exporter-zipkin" "^1.28" "@opentelemetry/instrumentation" "^0.55" "@opentelemetry/instrumentation-grpc" "^0.55" + "@opentelemetry/resources" "^1.28" + "@opentelemetry/sdk-trace-base" "^1.28" + "@opentelemetry/sdk-trace-node" "^1.28" + "@types/google-protobuf" "^3.15.5" + "@types/semver" "^7.5.6" + "@types/tmp" "^0.2.6" + execa "^5.1.0" + fdir "^6.1.1" + google-protobuf "^3.5.0" + got "^11.8.6" + ini "^2.0.0" + js-yaml "^3.14.0" + minimist "^1.2.6" + normalize-package-data "^6.0.0" + picomatch "^3.0.1" + pkg-dir "^7.0.0" + require-from-string "^2.0.1" + semver "^7.5.2" + source-map-support "^0.5.6" + tmp "^0.2.1" + upath "^1.1.0" "@pulumi/random@^4.18.2": version "4.18.2" @@ -4003,9 +4013,9 @@ extract-zip "^2.0.1" progress "^2.0.3" proxy-agent "^6.5.0" + semver "^7.7.2" tar-fs "^3.1.0" yargs "^17.7.2" - semver "^7.7.2" "@radix-ui/number@1.1.1": version "1.1.1" @@ -4022,14 +4032,14 @@ resolved "https://registry.npmjs.org/@radix-ui/react-accordion/-/react-accordion-1.2.11.tgz" integrity sha512-l3W5D54emV2ues7jjeG1xcyN7S3jnK3zE2zHqgn0CmMsy9lNJwmgcrmaxS+7ipw15FAivzKNzH3d5EcGoFKw0A== dependencies: - "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-collapsible" "1.1.11" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" "@radix-ui/react-direction" "1.1.1" + "@radix-ui/react-id" "1.1.1" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-collection" "1.1.7" - "@radix-ui/react-collapsible" "1.1.11" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-alert-dialog@1.1.14": @@ -4038,11 +4048,11 @@ integrity sha512-IOZfZ3nPvN6lXpJTBCunFQPRSvK8MDgSc1FB85xnIpUKOw9en0dJj8JmCAxV7BiZdtYlUpmrQjoTFkVYtdoWzQ== dependencies: "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-slot" "1.2.3" - "@radix-ui/react-dialog" "1.1.14" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-dialog" "1.1.14" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-arrow@1.1.7": version "1.1.7" @@ -4068,27 +4078,27 @@ integrity sha512-yd+dI56KZqawxKZrJ31eENUwqc1QSqg4OZ15rybGjF2ZNwMO+wCyHzAVLRp9qoYJf7kYy0YpZ2b0JCzJ42HZpA== dependencies: "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" "@radix-ui/react-presence" "1.1.4" - "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-use-previous" "1.1.1" "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-use-previous" "1.1.1" + "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-collapsible@1.1.11": version "1.1.11" resolved "https://registry.npmjs.org/@radix-ui/react-collapsible/-/react-collapsible-1.1.11.tgz" integrity sha512-2qrRsVGSCYasSz1RFOorXwl0H7g7J1frQtgpQgYrt+MOidtPAINHn9CPovQXb83r8ahapdx3Tu0fa/pdFFSdPg== dependencies: - "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-id" "1.1.1" "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-use-layout-effect" "1.1.1" "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-use-layout-effect" "1.1.1" "@radix-ui/react-collection@1.1.7": version "1.1.7" @@ -4116,8 +4126,8 @@ integrity sha512-UsQUMjcYTsBjTSXw0P3GO0werEQvUY2plgRQuKoCTtkNr45q1DiL51j4m7gxhABzZ0BadoXNsIbg7F3KwiUBbw== dependencies: "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-menu" "2.1.15" "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-menu" "2.1.15" "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-use-callback-ref" "1.1.1" "@radix-ui/react-use-controllable-state" "1.2.2" @@ -4127,20 +4137,20 @@ resolved "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.14.tgz" integrity sha512-+CpweKjqpzTmwRwcYECQcNYbI8V9VSQt0SNFKeEBLgfucbsLssU6Ppq7wUdNXEGb573bMjFhVjKVll8rmV6zMw== dependencies: - aria-hidden "^1.2.4" - "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" - react-remove-scroll "^2.6.3" - "@radix-ui/react-slot" "1.2.3" - "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-focus-guards" "1.1.2" + "@radix-ui/react-focus-scope" "1.1.7" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-portal" "1.1.9" "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-focus-scope" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-focus-guards" "1.1.2" - "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-use-controllable-state" "1.2.2" + aria-hidden "^1.2.4" + react-remove-scroll "^2.6.3" "@radix-ui/react-direction@1.1.1": version "1.1.1" @@ -4163,12 +4173,12 @@ resolved "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.1.15.tgz" integrity sha512-mIBnOjgwo9AH3FyKaSWoSu/dYj6VdhJ7frEPiGTeXCdUFHjl9h3mFh2wwhEtINOmYXWhdpf1rY2minFsmaNgVQ== dependencies: - "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-menu" "2.1.15" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-menu" "2.1.15" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-focus-guards@1.1.2": @@ -4191,13 +4201,13 @@ integrity sha512-CPYZ24Mhirm+g6D8jArmLzjYu4Eyg3TTUHswR26QgzXBHBe64BO/RHOJKzmF/Dxb4y4f9PKyJdwm/O/AhNkb+Q== dependencies: "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.10" "@radix-ui/react-popper" "1.2.7" "@radix-ui/react-portal" "1.1.9" - "@radix-ui/react-context" "1.1.2" "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-dismissable-layer" "1.1.10" "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-icons@^1.3.0": @@ -4224,8 +4234,6 @@ resolved "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.1.15.tgz" integrity sha512-tVlmA3Vb9n8SZSd+YSbuFR66l87Wiy4du+YE+0hzKQEANA+7cWKH1WgqcEX4pXqxUFQKrWQGHdvEfw00TjFiew== dependencies: - aria-hidden "^1.2.4" - react-remove-scroll "^2.6.3" "@radix-ui/primitive" "1.1.2" "@radix-ui/react-collection" "1.1.7" "@radix-ui/react-compose-refs" "1.1.2" @@ -4233,56 +4241,58 @@ "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-dismissable-layer" "1.1.10" "@radix-ui/react-focus-guards" "1.1.2" - "@radix-ui/react-popper" "1.2.7" - "@radix-ui/react-id" "1.1.1" "@radix-ui/react-focus-scope" "1.1.7" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-popper" "1.2.7" "@radix-ui/react-portal" "1.1.9" "@radix-ui/react-presence" "1.1.4" - "@radix-ui/react-roving-focus" "1.1.10" "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-roving-focus" "1.1.10" "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-use-callback-ref" "1.1.1" + aria-hidden "^1.2.4" + react-remove-scroll "^2.6.3" "@radix-ui/react-navigation-menu@1.2.13": version "1.2.13" resolved "https://registry.npmjs.org/@radix-ui/react-navigation-menu/-/react-navigation-menu-1.2.13.tgz" integrity sha512-WG8wWfDiJlSF5hELjwfjSGOXcBR/ZMhBFCGYe8vERpC39CQYZeq1PQ2kaYHdye3V95d06H89KGMsVCIE4LWo3g== dependencies: - "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-direction" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-collection" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-use-previous" "1.1.1" - "@radix-ui/react-visually-hidden" "1.2.3" "@radix-ui/react-use-callback-ref" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.10" - "@radix-ui/react-use-layout-effect" "1.1.1" "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-use-previous" "1.1.1" + "@radix-ui/react-visually-hidden" "1.2.3" "@radix-ui/react-popover@1.1.14": version "1.1.14" resolved "https://registry.npmjs.org/@radix-ui/react-popover/-/react-popover-1.1.14.tgz" integrity sha512-ODz16+1iIbGUfFEfKx2HTPKizg2MN39uIOV8MXeHnmdd3i/N9Wt7vU46wbHsqA0xoaQyXVcs0KIlBdOA2Y95bw== dependencies: - aria-hidden "^1.2.4" - "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" - react-remove-scroll "^2.6.3" - "@radix-ui/react-slot" "1.2.3" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-focus-guards" "1.1.2" + "@radix-ui/react-focus-scope" "1.1.7" + "@radix-ui/react-id" "1.1.1" "@radix-ui/react-popper" "1.2.7" "@radix-ui/react-portal" "1.1.9" - "@radix-ui/react-context" "1.1.2" "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-focus-scope" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-focus-guards" "1.1.2" - "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-use-controllable-state" "1.2.2" + aria-hidden "^1.2.4" + react-remove-scroll "^2.6.3" "@radix-ui/react-popper@1.2.7": version "1.2.7" @@ -4291,13 +4301,13 @@ dependencies: "@floating-ui/react-dom" "^2.0.0" "@radix-ui/react-arrow" "1.1.7" - "@radix-ui/react-context" "1.1.2" "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-use-callback-ref" "1.1.1" "@radix-ui/react-use-layout-effect" "1.1.1" - "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-use-rect" "1.1.1" + "@radix-ui/react-use-size" "1.1.1" "@radix-ui/rect" "1.1.1" "@radix-ui/react-portal@1.1.9": @@ -4337,15 +4347,15 @@ integrity sha512-9w5XhD0KPOrm92OTTE0SysH3sYzHsSTHNvZgUBo/VZ80VdYyB5RneDbc0dKpURS24IxkoFRu/hI0i4XyfFwY6g== dependencies: "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-presence" "1.1.4" - "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-direction" "1.1.1" + "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-roving-focus" "1.1.10" - "@radix-ui/react-use-previous" "1.1.1" "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-use-previous" "1.1.1" + "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-roving-focus@1.1.10": version "1.1.10" @@ -4354,10 +4364,10 @@ dependencies: "@radix-ui/primitive" "1.1.2" "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-id" "1.1.1" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-use-callback-ref" "1.1.1" "@radix-ui/react-use-controllable-state" "1.2.2" @@ -4369,11 +4379,11 @@ dependencies: "@radix-ui/number" "1.1.1" "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-direction" "1.1.1" + "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-use-callback-ref" "1.1.1" "@radix-ui/react-use-layout-effect" "1.1.1" @@ -4382,27 +4392,27 @@ resolved "https://registry.npmjs.org/@radix-ui/react-select/-/react-select-2.2.5.tgz" integrity sha512-HnMTdXEVuuyzx63ME0ut4+sEMYW6oouHWNGUZc7ddvUWIcfCva/AMoqEW/3wnEllriMWBa0RHspCYnfCWJQYmA== dependencies: - aria-hidden "^1.2.4" "@radix-ui/number" "1.1.1" - "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" - react-remove-scroll "^2.6.3" - "@radix-ui/react-slot" "1.2.3" - "@radix-ui/react-popper" "1.2.7" - "@radix-ui/react-portal" "1.1.9" - "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-direction" "1.1.1" - "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-collection" "1.1.7" - "@radix-ui/react-focus-scope" "1.1.7" "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-direction" "1.1.1" + "@radix-ui/react-dismissable-layer" "1.1.10" "@radix-ui/react-focus-guards" "1.1.2" - "@radix-ui/react-use-previous" "1.1.1" - "@radix-ui/react-visually-hidden" "1.2.3" + "@radix-ui/react-focus-scope" "1.1.7" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-popper" "1.2.7" + "@radix-ui/react-portal" "1.1.9" + "@radix-ui/react-primitive" "2.1.3" + "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-use-callback-ref" "1.1.1" - "@radix-ui/react-dismissable-layer" "1.1.10" - "@radix-ui/react-use-layout-effect" "1.1.1" "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-use-previous" "1.1.1" + "@radix-ui/react-visually-hidden" "1.2.3" + aria-hidden "^1.2.4" + react-remove-scroll "^2.6.3" "@radix-ui/react-separator@1.1.7": version "1.1.7" @@ -4418,15 +4428,15 @@ dependencies: "@radix-ui/number" "1.1.1" "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-collection" "1.1.7" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-collection" "1.1.7" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-use-previous" "1.1.1" - "@radix-ui/react-use-layout-effect" "1.1.1" "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-use-layout-effect" "1.1.1" + "@radix-ui/react-use-previous" "1.1.1" + "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-slot@1.2.3", "@radix-ui/react-slot@^1.0.2": version "1.2.3" @@ -4441,23 +4451,23 @@ integrity sha512-5ijLkak6ZMylXsaImpZ8u4Rlf5grRmoc0p0QeX9VJtlrM4f5m3nCTX8tWga/zOA8PZYIR/t0p2Mnvd7InrJ6yQ== dependencies: "@radix-ui/primitive" "1.1.2" + "@radix-ui/react-compose-refs" "1.1.2" "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-use-previous" "1.1.1" "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-use-previous" "1.1.1" + "@radix-ui/react-use-size" "1.1.1" "@radix-ui/react-tabs@1.1.12": version "1.1.12" resolved "https://registry.npmjs.org/@radix-ui/react-tabs/-/react-tabs-1.1.12.tgz" integrity sha512-GTVAlRVrQrSw3cEARM0nAx73ixrWDPNZAruETn3oHCNP6SbZ/hNxdxp+u7VkIEv3/sFoLq1PfcHrl7Pnp0CDpw== dependencies: - "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" "@radix-ui/react-context" "1.1.2" - "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-direction" "1.1.1" + "@radix-ui/react-id" "1.1.1" + "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-roving-focus" "1.1.10" "@radix-ui/react-use-controllable-state" "1.2.2" @@ -4495,11 +4505,11 @@ integrity sha512-kiU694Km3WFLTC75DdqgM/3Jauf3rD9wxeS9XtyWFKsBUeZA337lC+6uUazT7I1DhanZ5gyD5Stf8uf2dbQxOQ== dependencies: "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-toggle" "1.1.9" "@radix-ui/react-context" "1.1.2" "@radix-ui/react-direction" "1.1.1" "@radix-ui/react-primitive" "2.1.3" "@radix-ui/react-roving-focus" "1.1.10" + "@radix-ui/react-toggle" "1.1.9" "@radix-ui/react-use-controllable-state" "1.2.2" "@radix-ui/react-tooltip@1.2.7", "@radix-ui/react-tooltip@npm:@radix-ui/react-tooltip@^1.0.0": @@ -4507,18 +4517,18 @@ resolved "https://registry.npmjs.org/@radix-ui/react-tooltip/-/react-tooltip-1.2.7.tgz" integrity sha512-Ap+fNYwKTYJ9pzqW+Xe2HtMRbQ/EeWkj2qykZ6SuEV4iS/o1bZI5ssJbk4D2r8XuDuOBVz/tIx2JObtuqU+5Zw== dependencies: - "@radix-ui/react-id" "1.1.1" "@radix-ui/primitive" "1.1.2" - "@radix-ui/react-slot" "1.2.3" + "@radix-ui/react-compose-refs" "1.1.2" + "@radix-ui/react-context" "1.1.2" + "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-id" "1.1.1" "@radix-ui/react-popper" "1.2.7" "@radix-ui/react-portal" "1.1.9" - "@radix-ui/react-context" "1.1.2" "@radix-ui/react-presence" "1.1.4" "@radix-ui/react-primitive" "2.1.3" - "@radix-ui/react-compose-refs" "1.1.2" - "@radix-ui/react-visually-hidden" "1.2.3" - "@radix-ui/react-dismissable-layer" "1.1.10" + "@radix-ui/react-slot" "1.2.3" "@radix-ui/react-use-controllable-state" "1.2.2" + "@radix-ui/react-visually-hidden" "1.2.3" "@radix-ui/react-use-callback-ref@1.1.1": version "1.1.1" @@ -4637,26 +4647,26 @@ resolved "https://registry.npmjs.org/@react-email/components/-/components-0.0.41.tgz" integrity sha512-WUI3wHwra3QS0pwrovSU6b0I0f3TvY33ph0y44LuhSYDSQlMRyeOzgoT6HRDY5FXMDF57cHYq9WoKwpwP0yd7Q== dependencies: - "@react-email/hr" "0.0.11" - "@react-email/img" "0.0.11" - "@react-email/row" "0.0.12" "@react-email/body" "0.0.11" + "@react-email/button" "0.0.19" + "@react-email/code-block" "0.0.13" + "@react-email/code-inline" "0.0.5" + "@react-email/column" "0.0.13" + "@react-email/container" "0.0.15" "@react-email/font" "0.0.9" "@react-email/head" "0.0.12" + "@react-email/heading" "0.0.15" + "@react-email/hr" "0.0.11" "@react-email/html" "0.0.11" + "@react-email/img" "0.0.11" "@react-email/link" "0.0.12" - "@react-email/text" "0.1.4" - "@react-email/button" "0.0.19" - "@react-email/column" "0.0.13" - "@react-email/render" "1.1.2" - "@react-email/heading" "0.0.15" + "@react-email/markdown" "0.0.15" "@react-email/preview" "0.0.13" + "@react-email/render" "1.1.2" + "@react-email/row" "0.0.12" "@react-email/section" "0.0.16" - "@react-email/markdown" "0.0.15" "@react-email/tailwind" "1.0.5" - "@react-email/container" "0.0.15" - "@react-email/code-block" "0.0.13" - "@react-email/code-inline" "0.0.5" + "@react-email/text" "0.1.4" "@react-email/container@0.0.15": version "0.0.15" @@ -4715,8 +4725,8 @@ resolved "https://registry.npmjs.org/@react-email/render/-/render-1.1.2.tgz" integrity sha512-RnRehYN3v9gVlNMehHPHhyp2RQo7+pSkHDtXPvg3s0GbzM9SQMW4Qrf8GRNvtpLC4gsI+Wt0VatNRUFqjvevbw== dependencies: - prettier "^3.5.3" html-to-text "^9.0.5" + prettier "^3.5.3" react-promise-suspense "^0.3.4" "@react-email/render@^1.1.2": @@ -4932,8 +4942,8 @@ resolved "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz" integrity sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg== dependencies: - lodash "^4.17.21" fast-deep-equal "^3.1.3" + lodash "^4.17.21" "@sapphire/snowflake@3.5.3", "@sapphire/snowflake@^3.5.3": version "3.5.3" @@ -5011,41 +5021,41 @@ resolved "https://registry.npmjs.org/@semantic-release/github/-/github-11.0.3.tgz" integrity sha512-T2fKUyFkHHkUNa5XNmcsEcDPuG23hwBKptfUVcFXDVG2cSjXXZYDOfVYwfouqbWo/8UefotLaoGfQeK+k3ep6A== dependencies: - mime "^4.0.0" - debug "^4.3.4" - globby "^14.0.0" - dir-glob "^3.0.1" - p-filter "^4.0.0" - url-join "^5.0.0" - lodash-es "^4.17.21" - issue-parser "^7.0.0" "@octokit/core" "^7.0.0" + "@octokit/plugin-paginate-rest" "^13.0.0" + "@octokit/plugin-retry" "^8.0.0" + "@octokit/plugin-throttling" "^11.0.0" + "@semantic-release/error" "^4.0.0" aggregate-error "^5.0.0" + debug "^4.3.4" + dir-glob "^3.0.1" + globby "^14.0.0" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.0" - "@octokit/plugin-retry" "^8.0.0" - "@semantic-release/error" "^4.0.0" - "@octokit/plugin-throttling" "^11.0.0" - "@octokit/plugin-paginate-rest" "^13.0.0" + issue-parser "^7.0.0" + lodash-es "^4.17.21" + mime "^4.0.0" + p-filter "^4.0.0" + url-join "^5.0.0" "@semantic-release/npm@^12.0.1", "@semantic-release/npm@^12.0.2": version "12.0.2" resolved "https://registry.npmjs.org/@semantic-release/npm/-/npm-12.0.2.tgz" integrity sha512-+M9/Lb35IgnlUO6OSJ40Ie+hUsZLuph2fqXC/qrKn0fMvUU/jiCjpoL6zEm69vzcmaZJ8yNKtMBEKHWN49WBbQ== dependencies: - rc "^1.2.8" - npm "^10.9.3" + "@semantic-release/error" "^4.0.0" + aggregate-error "^5.0.0" execa "^9.0.0" - tempy "^3.0.0" - semver "^7.1.2" fs-extra "^11.0.0" - read-pkg "^9.0.0" lodash-es "^4.17.21" nerf-dart "^1.0.0" normalize-url "^8.0.0" - aggregate-error "^5.0.0" + npm "^10.9.3" + rc "^1.2.8" + read-pkg "^9.0.0" registry-auth-token "^5.0.0" - "@semantic-release/error" "^4.0.0" + semver "^7.1.2" + tempy "^3.0.0" "@semantic-release/release-notes-generator@^14.0.0-beta.1", "@semantic-release/release-notes-generator@^14.0.3": version "14.0.3" @@ -5102,12 +5112,12 @@ resolved "https://registry.npmjs.org/@sigstore/sign/-/sign-2.3.2.tgz" integrity sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA== dependencies: - proc-log "^4.2.0" - promise-retry "^2.0.1" - "@sigstore/core" "^1.0.0" "@sigstore/bundle" "^2.3.2" - make-fetch-happen "^13.0.1" + "@sigstore/core" "^1.0.0" "@sigstore/protobuf-specs" "^0.3.2" + make-fetch-happen "^13.0.1" + proc-log "^4.2.0" + promise-retry "^2.0.1" "@sigstore/sign@^3.1.0": version "3.1.0" @@ -5126,8 +5136,8 @@ resolved "https://registry.npmjs.org/@sigstore/tuf/-/tuf-2.3.4.tgz" integrity sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw== dependencies: - tuf-js "^2.2.1" "@sigstore/protobuf-specs" "^0.3.2" + tuf-js "^2.2.1" "@sigstore/tuf@^3.1.0", "@sigstore/tuf@^3.1.1": version "3.1.1" @@ -5142,8 +5152,8 @@ resolved "https://registry.npmjs.org/@sigstore/verify/-/verify-1.2.1.tgz" integrity sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g== dependencies: - "@sigstore/core" "^1.1.0" "@sigstore/bundle" "^2.3.2" + "@sigstore/core" "^1.1.0" "@sigstore/protobuf-specs" "^0.3.2" "@sigstore/verify@^2.1.0": @@ -5151,9 +5161,9 @@ resolved "https://registry.npmjs.org/@sigstore/verify/-/verify-2.1.1.tgz" integrity sha512-hVJD77oT67aowHxwT4+M6PGOp+E2LtLdTK3+FC0lBO9T7sYwItDMXZ7Z07IDCvR1M717a4axbIWckrW67KMP/w== dependencies: - "@sigstore/protobuf-specs" "^0.4.1" "@sigstore/bundle" "^3.1.0" "@sigstore/core" "^2.0.0" + "@sigstore/protobuf-specs" "^0.4.1" "@simplewebauthn/browser@^13.0.0": version "13.1.2" @@ -5193,20 +5203,20 @@ resolved "https://registry.npmjs.org/@slack/bolt/-/bolt-3.22.0.tgz" integrity sha512-iKDqGPEJDnrVwxSVlFW6OKTkijd7s4qLBeSufoBsTM0reTyfdp/5izIQVkxNfzjHi3o6qjdYbRXkYad5HBsBog== dependencies: - axios "^1.7.4" - tsscmp "^1.0.6" - express "^4.21.0" - raw-body "^2.3.3" + "@slack/logger" "^4.0.0" "@slack/oauth" "^2.6.3" + "@slack/socket-mode" "^1.3.6" "@slack/types" "^2.13.0" - "@slack/logger" "^4.0.0" - "@types/tsscmp" "^1.0.0" "@slack/web-api" "^6.13.0" "@types/express" "^4.16.1" + "@types/promise.allsettled" "^1.0.3" + "@types/tsscmp" "^1.0.0" + axios "^1.7.4" + express "^4.21.0" path-to-regexp "^8.1.0" - "@slack/socket-mode" "^1.3.6" promise.allsettled "^1.0.2" - "@types/promise.allsettled" "^1.0.3" + raw-body "^2.3.3" + tsscmp "^1.0.6" "@slack/logger@^3.0.0": version "3.0.0" @@ -5227,25 +5237,25 @@ resolved "https://registry.npmjs.org/@slack/oauth/-/oauth-2.6.3.tgz" integrity sha512-1amXs6xRkJpoH6zSgjVPgGEJXCibKNff9WNDijcejIuVy1HFAl1adh7lehaGNiHhTWfQkfKxBiF+BGn56kvoFw== dependencies: - "@types/node" ">=12" - jsonwebtoken "^9.0.0" "@slack/logger" "^3.0.0" "@slack/web-api" "^6.12.1" - lodash.isstring "^4.0.1" "@types/jsonwebtoken" "^8.3.7" + "@types/node" ">=12" + jsonwebtoken "^9.0.0" + lodash.isstring "^4.0.1" "@slack/socket-mode@^1.3.6": version "1.3.6" resolved "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-1.3.6.tgz" integrity sha512-G+im7OP7jVqHhiNSdHgv2VVrnN5U7KY845/5EZimZkrD4ZmtV0P3BiWkgeJhPtdLuM7C7i6+M6h6Bh+S4OOalA== dependencies: - ws "^7.5.3" - finity "^0.5.4" - "@types/ws" "^7.4.7" - "@types/node" ">=12.0.0" "@slack/logger" "^3.0.0" - eventemitter3 "^5" "@slack/web-api" "^6.12.1" + "@types/node" ">=12.0.0" + "@types/ws" "^7.4.7" + eventemitter3 "^5" + finity "^0.5.4" + ws "^7.5.3" "@slack/types@^2.11.0", "@slack/types@^2.13.0", "@slack/types@^2.9.0": version "2.15.0" @@ -5257,17 +5267,17 @@ resolved "https://registry.npmjs.org/@slack/web-api/-/web-api-6.13.0.tgz" integrity sha512-dv65crIgdh9ZYHrevLU6XFHTQwTyDmNqEqzuIrV+Vqe/vgiG6w37oex5ePDU1RGm2IJ90H8iOvHFvzdEO/vB+g== dependencies: + "@slack/logger" "^3.0.0" + "@slack/types" "^2.11.0" + "@types/is-stream" "^1.1.0" + "@types/node" ">=12.0.0" axios "^1.7.4" - p-queue "^6.6.1" - p-retry "^4.0.0" + eventemitter3 "^3.1.0" form-data "^2.5.0" - is-stream "^1.1.0" - "@types/node" ">=12.0.0" is-electron "2.2.2" - "@slack/types" "^2.11.0" - "@slack/logger" "^3.0.0" - eventemitter3 "^3.1.0" - "@types/is-stream" "^1.1.0" + is-stream "^1.1.0" + p-queue "^6.6.1" + p-retry "^4.0.0" "@slack/web-api@^7.8.0": version "7.9.3" @@ -5307,8 +5317,8 @@ resolved "https://registry.npmjs.org/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-4.0.0.tgz" integrity sha512-R9wM2yPmfEMsUmlMlIgSzOyICs0x9uu7UTHoccMyt7BWw8shcGM8HqB355+BZCPBcySvbTYMs62EgEQkNxz2ig== dependencies: - tslib "^2.6.2" "@smithy/util-base64" "^4.0.0" + tslib "^2.6.2" "@smithy/config-resolver@^4.1.4": version "4.1.4" @@ -5635,9 +5645,9 @@ resolved "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz" integrity sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg== dependencies: - tslib "^2.6.2" - "@smithy/util-utf8" "^4.0.0" "@smithy/util-buffer-from" "^4.0.0" + "@smithy/util-utf8" "^4.0.0" + tslib "^2.6.2" "@smithy/util-body-length-browser@^4.0.0": version "4.0.0" @@ -5658,16 +5668,16 @@ resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz" integrity sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA== dependencies: - tslib "^2.6.2" "@smithy/is-array-buffer" "^2.2.0" + tslib "^2.6.2" "@smithy/util-buffer-from@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz" integrity sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug== dependencies: - tslib "^2.6.2" "@smithy/is-array-buffer" "^4.0.0" + tslib "^2.6.2" "@smithy/util-config-provider@^4.0.0": version "4.0.0" @@ -5759,16 +5769,16 @@ resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz" integrity sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A== dependencies: - tslib "^2.6.2" "@smithy/util-buffer-from" "^2.2.0" + tslib "^2.6.2" "@smithy/util-utf8@^4.0.0": version "4.0.0" resolved "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz" integrity sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow== dependencies: - tslib "^2.6.2" "@smithy/util-buffer-from" "^4.0.0" + tslib "^2.6.2" "@smithy/util-waiter@^4.0.6": version "4.0.6" @@ -5830,47 +5840,47 @@ resolved "https://registry.npmjs.org/@tailwindcss/cli/-/cli-4.1.11.tgz" integrity sha512-7RAFOrVaXCFz5ooEG36Kbh+sMJiI2j4+Ozp71smgjnLfBRu7DTfoq8DsTvzse2/6nDeo2M3vS/FGaxfDgr3rtQ== dependencies: - mri "^1.2.0" - picocolors "^1.1.1" - tailwindcss "4.1.11" "@parcel/watcher" "^2.5.1" - enhanced-resolve "^5.18.1" "@tailwindcss/node" "4.1.11" "@tailwindcss/oxide" "4.1.11" + enhanced-resolve "^5.18.1" + mri "^1.2.0" + picocolors "^1.1.1" + tailwindcss "4.1.11" "@tailwindcss/node@4.1.11": version "4.1.11" resolved "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.11.tgz" integrity sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q== dependencies: + "@ampproject/remapping" "^2.3.0" + enhanced-resolve "^5.18.1" jiti "^2.4.2" - tailwindcss "4.1.11" lightningcss "1.30.1" magic-string "^0.30.17" source-map-js "^1.2.1" - enhanced-resolve "^5.18.1" - "@ampproject/remapping" "^2.3.0" + tailwindcss "4.1.11" "@tailwindcss/oxide@4.1.11": version "4.1.11" resolved "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.11.tgz" integrity sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg== - dependencies: - tar "^7.4.3" - detect-libc "^2.0.4" optionalDependencies: + "@tailwindcss/oxide-android-arm64" "4.1.11" + "@tailwindcss/oxide-darwin-arm64" "4.1.11" "@tailwindcss/oxide-darwin-x64" "4.1.11" "@tailwindcss/oxide-freebsd-x64" "4.1.11" - "@tailwindcss/oxide-wasm32-wasi" "4.1.11" - "@tailwindcss/oxide-darwin-arm64" "4.1.11" - "@tailwindcss/oxide-android-arm64" "4.1.11" - "@tailwindcss/oxide-linux-x64-gnu" "4.1.11" - "@tailwindcss/oxide-linux-x64-musl" "4.1.11" - "@tailwindcss/oxide-win32-x64-msvc" "4.1.11" + "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.11" "@tailwindcss/oxide-linux-arm64-gnu" "4.1.11" "@tailwindcss/oxide-linux-arm64-musl" "4.1.11" + "@tailwindcss/oxide-linux-x64-gnu" "4.1.11" + "@tailwindcss/oxide-linux-x64-musl" "4.1.11" + "@tailwindcss/oxide-wasm32-wasi" "4.1.11" "@tailwindcss/oxide-win32-arm64-msvc" "4.1.11" - "@tailwindcss/oxide-linux-arm-gnueabihf" "4.1.11" + "@tailwindcss/oxide-win32-x64-msvc" "4.1.11" + dependencies: + detect-libc "^2.0.4" + tar "^7.4.3" "@tailwindcss/oxide-android-arm64@4.1.11": version "4.1.11" @@ -5922,12 +5932,12 @@ resolved "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.11.tgz" integrity sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g== dependencies: - tslib "^2.8.0" "@emnapi/core" "^1.4.3" "@emnapi/runtime" "^1.4.3" - "@tybys/wasm-util" "^0.9.0" "@emnapi/wasi-threads" "^1.0.2" "@napi-rs/wasm-runtime" "^0.2.11" + "@tybys/wasm-util" "^0.9.0" + tslib "^2.8.0" "@tailwindcss/oxide-win32-arm64-msvc@4.1.11": version "4.1.11" @@ -5944,20 +5954,20 @@ resolved "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.11.tgz" integrity sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA== dependencies: - postcss "^8.4.41" - tailwindcss "4.1.11" "@alloc/quick-lru" "^5.2.0" "@tailwindcss/node" "4.1.11" "@tailwindcss/oxide" "4.1.11" + postcss "^8.4.41" + tailwindcss "4.1.11" "@tailwindcss/typography@^0.5.16": version "0.5.16" resolved "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.16.tgz" integrity sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA== dependencies: - lodash.merge "^4.6.2" lodash.castarray "^4.4.0" lodash.isplainobject "^4.0.6" + lodash.merge "^4.6.2" postcss-selector-parser "6.0.10" "@tanstack/query-core@5.83.0": @@ -6001,14 +6011,14 @@ resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz" integrity sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ== dependencies: - chalk "^4.1.0" - lz-string "^1.5.0" - aria-query "5.3.0" - pretty-format "^27.0.2" - "@babel/runtime" "^7.12.5" "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" "@types/aria-query" "^5.0.1" + aria-query "5.3.0" + chalk "^4.1.0" dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" "@testing-library/jest-dom@^6.6.3": version "6.6.3" @@ -6226,62 +6236,62 @@ resolved "https://registry.npmjs.org/@tiptap/pm/-/pm-2.22.3.tgz" integrity sha512-uWPeIScnpQVCYdTnL140XgcvbT1qH288CstMJ6S0Y11lC5PclPK9CxfAipsqgWWrIK7yatxKUVCg6TzfG9zpmA== dependencies: - prosemirror-menu "^1.2.4" - prosemirror-view "^1.37.0" - prosemirror-model "^1.23.0" - prosemirror-state "^1.4.3" + prosemirror-changeset "^2.3.0" prosemirror-collab "^1.3.1" - prosemirror-keymap "^1.2.2" - prosemirror-tables "^1.6.4" - prosemirror-history "^1.4.1" prosemirror-commands "^1.6.2" - prosemirror-markdown "^1.13.1" - prosemirror-changeset "^2.3.0" - prosemirror-gapcursor "^1.3.2" - prosemirror-transform "^1.10.2" prosemirror-dropcursor "^1.8.1" + prosemirror-gapcursor "^1.3.2" + prosemirror-history "^1.4.1" prosemirror-inputrules "^1.4.0" - prosemirror-schema-list "^1.4.1" + prosemirror-keymap "^1.2.2" + prosemirror-markdown "^1.13.1" + prosemirror-menu "^1.2.4" + prosemirror-model "^1.23.0" prosemirror-schema-basic "^1.2.3" + prosemirror-schema-list "^1.4.1" + prosemirror-state "^1.4.3" + prosemirror-tables "^1.6.4" prosemirror-trailing-node "^3.0.0" + prosemirror-transform "^1.10.2" + prosemirror-view "^1.37.0" "@tiptap/react@2.14.0": version "2.14.0" resolved "https://registry.npmjs.org/@tiptap/react/-/react-2.14.0.tgz" integrity sha512-6mtksbT2+EWXFLdHVFag9PSoh0GXPmL97Cm+4sJoyECUmBkAyoErapAccmZIljyMaVIHBYpYkNdp9Pw1B73ezw== dependencies: - fast-deep-equal "^3" - use-sync-external-store "^1" "@tiptap/extension-bubble-menu" "^2.14.0" - "@types/use-sync-external-store" "^0.0.6" "@tiptap/extension-floating-menu" "^2.14.0" + "@types/use-sync-external-store" "^0.0.6" + fast-deep-equal "^3" + use-sync-external-store "^1" "@tiptap/starter-kit@2.14.0": version "2.14.0" resolved "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-2.14.0.tgz" integrity sha512-Z1bKAfHl14quRI3McmdU+bs675jp6/iexEQTI9M9oHa6l3McFF38g9N3xRpPPX02MX83DghsUPupndUW/yJvEQ== dependencies: - "@tiptap/pm" "^2.14.0" "@tiptap/core" "^2.14.0" + "@tiptap/extension-blockquote" "^2.14.0" "@tiptap/extension-bold" "^2.14.0" + "@tiptap/extension-bullet-list" "^2.14.0" "@tiptap/extension-code" "^2.14.0" - "@tiptap/extension-text" "^2.14.0" - "@tiptap/extension-italic" "^2.14.0" - "@tiptap/extension-strike" "^2.14.0" - "@tiptap/extension-heading" "^2.14.0" - "@tiptap/extension-history" "^2.14.0" + "@tiptap/extension-code-block" "^2.14.0" "@tiptap/extension-document" "^2.14.0" + "@tiptap/extension-dropcursor" "^2.14.0" "@tiptap/extension-gapcursor" "^2.14.0" + "@tiptap/extension-hard-break" "^2.14.0" + "@tiptap/extension-heading" "^2.14.0" + "@tiptap/extension-history" "^2.14.0" + "@tiptap/extension-horizontal-rule" "^2.14.0" + "@tiptap/extension-italic" "^2.14.0" "@tiptap/extension-list-item" "^2.14.0" + "@tiptap/extension-ordered-list" "^2.14.0" "@tiptap/extension-paragraph" "^2.14.0" - "@tiptap/extension-blockquote" "^2.14.0" - "@tiptap/extension-code-block" "^2.14.0" - "@tiptap/extension-dropcursor" "^2.14.0" - "@tiptap/extension-hard-break" "^2.14.0" + "@tiptap/extension-strike" "^2.14.0" + "@tiptap/extension-text" "^2.14.0" "@tiptap/extension-text-style" "^2.14.0" - "@tiptap/extension-bullet-list" "^2.14.0" - "@tiptap/extension-ordered-list" "^2.14.0" - "@tiptap/extension-horizontal-rule" "^2.14.0" + "@tiptap/pm" "^2.14.0" "@tiptap/suggestion@2.14.0": version "2.14.0" @@ -6298,70 +6308,70 @@ resolved "https://registry.npmjs.org/@trigger.dev/build/-/build-3.3.17.tgz" integrity sha512-dfreMuVeLAcZypS3kkUA9nWNviiuOPIQ3ldy2ywPCmwmbHyd0BE8tI5D3A4kmVq/f53TdRMls4c+cYafxlwubQ== dependencies: - tsconfck "3.1.3" + "@trigger.dev/core" "3.3.17" pkg-types "^1.1.3" tinyglobby "^0.2.2" - "@trigger.dev/core" "3.3.17" + tsconfck "3.1.3" "@trigger.dev/core@3.3.17", "@trigger.dev/core@^3.3.17": version "3.3.17" resolved "https://registry.npmjs.org/@trigger.dev/core/-/core-3.3.17.tgz" integrity sha512-KjnRxCuHq4R+MnE0zPvIQ7EIz4QSpJL+1Yn74n2cCGjyHYgQ/g8rcARn0Nxf2s8jzE38CnyRufjUrwG8k+DJrw== dependencies: - zod "3.23.8" - jose "^5.4.0" - execa "^8.0.1" - dequal "^2.0.3" - nanoid "^3.3.4" - superjson "^2.2.1" - zod-error "1.5.0" - eventsource "^3.0.5" + "@electric-sql/client" "1.0.0-beta.1" + "@google-cloud/precise-date" "^4.0.0" "@jsonhero/path" "^1.0.21" - socket.io-client "4.7.5" - humanize-duration "^3.27.3" "@opentelemetry/api" "1.9.0" - eventsource-parser "^3.0.0" - "@electric-sql/client" "1.0.0-beta.1" - zod-validation-error "^1.5.0" "@opentelemetry/api-logs" "0.52.1" + "@opentelemetry/exporter-logs-otlp-http" "0.52.1" + "@opentelemetry/exporter-trace-otlp-http" "0.52.1" + "@opentelemetry/instrumentation" "0.52.1" + "@opentelemetry/resources" "1.25.1" "@opentelemetry/sdk-logs" "0.52.1" "@opentelemetry/sdk-node" "0.52.1" - "@opentelemetry/resources" "1.25.1" - "@google-cloud/precise-date" "^4.0.0" "@opentelemetry/sdk-trace-base" "1.25.1" "@opentelemetry/sdk-trace-node" "1.25.1" - "@opentelemetry/instrumentation" "0.52.1" "@opentelemetry/semantic-conventions" "1.25.1" - "@opentelemetry/exporter-logs-otlp-http" "0.52.1" - "@opentelemetry/exporter-trace-otlp-http" "0.52.1" + dequal "^2.0.3" + eventsource "^3.0.5" + eventsource-parser "^3.0.0" + execa "^8.0.1" + humanize-duration "^3.27.3" + jose "^5.4.0" + nanoid "^3.3.4" + socket.io-client "4.7.5" + superjson "^2.2.1" + zod "3.23.8" + zod-error "1.5.0" + zod-validation-error "^1.5.0" "@trigger.dev/react-hooks@3.3.17": version "3.3.17" resolved "https://registry.npmjs.org/@trigger.dev/react-hooks/-/react-hooks-3.3.17.tgz" integrity sha512-1icVcYE7fuoB912KjeUxeTBiKygW82sy1XIWsYhEr6qyj7LcmfNzkNuL4qUdbqgcwJD0z91eKskRmd7MkjQrDg== dependencies: - swr "^2.2.5" "@trigger.dev/core" "^3.3.17" + swr "^2.2.5" "@trigger.dev/sdk@3.3.17": version "3.3.17" resolved "https://registry.npmjs.org/@trigger.dev/sdk/-/sdk-3.3.17.tgz" integrity sha512-wjIjlQWKybYWw/J7LxFIOO1pXzxXoj9lxbFMvjb51JtfebxnQnh6aExN47nOGhVhV38wHYstfBI/8ClWwBnFYw== dependencies: - ws "^8.11.0" + "@opentelemetry/api" "1.9.0" + "@opentelemetry/api-logs" "0.52.1" + "@opentelemetry/semantic-conventions" "1.25.1" + "@trigger.dev/core" "3.3.17" + chalk "^5.2.0" + cronstrue "^2.21.0" + debug "^4.3.4" evt "^2.4.13" slug "^6.0.0" + terminal-link "^3.0.0" ulid "^2.3.0" - uuid "^9.0.0" - chalk "^5.2.0" - debug "^4.3.4" uncrypto "^0.1.3" - cronstrue "^2.21.0" - terminal-link "^3.0.0" - "@trigger.dev/core" "3.3.17" - "@opentelemetry/api" "1.9.0" - "@opentelemetry/api-logs" "0.52.1" - "@opentelemetry/semantic-conventions" "1.25.1" + uuid "^9.0.0" + ws "^8.11.0" "@tsconfig/node10@^1.0.7": version "1.0.11" @@ -6393,8 +6403,8 @@ resolved "https://registry.npmjs.org/@tufjs/models/-/models-2.0.1.tgz" integrity sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg== dependencies: - minimatch "^9.0.4" "@tufjs/canonical-json" "2.0.0" + minimatch "^9.0.4" "@tufjs/models@3.0.1": version "3.0.1" @@ -6445,11 +6455,11 @@ resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz" integrity sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA== dependencies: - "@babel/types" "^7.20.7" "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" - "@types/babel__generator" "*" "@types/babel__generator@*": version "7.27.0" @@ -6463,8 +6473,8 @@ resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz" integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: - "@babel/types" "^7.0.0" "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" "@types/babel__traverse@*": version "7.20.7" @@ -6478,8 +6488,8 @@ resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz" integrity sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g== dependencies: - "@types/node" "*" "@types/connect" "*" + "@types/node" "*" "@types/bun@^1.2.15": version "1.2.19" @@ -6493,10 +6503,10 @@ resolved "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz" integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== dependencies: + "@types/http-cache-semantics" "*" "@types/keyv" "^3.1.4" "@types/node" "*" "@types/responselike" "^1.0.0" - "@types/http-cache-semantics" "*" "@types/canvas-confetti@^1.9.0": version "1.9.0" @@ -6536,36 +6546,36 @@ resolved "https://registry.npmjs.org/@types/d3/-/d3-7.4.3.tgz" integrity sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww== dependencies: - "@types/d3-dsv" "*" - "@types/d3-geo" "*" - "@types/d3-axis" "*" - "@types/d3-drag" "*" - "@types/d3-ease" "*" - "@types/d3-path" "*" - "@types/d3-time" "*" - "@types/d3-zoom" "*" "@types/d3-array" "*" + "@types/d3-axis" "*" "@types/d3-brush" "*" "@types/d3-chord" "*" "@types/d3-color" "*" + "@types/d3-contour" "*" + "@types/d3-delaunay" "*" + "@types/d3-dispatch" "*" + "@types/d3-drag" "*" + "@types/d3-dsv" "*" + "@types/d3-ease" "*" "@types/d3-fetch" "*" "@types/d3-force" "*" - "@types/d3-scale" "*" - "@types/d3-shape" "*" - "@types/d3-timer" "*" "@types/d3-format" "*" - "@types/d3-random" "*" - "@types/d3-contour" "*" + "@types/d3-geo" "*" + "@types/d3-hierarchy" "*" + "@types/d3-interpolate" "*" + "@types/d3-path" "*" "@types/d3-polygon" "*" - "@types/d3-delaunay" "*" - "@types/d3-dispatch" "*" "@types/d3-quadtree" "*" - "@types/d3-hierarchy" "*" + "@types/d3-random" "*" + "@types/d3-scale" "*" + "@types/d3-scale-chromatic" "*" "@types/d3-selection" "*" - "@types/d3-transition" "*" - "@types/d3-interpolate" "*" + "@types/d3-shape" "*" + "@types/d3-time" "*" "@types/d3-time-format" "*" - "@types/d3-scale-chromatic" "*" + "@types/d3-timer" "*" + "@types/d3-transition" "*" + "@types/d3-zoom" "*" "@types/d3-array@*", "@types/d3-array@^3.0.3": version "3.2.1" @@ -6601,8 +6611,8 @@ resolved "https://registry.npmjs.org/@types/d3-contour/-/d3-contour-3.0.6.tgz" integrity sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg== dependencies: - "@types/geojson" "*" "@types/d3-array" "*" + "@types/geojson" "*" "@types/d3-delaunay@*": version "6.0.4" @@ -6738,10 +6748,10 @@ resolved "https://registry.npmjs.org/@types/d3-zoom/-/d3-zoom-3.0.8.tgz" integrity sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw== dependencies: - "@types/d3-selection" "*" "@types/d3-interpolate" "*" + "@types/d3-selection" "*" -"@types/debug@^4.0.0": +"@types/debug@^4.0.0", "@types/debug@^4.1.12": version "4.1.12" resolved "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz" integrity sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ== @@ -6780,20 +6790,20 @@ resolved "https://registry.npmjs.org/@types/express/-/express-4.17.23.tgz" integrity sha512-Crp6WY9aTYP3qPi2wGDo9iUe/rceX01UMhnF1jmwDcKCFM6cx7YhGP/Mpr3y9AASpfHixIG0E6azCcL5OcDHsQ== dependencies: - "@types/qs" "*" "@types/body-parser" "*" - "@types/serve-static" "*" "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" "@types/express-serve-static-core@^4.17.33": version "4.19.6" resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz" integrity sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A== dependencies: - "@types/qs" "*" "@types/node" "*" - "@types/send" "*" + "@types/qs" "*" "@types/range-parser" "*" + "@types/send" "*" "@types/geojson@*": version "7946.0.16" @@ -6880,8 +6890,8 @@ resolved "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz" integrity sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog== dependencies: - "@types/mdurl" "^2" "@types/linkify-it" "^5" + "@types/mdurl" "^2" "@types/mdast@^4.0.0": version "4.0.4" @@ -6912,7 +6922,7 @@ dependencies: undici-types "~5.26.4" -"@types/node@*", "@types/node@>=10.0.0", "@types/node@>=12", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^24.0.3": +"@types/node@*", "@types/node@>= 12", "@types/node@>=10.0.0", "@types/node@>=12", "@types/node@>=13.7.0", "@types/node@>=18.0.0", "@types/node@^18.0.0 || >=20.0.0", "@types/node@^18.0.0 || ^20.0.0 || >=22.0.0", "@types/node@^20.19.0 || >=22.12.0", "@types/node@^24.0.3": version "24.1.0" resolved "https://registry.npmjs.org/@types/node/-/node-24.1.0.tgz" integrity sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w== @@ -6924,8 +6934,8 @@ resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.12.tgz" integrity sha512-8nneRWKCg3rMtF69nLQJnOYUcbafYeFSjqkw3jCRLsqkWFlHaoQrr5mXmofFGOx3DKn7UfmBMyov8ySvLRVldA== dependencies: - form-data "^4.0.0" "@types/node" "*" + form-data "^4.0.0" "@types/normalize-package-data@^2.4.3": version "2.4.4" @@ -6957,14 +6967,14 @@ resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz" integrity sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ== -"@types/react@*", "@types/react@>=18", "@types/react@^19", "@types/react@^19.1.6": +"@types/react@*", "@types/react@>= 16", "@types/react@>=16.8", "@types/react@>=18", "@types/react@^18.0.0 || ^19.0.0", "@types/react@^19", "@types/react@^19.1.6": version "19.1.8" resolved "https://registry.npmjs.org/@types/react/-/react-19.1.8.tgz" integrity sha512-AwAfQ2Wa5bCx9WP8nZL2uMZWod7J7/JSplxbTmBQ5ms6QpqNYm672H0Vu9ZVKVngQ+ii4R/byguVEUZQyeg44g== dependencies: csstype "^3.0.2" -"@types/react-dom@^19.1.1": +"@types/react-dom@*", "@types/react-dom@^18.0.0 || ^19.0.0", "@types/react-dom@^19.1.1": version "19.1.6" resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.6.tgz" integrity sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw== @@ -7016,9 +7026,9 @@ resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz" integrity sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg== dependencies: + "@types/http-errors" "*" "@types/node" "*" "@types/send" "*" - "@types/http-errors" "*" "@types/shimmer@^1.0.2", "@types/shimmer@^1.2.0": version "1.2.0" @@ -7035,13 +7045,13 @@ resolved "https://registry.npmjs.org/@types/three/-/three-0.177.0.tgz" integrity sha512-/ZAkn4OLUijKQySNci47lFO+4JLE1TihEjsGWPUT+4jWqxtwOPPEwJV1C3k5MEx0mcBPCdkFjzRzDOnHEI1R+A== dependencies: - fflate "~0.8.2" + "@dimforge/rapier3d-compat" "~0.12.0" + "@tweenjs/tween.js" "~23.1.3" + "@types/stats.js" "*" "@types/webxr" "*" "@webgpu/types" "*" + fflate "~0.8.2" meshoptimizer "~0.18.1" - "@types/stats.js" "*" - "@tweenjs/tween.js" "~23.1.3" - "@dimforge/rapier3d-compat" "~0.12.0" "@types/tmp@^0.2.6": version "0.2.6" @@ -7214,9 +7224,9 @@ resolved "https://registry.npmjs.org/@typespec/ts-http-runtime/-/ts-http-runtime-0.3.0.tgz" integrity sha512-sOx1PKSuFwnIl7z4RN0Ls7N9AQawmR9r66eI5rFCzLDIs8HTIYrIpH9QjYWoX0lkgGrkLxXhi4QnK7MizPRrIg== dependencies: - tslib "^2.6.2" http-proxy-agent "^7.0.0" https-proxy-agent "^7.0.0" + tslib "^2.6.2" "@uidotdev/usehooks@^2.4.1": version "2.4.1" @@ -7402,11 +7412,11 @@ resolved "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz" integrity sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig== dependencies: - chai "^5.2.0" "@types/chai" "^5.2.2" "@vitest/spy" "3.2.4" - tinyrainbow "^2.0.0" "@vitest/utils" "3.2.4" + chai "^5.2.0" + tinyrainbow "^2.0.0" "@vitest/mocker@3.2.4": version "3.2.4" @@ -7414,8 +7424,8 @@ integrity sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ== dependencies: "@vitest/spy" "3.2.4" - magic-string "^0.30.17" estree-walker "^3.0.3" + magic-string "^0.30.17" "@vitest/pretty-format@3.2.4", "@vitest/pretty-format@^3.2.4": version "3.2.4" @@ -7429,8 +7439,8 @@ resolved "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz" integrity sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ== dependencies: - pathe "^2.0.3" "@vitest/utils" "3.2.4" + pathe "^2.0.3" strip-literal "^3.0.0" "@vitest/snapshot@3.2.4": @@ -7438,9 +7448,9 @@ resolved "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz" integrity sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ== dependencies: - pathe "^2.0.3" - magic-string "^0.30.17" "@vitest/pretty-format" "3.2.4" + magic-string "^0.30.17" + pathe "^2.0.3" "@vitest/spy@3.2.4": version "3.2.4" @@ -7449,27 +7459,27 @@ dependencies: tinyspy "^4.0.3" -"@vitest/ui@^3.2.4": +"@vitest/ui@3.2.4", "@vitest/ui@^3.2.4": version "3.2.4" resolved "https://registry.npmjs.org/@vitest/ui/-/ui-3.2.4.tgz" integrity sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA== dependencies: - sirv "^3.0.1" - pathe "^2.0.3" + "@vitest/utils" "3.2.4" fflate "^0.8.2" flatted "^3.3.3" + pathe "^2.0.3" + sirv "^3.0.1" tinyglobby "^0.2.14" tinyrainbow "^2.0.0" - "@vitest/utils" "3.2.4" "@vitest/utils@3.2.4": version "3.2.4" resolved "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz" integrity sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA== dependencies: + "@vitest/pretty-format" "3.2.4" loupe "^3.1.4" tinyrainbow "^2.0.0" - "@vitest/pretty-format" "3.2.4" "@vladfrangu/async_event_emitter@^2.2.4", "@vladfrangu/async_event_emitter@^2.4.6": version "2.4.6" @@ -7491,8 +7501,8 @@ JSONStream@^1.3.5: resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== dependencies: - through ">=2.2.7 <3" jsonparse "^1.2.0" + through ">=2.2.7 <3" abbrev@1: version "1.1.1" @@ -7579,32 +7589,32 @@ ai@^4.3.16: resolved "https://registry.npmjs.org/ai/-/ai-4.3.19.tgz" integrity sha512-dIE2bfNpqHN3r6IINp9znguYdhIOheKW2LDigAMrgt/upT3B8eBGPSCblENvaZGoq+hxaN9fSMzjWpbqloP+7Q== dependencies: - "@ai-sdk/react" "1.2.12" - jsondiffpatch "0.6.0" "@ai-sdk/provider" "1.1.3" + "@ai-sdk/provider-utils" "2.2.8" + "@ai-sdk/react" "1.2.12" "@ai-sdk/ui-utils" "1.2.11" "@opentelemetry/api" "1.9.0" - "@ai-sdk/provider-utils" "2.2.8" + jsondiffpatch "0.6.0" ajv@^6.12.3, ajv@^6.12.4: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== dependencies: - uri-js "^4.2.2" fast-deep-equal "^3.1.1" - json-schema-traverse "^0.4.1" fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" ajv@^8.11.0: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-uri "^3.0.1" fast-deep-equal "^3.1.3" - require-from-string "^2.0.2" + fast-uri "^3.0.1" json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" ansi-colors@^4.1.1: version "4.1.3" @@ -7674,8 +7684,8 @@ anymatch@~3.1.2: resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== dependencies: - picomatch "^2.0.4" normalize-path "^3.0.0" + picomatch "^2.0.4" aproba@^1.0.3: version "1.2.0" @@ -7949,11 +7959,11 @@ autoprefixer@^10.4.21: resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz" integrity sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ== dependencies: - picocolors "^1.1.1" - fraction.js "^4.3.7" browserslist "^4.24.4" caniuse-lite "^1.0.30001702" + fraction.js "^4.3.7" normalize-range "^0.1.2" + picocolors "^1.1.1" postcss-value-parser "^4.2.0" available-typed-arrays@^1.0.7: @@ -7983,18 +7993,18 @@ axios@1.8.2: resolved "https://registry.npmjs.org/axios/-/axios-1.8.2.tgz" integrity sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg== dependencies: + follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" - follow-redirects "^1.15.6" axios@^1.6.8, axios@^1.7.4, axios@^1.7.9, axios@^1.8.2, axios@^1.8.3, axios@^1.9.0: version "1.10.0" resolved "https://registry.npmjs.org/axios/-/axios-1.10.0.tgz" integrity sha512-/1xYAC4MP/HEG+3duIhFr4ZQXR4sQXOIe+o6sdqzeykGLx6Upp/1p8MHqhINOvGeP7xyNHe7tsiJByc4SSVUxw== dependencies: + follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" - follow-redirects "^1.15.6" axobject-query@^4.1.0: version "4.1.0" @@ -8025,7 +8035,7 @@ balanced-match@^1.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== -bare-events@^2.2.0, bare-events@^2.5.4: +bare-events@*, bare-events@^2.2.0, bare-events@^2.5.4: version "2.6.0" resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.6.0.tgz" integrity sha512-EKZ5BTXYExaNqi3I3f9RtEsaI/xBSGjE0XZCZilPzFAV/goswFHuPd9jEZlPIZ/iNZJwDSao9qRiScySz7MbQg== @@ -8126,9 +8136,9 @@ bin-links@^4.0.4: integrity sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA== dependencies: cmd-shim "^6.0.0" + npm-normalize-package-bin "^3.0.0" read-cmd-shim "^4.0.0" write-file-atomic "^5.0.0" - npm-normalize-package-bin "^3.0.0" bin-links@^5.0.0: version "5.0.0" @@ -8136,10 +8146,10 @@ bin-links@^5.0.0: integrity sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA== dependencies: cmd-shim "^7.0.0" + npm-normalize-package-bin "^4.0.0" proc-log "^5.0.0" read-cmd-shim "^5.0.0" write-file-atomic "^6.0.0" - npm-normalize-package-bin "^4.0.0" binary-extensions@^2.0.0, binary-extensions@^2.3.0: version "2.3.0" @@ -8158,18 +8168,18 @@ body-parser@1.20.3: resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz" integrity sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g== dependencies: - qs "6.13.0" - depd "2.0.0" bytes "3.1.2" + content-type "~1.0.5" debug "2.6.9" - unpipe "1.0.0" + depd "2.0.0" destroy "1.2.0" - type-is "~1.6.18" - raw-body "2.5.2" - iconv-lite "0.4.24" http-errors "2.0.0" + iconv-lite "0.4.24" on-finished "2.4.1" - content-type "~1.0.5" + qs "6.13.0" + raw-body "2.5.2" + type-is "~1.6.18" + unpipe "1.0.0" bottleneck@^2.15.3: version "2.19.5" @@ -8277,36 +8287,36 @@ cacache@^18.0.0, cacache@^18.0.3: resolved "https://registry.npmjs.org/cacache/-/cacache-18.0.4.tgz" integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ== dependencies: - tar "^6.1.11" - glob "^10.2.2" - ssri "^10.0.0" - p-map "^4.0.0" - minipass "^7.0.3" - lru-cache "^10.0.1" "@npmcli/fs" "^3.1.0" fs-minipass "^3.0.0" - minipass-flush "^1.0.5" - unique-filename "^3.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" minipass-collect "^2.0.1" + minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" + p-map "^4.0.0" + ssri "^10.0.0" + tar "^6.1.11" + unique-filename "^3.0.0" cacache@^19.0.0, cacache@^19.0.1: version "19.0.1" resolved "https://registry.npmjs.org/cacache/-/cacache-19.0.1.tgz" integrity sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ== dependencies: - tar "^7.4.3" - glob "^10.2.2" - ssri "^12.0.0" - p-map "^7.0.2" - minipass "^7.0.3" - lru-cache "^10.0.1" "@npmcli/fs" "^4.0.0" fs-minipass "^3.0.0" - minipass-flush "^1.0.5" - unique-filename "^4.0.0" + glob "^10.2.2" + lru-cache "^10.0.1" + minipass "^7.0.3" minipass-collect "^2.0.1" + minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" + p-map "^7.0.2" + ssri "^12.0.0" + tar "^7.4.3" + unique-filename "^4.0.0" cacheable-lookup@^5.0.3: version "5.0.4" @@ -8318,13 +8328,13 @@ cacheable-request@^7.0.2: resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz" integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== dependencies: - keyv "^4.0.0" - get-stream "^5.1.0" - responselike "^2.0.0" - normalize-url "^6.0.1" clone-response "^1.0.2" - lowercase-keys "^2.0.0" + get-stream "^5.1.0" http-cache-semantics "^4.0.0" + keyv "^4.0.0" + lowercase-keys "^2.0.0" + normalize-url "^6.0.1" + responselike "^2.0.0" call-bind@^1.0.2, call-bind@^1.0.7, call-bind@^1.0.8: version "1.0.8" @@ -8404,8 +8414,8 @@ chalk@^2.3.2: integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== dependencies: ansi-styles "^3.2.1" - supports-color "^5.3.0" escape-string-regexp "^1.0.5" + supports-color "^5.3.0" chalk@^3.0.0: version "3.0.0" @@ -8469,16 +8479,16 @@ chokidar@^3.6.0: version "3.6.0" resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz" integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + optionalDependencies: + fsevents "~2.3.2" dependencies: - braces "~3.0.2" - is-glob "~4.0.1" anymatch "~3.1.2" - readdirp "~3.6.0" + braces "~3.0.2" glob-parent "~5.1.2" is-binary-path "~2.1.0" + is-glob "~4.0.1" normalize-path "~3.0.0" - optionalDependencies: - fsevents "~2.3.2" + readdirp "~3.6.0" chokidar@^4.0.3: version "4.0.3" @@ -8502,8 +8512,8 @@ chromium-bidi@7.1.1: resolved "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-7.1.1.tgz" integrity sha512-L2BKQ0rSLADgbPMIdDh3wnYHs3EiUiMay2Sq0CTolheaADmWIf6Pe+T9LJRcnh5rcMz0U7MVk0cQVvKsGRMa1g== dependencies: - zod "^3.24.1" mitt "^3.0.1" + zod "^3.24.1" ci-info@^4.0.0, ci-info@^4.2.0: version "4.3.0" @@ -8589,10 +8599,10 @@ cli-table3@^0.6.5: version "0.6.5" resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz" integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== - dependencies: - string-width "^4.2.0" optionalDependencies: "@colors/colors" "1.5.0" + dependencies: + string-width "^4.2.0" client-only@0.0.1: version "0.0.1" @@ -8604,18 +8614,18 @@ cliui@^7.0.2: resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== dependencies: - wrap-ansi "^7.0.0" - strip-ansi "^6.0.0" string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" cliui@^8.0.1: version "8.0.1" resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== dependencies: - wrap-ansi "^7.0.0" - strip-ansi "^6.0.1" string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" clone-response@^1.0.2: version "1.0.3" @@ -8644,10 +8654,10 @@ cmdk@1.0.4: resolved "https://registry.npmjs.org/cmdk/-/cmdk-1.0.4.tgz" integrity sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg== dependencies: - "@radix-ui/react-id" "^1.1.0" "@radix-ui/react-dialog" "^1.1.2" - use-sync-external-store "^1.2.2" + "@radix-ui/react-id" "^1.1.0" "@radix-ui/react-primitive" "^2.0.0" + use-sync-external-store "^1.2.2" code-point-at@^1.0.0: version "1.1.0" @@ -8659,8 +8669,8 @@ color@^4.2.3: resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: - color-string "^1.9.0" color-convert "^2.0.1" + color-string "^1.9.0" color-convert@^1.9.0: version "1.9.3" @@ -8740,8 +8750,8 @@ compress-commons@^6.0.2: integrity sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg== dependencies: crc-32 "^1.2.0" - is-stream "^2.0.1" crc32-stream "^6.0.0" + is-stream "^2.0.1" normalize-path "^3.0.0" readable-stream "^4.0.0" @@ -8778,8 +8788,8 @@ config-chain@^1.1.11: resolved "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz" integrity sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ== dependencies: - proto-list "~1.2.1" ini "^1.3.4" + proto-list "~1.2.1" consola@^3.2.3, consola@^3.4.0: version "3.4.2" @@ -8829,10 +8839,10 @@ conventional-changelog-writer@^8.0.0: resolved "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-8.2.0.tgz" integrity sha512-Y2aW4596l9AEvFJRwFGJGiQjt2sBYTjPD18DdvxX9Vpz0Z7HQ+g1Z+6iYDAm1vR3QOJrDBkRHixHK/+FhkR6Pw== dependencies: + conventional-commits-filter "^5.0.0" handlebars "^4.7.7" meow "^13.0.0" semver "^7.5.2" - conventional-commits-filter "^5.0.0" conventional-commits-filter@^5.0.0: version "5.0.0" @@ -8844,10 +8854,10 @@ conventional-commits-parser@^5.0.0: resolved "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz" integrity sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== dependencies: - meow "^12.0.1" - split2 "^4.0.0" JSONStream "^1.3.5" is-text-path "^2.0.0" + meow "^12.0.1" + split2 "^4.0.0" conventional-commits-parser@^6.0.0: version "6.2.0" @@ -8920,8 +8930,8 @@ cors@~2.8.5: resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== dependencies: - vary "^1" object-assign "^4" + vary "^1" cosmiconfig@^7.0.0: version "7.1.0" @@ -8991,9 +9001,9 @@ cross-spawn@^7.0.1, cross-spawn@^7.0.3, cross-spawn@^7.0.6: resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz" integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: - which "^2.0.1" path-key "^3.1.0" shebang-command "^2.0.0" + which "^2.0.1" crypto-random-string@^4.0.0: version "4.0.0" @@ -9032,8 +9042,8 @@ cssstyle@^4.2.1: resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-4.6.0.tgz" integrity sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg== dependencies: - rrweb-cssom "^0.8.0" "@asamuzakjp/css-color" "^3.2.0" + rrweb-cssom "^0.8.0" csstype@^3.0.2, csstype@^3.1.2: version "3.1.3" @@ -9045,36 +9055,36 @@ d3@^7.9.0: resolved "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz" integrity sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA== dependencies: - d3-dsv "3" - d3-geo "3" - d3-axis "3" - d3-drag "3" - d3-ease "3" - d3-path "3" - d3-time "3" - d3-zoom "3" d3-array "3" + d3-axis "3" d3-brush "3" d3-chord "3" d3-color "3" + d3-contour "4" + d3-delaunay "6" + d3-dispatch "3" + d3-drag "3" + d3-dsv "3" + d3-ease "3" d3-fetch "3" d3-force "3" - d3-scale "4" - d3-shape "3" - d3-timer "3" d3-format "3" - d3-random "3" - d3-contour "4" + d3-geo "3" + d3-hierarchy "3" + d3-interpolate "3" + d3-path "3" d3-polygon "3" - d3-delaunay "6" - d3-dispatch "3" d3-quadtree "3" - d3-hierarchy "3" + d3-random "3" + d3-scale "4" + d3-scale-chromatic "3" d3-selection "3" - d3-transition "3" - d3-interpolate "3" + d3-shape "3" + d3-time "3" d3-time-format "4" - d3-scale-chromatic "3" + d3-timer "3" + d3-transition "3" + d3-zoom "3" "d3-array@2 - 3", "d3-array@2.10.0 - 3", "d3-array@2.5.0 - 3", d3-array@3, d3-array@^3.1.6, d3-array@^3.2.0: version "3.2.4" @@ -9586,19 +9596,19 @@ discord.js@^14.7.1: resolved "https://registry.npmjs.org/discord.js/-/discord.js-14.21.0.tgz" integrity sha512-U5w41cEmcnSfwKYlLv5RJjB8Joa+QJyRwIJz5i/eg+v2Qvv6EYpCRhN9I2Rlf0900LuqSDg8edakUATrDZQncQ== dependencies: - tslib "^2.6.3" - undici "6.21.3" - "@discordjs/ws" "^1.2.3" - magic-bytes.js "^1.10.0" + "@discordjs/builders" "^1.11.2" + "@discordjs/collection" "1.5.3" + "@discordjs/formatters" "^0.6.1" "@discordjs/rest" "^2.5.1" "@discordjs/util" "^1.1.1" + "@discordjs/ws" "^1.2.3" + "@sapphire/snowflake" "3.5.3" + discord-api-types "^0.38.1" fast-deep-equal "3.1.3" lodash.snakecase "4.1.1" - discord-api-types "^0.38.1" - "@discordjs/builders" "^1.11.2" - "@sapphire/snowflake" "3.5.3" - "@discordjs/collection" "1.5.3" - "@discordjs/formatters" "^0.6.1" + magic-bytes.js "^1.10.0" + tslib "^2.6.3" + undici "6.21.3" dlv@^1.1.3: version "1.1.3" @@ -9636,8 +9646,8 @@ dom-helpers@^5.0.1: resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== dependencies: - csstype "^3.0.2" "@babel/runtime" "^7.8.7" + csstype "^3.0.2" dom-serializer@^2.0.0: version "2.0.0" @@ -9744,8 +9754,8 @@ effect@3.16.8: resolved "https://registry.npmjs.org/effect/-/effect-3.16.8.tgz" integrity sha512-E4U0MZFBun99myxOogy9ZZ1c3IYR47L/A5GqCP9Lp+6ORag0YLmGHOrYxQ3agN1FOMTrElgtJmciicwnHdE+Ug== dependencies: - fast-check "^3.23.1" "@standard-schema/spec" "^1.0.0" + fast-check "^3.23.1" effect@^3.13.7, effect@^3.16.8: version "3.17.0" @@ -9808,7 +9818,7 @@ encodeurl@~2.0.0: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -encoding@^0.1.13: +encoding@^0.1.0, encoding@^0.1.13: version "0.1.13" resolved "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -9842,11 +9852,11 @@ engine.io-client@~6.5.2: resolved "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.5.4.tgz" integrity sha512-GeZeeRjpD2qf49cZQ0Wvh/8NJNfeXkXXcoGh+F77oEAgo9gUHwT1fCRxSNU+YEEaysOJTnsFHmM5oAcPy4ntvQ== dependencies: - ws "~8.17.1" + "@socket.io/component-emitter" "~3.1.0" debug "~4.3.1" engine.io-parser "~5.2.1" + ws "~8.17.1" xmlhttprequest-ssl "~2.0.0" - "@socket.io/component-emitter" "~3.1.0" engine.io-parser@~5.2.1: version "5.2.3" @@ -10072,28 +10082,28 @@ esbuild@^0.20.1: integrity sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g== optionalDependencies: "@esbuild/aix-ppc64" "0.20.2" - "@esbuild/linux-arm" "0.20.2" - "@esbuild/linux-x64" "0.20.2" - "@esbuild/sunos-x64" "0.20.2" - "@esbuild/win32-x64" "0.20.2" - "@esbuild/darwin-x64" "0.20.2" - "@esbuild/linux-ia32" "0.20.2" - "@esbuild/netbsd-x64" "0.20.2" - "@esbuild/win32-ia32" "0.20.2" "@esbuild/android-arm" "0.20.2" + "@esbuild/android-arm64" "0.20.2" "@esbuild/android-x64" "0.20.2" + "@esbuild/darwin-arm64" "0.20.2" + "@esbuild/darwin-x64" "0.20.2" + "@esbuild/freebsd-arm64" "0.20.2" "@esbuild/freebsd-x64" "0.20.2" + "@esbuild/linux-arm" "0.20.2" "@esbuild/linux-arm64" "0.20.2" + "@esbuild/linux-ia32" "0.20.2" + "@esbuild/linux-loong64" "0.20.2" + "@esbuild/linux-mips64el" "0.20.2" "@esbuild/linux-ppc64" "0.20.2" + "@esbuild/linux-riscv64" "0.20.2" "@esbuild/linux-s390x" "0.20.2" + "@esbuild/linux-x64" "0.20.2" + "@esbuild/netbsd-x64" "0.20.2" "@esbuild/openbsd-x64" "0.20.2" + "@esbuild/sunos-x64" "0.20.2" "@esbuild/win32-arm64" "0.20.2" - "@esbuild/darwin-arm64" "0.20.2" - "@esbuild/android-arm64" "0.20.2" - "@esbuild/freebsd-arm64" "0.20.2" - "@esbuild/linux-loong64" "0.20.2" - "@esbuild/linux-riscv64" "0.20.2" - "@esbuild/linux-mips64el" "0.20.2" + "@esbuild/win32-ia32" "0.20.2" + "@esbuild/win32-x64" "0.20.2" esbuild@>=0.18, esbuild@^0.25.0: version "0.25.8" @@ -10156,12 +10166,12 @@ escodegen@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + optionalDependencies: + source-map "~0.6.1" dependencies: + esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - esprima "^4.0.1" - optionalDependencies: - source-map "~0.6.1" eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.23.0 || ^8.0.0 || ^9.0.0", "eslint@^8.57.0 || ^9.0.0", eslint@^9: version "9.31.0" @@ -10209,16 +10219,16 @@ eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 resolved "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-15.4.0-canary.85.tgz" integrity sha512-aI8S/cGs3AapI3po3ANDh5wnZ5JiZcFEn32n+P7FrfHwEY1IittY6ktTajt8HZEZqnhwFM38d2GH1PMscxP6bw== dependencies: - eslint-plugin-react "^7.37.0" - eslint-plugin-import "^2.31.0" - eslint-plugin-jsx-a11y "^6.10.0" - "@rushstack/eslint-patch" "^1.10.3" "@next/eslint-plugin-next" "15.4.0-canary.85" + "@rushstack/eslint-patch" "^1.10.3" + "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" "@typescript-eslint/parser" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" - eslint-plugin-react-hooks "^5.0.0" eslint-import-resolver-node "^0.3.6" - "@typescript-eslint/eslint-plugin" "^5.4.2 || ^6.0.0 || ^7.0.0 || ^8.0.0" eslint-import-resolver-typescript "^3.5.2" + eslint-plugin-import "^2.31.0" + eslint-plugin-jsx-a11y "^6.10.0" + eslint-plugin-react "^7.37.0" + eslint-plugin-react-hooks "^5.0.0" eslint-import-resolver-node@^0.3.6, eslint-import-resolver-node@^0.3.9: version "0.3.9" @@ -10234,13 +10244,13 @@ eslint-import-resolver-typescript@^3.5.2: resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz" integrity sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ== dependencies: + "@nolyfill/is-core-module" "1.0.39" debug "^4.4.0" - tinyglobby "^0.2.13" - stable-hash "^0.0.5" get-tsconfig "^4.10.0" is-bun-module "^2.0.0" + stable-hash "^0.0.5" + tinyglobby "^0.2.13" unrs-resolver "^1.6.2" - "@nolyfill/is-core-module" "1.0.39" eslint-module-utils@^2.12.1: version "2.12.1" @@ -10249,7 +10259,7 @@ eslint-module-utils@^2.12.1: dependencies: debug "^3.2.7" -eslint-plugin-import@^2.31.0: +eslint-plugin-import@*, eslint-plugin-import@^2.31.0: version "2.32.0" resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz" integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== @@ -10453,14 +10463,14 @@ execa@^5.0.0, execa@^5.1.0: resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== dependencies: - onetime "^5.1.2" - is-stream "^2.0.0" - get-stream "^6.0.0" cross-spawn "^7.0.3" - signal-exit "^3.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" merge-stream "^2.0.0" npm-run-path "^4.0.1" - human-signals "^2.1.0" + onetime "^5.1.2" + signal-exit "^3.0.3" strip-final-newline "^2.0.0" execa@^8.0.0, execa@^8.0.1: @@ -10468,14 +10478,14 @@ execa@^8.0.0, execa@^8.0.1: resolved "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz" integrity sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg== dependencies: - onetime "^6.0.0" - is-stream "^3.0.0" - get-stream "^8.0.1" cross-spawn "^7.0.3" - signal-exit "^4.1.0" + get-stream "^8.0.1" + human-signals "^5.0.0" + is-stream "^3.0.0" merge-stream "^2.0.0" npm-run-path "^5.1.0" - human-signals "^5.0.0" + onetime "^6.0.0" + signal-exit "^4.1.0" strip-final-newline "^3.0.0" execa@^9.0.0: @@ -10506,42 +10516,42 @@ exponential-backoff@^3.1.1: resolved "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.2.tgz" integrity sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA== -express@^4.21.0: +express@*, express@^4.21.0: version "4.21.2" resolved "https://registry.npmjs.org/express/-/express-4.21.2.tgz" integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== dependencies: - qs "6.13.0" + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.3" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.7.1" + cookie-signature "1.0.6" + debug "2.6.9" depd "2.0.0" + encodeurl "~2.0.0" + escape-html "~1.0.3" etag "~1.8.1" - send "0.19.0" - vary "~1.1.2" - debug "2.6.9" + finalhandler "1.3.1" fresh "0.5.2" - cookie "0.7.1" - accepts "~1.3.8" + http-errors "2.0.0" + merge-descriptors "1.0.3" methods "~1.1.2" - type-is "~1.6.18" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "2.0.1" - encodeurl "~2.0.0" + path-to-regexp "0.1.12" proxy-addr "~2.0.7" - body-parser "1.20.3" - escape-html "~1.0.3" - http-errors "2.0.0" - on-finished "2.4.1" - safe-buffer "5.2.1" - utils-merge "1.0.1" - content-type "~1.0.4" - finalhandler "1.3.1" + qs "6.13.0" range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.19.0" serve-static "1.16.2" - array-flatten "1.1.1" - path-to-regexp "0.1.12" setprototypeof "1.2.0" - cookie-signature "1.0.6" - merge-descriptors "1.0.3" - content-disposition "0.5.4" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" exsolve@^1.0.7: version "1.0.7" @@ -10564,12 +10574,12 @@ extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + optionalDependencies: + "@types/yauzl" "^2.9.1" dependencies: debug "^4.1.1" get-stream "^5.1.0" yauzl "^2.10.0" - optionalDependencies: - "@types/yauzl" "^2.9.1" extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" @@ -10613,11 +10623,11 @@ fast-glob@3.3.1: resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== dependencies: - merge2 "^1.3.0" - micromatch "^4.0.4" - glob-parent "^5.1.2" "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" fast-glob@^3.3.2, fast-glob@^3.3.3: version "3.3.3" @@ -10749,12 +10759,12 @@ finalhandler@1.3.1: integrity sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ== dependencies: debug "2.6.9" - unpipe "~1.0.0" - parseurl "~1.3.3" - statuses "2.0.1" encodeurl "~2.0.0" escape-html "~1.0.3" on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" find-my-way-ts@^0.1.5: version "0.1.6" @@ -10830,8 +10840,8 @@ flat-cache@^4.0.0: resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz" integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: - keyv "^4.5.4" flatted "^3.2.9" + keyv "^4.5.4" flatted@^3.2.9, flatted@^3.3.3: version "3.3.3" @@ -10878,31 +10888,31 @@ form-data@~2.3.2: integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== dependencies: asynckit "^0.4.0" - mime-types "^2.1.12" combined-stream "^1.0.6" + mime-types "^2.1.12" form-data@^2.5.0: version "2.5.5" resolved "https://registry.npmjs.org/form-data/-/form-data-2.5.5.tgz" integrity sha512-jqdObeR2rxZZbPSGL+3VckHMYtu+f9//KXBsVny6JSX/pa38Fy+bGjuG8eW/H6USNQWhLi8Num++cU2yOCNz4A== dependencies: - hasown "^2.0.2" asynckit "^0.4.0" - mime-types "^2.1.35" - safe-buffer "^5.2.1" combined-stream "^1.0.8" es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.35" + safe-buffer "^5.2.1" form-data@^4.0.0: version "4.0.4" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz" integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== dependencies: - hasown "^2.0.2" asynckit "^0.4.0" - mime-types "^2.1.12" combined-stream "^1.0.8" es-set-tostringtag "^2.1.0" + hasown "^2.0.2" + mime-types "^2.1.12" form-data-encoder@1.7.2: version "1.7.2" @@ -10992,10 +11002,10 @@ fstream@^1.0.0, fstream@^1.0.12: resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz" integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg== dependencies: + graceful-fs "^4.1.2" + inherits "~2.0.0" mkdirp ">=0.5 0" rimraf "2" - inherits "~2.0.0" - graceful-fs "^4.1.2" function-bind@^1.1.2: version "1.1.2" @@ -11030,13 +11040,13 @@ gauge@~2.7.3: integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg== dependencies: aproba "^1.0.3" - strip-ansi "^3.0.1" - wide-align "^1.1.0" + console-control-strings "^1.0.0" has-unicode "^2.0.0" + object-assign "^4.1.0" signal-exit "^3.0.0" string-width "^1.0.1" - object-assign "^4.1.0" - console-control-strings "^1.0.0" + strip-ansi "^3.0.1" + wide-align "^1.1.0" geist@^1.3.1: version "1.4.2" @@ -11166,8 +11176,8 @@ git-raw-commits@^4.0.0: resolved "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz" integrity sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== dependencies: - meow "^12.0.1" dargs "^8.0.0" + meow "^12.0.1" split2 "^4.0.0" gitmoji@^1.1.1: @@ -11183,11 +11193,11 @@ glob@^7.0.3, glob@^7.1.3: resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== dependencies: - once "^1.3.0" + fs.realpath "^1.0.0" inflight "^1.0.4" inherits "2" minimatch "^3.1.1" - fs.realpath "^1.0.0" + once "^1.3.0" path-is-absolute "^1.0.0" glob@^10.0.0, glob@^10.2.2, glob@^10.3.10, glob@^10.4.5: @@ -11195,12 +11205,12 @@ glob@^10.0.0, glob@^10.2.2, glob@^10.3.10, glob@^10.4.5: resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== dependencies: - minipass "^7.1.2" + foreground-child "^3.1.0" jackspeak "^3.1.2" minimatch "^9.0.4" - path-scurry "^1.11.1" - foreground-child "^3.1.0" + minipass "^7.1.2" package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" glob@^11.0.0: version "11.0.3" @@ -11285,17 +11295,17 @@ got@^11.8.6: resolved "https://registry.npmjs.org/got/-/got-11.8.6.tgz" integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== dependencies: - p-cancelable "^2.0.0" - responselike "^2.0.0" - http2-wrapper "^1.0.0-beta.5.2" - lowercase-keys "^2.0.0" "@sindresorhus/is" "^4.0.0" + "@szmarczak/http-timer" "^4.0.5" + "@types/cacheable-request" "^6.0.1" + "@types/responselike" "^1.0.0" cacheable-lookup "^5.0.3" cacheable-request "^7.0.2" - "@types/responselike" "^1.0.0" decompress-response "^6.0.0" - "@szmarczak/http-timer" "^4.0.5" - "@types/cacheable-request" "^6.0.1" + http2-wrapper "^1.0.0-beta.5.2" + lowercase-keys "^2.0.0" + p-cancelable "^2.0.0" + responselike "^2.0.0" graceful-fs@4.2.10: version "4.2.10" @@ -11326,13 +11336,13 @@ handlebars@^4.7.7: version "4.7.8" resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz" integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== + optionalDependencies: + uglify-js "^3.1.4" dependencies: minimist "^1.2.5" neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" har-schema@^2.0.0: version "2.0.0" @@ -11497,10 +11507,10 @@ htmlparser2@^8.0.2: resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz" integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.3" domutils "^3.0.1" entities "^4.4.0" - domhandler "^5.0.3" - domelementtype "^2.3.0" http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.1: version "4.2.0" @@ -11514,9 +11524,9 @@ http-errors@2.0.0: dependencies: depd "2.0.0" inherits "2.0.4" + setprototypeof "1.2.0" statuses "2.0.1" toidentifier "1.0.1" - setprototypeof "1.2.0" http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1, http-proxy-agent@^7.0.2: version "7.0.2" @@ -11531,9 +11541,9 @@ http-signature@~1.2.0: resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz" integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ== dependencies: - sshpk "^1.7.0" - jsprim "^1.2.2" assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" "http2-wrapper@^1.0.0-beta.5.2": version "1.0.3" @@ -11730,13 +11740,13 @@ init-package-json@^7.0.2: resolved "https://registry.npmjs.org/init-package-json/-/init-package-json-7.0.2.tgz" integrity sha512-Qg6nAQulaOQZjvaSzVLtYRqZmuqOi7gTknqqgdhZy7LV5oO+ppvHWq15tZYzGyxJLTH5BxRTqTa+cPDx2pSD9Q== dependencies: + "@npmcli/package-json" "^6.0.0" + npm-package-arg "^12.0.0" + promzard "^2.0.0" read "^4.0.0" semver "^7.3.5" - promzard "^2.0.0" - npm-package-arg "^12.0.0" - "@npmcli/package-json" "^6.0.0" - validate-npm-package-name "^6.0.0" validate-npm-package-license "^3.0.4" + validate-npm-package-name "^6.0.0" inline-style-parser@0.2.4: version "0.2.4" @@ -12229,10 +12239,10 @@ jackspeak@^3.1.2: version "3.4.3" resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== - dependencies: - "@isaacs/cliui" "^8.0.2" optionalDependencies: "@pkgjs/parseargs" "^0.11.0" + dependencies: + "@isaacs/cliui" "^8.0.2" jackspeak@^4.1.1: version "4.1.1" @@ -12251,7 +12261,7 @@ jiti@^1.21.6: resolved "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz" integrity sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A== -jiti@2.4.2, jiti@^2.4.1, jiti@^2.4.2: +jiti@*, jiti@2.4.2, jiti@>=1.21.0, jiti@^2.4.1, jiti@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz" integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== @@ -12306,31 +12316,31 @@ jsbn@1.1.0: resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== -jsdom@^26.1.0: +jsdom@*, jsdom@^26.1.0: version "26.1.0" resolved "https://registry.npmjs.org/jsdom/-/jsdom-26.1.0.tgz" integrity sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg== dependencies: - ws "^8.18.0" - saxes "^6.0.0" - nwsapi "^2.2.16" - parse5 "^7.2.1" cssstyle "^4.2.1" data-urls "^5.0.0" decimal.js "^10.5.0" - whatwg-url "^14.1.1" + html-encoding-sniffer "^4.0.0" + http-proxy-agent "^7.0.2" + https-proxy-agent "^7.0.6" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.16" + parse5 "^7.2.1" rrweb-cssom "^0.8.0" + saxes "^6.0.0" symbol-tree "^3.2.4" tough-cookie "^5.1.1" - whatwg-encoding "^3.1.1" - whatwg-mimetype "^4.0.0" - http-proxy-agent "^7.0.2" - https-proxy-agent "^7.0.6" w3c-xmlserializer "^5.0.0" webidl-conversions "^7.0.0" + whatwg-encoding "^3.1.1" + whatwg-mimetype "^4.0.0" + whatwg-url "^14.1.1" + ws "^8.18.0" xml-name-validator "^5.0.0" - html-encoding-sniffer "^4.0.0" - is-potential-custom-element-name "^1.0.1" jsesc@^3.0.2: version "3.1.0" @@ -12414,18 +12424,18 @@ jsondiffpatch@0.6.0: resolved "https://registry.npmjs.org/jsondiffpatch/-/jsondiffpatch-0.6.0.tgz" integrity sha512-3QItJOXp2AP1uv7waBkao5nCvhEv+QmJAd38Ybq7wNI74Q+BBmnLn4EDKz6yI9xGAIQoUF87qHt+kc1IVxB4zQ== dependencies: + "@types/diff-match-patch" "^1.0.36" chalk "^5.3.0" diff-match-patch "^1.0.5" - "@types/diff-match-patch" "^1.0.36" jsonfile@^6.0.1, jsonfile@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" optionalDependencies: graceful-fs "^4.1.6" + dependencies: + universalify "^2.0.0" jsonparse@^1.2.0, jsonparse@^1.3.1: version "1.3.1" @@ -12437,26 +12447,26 @@ jsonwebtoken@^9.0.0, jsonwebtoken@^9.0.2: resolved "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz" integrity sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ== dependencies: - ms "^2.1.1" jws "^3.2.2" - semver "^7.5.4" - lodash.once "^4.0.0" lodash.includes "^4.3.0" - lodash.isnumber "^3.0.3" - lodash.isstring "^4.0.1" lodash.isboolean "^3.0.3" lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + semver "^7.5.4" jsprim@^1.2.2: version "1.4.2" resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz" integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw== dependencies: - verror "1.10.0" - extsprintf "1.3.0" assert-plus "1.0.0" + extsprintf "1.3.0" json-schema "0.4.0" + verror "1.10.0" "jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.5: version "3.3.5" @@ -12475,8 +12485,8 @@ jszip@*, jszip@^3.10.1: dependencies: lie "~3.3.0" pako "~1.0.2" - setimmediate "^1.0.5" readable-stream "~2.3.6" + setimmediate "^1.0.5" just-diff@^6.0.0: version "6.0.2" @@ -12493,9 +12503,9 @@ jwa@^1.4.1: resolved "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz" integrity sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw== dependencies: - safe-buffer "^5.0.1" - ecdsa-sig-formatter "1.0.11" buffer-equal-constant-time "^1.0.1" + ecdsa-sig-formatter "1.0.11" + safe-buffer "^5.0.1" jws@^3.2.2: version "3.2.2" @@ -12642,14 +12652,14 @@ libnpmpublish@^10.0.1: resolved "https://registry.npmjs.org/libnpmpublish/-/libnpmpublish-10.0.1.tgz" integrity sha512-xNa1DQs9a8dZetNRV0ky686MNzv1MTqB3szgOlRR3Fr24x1gWRu7aB9OpLZsml0YekmtppgHBkyZ+8QZlzmEyw== dependencies: - ssri "^12.0.0" - semver "^7.3.7" ci-info "^4.0.0" - proc-log "^5.0.0" - sigstore "^3.0.0" + normalize-package-data "^7.0.0" npm-package-arg "^12.0.0" npm-registry-fetch "^18.0.1" - normalize-package-data "^7.0.0" + proc-log "^5.0.0" + semver "^7.3.7" + sigstore "^3.0.0" + ssri "^12.0.0" libnpmsearch@^8.0.0: version "8.0.0" @@ -12671,11 +12681,11 @@ libnpmversion@^7.0.0: resolved "https://registry.npmjs.org/libnpmversion/-/libnpmversion-7.0.0.tgz" integrity sha512-0xle91R6F8r/Q/4tHOnyKko+ZSquEXNdxwRdKCPv4kC1cOVBMFXRsKKrVtRKtXcFn362U8ZlJefk4Apu00424g== dependencies: - semver "^7.3.7" - proc-log "^5.0.0" "@npmcli/git" "^6.0.1" "@npmcli/run-script" "^9.0.1" json-parse-even-better-errors "^4.0.0" + proc-log "^5.0.0" + semver "^7.3.7" lie@^3.0.2, lie@~3.3.0: version "3.3.0" @@ -12684,23 +12694,23 @@ lie@^3.0.2, lie@~3.3.0: dependencies: immediate "~3.0.5" -lightningcss@1.30.1: +lightningcss@1.30.1, lightningcss@^1.21.0: version "1.30.1" resolved "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz" integrity sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg== - dependencies: - detect-libc "^2.0.3" optionalDependencies: - lightningcss-darwin-x64 "1.30.1" - lightningcss-linux-x64-gnu "1.30.1" - lightningcss-win32-x64-msvc "1.30.1" - lightningcss-win32-arm64-msvc "1.30.1" lightningcss-darwin-arm64 "1.30.1" - lightningcss-linux-arm64-gnu "1.30.1" + lightningcss-darwin-x64 "1.30.1" + lightningcss-freebsd-x64 "1.30.1" lightningcss-linux-arm-gnueabihf "1.30.1" + lightningcss-linux-arm64-gnu "1.30.1" lightningcss-linux-arm64-musl "1.30.1" + lightningcss-linux-x64-gnu "1.30.1" lightningcss-linux-x64-musl "1.30.1" - lightningcss-freebsd-x64 "1.30.1" + lightningcss-win32-arm64-msvc "1.30.1" + lightningcss-win32-x64-msvc "1.30.1" + dependencies: + detect-libc "^2.0.3" lightningcss-darwin-arm64@1.30.1: version "1.30.1" @@ -13037,35 +13047,35 @@ make-fetch-happen@^13.0.0, make-fetch-happen@^13.0.1: resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz" integrity sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA== dependencies: - ssri "^10.0.0" + "@npmcli/agent" "^2.0.0" cacache "^18.0.0" - minipass "^7.0.2" - proc-log "^4.2.0" + http-cache-semantics "^4.1.1" is-lambda "^1.0.1" - negotiator "^0.6.3" - "@npmcli/agent" "^2.0.0" - promise-retry "^2.0.1" + minipass "^7.0.2" minipass-fetch "^3.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - http-cache-semantics "^4.1.1" + negotiator "^0.6.3" + proc-log "^4.2.0" + promise-retry "^2.0.1" + ssri "^10.0.0" make-fetch-happen@^14.0.0, make-fetch-happen@^14.0.2, make-fetch-happen@^14.0.3: version "14.0.3" resolved "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-14.0.3.tgz" integrity sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ== dependencies: - ssri "^12.0.0" + "@npmcli/agent" "^3.0.0" cacache "^19.0.1" + http-cache-semantics "^4.1.1" minipass "^7.0.2" - proc-log "^5.0.0" - negotiator "^1.0.0" - "@npmcli/agent" "^3.0.0" - promise-retry "^2.0.1" minipass-fetch "^4.0.0" minipass-flush "^1.0.5" minipass-pipeline "^1.2.4" - http-cache-semantics "^4.1.1" + negotiator "^1.0.0" + proc-log "^5.0.0" + promise-retry "^2.0.1" + ssri "^12.0.0" markdown-it@^14.0.0: version "14.1.0" @@ -13434,13 +13444,13 @@ micromark-extension-gfm-footnote@^2.0.0: integrity sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw== dependencies: devlop "^1.0.0" - micromark-util-types "^2.0.0" - micromark-util-symbol "^2.0.0" + micromark-core-commonmark "^2.0.0" micromark-factory-space "^2.0.0" micromark-util-character "^2.0.0" - micromark-core-commonmark "^2.0.0" - micromark-util-sanitize-uri "^2.0.0" micromark-util-normalize-identifier "^2.0.0" + micromark-util-sanitize-uri "^2.0.0" + micromark-util-symbol "^2.0.0" + micromark-util-types "^2.0.0" micromark-extension-gfm-strikethrough@^2.0.0: version "2.1.0" @@ -13574,10 +13584,10 @@ micromark-util-decode-string@^2.0.0: resolved "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz" integrity sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ== dependencies: + decode-named-character-reference "^1.0.0" micromark-util-character "^2.0.0" micromark-util-decode-numeric-character-reference "^2.0.0" micromark-util-symbol "^2.0.0" - decode-named-character-reference "^1.0.0" micromark-util-encode@^2.0.0: version "2.0.1" @@ -13775,23 +13785,23 @@ minipass-fetch@^3.0.0: version "3.0.5" resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz" integrity sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg== + optionalDependencies: + encoding "^0.1.13" dependencies: minipass "^7.0.3" - minizlib "^2.1.2" minipass-sized "^1.0.3" - optionalDependencies: - encoding "^0.1.13" + minizlib "^2.1.2" minipass-fetch@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-4.0.1.tgz" integrity sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ== + optionalDependencies: + encoding "^0.1.13" dependencies: minipass "^7.0.3" - minizlib "^3.0.1" minipass-sized "^1.0.3" - optionalDependencies: - encoding "^0.1.13" + minizlib "^3.0.1" minipass-flush@^1.0.5: version "1.0.5" @@ -13819,8 +13829,8 @@ minizlib@^2.1.1, minizlib@^2.1.2: resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: - yallist "^4.0.0" minipass "^3.0.0" + yallist "^4.0.0" minizlib@^3.0.1: version "3.0.2" @@ -13917,8 +13927,6 @@ msgpackr-extract@^3.0.2: version "3.0.3" resolved "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz" integrity sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA== - dependencies: - node-gyp-build-optional-packages "5.2.2" optionalDependencies: "@msgpackr-extract/msgpackr-extract-darwin-arm64" "3.0.3" "@msgpackr-extract/msgpackr-extract-darwin-x64" "3.0.3" @@ -13926,6 +13934,8 @@ msgpackr-extract@^3.0.2: "@msgpackr-extract/msgpackr-extract-linux-arm64" "3.0.3" "@msgpackr-extract/msgpackr-extract-linux-x64" "3.0.3" "@msgpackr-extract/msgpackr-extract-win32-x64" "3.0.3" + dependencies: + node-gyp-build-optional-packages "5.2.2" multipasta@^0.2.5: version "0.2.7" @@ -14010,26 +14020,26 @@ netmask@^2.0.2: resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" integrity sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg== -"next@15.4.0-canary.85", "next@>= 14.0.0", next@>=13.2.0, "next@^13.0.0 || ^14.0.0 || ^15.0.0": +next@*, "next@15.4.0-canary.85", "next@>= 14.0.0", next@>=13.2.0, next@>=14.2.0, "next@^13.0.0 || ^14.0.0 || ^15.0.0": version "15.4.0-canary.85" resolved "https://registry.npmjs.org/next/-/next-15.4.0-canary.85.tgz" integrity sha512-xD+Es5CYPkb20//rQ9/vmWhx1TCohe8V2BhVzwkMv9UwAF8wMUK4GCyHyyXnvxqlNRfGG8KhDjS4IaTxq1ShEg== - dependencies: - postcss "8.4.31" - "@next/env" "15.4.0-canary.85" - styled-jsx "5.1.6" - "@swc/helpers" "0.5.15" - caniuse-lite "^1.0.30001579" optionalDependencies: - sharp "^0.34.1" - "@next/swc-darwin-x64" "15.4.0-canary.85" "@next/swc-darwin-arm64" "15.4.0-canary.85" - "@next/swc-linux-x64-gnu" "15.4.0-canary.85" - "@next/swc-linux-x64-musl" "15.4.0-canary.85" - "@next/swc-win32-x64-msvc" "15.4.0-canary.85" + "@next/swc-darwin-x64" "15.4.0-canary.85" "@next/swc-linux-arm64-gnu" "15.4.0-canary.85" "@next/swc-linux-arm64-musl" "15.4.0-canary.85" + "@next/swc-linux-x64-gnu" "15.4.0-canary.85" + "@next/swc-linux-x64-musl" "15.4.0-canary.85" "@next/swc-win32-arm64-msvc" "15.4.0-canary.85" + "@next/swc-win32-x64-msvc" "15.4.0-canary.85" + sharp "^0.34.1" + dependencies: + "@next/env" "15.4.0-canary.85" + "@swc/helpers" "0.5.15" + caniuse-lite "^1.0.30001579" + postcss "8.4.31" + styled-jsx "5.1.6" next-safe-action@^8.0.3: version "8.0.8" @@ -14073,34 +14083,34 @@ node-gyp@^3.0.3: resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz" integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA== dependencies: - tar "^2.0.0" + fstream "^1.0.0" glob "^7.0.3" - nopt "2 || 3" - osenv "0" - which "1" + graceful-fs "^4.1.2" mkdirp "^0.5.0" + nopt "2 || 3" npmlog "0 || 1 || 2 || 3 || 4" + osenv "0" + request "^2.87.0" rimraf "2" semver "~5.3.0" - fstream "^1.0.0" - request "^2.87.0" - graceful-fs "^4.1.2" + tar "^2.0.0" + which "1" node-gyp@^10.0.0: version "10.3.1" resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-10.3.1.tgz" integrity sha512-Pp3nFHBThHzVtNY7U6JfPjvT/DTE8+o/4xKsLQtBoU+j2HLsGlhcfzflAoUreaJbNmYnX+LlLi0qjV8kpyO6xQ== dependencies: - tar "^6.2.1" - glob "^10.3.10" - nopt "^7.0.0" - which "^4.0.0" - semver "^7.3.5" - proc-log "^4.1.0" env-paths "^2.2.0" + exponential-backoff "^3.1.1" + glob "^10.3.10" graceful-fs "^4.2.6" make-fetch-happen "^13.0.0" - exponential-backoff "^3.1.1" + nopt "^7.0.0" + proc-log "^4.1.0" + semver "^7.3.5" + tar "^6.2.1" + which "^4.0.0" node-gyp@^11.0.0, node-gyp@^11.2.0: version "11.2.0" @@ -14156,8 +14166,8 @@ normalize-package-data@^6.0.0: resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-6.0.2.tgz" integrity sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g== dependencies: - semver "^7.3.5" hosted-git-info "^7.0.0" + semver "^7.3.5" validate-npm-package-license "^3.0.4" normalize-package-data@^7.0.0: @@ -14311,9 +14321,9 @@ npm-package-arg@^11.0.0, npm-package-arg@^11.0.2: resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-11.0.3.tgz" integrity sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw== dependencies: - semver "^7.3.5" - proc-log "^4.0.0" hosted-git-info "^7.0.0" + proc-log "^4.0.0" + semver "^7.3.5" validate-npm-package-name "^5.0.0" npm-package-arg@^12.0.0, npm-package-arg@^12.0.2: @@ -14321,9 +14331,9 @@ npm-package-arg@^12.0.0, npm-package-arg@^12.0.2: resolved "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-12.0.2.tgz" integrity sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA== dependencies: - semver "^7.3.5" - proc-log "^5.0.0" hosted-git-info "^8.0.0" + proc-log "^5.0.0" + semver "^7.3.5" validate-npm-package-name "^6.0.0" npm-packlist@^8.0.0: @@ -14345,56 +14355,56 @@ npm-pick-manifest@^9.0.0, npm-pick-manifest@^9.0.1: resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-9.1.0.tgz" integrity sha512-nkc+3pIIhqHVQr085X9d2JzPzLyjzQS96zbruppqC9aZRm/x8xx6xhI98gHtsfELP2bE+loHq8ZaHFHhe+NauA== dependencies: - semver "^7.3.5" - npm-package-arg "^11.0.0" npm-install-checks "^6.0.0" npm-normalize-package-bin "^3.0.0" + npm-package-arg "^11.0.0" + semver "^7.3.5" npm-pick-manifest@^10.0.0: version "10.0.0" resolved "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-10.0.0.tgz" integrity sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ== dependencies: - semver "^7.3.5" - npm-package-arg "^12.0.0" npm-install-checks "^7.1.0" npm-normalize-package-bin "^4.0.0" + npm-package-arg "^12.0.0" + semver "^7.3.5" npm-profile@^11.0.1: version "11.0.1" resolved "https://registry.npmjs.org/npm-profile/-/npm-profile-11.0.1.tgz" integrity sha512-HP5Cw9WHwFS9vb4fxVlkNAQBUhVL5BmW6rAR+/JWkpwqcFJid7TihKUdYDWqHl0NDfLd0mpucheGySqo8ysyfw== dependencies: - proc-log "^5.0.0" npm-registry-fetch "^18.0.0" + proc-log "^5.0.0" npm-registry-fetch@^17.0.0, npm-registry-fetch@^17.0.1: version "17.1.0" resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-17.1.0.tgz" integrity sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA== dependencies: - minipass "^7.0.2" - minizlib "^2.1.2" - proc-log "^4.0.0" - jsonparse "^1.3.1" "@npmcli/redact" "^2.0.0" + jsonparse "^1.3.1" + make-fetch-happen "^13.0.0" + minipass "^7.0.2" minipass-fetch "^3.0.0" + minizlib "^2.1.2" npm-package-arg "^11.0.0" - make-fetch-happen "^13.0.0" + proc-log "^4.0.0" npm-registry-fetch@^18.0.0, npm-registry-fetch@^18.0.1, npm-registry-fetch@^18.0.2: version "18.0.2" resolved "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-18.0.2.tgz" integrity sha512-LeVMZBBVy+oQb5R6FDV9OlJCcWDU+al10oKpe+nsvcHnG24Z3uM3SvJYKfGJlfGjVU8v9liejCrUR/M5HO5NEQ== dependencies: - minipass "^7.0.2" - minizlib "^3.0.1" - proc-log "^5.0.0" - jsonparse "^1.3.1" "@npmcli/redact" "^3.0.0" + jsonparse "^1.3.1" + make-fetch-happen "^14.0.0" + minipass "^7.0.2" minipass-fetch "^4.0.0" + minizlib "^3.0.1" npm-package-arg "^12.0.0" - make-fetch-happen "^14.0.0" + proc-log "^5.0.0" npm-run-path@^4.0.1: version "4.0.1" @@ -14428,10 +14438,10 @@ npm-user-validate@^3.0.0: resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== dependencies: - gauge "~2.7.3" - set-blocking "~2.0.0" are-we-there-yet "~1.1.2" console-control-strings "~1.1.0" + gauge "~2.7.3" + set-blocking "~2.0.0" number-flow@0.5.8: version "0.5.8" @@ -14594,12 +14604,12 @@ optionator@^0.9.3: resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" integrity sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g== dependencies: - prelude-ls "^1.2.1" deep-is "^0.1.3" - word-wrap "^1.2.5" - type-check "^0.4.0" - levn "^0.4.1" fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + word-wrap "^1.2.5" ora@^8.0.0, ora@^8.2.0: version "8.2.0" @@ -14636,8 +14646,8 @@ osenv@0: resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== dependencies: - os-tmpdir "^1.0.0" os-homedir "^1.0.0" + os-tmpdir "^1.0.0" own-keys@^1.0.1: version "1.0.1" @@ -14734,8 +14744,8 @@ p-queue@^6, p-queue@^6.6.1: resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== dependencies: - p-timeout "^3.2.0" eventemitter3 "^4.0.4" + p-timeout "^3.2.0" p-reduce@^2.0.0: version "2.1.0" @@ -14752,8 +14762,8 @@ p-retry@^4: resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== dependencies: - retry "^0.13.1" "@types/retry" "0.12.0" + retry "^0.13.1" p-timeout@^3.2.0: version "3.2.0" @@ -14799,69 +14809,69 @@ pacote@^18.0.0, pacote@^18.0.6: resolved "https://registry.npmjs.org/pacote/-/pacote-18.0.6.tgz" integrity sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A== dependencies: - tar "^6.1.11" - ssri "^10.0.0" - cacache "^18.0.0" - minipass "^7.0.2" - proc-log "^4.0.0" - sigstore "^2.2.0" "@npmcli/git" "^5.0.0" + "@npmcli/installed-package-contents" "^2.0.1" + "@npmcli/package-json" "^5.1.0" + "@npmcli/promise-spawn" "^7.0.0" + "@npmcli/run-script" "^8.0.0" + cacache "^18.0.0" fs-minipass "^3.0.0" - npm-packlist "^8.0.0" - promise-retry "^2.0.1" + minipass "^7.0.2" npm-package-arg "^11.0.0" + npm-packlist "^8.0.0" npm-pick-manifest "^9.0.0" - "@npmcli/run-script" "^8.0.0" npm-registry-fetch "^17.0.0" - "@npmcli/package-json" "^5.1.0" - "@npmcli/promise-spawn" "^7.0.0" - "@npmcli/installed-package-contents" "^2.0.1" + proc-log "^4.0.0" + promise-retry "^2.0.1" + sigstore "^2.2.0" + ssri "^10.0.0" + tar "^6.1.11" pacote@^19.0.0, pacote@^19.0.1: version "19.0.1" resolved "https://registry.npmjs.org/pacote/-/pacote-19.0.1.tgz" integrity sha512-zIpxWAsr/BvhrkSruspG8aqCQUUrWtpwx0GjiRZQhEM/pZXrigA32ElN3vTcCPUDOFmHr6SFxwYrvVUs5NTEUg== dependencies: - tar "^6.1.11" - ssri "^12.0.0" - cacache "^19.0.0" - minipass "^7.0.2" - proc-log "^5.0.0" - sigstore "^3.0.0" "@npmcli/git" "^6.0.0" + "@npmcli/installed-package-contents" "^3.0.0" + "@npmcli/package-json" "^6.0.0" + "@npmcli/promise-spawn" "^8.0.0" + "@npmcli/run-script" "^9.0.0" + cacache "^19.0.0" fs-minipass "^3.0.0" - npm-packlist "^9.0.0" - promise-retry "^2.0.1" + minipass "^7.0.2" npm-package-arg "^12.0.0" + npm-packlist "^9.0.0" npm-pick-manifest "^10.0.0" - "@npmcli/run-script" "^9.0.0" npm-registry-fetch "^18.0.0" - "@npmcli/package-json" "^6.0.0" - "@npmcli/promise-spawn" "^8.0.0" - "@npmcli/installed-package-contents" "^3.0.0" + proc-log "^5.0.0" + promise-retry "^2.0.1" + sigstore "^3.0.0" + ssri "^12.0.0" + tar "^6.1.11" pacote@^20.0.0: version "20.0.0" resolved "https://registry.npmjs.org/pacote/-/pacote-20.0.0.tgz" integrity sha512-pRjC5UFwZCgx9kUFDVM9YEahv4guZ1nSLqwmWiLUnDbGsjs+U5w7z6Uc8HNR1a6x8qnu5y9xtGE6D1uAuYz+0A== dependencies: - tar "^6.1.11" - ssri "^12.0.0" - cacache "^19.0.0" - minipass "^7.0.2" - proc-log "^5.0.0" - sigstore "^3.0.0" "@npmcli/git" "^6.0.0" + "@npmcli/installed-package-contents" "^3.0.0" + "@npmcli/package-json" "^6.0.0" + "@npmcli/promise-spawn" "^8.0.0" + "@npmcli/run-script" "^9.0.0" + cacache "^19.0.0" fs-minipass "^3.0.0" - npm-packlist "^9.0.0" - promise-retry "^2.0.1" + minipass "^7.0.2" npm-package-arg "^12.0.0" + npm-packlist "^9.0.0" npm-pick-manifest "^10.0.0" - "@npmcli/run-script" "^9.0.0" npm-registry-fetch "^18.0.0" - "@npmcli/package-json" "^6.0.0" - "@npmcli/promise-spawn" "^8.0.0" - "@npmcli/installed-package-contents" "^3.0.0" + proc-log "^5.0.0" + promise-retry "^2.0.1" + sigstore "^3.0.0" + ssri "^12.0.0" + tar "^6.1.11" pako@~1.0.2: version "1.0.11" @@ -14880,18 +14890,18 @@ parse-conflict-json@^3.0.0: resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-3.0.1.tgz" integrity sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw== dependencies: + json-parse-even-better-errors "^3.0.0" just-diff "^6.0.0" just-diff-apply "^5.2.0" - json-parse-even-better-errors "^3.0.0" parse-conflict-json@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/parse-conflict-json/-/parse-conflict-json-4.0.0.tgz" integrity sha512-37CN2VtcuvKgHUs8+0b1uJeEsbGn61GRHz469C94P5xiOoqpDYJYwjg4RY9Vmz39WyZAVkR5++nbJwLMIgOCnQ== dependencies: + json-parse-even-better-errors "^4.0.0" just-diff "^6.0.0" just-diff-apply "^5.2.0" - json-parse-even-better-errors "^4.0.0" parse-entities@^4.0.0: version "4.0.2" @@ -14919,10 +14929,10 @@ parse-json@^5.0.0, parse-json@^5.2.0: resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== dependencies: - error-ex "^1.3.1" "@babel/code-frame" "^7.0.0" - lines-and-columns "^1.1.6" + error-ex "^1.3.1" json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" parse-json@^8.0.0: version "8.3.0" @@ -15015,8 +15025,8 @@ path-scurry@^1.11.1: resolved "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz" integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== dependencies: - minipass "^5.0.0 || ^6.0.2 || ^7.0.0" lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" path-scurry@^2.0.0: version "2.0.0" @@ -15075,14 +15085,14 @@ pg@>=8.0, pg@^8.11.3: version "8.16.3" resolved "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz" integrity sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw== + optionalDependencies: + pg-cloudflare "^1.2.7" dependencies: pg-connection-string "^2.9.1" pg-pool "^3.10.1" pg-protocol "^1.10.3" pg-types "2.2.0" pgpass "1.0.5" - optionalDependencies: - pg-cloudflare "^1.2.7" pg-cloudflare@^1.2.7: version "1.2.7" @@ -15142,7 +15152,7 @@ picomatch@^3.0.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-3.0.1.tgz" integrity sha512-I3EurrIQMlRc9IaAZnqRR044Phh2DXY+55o7uJ0V+hYZAcQYSuFWsc9q5PvyDHUSCe1Qxn/iBz+78s86zWnGag== -picomatch@^4.0.2: +"picomatch@^3 || ^4", picomatch@^4.0.2: version "4.0.3" resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz" integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== @@ -15182,9 +15192,9 @@ pkg-types@^1.1.3, pkg-types@^1.3.0: resolved "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz" integrity sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ== dependencies: + confbox "^0.1.8" mlly "^1.7.4" pathe "^2.0.1" - confbox "^0.1.8" pkg-types@^2.0.0: version "2.2.0" @@ -15199,10 +15209,10 @@ playwright@1.54.1: version "1.54.1" resolved "https://registry.npmjs.org/playwright/-/playwright-1.54.1.tgz" integrity sha512-peWpSwIBmSLi6aW2auvrUtf2DqY16YYcCMO8rTVx486jKmDTJg7UAhyrraP98GB8BoPURZP8+nxO7TSd4cPr5g== - dependencies: - playwright-core "1.54.1" optionalDependencies: fsevents "2.3.2" + dependencies: + playwright-core "1.54.1" playwright-core@1.54.1, playwright-core@^1.52.0: version "1.54.1" @@ -15223,7 +15233,7 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.38, postcss@^8.4.41, postcss@^8.4.47, postcss@^8.5.3, postcss@^8.5.4, postcss@^8.5.6: +postcss@>=8.0.9, postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.12, postcss@^8.4.21, postcss@^8.4.38, postcss@^8.4.41, postcss@^8.4.47, postcss@^8.5.3, postcss@^8.5.4, postcss@^8.5.6: version "8.5.6" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== @@ -15237,9 +15247,9 @@ postcss-import@^15.1.0: resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== dependencies: - resolve "^1.1.7" - read-cache "^1.0.0" postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" postcss-js@^4.0.1: version "4.0.1" @@ -15253,8 +15263,8 @@ postcss-load-config@^4.0.2: resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz" integrity sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ== dependencies: - yaml "^2.3.4" lilconfig "^3.0.0" + yaml "^2.3.4" postcss-load-config@^6.0.1: version "6.0.1" @@ -15368,7 +15378,7 @@ prettier@>=2.0, prettier@^3.0, prettier@^3.5.3: resolved "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz" integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== -prettier-plugin-organize-imports@^4.1.0: +prettier-plugin-organize-imports@*, prettier-plugin-organize-imports@^4.1.0: version "4.2.0" resolved "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-4.2.0.tgz" integrity sha512-Zdy27UhlmyvATZi67BTnLcKTo8fm6Oik59Sz6H64PgZJVs6NJpPD1mT240mmJn62c98/QaL+r3kx9Q3gRpDajg== @@ -15383,9 +15393,9 @@ pretty-format@^27.0.2: resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== dependencies: - react-is "^17.0.1" ansi-regex "^5.0.1" ansi-styles "^5.0.0" + react-is "^17.0.1" pretty-ms@^9.2.0: version "9.2.0" @@ -15394,7 +15404,7 @@ pretty-ms@^9.2.0: dependencies: parse-ms "^4.0.0" -prisma@^6.9.0: +prisma@*, prisma@^6.9.0: version "6.12.0" resolved "https://registry.npmjs.org/prisma/-/prisma-6.12.0.tgz" integrity sha512-pmV7NEqQej9WjizN6RSNIwf7Y+jeh9mY1JEX2WjGxJi4YZWexClhde1yz/FuvAM+cTwzchcMytu2m4I6wPkIzg== @@ -15534,8 +15544,8 @@ prosemirror-commands@^1.0.0, prosemirror-commands@^1.6.2: integrity sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w== dependencies: prosemirror-model "^1.0.0" - prosemirror-transform "^1.10.2" prosemirror-state "^1.0.0" + prosemirror-transform "^1.10.2" prosemirror-dropcursor@^1.8.1: version "1.8.2" @@ -15543,8 +15553,8 @@ prosemirror-dropcursor@^1.8.1: integrity sha512-CCk6Gyx9+Tt2sbYk5NK0nB1ukHi2ryaRgadV/LvyNuO3ena1payM2z6Cg0vO1ebK8cxbzo41ku2DE5Axj1Zuiw== dependencies: prosemirror-state "^1.0.0" - prosemirror-view "^1.1.0" prosemirror-transform "^1.1.0" + prosemirror-view "^1.1.0" prosemirror-gapcursor@^1.3.2: version "1.3.2" @@ -15579,17 +15589,17 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.2.2: resolved "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz" integrity sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw== dependencies: - w3c-keyname "^2.2.0" prosemirror-state "^1.0.0" + w3c-keyname "^2.2.0" prosemirror-markdown@^1.13.1: version "1.13.2" resolved "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz" integrity sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g== dependencies: + "@types/markdown-it" "^14.0.0" markdown-it "^14.0.0" prosemirror-model "^1.25.0" - "@types/markdown-it" "^14.0.0" prosemirror-menu@^1.2.4: version "1.2.5" @@ -15597,9 +15607,9 @@ prosemirror-menu@^1.2.4: integrity sha512-qwXzynnpBIeg1D7BAtjOusR+81xCp53j7iWu/IargiRZqRjGIlQuu1f3jFi+ehrHhWMLoyOQTSRx/IWZJqOYtQ== dependencies: crelt "^1.0.0" - prosemirror-state "^1.0.0" prosemirror-commands "^1.0.0" prosemirror-history "^1.0.0" + prosemirror-state "^1.0.0" prosemirror-model@^1.0.0, prosemirror-model@^1.20.0, prosemirror-model@^1.21.0, prosemirror-model@^1.22.1, prosemirror-model@^1.23.0, prosemirror-model@^1.25.0: version "1.25.2" @@ -15621,8 +15631,8 @@ prosemirror-schema-list@^1.4.1: integrity sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q== dependencies: prosemirror-model "^1.0.0" - prosemirror-transform "^1.7.3" prosemirror-state "^1.0.0" + prosemirror-transform "^1.7.3" prosemirror-state@^1.0.0, prosemirror-state@^1.2.2, prosemirror-state@^1.4.2, prosemirror-state@^1.4.3: version "1.4.3" @@ -15810,18 +15820,18 @@ raw-body@2.5.2, raw-body@^2.3.3: integrity sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA== dependencies: bytes "3.1.2" - unpipe "1.0.0" - iconv-lite "0.4.24" http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" rc@^1.2.8: version "1.2.8" resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: + deep-extend "^0.6.0" ini "~1.3.0" minimist "^1.2.0" - deep-extend "^0.6.0" strip-json-comments "~2.0.1" react@*, react@18.x, "react@>= 16.14", "react@>= 16.8 || 18.0.0", "react@>= 16.8.0", "react@>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0", "react@>= 18.2.0", react@>=16, react@>=16.13, react@>=16.6.0, react@>=16.8, "react@>=16.8.0 || ^17.0.0 || ^18", react@>=17.0, react@>=18, "react@>=18.2.0 || ^19.0.0-0", "react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react@^16.8.0 || ^17 || ^18 || ^19", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.8.0 || ^17.0.1 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react@^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc", "react@^17 || ^18 || ^19", "react@^17.0.2 || ^18.0.0 || ^19.0.0", "react@^18 || ^19", "react@^18 || ^19 || ^19.0.0-rc", "react@^18.0 || ^19.0", "react@^18.0 || ^19.0 || ^19.0.0-rc", "react@^18.0.0 || ^19.0.0", "react@^18.0.0 || ^19.0.0 || ^19.0.0-rc", react@^18.2.0, "react@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react@^18.2.0 || ^19.0.0", react@^19, react@^19.1.0: @@ -15863,7 +15873,7 @@ react-dnd-html5-backend@^16.0.1: dependencies: dnd-core "^16.0.1" -react-dom@*, "react-dom@>= 18.2.0", react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=18.0.0, "react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", react-dom@^18.2.0, "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom@^18.2.0 || ^19.0.0", react-dom@^19.1.0: +react-dom@*, "react-dom@>= 18.2.0", react-dom@>=16.13, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=18.0.0, "react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc", "react-dom@^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom@^18 || ^19", "react-dom@^18 || ^19 || ^19.0.0-rc", "react-dom@^18.0.0 || ^19.0.0", "react-dom@^18.0.0 || ^19.0.0 || ^19.0.0-rc", react-dom@^18.2.0, "react-dom@^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom@^18.2.0 || ^19.0.0", react-dom@^19, react-dom@^19.1.0: version "19.1.0" resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz" integrity sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g== @@ -15942,17 +15952,17 @@ react-markdown@^9.1.0: resolved "https://registry.npmjs.org/react-markdown/-/react-markdown-9.1.0.tgz" integrity sha512-xaijuJB0kzGiUdG7nc2MOMDUDBWPyGAjZtUrow9XxUeua8IqeP+VlIfAZ3bphpcLTnSZXz6z9jcVC/TCwbfgdw== dependencies: - vfile "^6.0.0" - devlop "^1.0.0" - unified "^11.0.0" "@types/hast" "^3.0.0" "@types/mdast" "^4.0.0" + devlop "^1.0.0" + hast-util-to-jsx-runtime "^2.0.0" + html-url-attributes "^3.0.0" + mdast-util-to-hast "^13.0.0" remark-parse "^11.0.0" remark-rehype "^11.0.0" + unified "^11.0.0" unist-util-visit "^5.0.0" - mdast-util-to-hast "^13.0.0" - html-url-attributes "^3.0.0" - hast-util-to-jsx-runtime "^2.0.0" + vfile "^6.0.0" react-number-format@^5.4.2: version "5.4.4" @@ -16038,8 +16048,8 @@ react-style-singleton@^2.2.2, react-style-singleton@^2.2.3: resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.3.tgz" integrity sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ== dependencies: - tslib "^2.0.0" get-nonce "^1.0.0" + tslib "^2.0.0" react-textarea-autosize@^8.5.9: version "8.5.9" @@ -16129,16 +16139,16 @@ read-package-json-fast@^3.0.0, read-package-json-fast@^3.0.2: resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-3.0.2.tgz" integrity sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw== dependencies: - npm-normalize-package-bin "^3.0.0" json-parse-even-better-errors "^3.0.0" + npm-normalize-package-bin "^3.0.0" read-package-json-fast@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz" integrity sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg== dependencies: - npm-normalize-package-bin "^4.0.0" json-parse-even-better-errors "^4.0.0" + npm-normalize-package-bin "^4.0.0" read-package-up@^11.0.0: version "11.0.0" @@ -16173,13 +16183,13 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: - isarray "~1.0.0" + core-util-is "~1.0.0" inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" safe-buffer "~5.1.1" - core-util-is "~1.0.0" string_decoder "~1.1.1" util-deprecate "~1.0.1" - process-nextick-args "~2.0.0" readable-stream@^4.0.0: version "4.7.0" @@ -16217,10 +16227,10 @@ recharts@2.15.0: integrity sha512-cIvMxDfpAmqAmVgc4yb7pgm/O1tmmkl/CjrvXuW+62/+7jj/iF9Ykm+hb/UJt42TREHMyd3gb+pkgoa2MxgDIw== dependencies: clsx "^2.0.0" + eventemitter3 "^4.0.1" lodash "^4.17.21" react-is "^18.3.1" react-smooth "^4.0.0" - eventemitter3 "^4.0.1" recharts-scale "^0.4.4" tiny-invariant "^1.3.1" victory-vendor "^36.6.8" @@ -16327,26 +16337,26 @@ request@^2.87.0: resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz" integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw== dependencies: - qs "~6.5.2" + aws-sign2 "~0.7.0" aws4 "^1.8.0" - uuid "^3.3.2" - extend "~3.0.2" caseless "~0.12.0" - isstream "~0.1.2" - aws-sign2 "~0.7.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" mime-types "~2.1.19" oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" safe-buffer "^5.1.2" tough-cookie "~2.5.0" tunnel-agent "^0.6.0" - forever-agent "~0.6.1" - har-validator "~5.1.3" - is-typedarray "~1.0.0" - http-signature "~1.2.0" - combined-stream "~1.0.6" - performance-now "^2.1.0" - json-stringify-safe "~5.0.1" + uuid "^3.3.2" require-directory@^2.1.1: version "2.1.1" @@ -16393,8 +16403,8 @@ resolve@^1.1.7, resolve@^1.19.0, resolve@^1.22.4, resolve@^1.22.8: resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz" integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - path-parse "^1.0.7" is-core-module "^2.13.0" + path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" resolve-alpn@^1.0.0: @@ -16476,30 +16486,30 @@ rollup@^4.13.0, rollup@^4.34.8, rollup@^4.34.9, rollup@^4.40.0: version "4.45.1" resolved "https://registry.npmjs.org/rollup/-/rollup-4.45.1.tgz" integrity sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw== - dependencies: - "@types/estree" "1.0.8" optionalDependencies: - fsevents "~2.3.2" - "@rollup/rollup-darwin-arm64" "4.45.1" + "@rollup/rollup-android-arm-eabi" "4.45.1" "@rollup/rollup-android-arm64" "4.45.1" - "@rollup/rollup-win32-arm64-msvc" "4.45.1" + "@rollup/rollup-darwin-arm64" "4.45.1" + "@rollup/rollup-darwin-x64" "4.45.1" "@rollup/rollup-freebsd-arm64" "4.45.1" - "@rollup/rollup-linux-arm64-gnu" "4.45.1" - "@rollup/rollup-linux-arm64-musl" "4.45.1" - "@rollup/rollup-android-arm-eabi" "4.45.1" + "@rollup/rollup-freebsd-x64" "4.45.1" "@rollup/rollup-linux-arm-gnueabihf" "4.45.1" "@rollup/rollup-linux-arm-musleabihf" "4.45.1" - "@rollup/rollup-win32-ia32-msvc" "4.45.1" + "@rollup/rollup-linux-arm64-gnu" "4.45.1" + "@rollup/rollup-linux-arm64-musl" "4.45.1" "@rollup/rollup-linux-loongarch64-gnu" "4.45.1" + "@rollup/rollup-linux-powerpc64le-gnu" "4.45.1" "@rollup/rollup-linux-riscv64-gnu" "4.45.1" "@rollup/rollup-linux-riscv64-musl" "4.45.1" - "@rollup/rollup-linux-powerpc64le-gnu" "4.45.1" "@rollup/rollup-linux-s390x-gnu" "4.45.1" - "@rollup/rollup-darwin-x64" "4.45.1" - "@rollup/rollup-win32-x64-msvc" "4.45.1" - "@rollup/rollup-freebsd-x64" "4.45.1" "@rollup/rollup-linux-x64-gnu" "4.45.1" "@rollup/rollup-linux-x64-musl" "4.45.1" + "@rollup/rollup-win32-arm64-msvc" "4.45.1" + "@rollup/rollup-win32-ia32-msvc" "4.45.1" + "@rollup/rollup-win32-x64-msvc" "4.45.1" + fsevents "~2.3.2" + dependencies: + "@types/estree" "1.0.8" rope-sequence@^1.3.0: version "1.3.4" @@ -16731,29 +16741,29 @@ send@0.19.0: resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw== dependencies: - ms "2.1.3" - depd "2.0.0" - etag "~1.8.1" - mime "1.6.0" debug "2.6.9" - fresh "0.5.2" + depd "2.0.0" destroy "1.2.0" - statuses "2.0.1" encodeurl "~1.0.2" escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" on-finished "2.4.1" range-parser "~1.2.1" + statuses "2.0.1" serve-static@1.16.2: version "1.16.2" resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz" integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw== dependencies: - send "0.19.0" - parseurl "~1.3.3" encodeurl "~2.0.0" escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.19.0" server-only@0.0.1, server-only@^0.0.1: version "0.0.1" @@ -16818,12 +16828,8 @@ setprototypeof@1.2.0: sharp@^0.34.1, sharp@^0.34.2: version "0.34.3" - resolved "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz" - integrity sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg== - dependencies: - color "^4.2.3" - detect-libc "^2.0.4" - semver "^7.7.2" + resolved "https://registry.npmjs.org/sharp/-/sharp-0.34.3.tgz" + integrity sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg== optionalDependencies: "@img/sharp-darwin-arm64" "0.34.3" "@img/sharp-darwin-x64" "0.34.3" @@ -16847,6 +16853,10 @@ sharp@^0.34.1, sharp@^0.34.2: "@img/sharp-win32-arm64" "0.34.3" "@img/sharp-win32-ia32" "0.34.3" "@img/sharp-win32-x64" "0.34.3" + dependencies: + color "^4.2.3" + detect-libc "^2.0.4" + semver "^7.7.2" shebang-command@^2.0.0: version "2.0.0" @@ -16939,12 +16949,12 @@ sigstore@^2.2.0: resolved "https://registry.npmjs.org/sigstore/-/sigstore-2.3.1.tgz" integrity sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ== dependencies: - "@sigstore/tuf" "^2.3.4" + "@sigstore/bundle" "^2.3.2" "@sigstore/core" "^1.0.0" + "@sigstore/protobuf-specs" "^0.3.2" "@sigstore/sign" "^2.3.2" - "@sigstore/bundle" "^2.3.2" + "@sigstore/tuf" "^2.3.4" "@sigstore/verify" "^1.2.1" - "@sigstore/protobuf-specs" "^0.3.2" sigstore@^3.0.0: version "3.1.0" @@ -17006,13 +17016,13 @@ socket.io@^4.8.1: resolved "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz" integrity sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg== dependencies: - cors "~2.8.5" - debug "~4.3.2" accepts "~1.3.4" base64id "~2.0.0" + cors "~2.8.5" + debug "~4.3.2" engine.io "~6.6.0" - socket.io-parser "~4.2.4" socket.io-adapter "~2.5.2" + socket.io-parser "~4.2.4" socket.io-adapter@~2.5.2: version "2.5.5" @@ -17027,18 +17037,18 @@ socket.io-client@4.7.5: resolved "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz" integrity sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ== dependencies: + "@socket.io/component-emitter" "~3.1.0" debug "~4.3.2" engine.io-client "~6.5.2" socket.io-parser "~4.2.4" - "@socket.io/component-emitter" "~3.1.0" socket.io-parser@~4.2.4: version "4.2.4" resolved "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz" integrity sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew== dependencies: - debug "~4.3.1" "@socket.io/component-emitter" "~3.1.0" + debug "~4.3.1" socks@^2.8.3: version "2.8.6" @@ -17174,14 +17184,14 @@ sshpk@^1.7.0: integrity sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ== dependencies: asn1 "~0.2.3" - jsbn "~0.1.0" - getpass "^0.1.1" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - tweetnacl "~0.14.0" assert-plus "^1.0.0" bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" safer-buffer "^2.0.2" + tweetnacl "~0.14.0" ssri@^10.0.0, ssri@^10.0.6: version "10.0.6" @@ -17241,8 +17251,8 @@ stats-gl@^2.2.8: resolved "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz" integrity sha512-g5O9B0hm9CvnM36+v7SFl39T7hmAlv541tU81ME8YeSb3i1CIP5/QdDeSB3A0la0bKNHpxpwxOVRo2wFTYEosQ== dependencies: - three "^0.170.0" "@types/three" "*" + three "^0.170.0" stats.js@^0.17.0: version "0.17.0" @@ -17289,38 +17299,38 @@ streamx@^2.15.0, streamx@^2.21.0: version "2.22.1" resolved "https://registry.npmjs.org/streamx/-/streamx-2.22.1.tgz" integrity sha512-znKXEBxfatz2GBNK02kRnCXjV+AA4kjZIUxeWSr3UGirZMJfTE9uiwKHobnbgxWyL/JWro8tTq+vOqAK1/qbSA== + optionalDependencies: + bare-events "^2.2.0" dependencies: fast-fifo "^1.3.2" text-decoder "^1.1.0" - optionalDependencies: - bare-events "^2.2.0" string-width@^1.0.1: version "1.0.2" resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz" integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw== dependencies: - strip-ansi "^3.0.0" code-point-at "^1.0.0" is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" "string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3, "string-width@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== dependencies: - strip-ansi "^6.0.1" emoji-regex "^8.0.0" is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== dependencies: - strip-ansi "^7.0.1" - emoji-regex "^9.2.2" eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" string-width@^7.2.0: version "7.2.0" @@ -17630,23 +17640,23 @@ syncpack@^13.0.4: resolved "https://registry.npmjs.org/syncpack/-/syncpack-13.0.4.tgz" integrity sha512-kJ9VlRxNCsBD5pJAE29oXeBYbPLhEySQmK4HdpsLv81I6fcDDW17xeJqMwiU3H7/woAVsbgq25DJNS8BeiN5+w== dependencies: - ora "^8.2.0" chalk "^5.4.1" + chalk-template "^1.1.0" + commander "^13.1.0" + cosmiconfig "^9.0.0" effect "^3.13.7" - globby "^14.1.0" - semver "^7.7.1" - prompts "^2.4.2" enquirer "^2.4.1" - commander "^13.1.0" - minimatch "9.0.5" - tightrope "0.2.0" fast-check "^3.23.2" - cosmiconfig "^9.0.0" - ts-toolbelt "^9.6.0" + globby "^14.1.0" jsonc-parser "^3.3.1" - chalk-template "^1.1.0" - read-yaml-file "^2.1.0" + minimatch "9.0.5" npm-package-arg "^12.0.2" + ora "^8.2.0" + prompts "^2.4.2" + read-yaml-file "^2.1.0" + semver "^7.7.1" + tightrope "0.2.0" + ts-toolbelt "^9.6.0" tailwind-merge@^1.13.2: version "1.14.0" @@ -17663,30 +17673,30 @@ tailwindcss@^3.3.3: resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz" integrity sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og== dependencies: + "@alloc/quick-lru" "^5.2.0" arg "^5.0.2" - dlv "^1.1.3" - jiti "^1.21.6" - is-glob "^4.0.3" - postcss "^8.4.47" - resolve "^1.22.8" - sucrase "^3.35.0" chokidar "^3.6.0" + didyoumean "^1.2.2" + dlv "^1.1.3" fast-glob "^3.3.2" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.21.6" lilconfig "^3.1.3" - didyoumean "^1.2.2" micromatch "^4.0.8" - picocolors "^1.1.1" - postcss-js "^4.0.1" - glob-parent "^6.0.2" - object-hash "^3.0.0" normalize-path "^3.0.0" + object-hash "^3.0.0" + picocolors "^1.1.1" + postcss "^8.4.47" postcss-import "^15.1.0" - postcss-nested "^6.2.0" - "@alloc/quick-lru" "^5.2.0" + postcss-js "^4.0.1" postcss-load-config "^4.0.2" + postcss-nested "^6.2.0" postcss-selector-parser "^6.1.2" + resolve "^1.22.8" + sucrase "^3.35.0" -tailwindcss@4.1.11, "tailwindcss@>=3.0.0 || insiders", "tailwindcss@>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1", tailwindcss@^4.1.8: +tailwindcss@4.1.11, "tailwindcss@>=3.0.0 || insiders", "tailwindcss@>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1", "tailwindcss@^3.0.0 || ^4.0.0-beta.0", tailwindcss@^4.1.8: version "4.1.11" resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.11.tgz" integrity sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA== @@ -17706,9 +17716,9 @@ tar@^2.0.0: resolved "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz" integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA== dependencies: + block-stream "*" fstream "^1.0.12" inherits "2" - block-stream "*" tar@^6.1.11, tar@^6.2.1: version "6.2.1" @@ -17716,11 +17726,11 @@ tar@^6.1.11, tar@^6.2.1: integrity sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== dependencies: chownr "^2.0.0" - mkdirp "^1.0.3" - yallist "^4.0.0" + fs-minipass "^2.0.0" minipass "^5.0.0" minizlib "^2.1.1" - fs-minipass "^2.0.0" + mkdirp "^1.0.3" + yallist "^4.0.0" tar@7.4.3, tar@^7.4.3: version "7.4.3" @@ -17738,12 +17748,12 @@ tar-fs@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.0.tgz" integrity sha512-5Mty5y/sOF1YWj1J6GiBodjlDc05CUR8PKXrsnFAiSG0xA+GHeWLovaZPYUDXkH/1iKRf2+M5+OrRgzC7O9b7w== - dependencies: - pump "^3.0.0" - tar-stream "^3.1.5" optionalDependencies: bare-fs "^4.0.1" bare-path "^3.0.0" + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" tar-stream@^3.0.0, tar-stream@^3.1.5: version "3.1.7" @@ -18068,24 +18078,24 @@ ts-mixer@^6.0.4: resolved "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz" integrity sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA== -ts-node@^10.9.2: +"ts-node@>= 7.0.1 < 12", ts-node@>=9.0.0, ts-node@^10.9.2: version "10.9.2" resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== dependencies: - yn "3.1.1" - arg "^4.1.0" - diff "^4.0.1" - acorn "^8.4.1" - acorn-walk "^8.1.1" - make-error "^1.1.1" - create-require "^1.1.0" + "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" "@tsconfig/node12" "^1.0.7" "@tsconfig/node14" "^1.0.0" "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" v8-compile-cache-lib "^3.0.1" - "@cspotcode/source-map-support" "^0.8.0" + yn "3.1.1" ts-pattern@^5.7.0: version "5.7.1" @@ -18112,10 +18122,10 @@ tsconfig-paths@^3.15.0: resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz" integrity sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== dependencies: + "@types/json5" "^0.0.29" json5 "^1.0.2" minimist "^1.2.6" strip-bom "^3.0.0" - "@types/json5" "^0.0.29" tsconfig-paths@4.2.0: version "4.2.0" @@ -18164,8 +18174,8 @@ tuf-js@^2.2.1: resolved "https://registry.npmjs.org/tuf-js/-/tuf-js-2.2.1.tgz" integrity sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA== dependencies: - debug "^4.3.4" "@tufjs/models" "2.0.1" + debug "^4.3.4" make-fetch-happen "^13.0.1" tuf-js@^3.0.1: @@ -18201,11 +18211,11 @@ turbo@^2.5.4: resolved "https://registry.npmjs.org/turbo/-/turbo-2.5.5.tgz" integrity sha512-eZ7wI6KjtT1eBqCnh2JPXWNUAxtoxxfi6VdBdZFvil0ychCOTxbm7YLRBi1JSt7U3c+u3CLxpoPxLdvr/Npr3A== optionalDependencies: - turbo-linux-64 "2.5.5" turbo-darwin-64 "2.5.5" - turbo-windows-64 "2.5.5" - turbo-linux-arm64 "2.5.5" turbo-darwin-arm64 "2.5.5" + turbo-linux-64 "2.5.5" + turbo-linux-arm64 "2.5.5" + turbo-windows-64 "2.5.5" turbo-windows-arm64 "2.5.5" turbo-darwin-64@2.5.5: @@ -18275,8 +18285,8 @@ type-is@~1.6.18: resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== dependencies: - mime-types "~2.1.24" media-typer "0.3.0" + mime-types "~2.1.24" typed-array-buffer@^1.0.3: version "1.0.3" @@ -18328,7 +18338,7 @@ typed-query-selector@^2.12.0: resolved "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz" integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== -typescript@>=2.7, typescript@>=2.9, typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0", typescript@>=5, typescript@^5.0.0, typescript@^5.8.2, typescript@^5.8.3: +"typescript@>= 3.8.3 < 6", typescript@>=2.7, typescript@>=2.9, typescript@>=3.3.1, typescript@>=4.5.0, typescript@>=4.8.4, "typescript@>=4.8.4 <5.9.0", typescript@>=4.9.5, typescript@>=5, typescript@>=5.1.0, typescript@^5.0.0, typescript@^5.8.2, typescript@^5.8.3: version "5.8.3" resolved "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz" integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ== @@ -18508,28 +18518,28 @@ unrs-resolver@^1.6.2: version "1.11.1" resolved "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz" integrity sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg== - dependencies: - napi-postinstall "^0.3.0" optionalDependencies: - "@unrs/resolver-binding-win32-x64-msvc" "1.11.1" - "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1" - "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1" - "@unrs/resolver-binding-linux-x64-gnu" "1.11.1" - "@unrs/resolver-binding-linux-x64-musl" "1.11.1" - "@unrs/resolver-binding-freebsd-x64" "1.11.1" - "@unrs/resolver-binding-android-arm64" "1.11.1" - "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1" - "@unrs/resolver-binding-linux-arm64-musl" "1.11.1" "@unrs/resolver-binding-android-arm-eabi" "1.11.1" + "@unrs/resolver-binding-android-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-arm64" "1.11.1" + "@unrs/resolver-binding-darwin-x64" "1.11.1" + "@unrs/resolver-binding-freebsd-x64" "1.11.1" "@unrs/resolver-binding-linux-arm-gnueabihf" "1.11.1" "@unrs/resolver-binding-linux-arm-musleabihf" "1.11.1" + "@unrs/resolver-binding-linux-arm64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-arm64-musl" "1.11.1" "@unrs/resolver-binding-linux-ppc64-gnu" "1.11.1" "@unrs/resolver-binding-linux-riscv64-gnu" "1.11.1" "@unrs/resolver-binding-linux-riscv64-musl" "1.11.1" "@unrs/resolver-binding-linux-s390x-gnu" "1.11.1" - "@unrs/resolver-binding-darwin-x64" "1.11.1" - "@unrs/resolver-binding-darwin-arm64" "1.11.1" + "@unrs/resolver-binding-linux-x64-gnu" "1.11.1" + "@unrs/resolver-binding-linux-x64-musl" "1.11.1" "@unrs/resolver-binding-wasm32-wasi" "1.11.1" + "@unrs/resolver-binding-win32-arm64-msvc" "1.11.1" + "@unrs/resolver-binding-win32-ia32-msvc" "1.11.1" + "@unrs/resolver-binding-win32-x64-msvc" "1.11.1" + dependencies: + napi-postinstall "^0.3.0" upath@^1.1.0: version "1.2.0" @@ -18609,7 +18619,7 @@ use-sidecar@^1.1.3: detect-node-es "^1.1.0" tslib "^2.0.0" -use-sync-external-store@^1, use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0, use-sync-external-store@^1.5.0: +use-sync-external-store@>=1.2.0, use-sync-external-store@^1, use-sync-external-store@^1.2.2, use-sync-external-store@^1.4.0, use-sync-external-store@^1.5.0: version "1.5.0" resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz" integrity sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A== @@ -18684,9 +18694,9 @@ verror@1.10.0: resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz" integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw== dependencies: - extsprintf "^1.2.0" assert-plus "^1.0.0" core-util-is "1.0.2" + extsprintf "^1.2.0" vfile@^6.0.0: version "6.0.3" @@ -18709,50 +18719,52 @@ victory-vendor@^36.6.8: resolved "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz" integrity sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ== dependencies: - d3-ease "^3.0.1" - d3-time "^3.0.0" - d3-array "^3.1.6" - d3-scale "^4.0.2" - d3-shape "^3.1.0" - d3-timer "^3.0.1" - "@types/d3-ease" "^3.0.0" - "@types/d3-time" "^3.0.0" - d3-interpolate "^3.0.1" "@types/d3-array" "^3.0.3" + "@types/d3-ease" "^3.0.0" + "@types/d3-interpolate" "^3.0.1" "@types/d3-scale" "^4.0.2" "@types/d3-shape" "^3.1.0" + "@types/d3-time" "^3.0.0" "@types/d3-timer" "^3.0.0" - "@types/d3-interpolate" "^3.0.1" + d3-array "^3.1.6" + d3-ease "^3.0.1" + d3-interpolate "^3.0.1" + d3-scale "^4.0.2" + d3-shape "^3.1.0" + d3-time "^3.0.0" + d3-timer "^3.0.1" vite@5.2.9: version "5.2.9" resolved "https://registry.npmjs.org/vite/-/vite-5.2.9.tgz" integrity sha512-uOQWfuZBlc6Y3W/DTuQ1Sr+oIXWvqljLvS881SVmAj00d5RdgShLcuXWxseWPd4HXwiYBFW/vXHfKFeqj9uQnw== + optionalDependencies: + fsevents "~2.3.3" dependencies: - rollup "^4.13.0" esbuild "^0.20.1" postcss "^8.4.38" - optionalDependencies: - fsevents "~2.3.3" + rollup "^4.13.0" vite@^6.3.4: version "6.3.5" resolved "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz" integrity sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ== + optionalDependencies: + fsevents "~2.3.3" dependencies: - fdir "^6.4.4" - rollup "^4.34.9" esbuild "^0.25.0" - postcss "^8.5.3" + fdir "^6.4.4" picomatch "^4.0.2" + postcss "^8.5.3" + rollup "^4.34.9" tinyglobby "^0.2.13" - optionalDependencies: - fsevents "~2.3.3" -"vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "vite@^5.0.0 || ^6.0.0 || ^7.0.0-0": +vite@*, "vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "vite@^5.0.0 || ^6.0.0 || ^7.0.0-0": version "7.0.5" resolved "https://registry.npmjs.org/vite/-/vite-7.0.5.tgz" integrity sha512-1mncVwJxy2C9ThLwz0+2GKZyEXuC3MyWtAAlNftlZZXZDP3AJt5FmwcMit/IGGaNZ8ZOB2BNO/HFUB+CpN0NQw== + optionalDependencies: + fsevents "~2.3.3" dependencies: esbuild "^0.25.0" fdir "^6.4.6" @@ -18760,8 +18772,6 @@ vite@^6.3.4: postcss "^8.5.6" rollup "^4.40.0" tinyglobby "^0.2.14" - optionalDependencies: - fsevents "~2.3.3" vite-node@3.2.4: version "3.2.4" @@ -18769,10 +18779,10 @@ vite-node@3.2.4: integrity sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg== dependencies: cac "^6.7.14" - vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" debug "^4.4.1" - pathe "^2.0.3" es-module-lexer "^1.7.0" + pathe "^2.0.3" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" vite-tsconfig-paths@^5.1.4: version "5.1.4" @@ -18788,29 +18798,29 @@ vitest@3.2.4, vitest@^3.2.4: resolved "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz" integrity sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A== dependencies: + "@types/chai" "^5.2.2" + "@vitest/expect" "3.2.4" + "@vitest/mocker" "3.2.4" + "@vitest/pretty-format" "^3.2.4" + "@vitest/runner" "3.2.4" + "@vitest/snapshot" "3.2.4" + "@vitest/spy" "3.2.4" + "@vitest/utils" "3.2.4" chai "^5.2.0" - vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" debug "^4.4.1" + expect-type "^1.2.1" + magic-string "^0.30.17" pathe "^2.0.3" - std-env "^3.9.0" - tinyexec "^0.3.2" - tinypool "^1.1.1" picomatch "^4.0.2" + std-env "^3.9.0" tinybench "^2.9.0" - vite-node "3.2.4" + tinyexec "^0.3.2" tinyglobby "^0.2.14" - "@types/chai" "^5.2.2" - "@vitest/spy" "3.2.4" - expect-type "^1.2.1" + tinypool "^1.1.1" tinyrainbow "^2.0.0" - magic-string "^0.30.17" - "@vitest/utils" "3.2.4" - "@vitest/expect" "3.2.4" - "@vitest/mocker" "3.2.4" - "@vitest/runner" "3.2.4" - "@vitest/snapshot" "3.2.4" + vite "^5.0.0 || ^6.0.0 || ^7.0.0-0" + vite-node "3.2.4" why-is-node-running "^2.3.0" - "@vitest/pretty-format" "^3.2.4" w3c-keyname@^2.2.0: version "2.2.8" @@ -18894,8 +18904,8 @@ whatwg-url@^7.0.0: resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== dependencies: - tr46 "^1.0.1" lodash.sortby "^4.7.0" + tr46 "^1.0.1" webidl-conversions "^4.0.2" whatwg-url@^14.0.0, whatwg-url@^14.1.1: @@ -19139,7 +19149,7 @@ yaml@^1.10.0: resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yaml@^2.3.4: +yaml@^2.3.4, yaml@^2.4.2: version "2.8.0" resolved "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz" integrity sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ== @@ -19149,26 +19159,26 @@ yargs@^16.0.0: resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== dependencies: - y18n "^5.0.5" cliui "^7.0.2" escalade "^3.1.1" - string-width "^4.2.0" - yargs-parser "^20.2.2" get-caller-file "^2.0.5" require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" yargs@^17.0.0, yargs@^17.5.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: - y18n "^5.0.5" cliui "^8.0.1" escalade "^3.1.1" - string-width "^4.2.3" - yargs-parser "^21.1.1" get-caller-file "^2.0.5" require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.1.1" yargs-parser@^20.2.2: version "20.2.9" @@ -19185,8 +19195,8 @@ yauzl@^2.10.0: resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== dependencies: - fd-slicer "~1.1.0" buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" yn@3.1.1: version "3.1.1" @@ -19219,20 +19229,20 @@ zip-stream@^6.0.1: integrity sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA== dependencies: archiver-utils "^5.0.0" - readable-stream "^4.0.0" compress-commons "^6.0.2" + readable-stream "^4.0.0" zod@3.23.8: version "3.23.8" resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== -zod@3.25.67, zod@^3, zod@^3.18.0, zod@^3.20.2, zod@^3.23.8, zod@^3.24.1, zod@^3.24.4: +zod@3.25.67, "zod@>= 3", zod@^3, zod@^3.18.0, zod@^3.20.2, zod@^3.23.8, "zod@^3.24.0 || ^4.0.0-beta.0", zod@^3.24.1, zod@^3.24.4: version "3.25.67" resolved "https://registry.npmjs.org/zod/-/zod-3.25.67.tgz" integrity sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw== -"zod@>= 3", zod@^4.0.5: +zod@^4.0.5: version "4.0.5" resolved "https://registry.npmjs.org/zod/-/zod-4.0.5.tgz" integrity sha512-/5UuuRPStvHXu7RS+gmvRf4NXrNxpSllGwDnCBcJZtQsKrviYXm54yDGV2KYNLT5kq0lHGcl7lqWJLgSaG+tgA== From 55442ab2f4f96b25be5d919be43580cd32bdb733 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 20:10:53 -0400 Subject: [PATCH 037/107] fix: correct static file paths for next.js standalone monorepo structure - fix public file copy to .next/standalone/apps/app/public/ - fix static file copy to .next/standalone/apps/app/.next/static/ - enhance debug verification to check correct paths - resolves 404 errors for css, js, and font files in deployed application --- apps/app/buildspec.yml | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index c82279f84..9f1b6a2e5 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -58,18 +58,12 @@ phases: - echo "DEBUG - Checking if static files exist..." - ls -la .next/static/ || echo "No static directory found" - echo "DEBUG - Copying static files to standalone..." - - cp -r public .next/standalone/ || echo "No public folder" - - mkdir -p .next/standalone/.next/static - - if [ -d ".next/static" ]; then cp -r .next/static/* .next/standalone/.next/static/; else echo "No .next/static directory"; fi + - cp -r public .next/standalone/apps/app/ || echo "No public folder" + - cp -r .next/static .next/standalone/apps/app/.next/ || echo "No .next/static directory" - echo "DEBUG - Final verification..." - ls -la .next/standalone/ || echo "Standalone empty" - - echo "Looking for static files in standalone..." - - find .next/standalone -type f -name "*.css" | head -5 || echo "No CSS files found" - - find .next/standalone -type f -name "*.js" | head -5 || echo "No JS files found" - - find .next/standalone -type f -name "*.ttf" | head -3 || echo "No font files found" - - echo "Checking specific paths..." - - ls -la .next/standalone/.next/static/chunks/ || echo "No chunks directory" - - ls -la .next/standalone/.next/static/media/ || echo "No media directory" + - find .next/standalone -name "*.css" | head -3 || echo "No CSS files found" + - find .next/standalone -name "*.js" | head -3 || echo "No JS files found" # Copy Prisma client - echo "Copying Prisma client..." From b8e20645333547842e7731deef05c0fc53c7732c Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 20:11:10 -0400 Subject: [PATCH 038/107] fix: add verification for public directory in buildspec.yml - Added a check for the presence of the public directory in the standalone build process. - Enhances debugging capabilities by ensuring all necessary directories are verified during the build. --- buildspec.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/buildspec.yml b/buildspec.yml index 8023ed464..2dfddeb54 100644 --- a/buildspec.yml +++ b/buildspec.yml @@ -17,3 +17,4 @@ - echo "Checking specific paths..." - ls -la .next/standalone/apps/app/.next/static/chunks/ || echo "No chunks directory" - ls -la .next/standalone/apps/app/.next/static/media/ || echo "No media directory" +- ls -la .next/standalone/apps/app/public/ || echo "No public directory" From eee55f6e1fbfdf4c1afbf09b9c947ee8bd9dcd62 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 20:19:54 -0400 Subject: [PATCH 039/107] feat: add deployment verification script for ECS - Introduced deploy.sh to verify ECS deployment stability post-build. - Implemented polling mechanism to check service status, including handling health check failures and failed tasks. - Enhances deployment reliability by providing detailed feedback on service status and potential issues during the deployment process. --- deploy.sh | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 deploy.sh diff --git a/deploy.sh b/deploy.sh new file mode 100644 index 000000000..c44da82cf --- /dev/null +++ b/deploy.sh @@ -0,0 +1,122 @@ +# Step 3: Verify Deployment +echo -e "${YELLOW}🔍 Step 3: Verifying deployment...${NC}" + +# Wait for ECS service to stabilize after the build updated it +echo -e "${YELLOW}⏳ Waiting for ECS deployment to stabilize...${NC}" + +# Check initial service status +echo -e "${YELLOW}📊 Initial service status:${NC}" +aws ecs describe-services \ + --cluster "$CLUSTER_NAME" \ + --services "$SERVICE_NAME" \ + --query 'services[0].{desired:desiredCount,running:runningCount,pending:pendingCount,status:status}' \ + --output table + +# Simple polling approach instead of complex timeout function +MAX_WAIT_TIME=600 # 10 minutes +WAIT_INTERVAL=30 # 30 seconds +elapsed_time=0 + +echo -e "${YELLOW}⏳ Polling service status every ${WAIT_INTERVAL} seconds (max ${MAX_WAIT_TIME}s)...${NC}" + +while [ $elapsed_time -lt $MAX_WAIT_TIME ]; do + # Get current service status + service_status=$(aws ecs describe-services \ + --cluster "$CLUSTER_NAME" \ + --services "$SERVICE_NAME" \ + --query 'services[0].{desired:desiredCount,running:runningCount,pending:pendingCount}' \ + --output json) + + desired=$(echo "$service_status" | jq -r '.desired') + running=$(echo "$service_status" | jq -r '.running') + pending=$(echo "$service_status" | jq -r '.pending') + + echo " Time: ${elapsed_time}s - Desired: $desired, Running: $running, Pending: $pending" + + # Check if service is stable (running count matches desired, no pending) + if [ "$running" = "$desired" ] && [ "$pending" = "0" ] && [ "$desired" != "0" ]; then + echo -e "${GREEN}✅ ECS service is stable${NC}" + break + fi + + # Accept partial deployment if we have at least 1 running task and it's been running for a while + if [ "$running" -gt "0" ] && [ "$desired" != "0" ] && [ $elapsed_time -gt 180 ]; then + echo -e "${YELLOW}⚠️ Partial deployment detected: $running/$desired tasks running${NC}" + echo -e "${YELLOW}🔍 Checking if this is due to health check issues...${NC}" + + # Check recent events for health check failures + health_check_failures=$(aws ecs describe-services \ + --cluster "$CLUSTER_NAME" \ + --services "$SERVICE_NAME" \ + --query 'services[0].events[0:5]' \ + --output json | jq -r '.[] | select(.message | contains("health checks")) | .message' | wc -l) + + if [ "$health_check_failures" -gt "0" ]; then + echo -e "${YELLOW}🚨 Health check failures detected - but app may still be working${NC}" + echo -e "${YELLOW}⚡ Accepting deployment with $running running task(s)${NC}" + echo -e "${YELLOW}💡 Recommendation: Check health endpoint and fix health checks${NC}" + break + fi + fi + + # Check for obvious failures + if [ "$running" = "0" ] && [ "$pending" = "0" ] && [ $elapsed_time -gt 120 ]; then + echo -e "${RED}❌ No tasks running after 2 minutes - checking for failures...${NC}" + + # Get recent events + echo -e "${RED}Recent service events:${NC}" + aws ecs describe-services \ + --cluster "$CLUSTER_NAME" \ + --services "$SERVICE_NAME" \ + --query 'services[0].events[0:3]' \ + --output json + + # Check for failed tasks + failed_tasks=$(aws ecs list-tasks \ + --cluster "$CLUSTER_NAME" \ + --service-name "$SERVICE_NAME" \ + --desired-status STOPPED \ + --query 'taskArns[0:2]' \ + --output json) + + if [ "$failed_tasks" != "[]" ] && [ -n "$failed_tasks" ]; then + echo -e "${RED}Failed task details:${NC}" + echo "$failed_tasks" | jq -r '.[]' | while read -r task_arn; do + aws ecs describe-tasks \ + --cluster "$CLUSTER_NAME" \ + --tasks "$task_arn" \ + --query 'tasks[0].{stoppedReason:stoppedReason,containers:containers[*].{name:name,exitCode:exitCode,reason:reason}}' \ + --output json + done + fi + + echo -e "${RED}❌ Deployment failed - no healthy tasks running${NC}" + exit 1 + fi + + sleep $WAIT_INTERVAL + elapsed_time=$((elapsed_time + WAIT_INTERVAL)) +done + +# If we've exceeded the wait time +if [ $elapsed_time -ge $MAX_WAIT_TIME ]; then + echo -e "${RED}❌ ECS service failed to stabilize within $((MAX_WAIT_TIME/60)) minutes${NC}" + + # Get final status for debugging + echo -e "${RED}Final service status:${NC}" + aws ecs describe-services \ + --cluster "$CLUSTER_NAME" \ + --services "$SERVICE_NAME" \ + --query 'services[0].{desired:desiredCount,running:runningCount,pending:pendingCount,status:status}' \ + --output table + + # Get recent events + echo -e "${RED}Recent service events:${NC}" + aws ecs describe-services \ + --cluster "$CLUSTER_NAME" \ + --services "$SERVICE_NAME" \ + --query 'services[0].events[0:5]' \ + --output json + + exit 1 +fi \ No newline at end of file From bafbb27affac170251a68f0a79038bc9c97851a1 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 20:21:46 -0400 Subject: [PATCH 040/107] fix: add missing port number to database connection string - add :5432 port to connectionString in database.ts - resolves health check failures due to invalid database URL - makes connectionString consistent with secret version --- apps/infra/modules/database.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/infra/modules/database.ts b/apps/infra/modules/database.ts index b2f6991dc..2d5221e97 100644 --- a/apps/infra/modules/database.ts +++ b/apps/infra/modules/database.ts @@ -235,7 +235,7 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { password: dbPassword.result, secretArn: dbSecret.arn, secretId: dbSecret.id, - connectionString: pulumi.interpolate`postgresql://${dbInstance.username}:${dbPassword.result}@${dbInstance.endpoint}/${dbInstance.dbName}?sslmode=require`, + connectionString: pulumi.interpolate`postgresql://${dbInstance.username}:${dbPassword.result}@${dbInstance.endpoint}:5432/${dbInstance.dbName}?sslmode=require`, readReplicaEndpoint: readReplica?.endpoint, logGroupName: dbLogGroup.name, connectionAlarmArn: dbConnectionAlarm.arn, From f1f60304efe352a8865f762415544592a970dd5e Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 20:22:30 -0400 Subject: [PATCH 041/107] fix: use dynamic port variable for database connection strings - replace hardcoded :5432 with dbInstance.port in both secret and export - ensures consistency and future-proofing if port changes - resolves health check failures due to invalid database URL format --- apps/infra/modules/database.ts | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/apps/infra/modules/database.ts b/apps/infra/modules/database.ts index 2d5221e97..5db901dee 100644 --- a/apps/infra/modules/database.ts +++ b/apps/infra/modules/database.ts @@ -144,10 +144,16 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { { secretId: dbSecret.id, secretString: pulumi - .all([dbInstance.endpoint, dbInstance.username, dbInstance.dbName, dbPassword.result]) + .all([ + dbInstance.endpoint, + dbInstance.username, + dbInstance.dbName, + dbPassword.result, + dbInstance.port, + ]) .apply( - ([endpoint, username, dbName, password]) => - `postgresql://${username}:${password}@${endpoint}:5432/${dbName}?sslmode=require`, + ([endpoint, username, dbName, password, port]) => + `postgresql://${username}:${password}@${endpoint}:${port}/${dbName}?sslmode=require`, ), }, ); @@ -235,7 +241,7 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { password: dbPassword.result, secretArn: dbSecret.arn, secretId: dbSecret.id, - connectionString: pulumi.interpolate`postgresql://${dbInstance.username}:${dbPassword.result}@${dbInstance.endpoint}:5432/${dbInstance.dbName}?sslmode=require`, + connectionString: pulumi.interpolate`postgresql://${dbInstance.username}:${dbPassword.result}@${dbInstance.endpoint}:${dbInstance.port}/${dbInstance.dbName}?sslmode=require`, readReplicaEndpoint: readReplica?.endpoint, logGroupName: dbLogGroup.name, connectionAlarmArn: dbConnectionAlarm.arn, From a34f367009cbe0c1b8cd1684c72c934d9c217f1c Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 20:34:42 -0400 Subject: [PATCH 042/107] refactor: clean up and standardize pulumi stack outputs - Removes duplicate and snake_case outputs from index.ts. - Standardizes all outputs to use camelCase convention. - Updates tailscale connection guide to use the dynamic database port. --- apps/infra/index.ts | 40 +++++++++++----------------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/apps/infra/index.ts b/apps/infra/index.ts index 27553e550..f492ad510 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -114,9 +114,8 @@ applications.map((app) => build.createApplicationDeployment(app, database, conta // ========================================== // Core application URLs -export const url = loadBalancer.applicationUrl; -export const albDns = loadBalancer.albDnsName; export const applicationUrl = loadBalancer.applicationUrl; +export const albDns = loadBalancer.albDnsName; // Infrastructure details export const ecrRepositoryUrl = container.repositoryUrl; @@ -124,41 +123,24 @@ export const ecsClusterName = container.clusterName; export const ecsServiceName = container.serviceName; // Database connection information -export const database_endpoint = database.endpoint; -export const database_port = pulumi.output(5432); -export const database_name = database.dbName; -export const database_username = database.username; +export const databaseEndpoint = database.endpoint; +export const databaseName = database.dbName; +export const databaseUsername = database.username; +export const databasePassword = pulumi.secret(database.password); // Tailscale-accessible database information (if Tailscale enabled) -export const tailscale_enabled = enableTailscale; -export const tailscale_database_host = enableTailscale ? database.endpoint : undefined; -export const tailscale_database_url = enableTailscale - ? pulumi.interpolate`postgresql://${database.username}:${database.password}@${database.endpoint}:5432/${database.dbName}?sslmode=require` - : undefined; -export const tailscale_router_ip = enableTailscale ? tailscale?.instancePrivateIp : undefined; -export const tailscale_connection_guide = enableTailscale +export const tailscaleEnabled = enableTailscale; +export const tailscaleConnectionGuide = enableTailscale ? pulumi.interpolate` # Connect to database through Tailscale: # 1. Ensure you're connected to Tailscale network -# 2. Use this connection string: postgresql://${database.username}:[PASSWORD]@${database.endpoint}:5432/${database.dbName}?sslmode=require -# 3. Get password with: pulumi stack output database_password --show-secrets +# 2. Use this connection string: postgresql://${database.username}:${database.password}@${database.endpoint}:${database.port}/${database.dbName}?sslmode=require +# 3. Get password with: pulumi stack output databasePassword --show-secrets ` : 'Tailscale not enabled for this environment'; // Better Stack information (if enabled) -export const betterstack_enabled = enableBetterStack; -export const betterstack_lambda_arn = enableBetterStack +export const betterstackEnabled = enableBetterStack; +export const betterstackLambdaArn = enableBetterStack ? monitoring.logForwarderFunctionArn : undefined; - -// Repository and cluster information -export const ecr_repository_url = container.repositoryUrl; -export const ecs_cluster_name = container.clusterName; -export const repositoryUrl = container.repositoryUrl; -export const databaseEndpoint = database.endpoint; - -// Security outputs (marked as secrets) -export const database_password = pulumi.secret(database.password); -export const tailscale_auth_key = enableTailscale - ? pulumi.secret(tailscale?.authSecretArn) - : undefined; From d47e9b5b5b3eff8e36c1006f12f4a108506575bb Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 20:39:32 -0400 Subject: [PATCH 043/107] fix(deploy): ensure pulumi update completes before starting build - Adds error handling to exit if 'pulumi up' fails. - Adds a 15-second sleep delay after infrastructure updates to allow changes to propagate. - Prevents a race condition where CodeBuild would start with stale environment variables, causing database connection errors during migration. --- apps/infra/deploy.sh | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/apps/infra/deploy.sh b/apps/infra/deploy.sh index a57df3342..2feec1267 100755 --- a/apps/infra/deploy.sh +++ b/apps/infra/deploy.sh @@ -110,9 +110,16 @@ wait_for_build() { echo -e "${YELLOW}📋 Step 1: Updating infrastructure...${NC}" cd "$INFRA_DIR" export NODE_ENV=production -pulumi up --yes +if ! pulumi up --yes; then + echo -e "${RED}❌ Pulumi update failed. Aborting deployment.${NC}" + exit 1 +fi cd "$PROJECT_ROOT" -echo -e "${GREEN}✅ Infrastructure updated${NC}" +echo -e "${GREEN}✅ Infrastructure updated successfully${NC}" + +# Add a small delay to ensure propagation +echo -e "${YELLOW}⏳ Waiting 15 seconds for infrastructure changes to propagate...${NC}" +sleep 15 # Step 2: Build and Deploy Application (includes migrations) echo -e "${YELLOW}🔨 Step 2: Building application (migrations + Next.js + Docker)...${NC}" From 093bcb3f5ba310ac4fc17be6d1c751fe71c56827 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 20:40:35 -0400 Subject: [PATCH 044/107] fix(infra): correctly resolve database connection string for codebuild - Wraps the CodeBuild project resource in a pulumi .apply() block. - Ensures the DATABASE_URL environment variable is a resolved string, not a Pulumi Output object. - This permanently fixes the 'invalid port number in database URL' error during prisma migrations in the build environment. --- apps/infra/modules/build.ts | 215 ++++++++++++++++++------------------ 1 file changed, 109 insertions(+), 106 deletions(-) diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index 8943efb48..4e5ab84c9 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -93,117 +93,120 @@ export function createBuildSystem( }); // CodeBuild project for building application image (requires database access) - const appProject = new aws.codebuild.Project(`${config.projectName}-app-build`, { - name: `${config.projectName}-app-build`, - description: 'Build application Docker image with database access', - serviceRole: codebuildRole.arn, - artifacts: { - type: 'NO_ARTIFACTS', - }, - environment: { - computeType: 'BUILD_GENERAL1_2XLARGE', - image: 'aws/codebuild/standard:7.0', - type: 'LINUX_CONTAINER', - privilegedMode: true, // Required for Docker builds - environmentVariables: [ - { - name: 'AWS_ACCOUNT_ID', - value: aws.getCallerIdentityOutput().accountId, - type: 'PLAINTEXT', - }, - { - name: 'IMAGE_REPO_NAME', - value: config.projectName, - type: 'PLAINTEXT', - }, - { - name: 'DATABASE_URL', - value: database.connectionString, - type: 'PLAINTEXT', - }, - { - name: 'ECR_REPOSITORY_URI', - value: container.repositoryUrl, - type: 'PLAINTEXT', + const appProject = database.connectionString.apply( + (dbUrl) => + new aws.codebuild.Project(`${config.projectName}-app-build`, { + name: `${config.projectName}-app-build`, + description: 'Build application Docker image with database access', + serviceRole: codebuildRole.arn, + artifacts: { + type: 'NO_ARTIFACTS', }, - { - name: 'ECS_CLUSTER_NAME', - value: container.clusterName, - type: 'PLAINTEXT', + environment: { + computeType: 'BUILD_GENERAL1_2XLARGE', + image: 'aws/codebuild/standard:7.0', + type: 'LINUX_CONTAINER', + privilegedMode: true, // Required for Docker builds + environmentVariables: [ + { + name: 'AWS_ACCOUNT_ID', + value: aws.getCallerIdentityOutput().accountId, + type: 'PLAINTEXT', + }, + { + name: 'IMAGE_REPO_NAME', + value: config.projectName, + type: 'PLAINTEXT', + }, + { + name: 'DATABASE_URL', + value: dbUrl, // Use the resolved string value here + type: 'PLAINTEXT', + }, + { + name: 'ECR_REPOSITORY_URI', + value: container.repositoryUrl, + type: 'PLAINTEXT', + }, + { + name: 'ECS_CLUSTER_NAME', + value: container.clusterName, + type: 'PLAINTEXT', + }, + { + name: 'ECS_SERVICE_NAME', + value: container.serviceName, + type: 'PLAINTEXT', + }, + { + name: 'AWS_DEFAULT_REGION', + value: config.awsRegion, + type: 'PLAINTEXT', + }, + { + name: 'NODE_ENV', + value: config.nodeEnv, + type: 'PLAINTEXT', + }, + // Application-specific environment variables (read from apps/app/.env) + ...(appEnv.AUTH_SECRET + ? [ + { + name: 'AUTH_SECRET', + value: appEnv.AUTH_SECRET, + type: 'PLAINTEXT', + }, + ] + : []), + ...(appEnv.RESEND_API_KEY + ? [ + { + name: 'RESEND_API_KEY', + value: appEnv.RESEND_API_KEY, + type: 'PLAINTEXT', + }, + ] + : []), + ...(appEnv.REVALIDATION_SECRET + ? [ + { + name: 'REVALIDATION_SECRET', + value: appEnv.REVALIDATION_SECRET, + type: 'PLAINTEXT', + }, + ] + : []), + ...(appEnv.NEXT_PUBLIC_PORTAL_URL + ? [ + { + name: 'NEXT_PUBLIC_PORTAL_URL', + value: appEnv.NEXT_PUBLIC_PORTAL_URL, + type: 'PLAINTEXT', + }, + ] + : []), + ], }, - { - name: 'ECS_SERVICE_NAME', - value: container.serviceName, - type: 'PLAINTEXT', + vpcConfig: { + vpcId: network.vpcId, + subnets: network.privateSubnetIds, + securityGroupIds: [network.securityGroups.codeBuild], }, - { - name: 'AWS_DEFAULT_REGION', - value: config.awsRegion, - type: 'PLAINTEXT', + source: { + type: 'GITHUB', + location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, + buildspec: 'apps/app/buildspec.yml', + gitCloneDepth: 1, }, - { - name: 'NODE_ENV', - value: config.nodeEnv, - type: 'PLAINTEXT', + sourceVersion: config.githubBranch, // Specify which branch to build from + tags: { + ...commonTags, + Name: `${config.projectName}-app-build`, + Type: 'codebuild-project', + Purpose: 'application-image-build', }, - // Application-specific environment variables (read from apps/app/.env) - ...(appEnv.AUTH_SECRET - ? [ - { - name: 'AUTH_SECRET', - value: appEnv.AUTH_SECRET, - type: 'PLAINTEXT', - }, - ] - : []), - ...(appEnv.RESEND_API_KEY - ? [ - { - name: 'RESEND_API_KEY', - value: appEnv.RESEND_API_KEY, - type: 'PLAINTEXT', - }, - ] - : []), - ...(appEnv.REVALIDATION_SECRET - ? [ - { - name: 'REVALIDATION_SECRET', - value: appEnv.REVALIDATION_SECRET, - type: 'PLAINTEXT', - }, - ] - : []), - ...(appEnv.NEXT_PUBLIC_PORTAL_URL - ? [ - { - name: 'NEXT_PUBLIC_PORTAL_URL', - value: appEnv.NEXT_PUBLIC_PORTAL_URL, - type: 'PLAINTEXT', - }, - ] - : []), - ], - }, - vpcConfig: { - vpcId: network.vpcId, - subnets: network.privateSubnetIds, - securityGroupIds: [network.securityGroups.codeBuild], - }, - source: { - type: 'GITHUB', - location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, - buildspec: 'apps/app/buildspec.yml', - gitCloneDepth: 1, - }, - sourceVersion: config.githubBranch, // Specify which branch to build from - tags: { - ...commonTags, - Name: `${config.projectName}-app-build`, - Type: 'codebuild-project', - Purpose: 'application-image-build', - }, - }); + }), + ); // Additional IAM permissions for ECS deployment const ecsDeployPolicy = new aws.iam.RolePolicy(`${config.projectName}-ecs-deploy-policy`, { From 302c4e2c0737dade945b2c184a91cedec457a398 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 20:43:04 -0400 Subject: [PATCH 045/107] refactor(infra): unify database secret handling for codebuild and ecs - Modifies the database secret to store a JSON object with a 'connectionString' key. - Updates the ECS container definition to reference the specific secret key. - Replaces the insecure plaintext DATABASE_URL in CodeBuild with a secure reference to the same secret using SECRETS_MANAGER type. - This creates a consistent, secure, and best-practice approach for managing the database URL across both build and runtime environments, eliminating the need for the previous '.apply()' workaround. --- apps/infra/modules/build.ts | 215 ++++++++++++++++---------------- apps/infra/modules/container.ts | 2 +- apps/infra/modules/database.ts | 7 +- 3 files changed, 111 insertions(+), 113 deletions(-) diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index 4e5ab84c9..708cde784 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -93,120 +93,117 @@ export function createBuildSystem( }); // CodeBuild project for building application image (requires database access) - const appProject = database.connectionString.apply( - (dbUrl) => - new aws.codebuild.Project(`${config.projectName}-app-build`, { - name: `${config.projectName}-app-build`, - description: 'Build application Docker image with database access', - serviceRole: codebuildRole.arn, - artifacts: { - type: 'NO_ARTIFACTS', + const appProject = new aws.codebuild.Project(`${config.projectName}-app-build`, { + name: `${config.projectName}-app-build`, + description: 'Build application Docker image with database access', + serviceRole: codebuildRole.arn, + artifacts: { + type: 'NO_ARTIFACTS', + }, + environment: { + computeType: 'BUILD_GENERAL1_2XLARGE', + image: 'aws/codebuild/standard:7.0', + type: 'LINUX_CONTAINER', + privilegedMode: true, // Required for Docker builds + environmentVariables: [ + { + name: 'AWS_ACCOUNT_ID', + value: aws.getCallerIdentityOutput().accountId, + type: 'PLAINTEXT', }, - environment: { - computeType: 'BUILD_GENERAL1_2XLARGE', - image: 'aws/codebuild/standard:7.0', - type: 'LINUX_CONTAINER', - privilegedMode: true, // Required for Docker builds - environmentVariables: [ - { - name: 'AWS_ACCOUNT_ID', - value: aws.getCallerIdentityOutput().accountId, - type: 'PLAINTEXT', - }, - { - name: 'IMAGE_REPO_NAME', - value: config.projectName, - type: 'PLAINTEXT', - }, - { - name: 'DATABASE_URL', - value: dbUrl, // Use the resolved string value here - type: 'PLAINTEXT', - }, - { - name: 'ECR_REPOSITORY_URI', - value: container.repositoryUrl, - type: 'PLAINTEXT', - }, - { - name: 'ECS_CLUSTER_NAME', - value: container.clusterName, - type: 'PLAINTEXT', - }, - { - name: 'ECS_SERVICE_NAME', - value: container.serviceName, - type: 'PLAINTEXT', - }, - { - name: 'AWS_DEFAULT_REGION', - value: config.awsRegion, - type: 'PLAINTEXT', - }, - { - name: 'NODE_ENV', - value: config.nodeEnv, - type: 'PLAINTEXT', - }, - // Application-specific environment variables (read from apps/app/.env) - ...(appEnv.AUTH_SECRET - ? [ - { - name: 'AUTH_SECRET', - value: appEnv.AUTH_SECRET, - type: 'PLAINTEXT', - }, - ] - : []), - ...(appEnv.RESEND_API_KEY - ? [ - { - name: 'RESEND_API_KEY', - value: appEnv.RESEND_API_KEY, - type: 'PLAINTEXT', - }, - ] - : []), - ...(appEnv.REVALIDATION_SECRET - ? [ - { - name: 'REVALIDATION_SECRET', - value: appEnv.REVALIDATION_SECRET, - type: 'PLAINTEXT', - }, - ] - : []), - ...(appEnv.NEXT_PUBLIC_PORTAL_URL - ? [ - { - name: 'NEXT_PUBLIC_PORTAL_URL', - value: appEnv.NEXT_PUBLIC_PORTAL_URL, - type: 'PLAINTEXT', - }, - ] - : []), - ], + { + name: 'IMAGE_REPO_NAME', + value: config.projectName, + type: 'PLAINTEXT', }, - vpcConfig: { - vpcId: network.vpcId, - subnets: network.privateSubnetIds, - securityGroupIds: [network.securityGroups.codeBuild], + { + name: 'DATABASE_URL', + value: `${database.secretArn}:connectionString::`, + type: 'SECRETS_MANAGER', }, - source: { - type: 'GITHUB', - location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, - buildspec: 'apps/app/buildspec.yml', - gitCloneDepth: 1, + { + name: 'ECR_REPOSITORY_URI', + value: container.repositoryUrl, + type: 'PLAINTEXT', }, - sourceVersion: config.githubBranch, // Specify which branch to build from - tags: { - ...commonTags, - Name: `${config.projectName}-app-build`, - Type: 'codebuild-project', - Purpose: 'application-image-build', + { + name: 'ECS_CLUSTER_NAME', + value: container.clusterName, + type: 'PLAINTEXT', }, - }), - ); + { + name: 'ECS_SERVICE_NAME', + value: container.serviceName, + type: 'PLAINTEXT', + }, + { + name: 'AWS_DEFAULT_REGION', + value: config.awsRegion, + type: 'PLAINTEXT', + }, + { + name: 'NODE_ENV', + value: config.nodeEnv, + type: 'PLAINTEXT', + }, + // Application-specific environment variables (read from apps/app/.env) + ...(appEnv.AUTH_SECRET + ? [ + { + name: 'AUTH_SECRET', + value: appEnv.AUTH_SECRET, + type: 'PLAINTEXT', + }, + ] + : []), + ...(appEnv.RESEND_API_KEY + ? [ + { + name: 'RESEND_API_KEY', + value: appEnv.RESEND_API_KEY, + type: 'PLAINTEXT', + }, + ] + : []), + ...(appEnv.REVALIDATION_SECRET + ? [ + { + name: 'REVALIDATION_SECRET', + value: appEnv.REVALIDATION_SECRET, + type: 'PLAINTEXT', + }, + ] + : []), + ...(appEnv.NEXT_PUBLIC_PORTAL_URL + ? [ + { + name: 'NEXT_PUBLIC_PORTAL_URL', + value: appEnv.NEXT_PUBLIC_PORTAL_URL, + type: 'PLAINTEXT', + }, + ] + : []), + ], + }, + vpcConfig: { + vpcId: network.vpcId, + subnets: network.privateSubnetIds, + securityGroupIds: [network.securityGroups.codeBuild], + }, + source: { + type: 'GITHUB', + location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, + buildspec: 'apps/app/buildspec.yml', + gitCloneDepth: 1, + }, + sourceVersion: config.githubBranch, // Specify which branch to build from + tags: { + ...commonTags, + Name: `${config.projectName}-app-build`, + Type: 'codebuild-project', + Purpose: 'application-image-build', + }, + }); // Additional IAM permissions for ECS deployment const ecsDeployPolicy = new aws.iam.RolePolicy(`${config.projectName}-ecs-deploy-policy`, { diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index 7d0c25c51..e3a5626d0 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -223,7 +223,7 @@ export function createContainer( const secrets = [ { name: 'DATABASE_URL', - valueFrom: dbSecretArn, + valueFrom: `${dbSecretArn}:connectionString::`, }, ]; diff --git a/apps/infra/modules/database.ts b/apps/infra/modules/database.ts index 5db901dee..35fcc3c1a 100644 --- a/apps/infra/modules/database.ts +++ b/apps/infra/modules/database.ts @@ -151,9 +151,10 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { dbPassword.result, dbInstance.port, ]) - .apply( - ([endpoint, username, dbName, password, port]) => - `postgresql://${username}:${password}@${endpoint}:${port}/${dbName}?sslmode=require`, + .apply(([endpoint, username, dbName, password, port]) => + JSON.stringify({ + connectionString: `postgresql://${username}:${password}@${endpoint}:${port}/${dbName}?sslmode=require`, + }), ), }, ); From 7ada5083c13a632a3ade97f3c7d453271adfa191 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 20:49:05 -0400 Subject: [PATCH 046/107] fix(infra): correct secrets manager syntax for codebuild and container - Removes incorrect trailing colons (::) from Secrets Manager ARN references in both build.ts and container.ts. - The previous change broke the container.ts module by incorrectly using pulumi.interpolate within an .apply() block; this has been reverted to the correct string concatenation. - CodeBuild now uses pulumi.interpolate to correctly resolve the secret ARN as it is defined outside of an apply block. - This resolves the 'InvalidParameter' error from Secrets Manager in CodeBuild and fixes the linter error in the container module. --- apps/infra/modules/build.ts | 2 +- apps/infra/modules/container.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index 708cde784..5053b496b 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -118,7 +118,7 @@ export function createBuildSystem( }, { name: 'DATABASE_URL', - value: `${database.secretArn}:connectionString::`, + value: pulumi.interpolate`${database.secretArn}:connectionString`, type: 'SECRETS_MANAGER', }, { diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index e3a5626d0..d4085b57d 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -223,7 +223,7 @@ export function createContainer( const secrets = [ { name: 'DATABASE_URL', - valueFrom: `${dbSecretArn}:connectionString::`, + valueFrom: `${dbSecretArn}:connectionString`, }, ]; @@ -231,15 +231,15 @@ export function createContainer( secrets.push( { name: 'AUTH_SECRET', - valueFrom: `${appSecretArn}:AUTH_SECRET::`, + valueFrom: `${appSecretArn}:AUTH_SECRET`, }, { name: 'RESEND_API_KEY', - valueFrom: `${appSecretArn}:RESEND_API_KEY::`, + valueFrom: `${appSecretArn}:RESEND_API_KEY`, }, { name: 'REVALIDATION_SECRET', - valueFrom: `${appSecretArn}:REVALIDATION_SECRET::`, + valueFrom: `${appSecretArn}:REVALIDATION_SECRET`, }, ); } From 2aebda34d22a2bd206d7571a7d4ffb20ff08b1c3 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 21:00:38 -0400 Subject: [PATCH 047/107] refactor(infra): streamline build system and environment variable handling - Removed redundant environment variable checks from buildspec.yml for AUTH_SECRET, RESEND_API_KEY, and REVALIDATION_SECRET. - Updated createBuildSystem function to accept appSecrets, allowing for more secure handling of application secrets via AWS Secrets Manager. - Enhanced the database connection string construction to ensure proper formatting and type handling. - Improved the overall structure and readability of the build system configuration. --- apps/app/buildspec.yml | 3 - apps/infra/index.ts | 2 +- apps/infra/modules/build.ts | 169 +++++++++++++++------------------ apps/infra/modules/database.ts | 15 ++- 4 files changed, 91 insertions(+), 98 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 9f1b6a2e5..dbcff4b98 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -30,9 +30,6 @@ phases: # Validate environment variables - echo "Validating environment variables..." - - '[ -n "$AUTH_SECRET" ] || { echo "❌ AUTH_SECRET is not set"; exit 1; }' - - '[ -n "$RESEND_API_KEY" ] || { echo "❌ RESEND_API_KEY is not set"; exit 1; }' - - '[ -n "$REVALIDATION_SECRET" ] || { echo "❌ REVALIDATION_SECRET is not set"; exit 1; }' - '[ -n "$NEXT_PUBLIC_PORTAL_URL" ] || { echo "❌ NEXT_PUBLIC_PORTAL_URL is not set"; exit 1; }' # Run database migrations diff --git a/apps/infra/index.ts b/apps/infra/index.ts index f492ad510..f6476d2a4 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -55,7 +55,7 @@ const loadBalancer = createLoadBalancer(config, network); const container = createContainer(config, network, database, loadBalancer, appSecrets); // 6. Build System - CodeBuild with VPC Database Access -const build = createBuildSystem(config, network, database, container); +const build = createBuildSystem(config, network, database, container, appSecrets); // 7. Auto-scaling - ECS Service Scaling const scaling = createScaling(config, container, loadBalancer); diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index 5053b496b..c873f5117 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -1,18 +1,13 @@ import * as aws from '@pulumi/aws'; import * as pulumi from '@pulumi/pulumi'; -import * as dotenv from 'dotenv'; -import * as path from 'path'; import { CommonConfig, ContainerOutputs, DatabaseOutputs, NetworkOutputs } from '../types'; -// Load app environment variables from the app's .env file -const appEnvPath = path.resolve(__dirname, '../../app/.env'); -const appEnv = dotenv.config({ path: appEnvPath }).parsed || {}; - export function createBuildSystem( config: CommonConfig, network: NetworkOutputs, database: DatabaseOutputs, container: ContainerOutputs, + appSecrets?: { secretArn: pulumi.Output; secretId: pulumi.Output }, ) { const { commonTags } = config; @@ -41,55 +36,57 @@ export function createBuildSystem( // CodeBuild policy for basic operations const codebuildPolicy = new aws.iam.RolePolicy(`${config.projectName}-codebuild-policy`, { role: codebuildRole.id, - policy: database.secretArn.apply((secretArn) => - JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents'], - Resource: 'arn:aws:logs:*:*:*', - }, - { - Effect: 'Allow', - Action: [ - 'ecr:BatchCheckLayerAvailability', - 'ecr:GetDownloadUrlForLayer', - 'ecr:BatchGetImage', - 'ecr:GetAuthorizationToken', - 'ecr:PutImage', - 'ecr:InitiateLayerUpload', - 'ecr:UploadLayerPart', - 'ecr:CompleteLayerUpload', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: [ - 'ec2:CreateNetworkInterface', - 'ec2:DescribeDhcpOptions', - 'ec2:DescribeNetworkInterfaces', - 'ec2:DeleteNetworkInterface', - 'ec2:DescribeSubnets', - 'ec2:DescribeSecurityGroups', - 'ec2:DescribeVpcs', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['ec2:CreateNetworkInterfacePermission'], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], - Resource: secretArn, - }, - ], - }), - ), + policy: pulumi + .all([database.secretArn, appSecrets?.secretArn]) + .apply(([dbSecretArn, appSecretArn]) => + JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: ['logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents'], + Resource: 'arn:aws:logs:*:*:*', + }, + { + Effect: 'Allow', + Action: [ + 'ecr:BatchCheckLayerAvailability', + 'ecr:GetDownloadUrlForLayer', + 'ecr:BatchGetImage', + 'ecr:GetAuthorizationToken', + 'ecr:PutImage', + 'ecr:InitiateLayerUpload', + 'ecr:UploadLayerPart', + 'ecr:CompleteLayerUpload', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: [ + 'ec2:CreateNetworkInterface', + 'ec2:DescribeDhcpOptions', + 'ec2:DescribeNetworkInterfaces', + 'ec2:DeleteNetworkInterface', + 'ec2:DescribeSubnets', + 'ec2:DescribeSecurityGroups', + 'ec2:DescribeVpcs', + ], + Resource: '*', + }, + { + Effect: 'Allow', + Action: ['ec2:CreateNetworkInterfacePermission'], + Resource: '*', + }, + { + Effect: 'Allow', + Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], + Resource: [dbSecretArn, ...(appSecretArn ? [appSecretArn] : [])], + }, + ], + }), + ), }); // CodeBuild project for building application image (requires database access) @@ -121,6 +118,26 @@ export function createBuildSystem( value: pulumi.interpolate`${database.secretArn}:connectionString`, type: 'SECRETS_MANAGER', }, + // Application secrets from AWS Secrets Manager + ...(appSecrets + ? [ + { + name: 'AUTH_SECRET', + value: pulumi.interpolate`${appSecrets.secretArn}:AUTH_SECRET`, + type: 'SECRETS_MANAGER', + }, + { + name: 'RESEND_API_KEY', + value: pulumi.interpolate`${appSecrets.secretArn}:RESEND_API_KEY`, + type: 'SECRETS_MANAGER', + }, + { + name: 'REVALIDATION_SECRET', + value: pulumi.interpolate`${appSecrets.secretArn}:REVALIDATION_SECRET`, + type: 'SECRETS_MANAGER', + }, + ] + : []), { name: 'ECR_REPOSITORY_URI', value: container.repositoryUrl, @@ -146,43 +163,11 @@ export function createBuildSystem( value: config.nodeEnv, type: 'PLAINTEXT', }, - // Application-specific environment variables (read from apps/app/.env) - ...(appEnv.AUTH_SECRET - ? [ - { - name: 'AUTH_SECRET', - value: appEnv.AUTH_SECRET, - type: 'PLAINTEXT', - }, - ] - : []), - ...(appEnv.RESEND_API_KEY - ? [ - { - name: 'RESEND_API_KEY', - value: appEnv.RESEND_API_KEY, - type: 'PLAINTEXT', - }, - ] - : []), - ...(appEnv.REVALIDATION_SECRET - ? [ - { - name: 'REVALIDATION_SECRET', - value: appEnv.REVALIDATION_SECRET, - type: 'PLAINTEXT', - }, - ] - : []), - ...(appEnv.NEXT_PUBLIC_PORTAL_URL - ? [ - { - name: 'NEXT_PUBLIC_PORTAL_URL', - value: appEnv.NEXT_PUBLIC_PORTAL_URL, - type: 'PLAINTEXT', - }, - ] - : []), + { + name: 'NEXT_PUBLIC_PORTAL_URL', + value: 'http://localhost:3002', + type: 'PLAINTEXT', + }, ], }, vpcConfig: { diff --git a/apps/infra/modules/database.ts b/apps/infra/modules/database.ts index 35fcc3c1a..e86e66a2b 100644 --- a/apps/infra/modules/database.ts +++ b/apps/infra/modules/database.ts @@ -153,7 +153,7 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { ]) .apply(([endpoint, username, dbName, password, port]) => JSON.stringify({ - connectionString: `postgresql://${username}:${password}@${endpoint}:${port}/${dbName}?sslmode=require`, + connectionString: `postgresql://${username}:${password}@${endpoint}:${port.toString()}/${dbName}?sslmode=require`, }), ), }, @@ -242,7 +242,18 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { password: dbPassword.result, secretArn: dbSecret.arn, secretId: dbSecret.id, - connectionString: pulumi.interpolate`postgresql://${dbInstance.username}:${dbPassword.result}@${dbInstance.endpoint}:${dbInstance.port}/${dbInstance.dbName}?sslmode=require`, + connectionString: pulumi + .all([ + dbInstance.username, + dbPassword.result, + dbInstance.endpoint, + dbInstance.port, + dbInstance.dbName, + ]) + .apply( + ([username, password, endpoint, port, dbName]) => + `postgresql://${username}:${password}@${endpoint}:${port.toString()}/${dbName}?sslmode=require`, + ), readReplicaEndpoint: readReplica?.endpoint, logGroupName: dbLogGroup.name, connectionAlarmArn: dbConnectionAlarm.arn, From 01c832d9648e690deb6f30b32a797d3c3bf3efb3 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 21:13:18 -0400 Subject: [PATCH 048/107] refactor(infra): update CodeBuild project naming for clarity - Renamed the CodeBuild project from `${config.projectName}-app-build` to `${config.projectName}-app-build-v2` for better versioning and clarity. - Updated associated tags to reflect the new project name, ensuring consistency across the build system. --- apps/infra/modules/build.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index c873f5117..01ce6acb5 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -90,8 +90,8 @@ export function createBuildSystem( }); // CodeBuild project for building application image (requires database access) - const appProject = new aws.codebuild.Project(`${config.projectName}-app-build`, { - name: `${config.projectName}-app-build`, + const appProject = new aws.codebuild.Project(`${config.projectName}-app-build-v2`, { + name: `${config.projectName}-app-build-v2`, description: 'Build application Docker image with database access', serviceRole: codebuildRole.arn, artifacts: { @@ -184,7 +184,7 @@ export function createBuildSystem( sourceVersion: config.githubBranch, // Specify which branch to build from tags: { ...commonTags, - Name: `${config.projectName}-app-build`, + Name: `${config.projectName}-app-build-v2`, Type: 'codebuild-project', Purpose: 'application-image-build', }, From 1a33522f34e7fe0102a95bc80ecafc5451d16917 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 21:19:16 -0400 Subject: [PATCH 049/107] refactor(infra): simplify database connection string format - Removed the port number from the database connection string in both createDatabase function instances. - This change enhances the clarity and consistency of the connection string while maintaining SSL mode requirements. --- apps/infra/modules/database.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/infra/modules/database.ts b/apps/infra/modules/database.ts index e86e66a2b..066413c81 100644 --- a/apps/infra/modules/database.ts +++ b/apps/infra/modules/database.ts @@ -153,7 +153,7 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { ]) .apply(([endpoint, username, dbName, password, port]) => JSON.stringify({ - connectionString: `postgresql://${username}:${password}@${endpoint}:${port.toString()}/${dbName}?sslmode=require`, + connectionString: `postgresql://${username}:${password}@${endpoint}/${dbName}?sslmode=require`, }), ), }, @@ -252,7 +252,7 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { ]) .apply( ([username, password, endpoint, port, dbName]) => - `postgresql://${username}:${password}@${endpoint}:${port.toString()}/${dbName}?sslmode=require`, + `postgresql://${username}:${password}@${endpoint}/${dbName}?sslmode=require`, ), readReplicaEndpoint: readReplica?.endpoint, logGroupName: dbLogGroup.name, From d455bb4e7482a8dc7ec17325bc8ba126613b9712 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 21:21:21 -0400 Subject: [PATCH 050/107] refactor(infra): revert CodeBuild project name to improve clarity - Changed the CodeBuild project name from `${config.projectName}-app-build-v2` back to `${config.projectName}-app-build` for consistency and clarity. - Updated associated tags to reflect the reverted project name, ensuring alignment across the build system. --- apps/infra/modules/build.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index 01ce6acb5..c873f5117 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -90,8 +90,8 @@ export function createBuildSystem( }); // CodeBuild project for building application image (requires database access) - const appProject = new aws.codebuild.Project(`${config.projectName}-app-build-v2`, { - name: `${config.projectName}-app-build-v2`, + const appProject = new aws.codebuild.Project(`${config.projectName}-app-build`, { + name: `${config.projectName}-app-build`, description: 'Build application Docker image with database access', serviceRole: codebuildRole.arn, artifacts: { @@ -184,7 +184,7 @@ export function createBuildSystem( sourceVersion: config.githubBranch, // Specify which branch to build from tags: { ...commonTags, - Name: `${config.projectName}-app-build-v2`, + Name: `${config.projectName}-app-build`, Type: 'codebuild-project', Purpose: 'application-image-build', }, From 24dd15b81c01a23b8d55fe61cfc9176ef97ace0c Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 21:32:25 -0400 Subject: [PATCH 051/107] refactor(infra): update secrets manager syntax for container environment variables - Changed the format of the secrets manager references in container.ts to use double colons (::) instead of single colons (:). - This update enhances consistency in the way environment variables are defined for the container, aligning with best practices for secrets management. --- apps/infra/modules/container.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index d4085b57d..aeadf6811 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -223,7 +223,7 @@ export function createContainer( const secrets = [ { name: 'DATABASE_URL', - valueFrom: `${dbSecretArn}:connectionString`, + valueFrom: `${dbSecretArn}::connectionString::`, }, ]; @@ -231,15 +231,15 @@ export function createContainer( secrets.push( { name: 'AUTH_SECRET', - valueFrom: `${appSecretArn}:AUTH_SECRET`, + valueFrom: `${appSecretArn}::AUTH_SECRET::`, }, { name: 'RESEND_API_KEY', - valueFrom: `${appSecretArn}:RESEND_API_KEY`, + valueFrom: `${appSecretArn}::RESEND_API_KEY::`, }, { name: 'REVALIDATION_SECRET', - valueFrom: `${appSecretArn}:REVALIDATION_SECRET`, + valueFrom: `${appSecretArn}::REVALIDATION_SECRET::`, }, ); } From 7c8b8ed9a8b94df5136b95a6faabc734e8132591 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 21:49:38 -0400 Subject: [PATCH 052/107] refactor(infra): correct secrets manager syntax for container environment variables - Updated the format of the secrets manager references in container.ts to use a single colon (:) instead of double colons (::). - This change ensures consistency in the way environment variables are defined for the container, aligning with best practices for secrets management. --- apps/infra/modules/container.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index aeadf6811..e3a5626d0 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -223,7 +223,7 @@ export function createContainer( const secrets = [ { name: 'DATABASE_URL', - valueFrom: `${dbSecretArn}::connectionString::`, + valueFrom: `${dbSecretArn}:connectionString::`, }, ]; @@ -231,15 +231,15 @@ export function createContainer( secrets.push( { name: 'AUTH_SECRET', - valueFrom: `${appSecretArn}::AUTH_SECRET::`, + valueFrom: `${appSecretArn}:AUTH_SECRET::`, }, { name: 'RESEND_API_KEY', - valueFrom: `${appSecretArn}::RESEND_API_KEY::`, + valueFrom: `${appSecretArn}:RESEND_API_KEY::`, }, { name: 'REVALIDATION_SECRET', - valueFrom: `${appSecretArn}::REVALIDATION_SECRET::`, + valueFrom: `${appSecretArn}:REVALIDATION_SECRET::`, }, ); } From 5f3f4a23a3386374b7a8a389f3eb3da4a5af2757 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 21:54:45 -0400 Subject: [PATCH 053/107] fix(infra): update health check endpoint in container configuration - Changed the health check command in the container configuration from '/health' to '/api/health' to align with the updated API structure. - This ensures the container health check correctly verifies the service's status. --- apps/infra/modules/container.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index e3a5626d0..c565c7506 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -275,7 +275,7 @@ export function createContainer( }, }, healthCheck: { - command: ['CMD-SHELL', 'curl -f http://localhost:3000/health || exit 1'], + command: ['CMD-SHELL', 'curl -f http://localhost:3000/api/health || exit 1'], interval: 30, timeout: 5, retries: 3, From c9b41a6acf20a8caa94a2b01c4c0271acb638013 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Tue, 22 Jul 2025 22:11:26 -0400 Subject: [PATCH 054/107] fix(infra): update health check configuration in container module - Increased timeout from 5 to 10 seconds, retries from 3 to 5, and start period from 60 to 120 seconds for the health check settings. - These adjustments improve the reliability of the health check process for the container. --- apps/infra/modules/container.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index c565c7506..c6715f01f 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -277,9 +277,9 @@ export function createContainer( healthCheck: { command: ['CMD-SHELL', 'curl -f http://localhost:3000/api/health || exit 1'], interval: 30, - timeout: 5, - retries: 3, - startPeriod: 60, + timeout: 10, + retries: 5, + startPeriod: 120, }, }, ]); From a0aea633cf0216c4be1af00889ab8f1d1b455e27 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Wed, 23 Jul 2025 11:44:01 -0400 Subject: [PATCH 055/107] refactor(infra): enhance application secrets management and configuration - Updated the application secrets in app-secrets.ts to include additional required and optional placeholders for better clarity and organization. - Modified the container.ts to reference new secrets, ensuring all necessary environment variables are correctly defined for the container. - Adjusted next.config.ts to conditionally set the output configuration for Docker builds based on the IS_VERCEL environment variable. --- apps/app/next.config.ts | 5 ++- apps/infra/modules/app-secrets.ts | 29 +++++++++++-- apps/infra/modules/container.ts | 71 +++++++++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 5 deletions(-) diff --git a/apps/app/next.config.ts b/apps/app/next.config.ts index b4f45f29f..469f066d4 100644 --- a/apps/app/next.config.ts +++ b/apps/app/next.config.ts @@ -2,7 +2,6 @@ import type { NextConfig } from 'next'; import './src/env.mjs'; const config: NextConfig = { - output: 'standalone', // Required for Docker builds poweredByHeader: false, reactStrictMode: true, turbopack: { @@ -50,4 +49,8 @@ const config: NextConfig = { skipTrailingSlashRedirect: true, }; +if (!process.env.IS_VERCEL || process.env.IS_VERCEL === 'false') { + config.output = 'standalone'; // Required for Docker builds +} + export default config; diff --git a/apps/infra/modules/app-secrets.ts b/apps/infra/modules/app-secrets.ts index 3ee8dca98..7ac033e6a 100644 --- a/apps/infra/modules/app-secrets.ts +++ b/apps/infra/modules/app-secrets.ts @@ -16,15 +16,36 @@ export function createAppSecrets(config: CommonConfig) { }, }); - // Store application secrets with placeholder values + // Store application secrets from environment variables, deduplicating as needed const appSecretVersion = new aws.secretsmanager.SecretVersion( `${config.projectName}-app-secret-version`, { secretId: appSecret.id, + // TODO: Populate secrets in AWS secrets manager UI. secretString: JSON.stringify({ - AUTH_SECRET: 'PLACEHOLDER_SET_IN_AWS_CONSOLE', - RESEND_API_KEY: 'PLACEHOLDER_SET_IN_AWS_CONSOLE', - REVALIDATION_SECRET: 'PLACEHOLDER_SET_IN_AWS_CONSOLE', + // Required + AUTH_SECRET: 'PLACEHOLDER', + RESEND_API_KEY: 'PLACEHOLDER', // For sending emails, and magic link sign in. + REVALIDATION_SECRET: 'PLACEHOLDER', + SECRET_KEY: 'PLACEHOLDER', // For encrypting api keys + UPSTASH_REDIS_REST_URL: 'PLACEHOLDER', + UPSTASH_REDIS_REST_TOKEN: 'PLACEHOLDER', + OPENAI_API_KEY: 'PLACEHOLDER', // Used for populating policies with AI + TRIGGER_SECRET_KEY: 'PLACEHOLDER', + + // Optional - comment out if not used. + AUTH_GOOGLE_ID: 'PLACEHOLDER', + AUTH_GOOGLE_SECRET: 'PLACEHOLDER', + AUTH_GITHUB_ID: 'PLACEHOLDER', + AUTH_GITHUB_SECRET: 'PLACEHOLDER', + AWS_BUCKET_NAME: 'PLACEHOLDER', + AWS_REGION: 'PLACEHOLDER', + AWS_ACCESS_KEY_ID: 'PLACEHOLDER', + AWS_SECRET_ACCESS_KEY: 'PLACEHOLDER', + DISCORD_WEBHOOK_URL: 'PLACEHOLDER', + SLACK_SALES_WEBHOOK: 'PLACEHOLDER', + HUBSPOT_ACCESS_TOKEN: 'PLACEHOLDER', + IS_VERCEL: 'PLACEHOLDER', }), }, ); diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index c6715f01f..f63c377d4 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -229,6 +229,7 @@ export function createContainer( if (appSecrets && appSecretArn) { secrets.push( + // Required secrets { name: 'AUTH_SECRET', valueFrom: `${appSecretArn}:AUTH_SECRET::`, @@ -241,6 +242,76 @@ export function createContainer( name: 'REVALIDATION_SECRET', valueFrom: `${appSecretArn}:REVALIDATION_SECRET::`, }, + { + name: 'SECRET_KEY', + valueFrom: `${appSecretArn}:SECRET_KEY::`, + }, + { + name: 'UPSTASH_REDIS_REST_URL', + valueFrom: `${appSecretArn}:UPSTASH_REDIS_REST_URL::`, + }, + { + name: 'UPSTASH_REDIS_REST_TOKEN', + valueFrom: `${appSecretArn}:UPSTASH_REDIS_REST_TOKEN::`, + }, + { + name: 'OPENAI_API_KEY', + valueFrom: `${appSecretArn}:OPENAI_API_KEY::`, + }, + { + name: 'TRIGGER_SECRET_KEY', + valueFrom: `${appSecretArn}:TRIGGER_SECRET_KEY::`, + }, + + // Optional secrets + { + name: 'IS_VERCEL', + valueFrom: `${appSecretArn}:IS_VERCEL::`, + }, + { + name: 'AUTH_GOOGLE_ID', + valueFrom: `${appSecretArn}:AUTH_GOOGLE_ID::`, + }, + { + name: 'AUTH_GOOGLE_SECRET', + valueFrom: `${appSecretArn}:AUTH_GOOGLE_SECRET::`, + }, + { + name: 'AUTH_GITHUB_ID', + valueFrom: `${appSecretArn}:AUTH_GITHUB_ID::`, + }, + { + name: 'AUTH_GITHUB_SECRET', + valueFrom: `${appSecretArn}:AUTH_GITHUB_SECRET::`, + }, + { + name: 'AWS_BUCKET_NAME', + valueFrom: `${appSecretArn}:AWS_BUCKET_NAME::`, + }, + { + name: 'AWS_REGION', + valueFrom: `${appSecretArn}:AWS_REGION::`, + }, + { + name: 'AWS_ACCESS_KEY_ID', + valueFrom: `${appSecretArn}:AWS_ACCESS_KEY_ID::`, + }, + { + name: 'AWS_SECRET_ACCESS_KEY', + valueFrom: `${appSecretArn}:AWS_SECRET_ACCESS_KEY::`, + }, + { + name: 'DISCORD_WEBHOOK_URL', + valueFrom: `${appSecretArn}:DISCORD_WEBHOOK_URL::`, + }, + { + name: 'SLACK_SALES_WEBHOOK', + valueFrom: `${appSecretArn}:SLACK_SALES_WEBHOOK::`, + }, + { + name: 'HUBSPOT_ACCESS_TOKEN', + valueFrom: `${appSecretArn}:HUBSPOT_ACCESS_TOKEN::`, + }, ); } From 67fc172794f65552ed3bde57c633e4a51e2520e7 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 16:07:01 -0400 Subject: [PATCH 056/107] feat(infra): enhance build and deployment configurations for applications - Updated buildspec.yml for the main app and portal to streamline Docker image building and deployment processes. - Introduced a new buildspec for database migrations to ensure proper execution before application deployments. - Created a generic buildspec template for Docker-based applications to standardize build configurations across different apps. - Enhanced deploy.sh script to support parallel deployment of the main app and portal, with options to skip infrastructure updates and migrations. - Improved validation of application configurations to prevent duplicate names and port conflicts, ensuring robust deployment setups. - Added application routing and scaling configurations to support multiple applications within the infrastructure. --- apps/app/buildspec.yml | 34 +- apps/infra/buildspec-migrations.yml | 43 +++ apps/infra/buildspec-template.yml | 41 +++ apps/infra/deploy.sh | 178 +++++++++- apps/infra/index.ts | 272 +++++++++++---- apps/infra/modules/app-secrets.ts | 96 ++--- apps/infra/modules/build.ts | 303 ++++++++++------ apps/infra/modules/config.ts | 100 +++--- apps/infra/modules/container.ts | 519 +++++++++++++--------------- apps/infra/modules/database.ts | 2 +- apps/infra/modules/loadbalancer.ts | 117 +++++-- apps/infra/modules/monitoring.ts | 402 +++++++++++++-------- apps/infra/modules/networking.ts | 15 +- apps/infra/modules/scaling.ts | 272 +++++++-------- apps/infra/modules/validation.ts | 117 +++++++ apps/infra/types.ts | 84 +++-- apps/portal/Dockerfile | 37 ++ apps/portal/buildspec.yml | 45 +++ 18 files changed, 1742 insertions(+), 935 deletions(-) create mode 100644 apps/infra/buildspec-migrations.yml create mode 100644 apps/infra/buildspec-template.yml create mode 100644 apps/infra/modules/validation.ts create mode 100644 apps/portal/Dockerfile create mode 100644 apps/portal/buildspec.yml diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index dbcff4b98..764254efb 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -5,9 +5,10 @@ phases: commands: - echo "Logging in to Amazon ECR..." - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com - - REPOSITORY_URI=$AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME + - REPOSITORY_URI=$ECR_REPOSITORY_URI - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - IMAGE_TAG=${COMMIT_HASH:=latest} + - echo "Installing dependencies..." - curl -fsSL https://bun.sh/install | bash build: @@ -19,12 +20,16 @@ phases: - export UV_THREADPOOL_SIZE=36 - export NODE_OPTIONS="--max-old-space-size=65536" + # Navigate to app directory + - cd apps/$APP_NAME + # Install dependencies - echo "Installing dependencies..." - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile --concurrent 36 || SKIP_ENV_VALIDATION=true bun install --concurrent 36 # Generate Prisma client - echo "Generating Prisma client..." + - cd ../../ - bun x prisma generate --schema=packages/db/prisma/schema.prisma - cd packages/db && bun x prisma generate && cd ../../ @@ -32,19 +37,13 @@ phases: - echo "Validating environment variables..." - '[ -n "$NEXT_PUBLIC_PORTAL_URL" ] || { echo "❌ NEXT_PUBLIC_PORTAL_URL is not set"; exit 1; }' - # Run database migrations - - echo "Running database migrations..." - - cd apps/app - - NODE_TLS_REJECT_UNAUTHORIZED=0 bun run apply-migrations - - cd ../../ - # Type check - echo "Type checking..." - - cd apps/app && bun run typecheck && cd ../../ + - cd apps/$APP_NAME && bun run typecheck && cd ../../ # Build Next.js app - echo "Building Next.js application..." - - cd apps/app + - cd apps/$APP_NAME - NODE_TLS_REJECT_UNAUTHORIZED=0 bun run build # Prepare standalone build @@ -55,8 +54,8 @@ phases: - echo "DEBUG - Checking if static files exist..." - ls -la .next/static/ || echo "No static directory found" - echo "DEBUG - Copying static files to standalone..." - - cp -r public .next/standalone/apps/app/ || echo "No public folder" - - cp -r .next/static .next/standalone/apps/app/.next/ || echo "No .next/static directory" + - cp -r public .next/standalone/apps/$APP_NAME/ || echo "No public folder" + - cp -r .next/static .next/standalone/apps/$APP_NAME/.next/ || echo "No .next/static directory" - echo "DEBUG - Final verification..." - ls -la .next/standalone/ || echo "Standalone empty" - find .next/standalone -name "*.css" | head -3 || echo "No CSS files found" @@ -78,18 +77,17 @@ phases: # Build Docker image - echo "Building Docker image..." - - docker build --build-arg BUILDKIT_INLINE_CACHE=1 -f Dockerfile -t $IMAGE_REPO_NAME:$IMAGE_TAG . - - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG - - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $REPOSITORY_URI:latest + - docker build --build-arg BUILDKIT_INLINE_CACHE=1 -f ${DOCKERFILE_PATH:-Dockerfile} -t $ECR_REPOSITORY_URI:$IMAGE_TAG . + - docker tag $ECR_REPOSITORY_URI:$IMAGE_TAG $ECR_REPOSITORY_URI:latest post_build: commands: - echo "Pushing images to ECR..." - - docker push $REPOSITORY_URI:$IMAGE_TAG - - docker push $REPOSITORY_URI:latest + - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG + - docker push $ECR_REPOSITORY_URI:latest - echo "Updating ECS service..." - aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment - - 'printf "[{\"name\":\"%s-app\",\"imageUri\":\"%s\"}]" $IMAGE_REPO_NAME $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json' + - 'printf "[{\"name\":\"%s-container\",\"imageUri\":\"%s\"}]" $APP_NAME $ECR_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json' cache: paths: @@ -102,4 +100,4 @@ cache: artifacts: files: - imagedefinitions.json - name: app-build + name: ${APP_NAME}-build diff --git a/apps/infra/buildspec-migrations.yml b/apps/infra/buildspec-migrations.yml new file mode 100644 index 000000000..7880fdf97 --- /dev/null +++ b/apps/infra/buildspec-migrations.yml @@ -0,0 +1,43 @@ +version: 0.2 + +phases: + pre_build: + commands: + - echo "Installing dependencies for migrations..." + - curl -fsSL https://bun.sh/install | bash + - export PATH="/root/.bun/bin:$PATH" + + build: + commands: + # Environment setup + - export PATH="/root/.bun/bin:$PATH" + - export PGSSLMODE=require + - export NODE_TLS_REJECT_UNAUTHORIZED=0 + + # Install dependencies + - echo "Installing dependencies..." + - cd packages/db + - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile || SKIP_ENV_VALIDATION=true bun install + + # Generate Prisma client + - echo "Generating Prisma client..." + - bun x prisma generate + + # Run database migrations + - echo "Running database migrations..." + - echo "DATABASE_URL is configured: $([ -n \"$DATABASE_URL\" ] && echo 'YES' || echo 'NO')" + - bun x prisma migrate deploy + + # Verify migration success + - echo "Verifying database schema..." + - bun x prisma db pull --print + + post_build: + commands: + - echo "Database migrations completed successfully on `date`" + +cache: + paths: + - 'node_modules/**/*' + - 'packages/db/node_modules/**/*' + - '/root/.bun/install/cache/**/*' diff --git a/apps/infra/buildspec-template.yml b/apps/infra/buildspec-template.yml new file mode 100644 index 000000000..5baf8eff7 --- /dev/null +++ b/apps/infra/buildspec-template.yml @@ -0,0 +1,41 @@ +version: 0.2 + +# Generic buildspec template for Docker-based applications +# This template can be used by any app regardless of language +# Required environment variables: +# - AWS_ACCOUNT_ID: AWS account ID +# - AWS_DEFAULT_REGION: AWS region +# - ECR_REPOSITORY_URI: ECR repository URL for this app +# - ECS_CLUSTER_NAME: ECS cluster name +# - ECS_SERVICE_NAME: ECS service name for this app +# - APP_NAME: Application name +# - DOCKERFILE_PATH: Path to Dockerfile (default: ./Dockerfile) + +phases: + pre_build: + commands: + - echo "Logging in to Amazon ECR..." + - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com + - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) + - IMAGE_TAG=${COMMIT_HASH:=latest} + + build: + commands: + - echo "Building Docker image for $APP_NAME..." + - cd apps/$APP_NAME + - docker build --build-arg BUILDKIT_INLINE_CACHE=1 -f ${DOCKERFILE_PATH:-Dockerfile} -t $ECR_REPOSITORY_URI:$IMAGE_TAG . + - docker tag $ECR_REPOSITORY_URI:$IMAGE_TAG $ECR_REPOSITORY_URI:latest + + post_build: + commands: + - echo "Pushing images to ECR..." + - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG + - docker push $ECR_REPOSITORY_URI:latest + - echo "Updating ECS service..." + - aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment + - 'printf "[{\"name\":\"%s-container\",\"imageUri\":\"%s\"}]" $APP_NAME $ECR_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json' + +artifacts: + files: + - imagedefinitions.json + name: ${APP_NAME}-build diff --git a/apps/infra/deploy.sh b/apps/infra/deploy.sh index 2feec1267..f7563c2ec 100755 --- a/apps/infra/deploy.sh +++ b/apps/infra/deploy.sh @@ -10,6 +10,49 @@ NC='\033[0m' # No Color # Configuration AWS_REGION=${AWS_REGION:-us-east-1} PROJECT_NAME=${PROJECT_NAME:-comp} # Base project name, can be overridden +AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text 2>/dev/null || echo "") + +# Parse command line arguments +DEPLOY_APP=true +DEPLOY_PORTAL=true +SKIP_INFRA=false +SKIP_MIGRATIONS=false + +while [[ $# -gt 0 ]]; do + case $1 in + --app-only) + DEPLOY_PORTAL=false + shift + ;; + --portal-only) + DEPLOY_APP=false + shift + ;; + --skip-infra) + SKIP_INFRA=true + shift + ;; + --skip-migrations) + SKIP_MIGRATIONS=true + shift + ;; + --help) + echo "Usage: $0 [options]" + echo "Options:" + echo " --app-only Deploy only the main app" + echo " --portal-only Deploy only the portal" + echo " --skip-infra Skip Pulumi infrastructure update" + echo " --skip-migrations Skip database migrations (DANGEROUS!)" + echo " --help Show this help message" + exit 0 + ;; + *) + echo "Unknown option: $1" + echo "Run '$0 --help' for usage information" + exit 1 + ;; + esac +done # Get the script's directory SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" @@ -50,6 +93,8 @@ PROJECT_PREFIX="${PROJECT_NAME}-${ENV_NAME}" CLUSTER_NAME="${PROJECT_PREFIX}" SERVICE_NAME="${PROJECT_PREFIX}" # Service name matches project prefix APP_PROJECT="${PROJECT_PREFIX}-app-build" +PORTAL_PROJECT="${PROJECT_PREFIX}-portal-build" +MIGRATION_PROJECT="${PROJECT_PREFIX}-migrations" echo -e "${GREEN}🚀 Starting deployment for environment: ${ENV_NAME}${NC}" echo -e "${YELLOW}📋 Using resource prefix: ${PROJECT_PREFIX}${NC}" @@ -64,7 +109,9 @@ SERVICE_NAME=${ACTUAL_SERVICE:-$SERVICE_NAME} echo -e "${YELLOW}📋 Cluster: ${CLUSTER_NAME}${NC}" echo -e "${YELLOW}📋 Service: ${SERVICE_NAME}${NC}" -echo -e "${YELLOW}📋 CodeBuild Project: ${APP_PROJECT}${NC}" +echo -e "${YELLOW}📋 Migration Project: ${MIGRATION_PROJECT}${NC}" +echo -e "${YELLOW}📋 App CodeBuild Project: ${APP_PROJECT}${NC}" +echo -e "${YELLOW}📋 Portal CodeBuild Project: ${PORTAL_PROJECT}${NC}" echo -e "${YELLOW}📋 AWS Region: ${AWS_REGION}${NC}" # Confirm deployment @@ -75,6 +122,16 @@ if [[ ! "$response" =~ ^[Yy]$ ]]; then exit 1 fi +# Function to generate CodeBuild console URL +get_codebuild_url() { + local build_id=$1 + # Extract project name from build ID (format: project-name:build-uuid) + local project_name=$(echo "$build_id" | cut -d':' -f1) + # URL encode the build ID (replace : with %3A) + local encoded_build_id=$(echo "$build_id" | sed 's/:/%3A/g') + echo "https://${AWS_REGION}.console.aws.amazon.com/codesuite/codebuild/${AWS_ACCOUNT_ID}/projects/${project_name}/build/${encoded_build_id}/?region=${AWS_REGION}" +} + # Function to wait for CodeBuild wait_for_build() { local build_id=$1 @@ -107,31 +164,116 @@ wait_for_build() { } # Step 1: Update Infrastructure -echo -e "${YELLOW}📋 Step 1: Updating infrastructure...${NC}" -cd "$INFRA_DIR" -export NODE_ENV=production -if ! pulumi up --yes; then - echo -e "${RED}❌ Pulumi update failed. Aborting deployment.${NC}" - exit 1 +if [ "$SKIP_INFRA" = false ]; then + echo -e "${YELLOW}📋 Step 1: Updating infrastructure...${NC}" + cd "$INFRA_DIR" + export NODE_ENV=production + if ! pulumi up --yes; then + echo -e "${RED}❌ Pulumi update failed. Aborting deployment.${NC}" + exit 1 + fi + cd "$PROJECT_ROOT" + echo -e "${GREEN}✅ Infrastructure updated successfully${NC}" +else + echo -e "${YELLOW}⏭️ Step 1: Skipping infrastructure update${NC}" fi -cd "$PROJECT_ROOT" -echo -e "${GREEN}✅ Infrastructure updated successfully${NC}" # Add a small delay to ensure propagation echo -e "${YELLOW}⏳ Waiting 15 seconds for infrastructure changes to propagate...${NC}" sleep 15 -# Step 2: Build and Deploy Application (includes migrations) -echo -e "${YELLOW}🔨 Step 2: Building application (migrations + Next.js + Docker)...${NC}" -app_build_id=$(aws codebuild start-build \ - --project-name "$APP_PROJECT" \ - --query 'build.id' --output text) +# Step 2: Run Database Migrations (MUST complete before apps) +if [ "$SKIP_MIGRATIONS" = false ]; then + echo -e "${YELLOW}🗃️ Step 2: Running database migrations...${NC}" + migration_build_id=$(aws codebuild start-build \ + --project-name "$MIGRATION_PROJECT" \ + --query 'build.id' --output text) + + echo "Migration build ID: $migration_build_id" + migration_url=$(get_codebuild_url "$migration_build_id") + echo -e "${YELLOW}🔗 View build: ${migration_url}${NC}" + if ! wait_for_build "$migration_build_id" "Database Migrations"; then + echo -e "${RED}❌ Migration failed. Aborting deployment.${NC}" + exit 1 + fi +else + echo -e "${YELLOW}⏭️ Step 2: Skipping database migrations (DANGEROUS!)${NC}" +fi -echo "App build ID: $app_build_id" -wait_for_build "$app_build_id" "Application" +# Step 3: Build and Deploy Applications (in parallel) +echo -e "${YELLOW}🔨 Step 3: Building and deploying applications...${NC}" + +# Display what will be deployed +echo -e "${YELLOW}📦 Applications to deploy:${NC}" +if [ "$DEPLOY_APP" = true ]; then + echo -e " - Main App ✓" +else + echo -e " - Main App ✗ (skipped)" +fi +if [ "$DEPLOY_PORTAL" = true ]; then + echo -e " - Portal ✓" +else + echo -e " - Portal ✗ (skipped)" +fi +echo "" + +# Start app build +if [ "$DEPLOY_APP" = true ]; then + app_build_id=$(aws codebuild start-build \ + --project-name "$APP_PROJECT" \ + --query 'build.id' --output text) + echo "App build ID: $app_build_id" + app_url=$(get_codebuild_url "$app_build_id") + echo -e "${YELLOW}🔗 View app build: ${app_url}${NC}" +fi + +# Start portal build (if project exists) +portal_build_id="" +if [ "$DEPLOY_PORTAL" = true ] && aws codebuild describe-projects --names "$PORTAL_PROJECT" &>/dev/null; then + portal_build_id=$(aws codebuild start-build \ + --project-name "$PORTAL_PROJECT" \ + --query 'build.id' --output text) + echo "Portal build ID: $portal_build_id" + portal_url=$(get_codebuild_url "$portal_build_id") + echo -e "${YELLOW}🔗 View portal build: ${portal_url}${NC}" +fi + +# Display summary of running builds +echo "" +echo -e "${GREEN}📊 Build Summary:${NC}" +if [ "$DEPLOY_APP" = true ] && [ -n "$app_build_id" ]; then + echo -e "${YELLOW} 🔨 App Build:${NC}" + echo -e " ID: $app_build_id" + echo -e " 🔗 ${app_url}" +fi +if [ "$DEPLOY_PORTAL" = true ] && [ -n "$portal_build_id" ]; then + echo -e "${YELLOW} 🔨 Portal Build:${NC}" + echo -e " ID: $portal_build_id" + echo -e " 🔗 ${portal_url}" +fi +echo "" + +# Wait for builds to complete +build_failed=false +if [ "$DEPLOY_APP" = true ] && [ -n "$app_build_id" ]; then + if ! wait_for_build "$app_build_id" "Application"; then + build_failed=true + fi +fi + +if [ "$DEPLOY_PORTAL" = true ] && [ -n "$portal_build_id" ]; then + if ! wait_for_build "$portal_build_id" "Portal"; then + build_failed=true + fi +fi + +if [ "$build_failed" = true ]; then + echo -e "${RED}❌ One or more builds failed. Deployment incomplete.${NC}" + exit 1 +fi -# Step 3: Verify Deployment -echo -e "${YELLOW}🔍 Step 3: Verifying deployment...${NC}" +# Step 4: Verify Deployment +echo -e "${YELLOW}🔍 Step 4: Verifying deployment...${NC}" # Wait for ECS service to stabilize after the build updated it echo -e "${YELLOW}⏳ Waiting for ECS deployment to stabilize...${NC}" diff --git a/apps/infra/index.ts b/apps/infra/index.ts index f6476d2a4..acf27fc95 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -7,11 +7,13 @@ import { createConfig } from './modules/config'; import { createContainer } from './modules/container'; import { createDatabase } from './modules/database'; import { createGithubOidc } from './modules/github-oidc'; -import { createLoadBalancer } from './modules/loadbalancer'; +import { createApplicationRouting, createLoadBalancer } from './modules/loadbalancer'; import { createMonitoring } from './modules/monitoring'; import { createNetworking } from './modules/networking'; import { createScaling } from './modules/scaling'; import { createTailscale } from './modules/tailscale'; +import { validateApplicationConfigs } from './modules/validation'; +import { ApplicationConfig, ApplicationOutput } from './types'; // Load environment variables from .env file dotenv.config(); @@ -35,112 +37,256 @@ const enableDetailedMonitoring = pathfinderConfig.getBoolean('enableDetailedMoni // ========================================== const config = createConfig(projectName); +// ========================================== +// APPLICATION CONFIGURATIONS +// ========================================== +const applications: ApplicationConfig[] = [ + { + name: 'app', + containerPort: 3000, + healthCheck: { + path: '/api/health', + interval: 30, + timeout: 5, + healthyThreshold: 2, + unhealthyThreshold: 3, + }, + routing: { + pathPattern: '/*', // Default route + }, + cpu: 256, + memory: 512, + desiredCount: 2, + minCount: 1, + maxCount: 10, + targetCPUPercent: 70, + requiredSecrets: [ + // Core authentication and security + 'AUTH_SECRET', + 'RESEND_API_KEY', // For sending emails, and magic link sign in. + 'REVALIDATION_SECRET', + 'SECRET_KEY', // For encrypting api keys + 'UPSTASH_REDIS_REST_URL', + 'UPSTASH_REDIS_REST_TOKEN', + 'OPENAI_API_KEY', // Used for populating policies with AI + 'TRIGGER_SECRET_KEY', + + // Optional - comment out if not used. + 'AUTH_GOOGLE_ID', + 'AUTH_GOOGLE_SECRET', + 'AUTH_GITHUB_ID', + 'AUTH_GITHUB_SECRET', + 'AWS_BUCKET_NAME', + 'AWS_REGION', + 'AWS_ACCESS_KEY_ID', + 'AWS_SECRET_ACCESS_KEY', + 'DISCORD_WEBHOOK_URL', + 'SLACK_SALES_WEBHOOK', + 'HUBSPOT_ACCESS_TOKEN', + 'IS_VERCEL', + ], + includeDatabaseUrl: true, + environmentVariables: { + NODE_ENV: 'production', + NEXT_TELEMETRY_DISABLED: '1', + }, + }, + { + name: 'portal', + containerPort: 3001, + healthCheck: { + path: '/health', + interval: 30, + timeout: 5, + healthyThreshold: 2, + unhealthyThreshold: 3, + }, + routing: { + pathPattern: '/portal/*', + }, + cpu: 256, + memory: 512, + desiredCount: 1, + minCount: 1, + maxCount: 5, + targetCPUPercent: 70, + requiredSecrets: ['PORTAL_API_KEY'], + includeDatabaseUrl: true, + environmentVariables: { + NODE_ENV: 'production', + }, + }, +]; + +// Validate configurations before creating resources +validateApplicationConfigs(applications); + // ========================================== // CORE INFRASTRUCTURE (ALWAYS DEPLOYED) // ========================================== // 1. Foundation Layer - VPC, Subnets, Security Groups -const network = createNetworking(config); +const network = createNetworking(config, applications); // 2. Data Layer - Private RDS PostgreSQL const database = createDatabase(config, network); -// 3. Application Secrets - Separate from database secrets -const appSecrets = createAppSecrets(config); +// 3. Application Secrets - Per-app secrets +const appSecrets = createAppSecrets(config, applications); -// 4. Load Balancing - ALB with Health Checks (create target group first) +// 4. Load Balancing - ALB with Health Checks const loadBalancer = createLoadBalancer(config, network); -// 5. Container Platform - ECR, ECS Cluster (with load balancer integration) -const container = createContainer(config, network, database, loadBalancer, appSecrets); +// 5. Container Platform - Multi-app ECS support +const container = createContainer( + config, + applications, + network, + database, + loadBalancer, + appSecrets, +); // 6. Build System - CodeBuild with VPC Database Access const build = createBuildSystem(config, network, database, container, appSecrets); -// 7. Auto-scaling - ECS Service Scaling -const scaling = createScaling(config, container, loadBalancer); +// 7. Wire up applications +const deployments = applications.map((app, index) => { + const appContainer = container.applications![index]; + + // Create build project for this app + const buildProject = build.createApplicationBuildProject(app, appContainer); -// 8. GitHub OIDC - For GitHub Actions authentication + // Create routing rules if app has routing config and target group + if (app.routing && appContainer.targetGroupArn) { + createApplicationRouting({ + projectName: config.projectName, + appName: app.name, + loadBalancerArn: loadBalancer.albArn, + targetGroupArn: appContainer.targetGroupArn, + pathPattern: app.routing.pathPattern, + hostHeader: app.routing.hostnames, + priority: (index + 1) * 100, + httpListenerArn: loadBalancer.httpListenerArn, + }); + } + + return { + app, + buildProject, + container: appContainer, + }; +}); + +// 8. Auto-scaling - ECS Service Scaling +const scaling = createScaling(config, applications, container, loadBalancer); + +// 9. GitHub OIDC - For GitHub Actions authentication const githubOidc = createGithubOidc(config); // ========================================== // OPTIONAL INFRASTRUCTURE (FEATURE-GATED) // ========================================== -// 9. Development Access - Tailscale Subnet Router (Optional) +// 10. Development Access - Tailscale Subnet Router (Optional) const tailscale = enableTailscale ? createTailscale(config, network, database) : undefined; -// 10. Observability - Better Stack + CloudWatch (Optional/Configurable) -const monitoring = createMonitoring(config, database, container, loadBalancer, { +// 11. Observability - Better Stack + CloudWatch (Optional/Configurable) +const appContainers = + container.applications?.reduce( + (acc, appContainer, index) => { + acc[applications[index].name] = appContainer; + return acc; + }, + {} as Record, + ) || {}; + +const monitoring = createMonitoring(config, applications, database, appContainers, loadBalancer, { enableBetterStack, enableDetailedMonitoring, }); // ========================================== -// MULTI-APPLICATION DEPLOYMENT +// STACK OUTPUTS // ========================================== -const applications = [ - { - name: `${config.projectName}-app`, - contextPath: '../app', - requiresDatabaseAccess: true, - dependsOnMigrations: true, - buildCommand: 'npm run build', - healthCheckPath: '/health', - environmentVariables: { - NODE_ENV: 'production', - HOSTNAME: '0.0.0.0', - PORT: '3000', - }, - resourceRequirements: { - cpu: 1024, - memory: 2048, - }, - scaling: { - minInstances: 2, - maxInstances: 10, - targetCpuPercent: 60, - }, - }, -]; +// Application-specific outputs +export const applicationOutputs = deployments.reduce( + (acc, deployment) => { + const appName = deployment.app.name; -// Deploy configured applications -// TODO: Implement createApplicationDeployment in build module -applications.map((app) => build.createApplicationDeployment(app, database, container)); + // Build URL based on routing config + const appUrl = deployment.app.routing?.pathPattern + ? pulumi.interpolate`${loadBalancer.applicationUrl}${deployment.app.routing.pathPattern.replace('/*', '')}` + : deployment.app.routing?.hostnames + ? pulumi.interpolate`http://${deployment.app.routing.hostnames[0]}` + : loadBalancer.applicationUrl; -// ========================================== -// STACK OUTPUTS (COMPREHENSIVE AS PER PROPOSAL) -// ========================================== + acc[appName] = { + url: appUrl, + serviceName: deployment.container.serviceName, + ecrRepository: deployment.container.repositoryUrl, + logGroup: deployment.container.logGroupName, + buildProject: deployment.buildProject.name, + healthCheckUrl: pulumi.interpolate`${appUrl}${deployment.app.healthCheck?.path || '/health'}`, + secretArn: appSecrets[deployment.app.name]?.secretArn, + deployCommand: pulumi.interpolate`aws codebuild start-build --project-name ${deployment.buildProject.name}`, + }; -// Core application URLs -export const applicationUrl = loadBalancer.applicationUrl; -export const albDns = loadBalancer.albDnsName; + return acc; + }, + {} as Record, +); -// Infrastructure details -export const ecrRepositoryUrl = container.repositoryUrl; -export const ecsClusterName = container.clusterName; -export const ecsServiceName = container.serviceName; +// Infrastructure outputs +export const albUrl = loadBalancer.applicationUrl; +export const clusterName = container.clusterName; -// Database connection information +// Database outputs export const databaseEndpoint = database.endpoint; export const databaseName = database.dbName; -export const databaseUsername = database.username; -export const databasePassword = pulumi.secret(database.password); -// Tailscale-accessible database information (if Tailscale enabled) +// Migration outputs +export const migrationProjectName = build.migrationProject.name; +export const runMigrationsCommand = pulumi.interpolate`aws codebuild start-build --project-name ${build.migrationProject.name}`; + +// Tailscale outputs (if enabled) export const tailscaleEnabled = enableTailscale; export const tailscaleConnectionGuide = enableTailscale ? pulumi.interpolate` # Connect to database through Tailscale: # 1. Ensure you're connected to Tailscale network -# 2. Use this connection string: postgresql://${database.username}:${database.password}@${database.endpoint}:${database.port}/${database.dbName}?sslmode=require -# 3. Get password with: pulumi stack output databasePassword --show-secrets +# 2. Use: postgresql://${database.username}:[PASSWORD]@${database.endpoint}:${database.port}/${database.dbName}?sslmode=require +# 3. Get password with: pulumi stack output databasePassword --show-secrets (if stored) ` - : 'Tailscale not enabled for this environment'; + : 'Tailscale not enabled'; + +// Monitoring outputs +export const dashboardUrl = monitoring.applicationDashboardUrl; +export const infrastructureDashboardUrl = monitoring.infrastructureDashboardUrl; + +// Deployment instructions +export const deploymentInstructions = pulumi + .all([migrationProjectName, applicationOutputs['app']?.deployCommand || pulumi.output('')]) + .apply( + ([migrationProject, appDeployCmd]) => ` +IMPORTANT: Deployment Order +=========================== +1. FIRST run database migrations (required before any app deployment): + aws codebuild start-build --project-name ${migrationProject} + +2. THEN deploy applications (can be run in parallel): + - App: ${appDeployCmd} + - Portal: aws codebuild start-build --project-name [portal-project-name] + +3. Monitor deployments: + - CodeBuild console for build progress + - ECS console for service updates + - CloudWatch logs for runtime issues -// Better Stack information (if enabled) -export const betterstackEnabled = enableBetterStack; -export const betterstackLambdaArn = enableBetterStack - ? monitoring.logForwarderFunctionArn - : undefined; +To update secrets: +1. Go to AWS Secrets Manager +2. Find the secret for your app (format: ${projectName}/{appName}/secrets-*) +3. Update the secret values as needed +`, + ); diff --git a/apps/infra/modules/app-secrets.ts b/apps/infra/modules/app-secrets.ts index 7ac033e6a..fb7230d17 100644 --- a/apps/infra/modules/app-secrets.ts +++ b/apps/infra/modules/app-secrets.ts @@ -1,57 +1,57 @@ import * as aws from '@pulumi/aws'; -import { CommonConfig } from '../types'; +import * as pulumi from '@pulumi/pulumi'; +import { ApplicationConfig, CommonConfig } from '../types'; -export function createAppSecrets(config: CommonConfig) { +export function createAppSecrets(config: CommonConfig, applications: ApplicationConfig[]) { const { commonTags } = config; - // Create AWS Secret for application credentials - const appSecret = new aws.secretsmanager.Secret(`${config.projectName}-app-secret`, { - namePrefix: `${config.projectName}/application/secrets-`, - description: 'Application secrets for AUTH_SECRET, RESEND_API_KEY, etc.', - tags: { - ...commonTags, - Name: `${config.projectName}-app-secret`, - Type: 'secret', - Purpose: 'application-secrets', - }, - }); + // Create a secret for each application that needs secrets + const appSecrets = applications + .filter((app) => app.requiredSecrets && app.requiredSecrets.length > 0) + .map((app) => { + // Create app-specific secret + const secret = new aws.secretsmanager.Secret(`${config.projectName}-${app.name}-secret`, { + namePrefix: `${config.projectName}/${app.name}/secrets-`, + description: `Application secrets for ${app.name}. Update these values in AWS Secrets Manager.`, + tags: { + ...commonTags, + Name: `${config.projectName}-${app.name}-secret`, + Type: 'secret', + Purpose: 'application-secrets', + App: app.name, + }, + }); + + // Create placeholders for all required secrets + const placeholders: Record = {}; + app.requiredSecrets!.forEach((secretName) => { + placeholders[secretName] = 'PLACEHOLDER'; + }); - // Store application secrets from environment variables, deduplicating as needed - const appSecretVersion = new aws.secretsmanager.SecretVersion( - `${config.projectName}-app-secret-version`, - { - secretId: appSecret.id, - // TODO: Populate secrets in AWS secrets manager UI. - secretString: JSON.stringify({ - // Required - AUTH_SECRET: 'PLACEHOLDER', - RESEND_API_KEY: 'PLACEHOLDER', // For sending emails, and magic link sign in. - REVALIDATION_SECRET: 'PLACEHOLDER', - SECRET_KEY: 'PLACEHOLDER', // For encrypting api keys - UPSTASH_REDIS_REST_URL: 'PLACEHOLDER', - UPSTASH_REDIS_REST_TOKEN: 'PLACEHOLDER', - OPENAI_API_KEY: 'PLACEHOLDER', // Used for populating policies with AI - TRIGGER_SECRET_KEY: 'PLACEHOLDER', + const secretVersion = new aws.secretsmanager.SecretVersion( + `${config.projectName}-${app.name}-secret-version`, + { + secretId: secret.id, + secretString: JSON.stringify(placeholders), + }, + ); - // Optional - comment out if not used. - AUTH_GOOGLE_ID: 'PLACEHOLDER', - AUTH_GOOGLE_SECRET: 'PLACEHOLDER', - AUTH_GITHUB_ID: 'PLACEHOLDER', - AUTH_GITHUB_SECRET: 'PLACEHOLDER', - AWS_BUCKET_NAME: 'PLACEHOLDER', - AWS_REGION: 'PLACEHOLDER', - AWS_ACCESS_KEY_ID: 'PLACEHOLDER', - AWS_SECRET_ACCESS_KEY: 'PLACEHOLDER', - DISCORD_WEBHOOK_URL: 'PLACEHOLDER', - SLACK_SALES_WEBHOOK: 'PLACEHOLDER', - HUBSPOT_ACCESS_TOKEN: 'PLACEHOLDER', - IS_VERCEL: 'PLACEHOLDER', - }), + return { + appName: app.name, + secretArn: secret.arn, + secretId: secret.id, + }; + }); + + // Return a map of app name to secret info + return appSecrets.reduce( + (acc, appSecret) => { + acc[appSecret.appName] = { + secretArn: appSecret.secretArn, + secretId: appSecret.secretId, + }; + return acc; }, + {} as Record; secretId: pulumi.Output }>, ); - - return { - secretArn: appSecret.arn, - secretId: appSecret.id, - }; } diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index c873f5117..b3b0d46a9 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -1,13 +1,22 @@ import * as aws from '@pulumi/aws'; import * as pulumi from '@pulumi/pulumi'; -import { CommonConfig, ContainerOutputs, DatabaseOutputs, NetworkOutputs } from '../types'; +import { + ApplicationConfig, + CommonConfig, + ContainerOutputs, + DatabaseOutputs, + NetworkOutputs, +} from '../types'; export function createBuildSystem( config: CommonConfig, network: NetworkOutputs, database: DatabaseOutputs, container: ContainerOutputs, - appSecrets?: { secretArn: pulumi.Output; secretId: pulumi.Output }, + appSecrets?: Record< + string, + { secretArn: pulumi.Output; secretId: pulumi.Output } + >, ) { const { commonTags } = config; @@ -89,107 +98,6 @@ export function createBuildSystem( ), }); - // CodeBuild project for building application image (requires database access) - const appProject = new aws.codebuild.Project(`${config.projectName}-app-build`, { - name: `${config.projectName}-app-build`, - description: 'Build application Docker image with database access', - serviceRole: codebuildRole.arn, - artifacts: { - type: 'NO_ARTIFACTS', - }, - environment: { - computeType: 'BUILD_GENERAL1_2XLARGE', - image: 'aws/codebuild/standard:7.0', - type: 'LINUX_CONTAINER', - privilegedMode: true, // Required for Docker builds - environmentVariables: [ - { - name: 'AWS_ACCOUNT_ID', - value: aws.getCallerIdentityOutput().accountId, - type: 'PLAINTEXT', - }, - { - name: 'IMAGE_REPO_NAME', - value: config.projectName, - type: 'PLAINTEXT', - }, - { - name: 'DATABASE_URL', - value: pulumi.interpolate`${database.secretArn}:connectionString`, - type: 'SECRETS_MANAGER', - }, - // Application secrets from AWS Secrets Manager - ...(appSecrets - ? [ - { - name: 'AUTH_SECRET', - value: pulumi.interpolate`${appSecrets.secretArn}:AUTH_SECRET`, - type: 'SECRETS_MANAGER', - }, - { - name: 'RESEND_API_KEY', - value: pulumi.interpolate`${appSecrets.secretArn}:RESEND_API_KEY`, - type: 'SECRETS_MANAGER', - }, - { - name: 'REVALIDATION_SECRET', - value: pulumi.interpolate`${appSecrets.secretArn}:REVALIDATION_SECRET`, - type: 'SECRETS_MANAGER', - }, - ] - : []), - { - name: 'ECR_REPOSITORY_URI', - value: container.repositoryUrl, - type: 'PLAINTEXT', - }, - { - name: 'ECS_CLUSTER_NAME', - value: container.clusterName, - type: 'PLAINTEXT', - }, - { - name: 'ECS_SERVICE_NAME', - value: container.serviceName, - type: 'PLAINTEXT', - }, - { - name: 'AWS_DEFAULT_REGION', - value: config.awsRegion, - type: 'PLAINTEXT', - }, - { - name: 'NODE_ENV', - value: config.nodeEnv, - type: 'PLAINTEXT', - }, - { - name: 'NEXT_PUBLIC_PORTAL_URL', - value: 'http://localhost:3002', - type: 'PLAINTEXT', - }, - ], - }, - vpcConfig: { - vpcId: network.vpcId, - subnets: network.privateSubnetIds, - securityGroupIds: [network.securityGroups.codeBuild], - }, - source: { - type: 'GITHUB', - location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, - buildspec: 'apps/app/buildspec.yml', - gitCloneDepth: 1, - }, - sourceVersion: config.githubBranch, // Specify which branch to build from - tags: { - ...commonTags, - Name: `${config.projectName}-app-build`, - Type: 'codebuild-project', - Purpose: 'application-image-build', - }, - }); - // Additional IAM permissions for ECS deployment const ecsDeployPolicy = new aws.iam.RolePolicy(`${config.projectName}-ecs-deploy-policy`, { role: codebuildRole.id, @@ -239,6 +147,15 @@ export function createBuildSystem( }, database: DatabaseOutputs, container: ContainerOutputs, + appContainer: { + serviceName: pulumi.Output; + repositoryUrl: pulumi.Output; + repositoryArn: pulumi.Output; + taskDefinitionArn: pulumi.Output; + logGroupName: pulumi.Output; + logGroupArn: pulumi.Output; + targetGroupArn?: pulumi.Output; + }, ) { // Return deployment configuration for the application return { @@ -247,24 +164,194 @@ export function createBuildSystem( // Single build command that does everything (migrations + app) buildCommands: { // Single step: Run the complete build (migrations + app + deploy) - deployWithMigrations: `aws codebuild start-build --project-name ${appProject.name}`, + deployWithMigrations: `aws codebuild start-build --project-name ${config.projectName}-${app.name}-build`, }, // Docker image reference - containerImage: pulumi.interpolate`${container.repositoryUrl}:${app.name}-latest`, + containerImage: pulumi.interpolate`${appContainer.repositoryUrl}:${app.name}-latest`, healthCheckPath: app.healthCheckPath, resourceRequirements: app.resourceRequirements, scaling: app.scaling, // Build project reference - buildProject: appProject.name, + buildProject: `${config.projectName}-${app.name}-build`, }; } + // Create per-app build project function + function createApplicationBuildProject( + app: ApplicationConfig, + appContainer: { + repositoryUrl: pulumi.Output; + serviceName: pulumi.Output; + targetGroupArn?: pulumi.Output; + }, + ) { + // Default buildspec path is at the app's root directory + const buildspecPath = `apps/${app.name}/buildspec.yml`; + + return new aws.codebuild.Project(`${config.projectName}-${app.name}-build`, { + name: `${config.projectName}-${app.name}-build`, + description: `Build ${app.name} Docker image`, + serviceRole: codebuildRole.arn, + artifacts: { + type: 'NO_ARTIFACTS', + }, + environment: { + computeType: 'BUILD_GENERAL1_LARGE', + image: 'aws/codebuild/standard:7.0', + type: 'LINUX_CONTAINER', + privilegedMode: true, + environmentVariables: [ + { + name: 'AWS_ACCOUNT_ID', + value: aws.getCallerIdentityOutput().accountId, + type: 'PLAINTEXT', + }, + { + name: 'APP_NAME', + value: app.name, + type: 'PLAINTEXT', + }, + { + name: 'DOCKERFILE_PATH', + value: './Dockerfile', + type: 'PLAINTEXT', + }, + { + name: 'ECR_REPOSITORY_URI', + value: appContainer.repositoryUrl, + type: 'PLAINTEXT', + }, + { + name: 'ECS_CLUSTER_NAME', + value: container.clusterName, + type: 'PLAINTEXT', + }, + { + name: 'ECS_SERVICE_NAME', + value: appContainer.serviceName, + type: 'PLAINTEXT', + }, + { + name: 'AWS_DEFAULT_REGION', + value: config.awsRegion, + type: 'PLAINTEXT', + }, + // Only add DATABASE_URL if app needs it + ...(app.includeDatabaseUrl + ? [ + { + name: 'DATABASE_URL', + value: pulumi.interpolate`${database.secretArn}:connectionString`, + type: 'SECRETS_MANAGER' as const, + }, + ] + : []), + // Add custom environment variables from app config + ...Object.entries(app.environmentVariables || {}).map(([key, value]) => ({ + name: key, + value, + type: 'PLAINTEXT' as const, + })), + ], + }, + vpcConfig: app.includeDatabaseUrl + ? { + vpcId: network.vpcId, + subnets: network.privateSubnetIds, + securityGroupIds: [network.securityGroups.codeBuild], + } + : undefined, + source: { + type: 'GITHUB', + location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, + buildspec: buildspecPath, + gitCloneDepth: 1, + }, + sourceVersion: config.githubBranch, + tags: { + ...commonTags, + Name: `${config.projectName}-${app.name}-build`, + Type: 'codebuild-project', + App: app.name, + }, + }); + } + + // Create Database Migration Project + function createMigrationProject() { + const migrationProject = new aws.codebuild.Project(`${config.projectName}-migrations`, { + name: `${config.projectName}-migrations`, + description: 'Run database migrations before application deployments', + serviceRole: codebuildRole.arn, + artifacts: { + type: 'NO_ARTIFACTS', + }, + source: { + type: 'GITHUB', + location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, + buildspec: 'apps/infra/buildspec-migrations.yml', + gitCloneDepth: 1, + gitSubmodulesConfig: { + fetchSubmodules: false, + }, + }, + cache: { + type: 'LOCAL', + modes: ['LOCAL_DOCKER_LAYER_CACHE', 'LOCAL_SOURCE_CACHE'], + }, + environment: { + type: 'LINUX_CONTAINER', + image: 'aws/codebuild/standard:7.0', + computeType: 'BUILD_GENERAL1_MEDIUM', + privilegedMode: true, + environmentVariables: [ + { + name: 'PROJECT_NAME', + value: config.projectName, + type: 'PLAINTEXT', + }, + { + name: 'DATABASE_URL', + value: pulumi.interpolate`${database.secretArn}:connectionString`, + type: 'SECRETS_MANAGER' as const, + }, + ], + }, + vpcConfig: { + vpcId: network.vpcId, + subnets: [network.privateSubnetIds[0], network.privateSubnetIds[1]], + securityGroupIds: [network.securityGroups.codeBuild], + }, + logsConfig: { + cloudwatchLogs: { + status: 'ENABLED', + groupName: `/aws/codebuild/${config.projectName}-migrations`, + }, + }, + buildBatchConfig: { + serviceRole: codebuildRole.arn, + timeoutInMins: 10, + }, + tags: { + ...commonTags, + Name: `${config.projectName}-migrations`, + Type: 'codebuild-project', + Purpose: 'database-migrations', + }, + }); + + return migrationProject; + } + + const migrationProject = createMigrationProject(); + return { - appProjectName: appProject.name, - appProjectArn: appProject.arn, + codebuildRole, codebuildRoleArn: codebuildRole.arn, buildInstanceType: 'BUILD_GENERAL1_2XLARGE', buildTimeout: 20, createApplicationDeployment, + createApplicationBuildProject, + migrationProject, }; } diff --git a/apps/infra/modules/config.ts b/apps/infra/modules/config.ts index e9ad8c2b8..c37c876ac 100644 --- a/apps/infra/modules/config.ts +++ b/apps/infra/modules/config.ts @@ -6,17 +6,10 @@ import { CommonConfig } from '../types'; dotenv.config(); export function createConfig(projectName: string): CommonConfig { - if (!process.env.AWS_REGION) { - throw new Error('AWS_REGION is not set'); - } - - if (!process.env.NODE_ENV) { - throw new Error('NODE_ENV is not set'); - } + const config = new pulumi.Config(projectName); + const awsConfig = new pulumi.Config('aws'); - if (!process.env.ENABLE_DEBUG_ENDPOINTS) { - throw new Error('ENABLE_DEBUG_ENDPOINTS is not set'); - } + // NODE_ENV check removed for language-agnostic support if (!process.env.GITHUB_ORG) { throw new Error('GITHUB_ORG is not set'); @@ -30,9 +23,16 @@ export function createConfig(projectName: string): CommonConfig { throw new Error('ENABLE_RDS_READ_REPLICAS is not set'); } + if (!process.env.ENABLE_DEBUG_ENDPOINTS) { + throw new Error('ENABLE_DEBUG_ENDPOINTS is not set'); + } + const stack = pulumi.getStack(); // dev, staging, prod, mariano-test, etc. const pulumiConfig = new pulumi.Config(projectName); + // Get AWS region from Pulumi AWS config or environment + const awsRegion = awsConfig.require('region'); + // Use PULUMI_PROJECT_NAME as the environment identifier for resource naming const environmentName = process.env.PULUMI_PROJECT_NAME || stack; @@ -48,9 +48,9 @@ export function createConfig(projectName: string): CommonConfig { const baseConfig = { projectName: resourcePrefix, // Use stack-based naming for resources enableRDSReadReplicas: process.env.ENABLE_RDS_READ_REPLICAS === 'true', - region: process.env.AWS_REGION, - awsRegion: process.env.AWS_REGION, - nodeEnv: process.env.NODE_ENV, + region: awsRegion, + awsRegion: awsRegion, + // nodeEnv removed for language-agnostic support enableDebugEndpoints: process.env.ENABLE_DEBUG_ENDPOINTS === 'true', githubOrg: process.env.GITHUB_ORG, githubRepo: process.env.GITHUB_REPO, @@ -68,49 +68,45 @@ export function createConfig(projectName: string): CommonConfig { }; // Environment-specific configurations - const environmentConfigs = { - prod: { - database: { - instanceClass: 'db.t3.medium', - allocatedStorage: 100, - maxAllocatedStorage: 1000, - deletionProtection: true, - backupRetentionPeriod: 30, - }, - scaling: { - minCapacity: 3, - maxCapacity: 20, - targetCpuUtilization: 50, - }, - tailscale: { - instanceType: 't3.small', // Slightly larger for prod - }, - monitoring: { - logRetentionDays: 30, - detailedMonitoring: true, - }, - networking: { - vpcCidr: '10.2.0.0/16', - subnets: { - public: [ - { cidr: '10.2.1.0/24', az: 0 }, - { cidr: '10.2.2.0/24', az: 1 }, - ], - private: [ - { cidr: '10.2.10.0/24', az: 0 }, - { cidr: '10.2.20.0/24', az: 1 }, - ], - }, - }, - security: { - allowedCidrBlocks: ['0.0.0.0/0'], - enableWaf: true, + const envConfig = { + database: { + instanceClass: 'db.t3.medium', + allocatedStorage: 100, + maxAllocatedStorage: 1000, + deletionProtection: true, + backupRetentionPeriod: 30, + }, + scaling: { + minCapacity: 3, + maxCapacity: 20, + targetCpuUtilization: 50, + }, + tailscale: { + instanceType: 't3.small', + }, + monitoring: { + logRetentionDays: 30, + detailedMonitoring: true, + }, + networking: { + vpcCidr: '10.2.0.0/16', + subnets: { + public: [ + { cidr: '10.2.1.0/24', az: 0 }, + { cidr: '10.2.2.0/24', az: 1 }, + ], + private: [ + { cidr: '10.2.10.0/24', az: 0 }, + { cidr: '10.2.20.0/24', az: 1 }, + ], }, }, + security: { + allowedCidrBlocks: ['0.0.0.0/0'], + enableWaf: true, + }, }; - const envConfig = environmentConfigs.prod; - return { ...baseConfig, // Merge environment-specific config directly diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index f63c377d4..b2186e702 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -1,46 +1,60 @@ import * as aws from '@pulumi/aws'; import * as pulumi from '@pulumi/pulumi'; -import { CommonConfig, DatabaseOutputs, LoadBalancerOutputs, NetworkOutputs } from '../types'; +import { + ApplicationConfig, + CommonConfig, + DatabaseOutputs, + LoadBalancerOutputs, + NetworkOutputs, +} from '../types'; -export function createContainer( +// Function to create container resources for a single application +export function createApplicationContainer( config: CommonConfig, + app: ApplicationConfig, network: NetworkOutputs, database: DatabaseOutputs, + sharedResources: { + cluster: aws.ecs.Cluster; + taskExecutionRole: aws.iam.Role; + taskRole: aws.iam.Role; + }, loadBalancer?: LoadBalancerOutputs, - appSecrets?: { secretArn: pulumi.Output; secretId: pulumi.Output }, + appSecret?: { secretArn: pulumi.Output; secretId: pulumi.Output }, ) { const { commonTags } = config; + const appName = `${config.projectName}-${app.name}`; - // ECR Repository for container images - const repository = new aws.ecr.Repository(`${config.projectName}-repository`, { - name: config.projectName, + // App-specific ECR Repository + const repository = new aws.ecr.Repository(`${appName}-repository`, { + name: appName.toLowerCase(), // ECR names must be lowercase imageTagMutability: 'MUTABLE', - imageScanningConfiguration: { - scanOnPush: true, - }, encryptionConfigurations: [ { encryptionType: 'AES256', }, ], + imageScanningConfiguration: { + scanOnPush: true, + }, tags: { ...commonTags, - Name: `${config.projectName}-repository`, + Name: `${appName}-repository`, Type: 'ecr-repository', + App: app.name, }, }); - // ECR Lifecycle Policy - const lifecyclePolicy = new aws.ecr.LifecyclePolicy(`${config.projectName}-lifecycle-policy`, { + // ECR Lifecycle Policy to manage image retention + const lifecyclePolicy = new aws.ecr.LifecyclePolicy(`${appName}-lifecycle-policy`, { repository: repository.name, policy: JSON.stringify({ rules: [ { rulePriority: 1, - description: 'Keep last 10 production images', + description: 'Keep last 10 images', selection: { - tagStatus: 'tagged', - tagPrefixList: ['prod'], + tagStatus: 'any', countType: 'imageCountMoreThan', countNumber: 10, }, @@ -48,37 +62,178 @@ export function createContainer( type: 'expire', }, }, - { - rulePriority: 2, - description: 'Keep last 5 development images', - selection: { - tagStatus: 'tagged', - tagPrefixList: ['dev'], - countType: 'imageCountMoreThan', - countNumber: 5, - }, - action: { - type: 'expire', - }, - }, - { - rulePriority: 3, - description: 'Delete untagged images older than 1 day', - selection: { - tagStatus: 'untagged', - countType: 'sinceImagePushed', - countUnit: 'days', - countNumber: 1, - }, - action: { - type: 'expire', - }, - }, ], }), }); - // ECS Cluster + // App-specific CloudWatch Log Group + const logGroup = new aws.cloudwatch.LogGroup(`${appName}-logs`, { + name: `/ecs/${appName}`, + retentionInDays: 30, + tags: { + ...commonTags, + Name: `${appName}-logs`, + Type: 'cloudwatch-logs', + App: app.name, + }, + }); + + // App-specific Target Group (if routing is configured) + let targetGroup: aws.lb.TargetGroup | undefined; + if (app.routing && loadBalancer) { + targetGroup = new aws.lb.TargetGroup(`${appName}-tg`, { + name: `${appName}-tg`.substring(0, 32), // AWS limit + port: app.containerPort, + protocol: 'HTTP', + targetType: 'ip', + vpcId: network.vpcId, + healthCheck: { + enabled: true, + path: app.healthCheck?.path || '/health', + interval: app.healthCheck?.interval || 60, + timeout: app.healthCheck?.timeout || 30, + healthyThreshold: app.healthCheck?.healthyThreshold || 2, + unhealthyThreshold: app.healthCheck?.unhealthyThreshold || 3, + matcher: '200', + }, + tags: { + ...commonTags, + Name: `${appName}-tg`, + Type: 'target-group', + App: app.name, + }, + }); + } + + // App-specific Task Definition + const taskDefinition = new aws.ecs.TaskDefinition(`${appName}-task`, { + family: appName, + networkMode: 'awsvpc', + requiresCompatibilities: ['FARGATE'], + cpu: (app.cpu || 256).toString(), + memory: (app.memory || 512).toString(), + executionRoleArn: sharedResources.taskExecutionRole.arn, + taskRoleArn: sharedResources.taskRole.arn, + containerDefinitions: pulumi + .all([ + repository.repositoryUrl, + logGroup.name, + database.secretArn, + appSecret?.secretArn || pulumi.output(''), + ]) + .apply(([repoUrl, logGroupName, dbSecretArn, appSecretArn]) => { + const secrets = []; + + // Add database secret if needed + if (app.includeDatabaseUrl) { + secrets.push({ + name: 'DATABASE_URL', + valueFrom: `${dbSecretArn}:connectionString::`, + }); + } + + // Add app-specific secrets if provided + if (appSecretArn && app.requiredSecrets) { + app.requiredSecrets.forEach((secretName) => { + secrets.push({ + name: secretName, + valueFrom: `${appSecretArn}:${secretName}::`, + }); + }); + } + + return JSON.stringify([ + { + name: `${app.name}-container`, + image: pulumi.interpolate`${repoUrl}:latest`, + essential: true, + portMappings: [ + { + containerPort: app.containerPort, + protocol: 'tcp', + }, + ], + environment: Object.entries(app.environmentVariables || {}).map(([key, value]) => ({ + name: key, + value: value, + })), + secrets, + logConfiguration: { + logDriver: 'awslogs', + options: { + 'awslogs-group': logGroupName, + 'awslogs-region': config.awsRegion, + 'awslogs-stream-prefix': 'ecs', + }, + }, + }, + ]); + }), + tags: { + ...commonTags, + Name: `${appName}-task`, + Type: 'ecs-task-definition', + App: app.name, + }, + }); + + // App-specific ECS Service + const service = new aws.ecs.Service(`${appName}-service`, { + name: appName, + cluster: sharedResources.cluster.id, + taskDefinition: taskDefinition.arn, + desiredCount: app.desiredCount || app.minCount || 1, + launchType: 'FARGATE', + platformVersion: 'LATEST', + networkConfiguration: { + subnets: network.privateSubnetIds, + securityGroups: [network.securityGroups.ecs], + assignPublicIp: false, + }, + enableExecuteCommand: true, + loadBalancers: targetGroup + ? [ + { + targetGroupArn: targetGroup.arn, + containerName: `${app.name}-container`, + containerPort: app.containerPort, + }, + ] + : undefined, + tags: { + ...commonTags, + Name: `${appName}-service`, + Type: 'ecs-service', + App: app.name, + }, + }); + + return { + serviceName: service.name, + repositoryUrl: repository.repositoryUrl, + repositoryArn: repository.arn, + taskDefinitionArn: taskDefinition.arn, + logGroupName: logGroup.name, + logGroupArn: logGroup.arn, + targetGroupArn: targetGroup?.arn, + }; +} + +// Main container function that creates shared resources and calls createApplicationContainer for each app +export function createContainer( + config: CommonConfig, + applications: ApplicationConfig[], + network: NetworkOutputs, + database: DatabaseOutputs, + loadBalancer?: LoadBalancerOutputs, + appSecrets?: Record< + string, + { secretArn: pulumi.Output; secretId: pulumi.Output } + >, +) { + const { commonTags } = config; + + // Create shared ECS Cluster const cluster = new aws.ecs.Cluster(`${config.projectName}-cluster`, { name: config.projectName, settings: [ @@ -94,18 +249,7 @@ export function createContainer( }, }); - // CloudWatch Log Group for application logs - const logGroup = new aws.cloudwatch.LogGroup(`${config.projectName}-app-logs`, { - name: `/aws/ecs/${config.projectName}`, - retentionInDays: config.logRetentionDays, - tags: { - ...commonTags, - Name: `${config.projectName}-app-logs`, - Type: 'log-group', - }, - }); - - // ECS Task Execution Role + // Create shared IAM roles that all apps can use const taskExecutionRole = new aws.iam.Role(`${config.projectName}-task-execution-role`, { name: `${config.projectName}-ecs-task-execution-role`, assumeRolePolicy: JSON.stringify({ @@ -141,20 +285,18 @@ export function createContainer( `${config.projectName}-task-execution-secrets-policy`, { role: taskExecutionRole.id, - policy: pulumi - .all([database.secretArn, appSecrets?.secretArn]) - .apply(([dbSecretArn, appSecretArn]) => - JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], - Resource: [dbSecretArn, ...(appSecretArn ? [appSecretArn] : [])], - }, - ], - }), - ), + policy: pulumi.all([database.secretArn]).apply(([dbSecretArn]) => + JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], + Resource: [dbSecretArn, 'arn:aws:secretsmanager:*:*:secret:*'], + }, + ], + }), + ), }, ); @@ -183,227 +325,42 @@ export function createContainer( // Task Role Policy for application access const taskRolePolicy = new aws.iam.RolePolicy(`${config.projectName}-task-role-policy`, { role: taskRole.id, - policy: logGroup.arn.apply((logGroupArn) => - JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['logs:CreateLogStream', 'logs:PutLogEvents'], - Resource: logGroupArn, - }, - ], - }), - ), - }); - - // ECS Task Definition - const taskDefinition = new aws.ecs.TaskDefinition(`${config.projectName}-task`, { - family: config.projectName, - networkMode: 'awsvpc', - requiresCompatibilities: ['FARGATE'], - cpu: '1024', - memory: '2048', - executionRoleArn: taskExecutionRole.arn, - taskRoleArn: taskRole.arn, - containerDefinitions: pulumi - .all([ - repository.repositoryUrl, - logGroup.name, - database.secretArn, - appSecrets?.secretArn || pulumi.output(''), - ]) - .apply( - ([repoUrl, logGroupName, dbSecretArn, appSecretArn]: [string, string, string, string]) => { - const secrets = [ - { - name: 'DATABASE_URL', - valueFrom: `${dbSecretArn}:connectionString::`, - }, - ]; - - if (appSecrets && appSecretArn) { - secrets.push( - // Required secrets - { - name: 'AUTH_SECRET', - valueFrom: `${appSecretArn}:AUTH_SECRET::`, - }, - { - name: 'RESEND_API_KEY', - valueFrom: `${appSecretArn}:RESEND_API_KEY::`, - }, - { - name: 'REVALIDATION_SECRET', - valueFrom: `${appSecretArn}:REVALIDATION_SECRET::`, - }, - { - name: 'SECRET_KEY', - valueFrom: `${appSecretArn}:SECRET_KEY::`, - }, - { - name: 'UPSTASH_REDIS_REST_URL', - valueFrom: `${appSecretArn}:UPSTASH_REDIS_REST_URL::`, - }, - { - name: 'UPSTASH_REDIS_REST_TOKEN', - valueFrom: `${appSecretArn}:UPSTASH_REDIS_REST_TOKEN::`, - }, - { - name: 'OPENAI_API_KEY', - valueFrom: `${appSecretArn}:OPENAI_API_KEY::`, - }, - { - name: 'TRIGGER_SECRET_KEY', - valueFrom: `${appSecretArn}:TRIGGER_SECRET_KEY::`, - }, - - // Optional secrets - { - name: 'IS_VERCEL', - valueFrom: `${appSecretArn}:IS_VERCEL::`, - }, - { - name: 'AUTH_GOOGLE_ID', - valueFrom: `${appSecretArn}:AUTH_GOOGLE_ID::`, - }, - { - name: 'AUTH_GOOGLE_SECRET', - valueFrom: `${appSecretArn}:AUTH_GOOGLE_SECRET::`, - }, - { - name: 'AUTH_GITHUB_ID', - valueFrom: `${appSecretArn}:AUTH_GITHUB_ID::`, - }, - { - name: 'AUTH_GITHUB_SECRET', - valueFrom: `${appSecretArn}:AUTH_GITHUB_SECRET::`, - }, - { - name: 'AWS_BUCKET_NAME', - valueFrom: `${appSecretArn}:AWS_BUCKET_NAME::`, - }, - { - name: 'AWS_REGION', - valueFrom: `${appSecretArn}:AWS_REGION::`, - }, - { - name: 'AWS_ACCESS_KEY_ID', - valueFrom: `${appSecretArn}:AWS_ACCESS_KEY_ID::`, - }, - { - name: 'AWS_SECRET_ACCESS_KEY', - valueFrom: `${appSecretArn}:AWS_SECRET_ACCESS_KEY::`, - }, - { - name: 'DISCORD_WEBHOOK_URL', - valueFrom: `${appSecretArn}:DISCORD_WEBHOOK_URL::`, - }, - { - name: 'SLACK_SALES_WEBHOOK', - valueFrom: `${appSecretArn}:SLACK_SALES_WEBHOOK::`, - }, - { - name: 'HUBSPOT_ACCESS_TOKEN', - valueFrom: `${appSecretArn}:HUBSPOT_ACCESS_TOKEN::`, - }, - ); - } - - return JSON.stringify([ - { - name: `${config.projectName}-app`, - image: `${repoUrl}:latest`, - essential: true, - portMappings: [ - { - containerPort: 3000, - protocol: 'tcp', - }, - ], - environment: [ - { - name: 'NODE_ENV', - value: 'production', - }, - { - name: 'PORT', - value: '3000', - }, - ], - secrets, - logConfiguration: { - logDriver: 'awslogs', - options: { - 'awslogs-group': logGroupName, - 'awslogs-region': config.awsRegion, - 'awslogs-stream-prefix': 'ecs', - }, - }, - healthCheck: { - command: ['CMD-SHELL', 'curl -f http://localhost:3000/api/health || exit 1'], - interval: 30, - timeout: 10, - retries: 5, - startPeriod: 120, - }, - }, - ]); + policy: JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], + Resource: '*', }, - ), - tags: { - ...commonTags, - Name: `${config.projectName}-task`, - Type: 'ecs-task-definition', - }, + { + Effect: 'Allow', + Action: ['logs:CreateLogStream', 'logs:PutLogEvents'], + Resource: '*', + }, + ], + }), }); - // ECS Service - const service = new aws.ecs.Service(`${config.projectName}-service`, { - name: config.projectName, - cluster: cluster.id, - taskDefinition: taskDefinition.arn, - desiredCount: 2, - launchType: 'FARGATE', - platformVersion: 'LATEST', - networkConfiguration: { - subnets: network.privateSubnetIds, - securityGroups: [network.securityGroups.ecs], - assignPublicIp: false, - }, - enableExecuteCommand: true, - // Attach to load balancer if provided - loadBalancers: loadBalancer - ? [ - { - targetGroupArn: loadBalancer.targetGroupArn, - containerName: `${config.projectName}-app`, - containerPort: 3000, - }, - ] - : undefined, - tags: { - ...commonTags, - Name: `${config.projectName}-service`, - Type: 'ecs-service', - }, - }); + // Create application-specific resources + const appContainers = applications.map((app) => + createApplicationContainer( + config, + app, + network, + database, + { cluster, taskExecutionRole, taskRole }, + loadBalancer, + appSecrets?.[app.name], + ), + ); + // Return shared resources and app-specific resources return { clusterName: cluster.name, clusterArn: cluster.arn, - serviceName: service.name, - repositoryUrl: repository.repositoryUrl, - repositoryArn: repository.arn, - taskDefinitionArn: taskDefinition.arn, - logGroupName: logGroup.name, - logGroupArn: logGroup.arn, taskExecutionRoleArn: taskExecutionRole.arn, taskRoleArn: taskRole.arn, + applications: appContainers, }; } diff --git a/apps/infra/modules/database.ts b/apps/infra/modules/database.ts index 066413c81..10127e058 100644 --- a/apps/infra/modules/database.ts +++ b/apps/infra/modules/database.ts @@ -118,7 +118,7 @@ export function createDatabase(config: CommonConfig, network: NetworkOutputs) { backupWindow: '03:00-04:00', maintenanceWindow: 'Sun:04:00-Sun:05:00', - deletionProtection: config.dbDeletionProtection || false, + deletionProtection: config.dbDeletionProtection || true, skipFinalSnapshot: !config.dbDeletionProtection, finalSnapshotIdentifier: config.dbDeletionProtection ? `${config.projectName}-final-snapshot` diff --git a/apps/infra/modules/loadbalancer.ts b/apps/infra/modules/loadbalancer.ts index d9b3f5032..f2c040d18 100644 --- a/apps/infra/modules/loadbalancer.ts +++ b/apps/infra/modules/loadbalancer.ts @@ -1,41 +1,114 @@ -import * as awsx from '@pulumi/awsx'; +import * as aws from '@pulumi/aws'; +import * as pulumi from '@pulumi/pulumi'; import { CommonConfig, NetworkOutputs } from '../types'; export function createLoadBalancer(config: CommonConfig, network: NetworkOutputs) { const { commonTags } = config; - // Simple working load balancer (copied from legacy) - const lb = new awsx.lb.ApplicationLoadBalancer(`${config.projectName}-lb`, { - subnetIds: network.publicSubnetIds, + // Create ALB without default target group since we'll create app-specific ones + const lb = new aws.lb.LoadBalancer(`${config.projectName}-lb`, { + loadBalancerType: 'application', + subnets: network.publicSubnetIds, securityGroups: [network.securityGroups.alb], tags: { ...commonTags, Name: `${config.projectName}-lb`, Type: 'application-load-balancer', }, - defaultTargetGroup: { - port: 3000, - protocol: 'HTTP', - targetType: 'ip', // Required for Fargate - healthCheck: { - enabled: true, - path: '/', - healthyThreshold: 2, - unhealthyThreshold: 3, - timeout: 30, - interval: 60, - matcher: '200', + }); + + // Create a default target group (required for listener) + const defaultTargetGroup = new aws.lb.TargetGroup(`${config.projectName}-default-tg`, { + port: 80, + protocol: 'HTTP', + targetType: 'ip', + vpcId: network.vpcId, + healthCheck: { + enabled: true, + path: '/', + healthyThreshold: 2, + unhealthyThreshold: 3, + timeout: 30, + interval: 60, + matcher: '200', + }, + tags: { + ...commonTags, + Name: `${config.projectName}-default-tg`, + Type: 'target-group', + }, + }); + + // Create HTTP listener + const httpListener = new aws.lb.Listener(`${config.projectName}-http-listener`, { + loadBalancerArn: lb.arn, + port: 80, + protocol: 'HTTP', + defaultActions: [ + { + type: 'forward', + targetGroupArn: defaultTargetGroup.arn, }, + ], + tags: { + ...commonTags, + Name: `${config.projectName}-http-listener`, + Type: 'listener', }, }); return { - albArn: lb.loadBalancer.arn, - albDnsName: lb.loadBalancer.dnsName, - albZoneId: lb.loadBalancer.zoneId, - targetGroupArn: lb.defaultTargetGroup.arn, - applicationUrl: lb.loadBalancer.dnsName.apply((dns) => `http://${dns}`), - healthCheckUrl: lb.loadBalancer.dnsName.apply((dns) => `http://${dns}/health`), + albArn: lb.arn, + albDnsName: lb.dnsName, + albZoneId: lb.zoneId, + targetGroupArn: defaultTargetGroup.arn, + applicationUrl: lb.dnsName.apply((dns) => `http://${dns}`), + healthCheckUrl: lb.dnsName.apply((dns) => `http://${dns}/health`), certificateArn: undefined, + httpListenerArn: httpListener.arn, }; } + +// Create listener rules for app routing +export interface ApplicationRoutingArgs { + projectName: string; + appName: string; + loadBalancerArn: pulumi.Output; + targetGroupArn: pulumi.Output; + pathPattern?: string; + hostHeader?: string[]; + priority: number; + httpListenerArn: pulumi.Output; +} + +export function createApplicationRouting(args: ApplicationRoutingArgs) { + const conditions = []; + + if (args.pathPattern) { + conditions.push({ + pathPattern: { + values: [args.pathPattern], + }, + }); + } + + if (args.hostHeader) { + conditions.push({ + hostHeader: { + values: args.hostHeader, + }, + }); + } + + return new aws.lb.ListenerRule(`${args.projectName}-${args.appName}-rule`, { + listenerArn: args.httpListenerArn, + priority: args.priority, + conditions, + actions: [ + { + type: 'forward', + targetGroupArn: args.targetGroupArn, + }, + ], + }); +} diff --git a/apps/infra/modules/monitoring.ts b/apps/infra/modules/monitoring.ts index 1fc867731..953b5f03e 100644 --- a/apps/infra/modules/monitoring.ts +++ b/apps/infra/modules/monitoring.ts @@ -1,157 +1,267 @@ import * as aws from '@pulumi/aws'; import * as pulumi from '@pulumi/pulumi'; -import { CommonConfig, ContainerOutputs, DatabaseOutputs, LoadBalancerOutputs } from '../types'; +import { ApplicationConfig, CommonConfig, DatabaseOutputs, LoadBalancerOutputs } from '../types'; interface MonitoringOptions { enableBetterStack?: boolean; enableDetailedMonitoring?: boolean; } +interface ApplicationContainerOutputs { + serviceName: pulumi.Output; + repositoryUrl: pulumi.Output; + logGroupName: pulumi.Output; + targetGroupArn?: pulumi.Output; +} + export function createMonitoring( config: CommonConfig, + applications: ApplicationConfig[], database: DatabaseOutputs, - container: ContainerOutputs, + appContainers: Record, loadBalancer: LoadBalancerOutputs, options: MonitoringOptions = {}, ) { const { commonTags } = config; const { enableBetterStack = false, enableDetailedMonitoring = true } = options; - // CloudWatch Dashboard for Application Monitoring - const applicationDashboard = new aws.cloudwatch.Dashboard(`${config.projectName}-app-dashboard`, { - dashboardName: `${config.projectName}-application`, - dashboardBody: JSON.stringify({ - widgets: [ - { - type: 'metric', - x: 0, - y: 0, - width: 12, - height: 6, - properties: { - metrics: [ - ['AWS/ApplicationELB', 'RequestCount', 'LoadBalancer', loadBalancer.albArn], - ['.', 'TargetResponseTime', '.', '.'], - ['.', 'HTTPCode_Target_2XX_Count', '.', '.'], - ['.', 'HTTPCode_Target_4XX_Count', '.', '.'], - ['.', 'HTTPCode_Target_5XX_Count', '.', '.'], - ], - view: 'timeSeries', - stacked: false, - region: config.awsRegion, - title: 'Application Load Balancer Metrics', - period: 300, - }, - }, - { - type: 'metric', - x: 0, - y: 6, - width: 12, - height: 6, - properties: { - metrics: [ - [ - 'AWS/ECS', - 'CPUUtilization', - 'ServiceName', - container.serviceName, - 'ClusterName', - container.clusterName, - ], - ['.', 'MemoryUtilization', '.', '.', '.', '.'], + // Create dashboard widgets for each application + const appWidgets = applications.flatMap((app, index) => { + const container = appContainers[app.name]; + if (!container) return []; + + const yOffset = index * 12; // Stack app widgets vertically + + return [ + { + type: 'metric', + x: 0, + y: yOffset, + width: 12, + height: 6, + properties: { + metrics: [ + [ + 'AWS/ECS', + 'CPUUtilization', + 'ServiceName', + container.serviceName, + 'ClusterName', + `${config.projectName}-cluster`, ], - view: 'timeSeries', - stacked: false, - region: config.awsRegion, - title: 'ECS Service Metrics', - period: 300, - }, + ['.', 'MemoryUtilization', '.', '.', '.', '.'], + ], + view: 'timeSeries', + stacked: false, + region: config.awsRegion, + title: `${app.name} - ECS Service Metrics`, + period: 300, }, - { - type: 'metric', - x: 0, - y: 12, - width: 12, - height: 6, - properties: { - metrics: [ - ['AWS/RDS', 'CPUUtilization', 'DBInstanceIdentifier', database.instanceId], - ['.', 'DatabaseConnections', '.', '.'], - ['.', 'ReadLatency', '.', '.'], - ['.', 'WriteLatency', '.', '.'], - ], - view: 'timeSeries', - stacked: false, - region: config.awsRegion, - title: 'Database Metrics', - period: 300, - }, + }, + { + type: 'log', + x: 12, + y: yOffset, + width: 12, + height: 6, + properties: { + query: `SOURCE '${container.logGroupName}' + | fields @timestamp, @message + | sort @timestamp desc + | limit 100`, + region: config.awsRegion, + title: `${app.name} - Recent Logs`, }, - ], - }), + }, + ]; }); - // Infrastructure Dashboard - const infrastructureDashboard = new aws.cloudwatch.Dashboard( - `${config.projectName}-infra-dashboard`, - { - dashboardName: `${config.projectName}-infrastructure`, - dashboardBody: JSON.stringify({ - widgets: [ - { - type: 'metric', - x: 0, - y: 0, - width: 12, - height: 6, - properties: { - metrics: [ - [ - 'AWS/ECS', - 'RunningTaskCount', - 'ServiceName', - container.serviceName, - 'ClusterName', - container.clusterName, + // CloudWatch Dashboard for Application Monitoring + const applicationDashboard = new aws.cloudwatch.Dashboard(`${config.projectName}-app-dashboard`, { + dashboardName: `${config.projectName}-application`, + dashboardBody: pulumi + .all([loadBalancer.albArn, ...Object.values(appContainers).map((c) => c.logGroupName)]) + .apply(([albArn]) => + JSON.stringify({ + widgets: [ + // ALB metrics at the top + { + type: 'metric', + x: 0, + y: 0, + width: 24, + height: 6, + properties: { + metrics: [ + ['AWS/ApplicationELB', 'RequestCount', 'LoadBalancer', albArn], + ['.', 'TargetResponseTime', '.', '.'], + ['.', 'HTTPCode_Target_2XX_Count', '.', '.'], + ['.', 'HTTPCode_Target_4XX_Count', '.', '.'], + ['.', 'HTTPCode_Target_5XX_Count', '.', '.'], ], - ['.', 'DesiredCount', '.', '.', '.', '.'], - ], - view: 'timeSeries', - stacked: false, - region: config.awsRegion, - title: 'ECS Task Counts', - period: 300, + view: 'timeSeries', + stacked: false, + region: config.awsRegion, + title: 'Application Load Balancer Metrics', + period: 300, + }, }, - }, - { - type: 'metric', - x: 0, - y: 6, - width: 12, - height: 6, - properties: { - metrics: [ - [ - 'AWS/ApplicationELB', - 'HealthyHostCount', - 'TargetGroup', - loadBalancer.targetGroupArn, + // Application-specific widgets + ...appWidgets, + // Database metrics at the bottom + { + type: 'metric', + x: 0, + y: applications.length * 12, + width: 24, + height: 6, + properties: { + metrics: [ + ['AWS/RDS', 'CPUUtilization', 'DBInstanceIdentifier', database.instanceId], + ['.', 'DatabaseConnections', '.', '.'], + ['.', 'ReadLatency', '.', '.'], + ['.', 'WriteLatency', '.', '.'], ], - ['.', 'UnHealthyHostCount', '.', '.'], - ], - view: 'timeSeries', - stacked: false, - region: config.awsRegion, - title: 'Target Group Health', - period: 300, + view: 'timeSeries', + stacked: false, + region: config.awsRegion, + title: 'Database Metrics', + period: 300, + }, }, - }, - ], - }), + ], + }), + ), + }); + + // Infrastructure Dashboard for Operations + const infrastructureDashboard = new aws.cloudwatch.Dashboard( + `${config.projectName}-infra-dashboard`, + { + dashboardName: `${config.projectName}-infrastructure`, + dashboardBody: pulumi + .all(Object.entries(appContainers).map(([appName, container]) => ({ appName, container }))) + .apply((apps) => + JSON.stringify({ + widgets: [ + // ECS Task counts for all apps + ...apps.map((appData, index) => ({ + type: 'metric', + x: (index % 2) * 12, + y: Math.floor(index / 2) * 6, + width: 12, + height: 6, + properties: { + metrics: [ + [ + 'AWS/ECS', + 'RunningTaskCount', + 'ServiceName', + appData.container.serviceName, + 'ClusterName', + `${config.projectName}-cluster`, + ], + ['.', 'DesiredCount', '.', '.', '.', '.'], + ], + view: 'timeSeries', + stacked: false, + region: config.awsRegion, + title: `${appData.appName} - ECS Task Counts`, + period: 300, + }, + })), + // ALB Target Health at the bottom + { + type: 'metric', + x: 0, + y: Math.ceil(apps.length / 2) * 6, + width: 24, + height: 6, + properties: { + metrics: apps.flatMap((appData) => + appData.container.targetGroupArn + ? [ + [ + 'AWS/ApplicationELB', + 'HealthyHostCount', + 'TargetGroup', + appData.container.targetGroupArn, + ], + ['.', 'UnHealthyHostCount', '.', '.'], + ] + : [], + ), + view: 'timeSeries', + stacked: false, + region: config.awsRegion, + title: 'Target Group Health', + period: 300, + }, + }, + ], + }), + ), }, ); + // Create alarms for each application if detailed monitoring is enabled + const appAlarms = enableDetailedMonitoring + ? applications.flatMap((app) => { + const container = appContainers[app.name]; + if (!container) return []; + + return [ + // High CPU utilization alarm + new aws.cloudwatch.MetricAlarm(`${config.projectName}-${app.name}-cpu-alarm`, { + name: `${config.projectName}-${app.name}-high-cpu`, + alarmDescription: `High CPU utilization for ${app.name} ECS service`, + metricName: 'CPUUtilization', + namespace: 'AWS/ECS', + statistic: 'Average', + period: 300, + evaluationPeriods: 2, + threshold: 85, + comparisonOperator: 'GreaterThanThreshold', + dimensions: { + ServiceName: container.serviceName, + ClusterName: `${config.projectName}-cluster`, + }, + treatMissingData: 'notBreaching', + tags: { + ...commonTags, + Name: `${config.projectName}-${app.name}-cpu-alarm`, + Type: 'cloudwatch-alarm', + App: app.name, + }, + }), + + // High memory utilization alarm + new aws.cloudwatch.MetricAlarm(`${config.projectName}-${app.name}-memory-alarm`, { + name: `${config.projectName}-${app.name}-high-memory`, + alarmDescription: `High memory utilization for ${app.name} ECS service`, + metricName: 'MemoryUtilization', + namespace: 'AWS/ECS', + statistic: 'Average', + period: 300, + evaluationPeriods: 2, + threshold: 85, + comparisonOperator: 'GreaterThanThreshold', + dimensions: { + ServiceName: container.serviceName, + ClusterName: `${config.projectName}-cluster`, + }, + treatMissingData: 'notBreaching', + tags: { + ...commonTags, + Name: `${config.projectName}-${app.name}-memory-alarm`, + Type: 'cloudwatch-alarm', + App: app.name, + }, + }), + ]; + }) + : []; + // Custom Metrics Lambda Function const customMetricsRole = new aws.iam.Role(`${config.projectName}-custom-metrics-role`, { name: `${config.projectName}-custom-metrics-role`, @@ -228,16 +338,12 @@ rds = boto3.client('rds') def handler(event, context): try: - # Get ECS service metrics - services = ecs.describe_services( - cluster='${container.clusterName}', - services=['${container.serviceName}'] - ) + # Get ECS service metrics for all apps + cluster_name = '${config.projectName}-cluster' + service_names = ${JSON.stringify(Object.values(appContainers).map(() => ''))} - if services['services']: - service = services['services'][0] - running_count = service['runningCount'] - desired_count = service['desiredCount'] + # This would need to be populated with actual service names at runtime + # For now, this is a placeholder for the Lambda function # Custom metric: Service health ratio health_ratio = running_count / desired_count if desired_count > 0 else 0 @@ -251,8 +357,12 @@ def handler(event, context): 'Unit': 'Percent', 'Dimensions': [ { - 'Name': 'Environment', - 'Value': '${config.nodeEnv}' + 'Name': 'ProjectName', + 'Value': '${config.projectName}' + }, + { + 'Name': 'AwsRegion', + 'Value': '${config.awsRegion}' } ] } @@ -386,10 +496,22 @@ def handler(event, context): (name) => `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#dashboards:name=${name}`, ), - applicationLogGroup: container.logGroupName, - logsUrl: container.logGroupName.apply( - (name) => - `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#logsV2:log-groups/log-group/${encodeURIComponent(name)}`, + applicationLogGroups: Object.entries(appContainers).reduce( + (acc, [appName, container]) => { + acc[appName] = container.logGroupName; + return acc; + }, + {} as Record>, + ), + logsUrls: Object.entries(appContainers).reduce( + (acc, [appName, container]) => { + acc[appName] = container.logGroupName.apply( + (logGroupName) => + `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#logsV2:log-groups/log-group/${encodeURIComponent(logGroupName)}`, + ); + return acc; + }, + {} as Record>, ), metricsNamespace: `${config.projectName}/Application`, customMetricsFunctionArn: customMetricsFunction.arn, diff --git a/apps/infra/modules/networking.ts b/apps/infra/modules/networking.ts index f4246d6ac..ea1c0947e 100644 --- a/apps/infra/modules/networking.ts +++ b/apps/infra/modules/networking.ts @@ -1,7 +1,7 @@ import * as aws from '@pulumi/aws'; -import { CommonConfig } from '../types'; +import { ApplicationConfig, CommonConfig } from '../types'; -export function createNetworking(config: CommonConfig) { +export function createNetworking(config: CommonConfig, applications: ApplicationConfig[]) { const { commonTags, networkConfig, securityConfig } = config; // ========================================== @@ -204,13 +204,14 @@ export function createNetworking(config: CommonConfig) { vpcId: vpc.id, description: 'Security group for ECS services', ingress: [ - { + // Create ingress rules for each application's port + ...applications.map((app) => ({ protocol: 'tcp', - fromPort: 3000, - toPort: 3000, + fromPort: app.containerPort, + toPort: app.containerPort, securityGroups: [albSecurityGroup.id], - description: 'HTTP access from ALB only', - }, + description: `HTTP access from ALB for ${app.name} app`, + })), ], egress: [ { diff --git a/apps/infra/modules/scaling.ts b/apps/infra/modules/scaling.ts index 018818737..9cf4611a2 100644 --- a/apps/infra/modules/scaling.ts +++ b/apps/infra/modules/scaling.ts @@ -1,176 +1,144 @@ import * as aws from '@pulumi/aws'; import * as pulumi from '@pulumi/pulumi'; -import { CommonConfig, ContainerOutputs, LoadBalancerOutputs } from '../types'; +import { ApplicationConfig, CommonConfig, ContainerOutputs, LoadBalancerOutputs } from '../types'; + +interface ApplicationScalingOutputs { + target: aws.appautoscaling.Target; + cpuPolicy: aws.appautoscaling.Policy; + memoryPolicy: aws.appautoscaling.Policy; + requestCountPolicy?: aws.appautoscaling.Policy; +} export function createScaling( config: CommonConfig, + applications: ApplicationConfig[], container: ContainerOutputs, loadBalancer: LoadBalancerOutputs, ) { const { commonTags } = config; - // Auto Scaling Target for ECS Service - const ecsTarget = new aws.appautoscaling.Target(`${config.projectName}-ecs-target`, { - maxCapacity: 10, - minCapacity: 2, - resourceId: pulumi.interpolate`service/${container.clusterName}/${container.serviceName}`, - scalableDimension: 'ecs:service:DesiredCount', - serviceNamespace: 'ecs', - tags: { - ...commonTags, - Name: `${config.projectName}-ecs-target`, - Type: 'autoscaling-target', - }, - }); + // Create scaling resources for each application + const applicationScaling = applications.reduce( + (acc, app, index) => { + const appContainer = container.applications?.[index]; + if (!appContainer) return acc; - // CPU-based Auto Scaling Policy - const cpuScalingPolicy = new aws.appautoscaling.Policy(`${config.projectName}-cpu-scaling`, { - name: `${config.projectName}-cpu-scaling`, - policyType: 'TargetTrackingScaling', - resourceId: ecsTarget.resourceId, - scalableDimension: ecsTarget.scalableDimension, - serviceNamespace: ecsTarget.serviceNamespace, - targetTrackingScalingPolicyConfiguration: { - targetValue: 70.0, // Target 70% CPU utilization - predefinedMetricSpecification: { - predefinedMetricType: 'ECSServiceAverageCPUUtilization', - }, - scaleOutCooldown: 300, // 5 minutes - scaleInCooldown: 300, // 5 minutes - }, - }); + // Skip if app doesn't want auto-scaling + if (app.minCount === app.maxCount) return acc; - // Memory-based Auto Scaling Policy - const memoryScalingPolicy = new aws.appautoscaling.Policy( - `${config.projectName}-memory-scaling`, - { - name: `${config.projectName}-memory-scaling`, - policyType: 'TargetTrackingScaling', - resourceId: ecsTarget.resourceId, - scalableDimension: ecsTarget.scalableDimension, - serviceNamespace: ecsTarget.serviceNamespace, - targetTrackingScalingPolicyConfiguration: { - targetValue: 80.0, // Target 80% memory utilization - predefinedMetricSpecification: { - predefinedMetricType: 'ECSServiceAverageMemoryUtilization', + // Auto Scaling Target for ECS Service + const ecsTarget = new aws.appautoscaling.Target( + `${config.projectName}-${app.name}-ecs-target`, + { + maxCapacity: app.maxCount || 10, + minCapacity: app.minCount || 1, + resourceId: pulumi.interpolate`service/${config.projectName}-cluster/${appContainer.serviceName}`, + scalableDimension: 'ecs:service:DesiredCount', + serviceNamespace: 'ecs', + tags: { + ...commonTags, + Name: `${config.projectName}-${app.name}-ecs-target`, + Type: 'autoscaling-target', + App: app.name, + }, }, - scaleOutCooldown: 300, - scaleInCooldown: 600, // Longer cooldown for memory - }, - }, - ); + ); - // ALB Request Count Scaling Policy - const requestCountScalingPolicy = new aws.appautoscaling.Policy( - `${config.projectName}-request-count-scaling`, - { - name: `${config.projectName}-request-count-scaling`, - policyType: 'TargetTrackingScaling', - resourceId: ecsTarget.resourceId, - scalableDimension: ecsTarget.scalableDimension, - serviceNamespace: ecsTarget.serviceNamespace, - targetTrackingScalingPolicyConfiguration: { - targetValue: 1000.0, // Target 1000 requests per target per minute - predefinedMetricSpecification: { - predefinedMetricType: 'ALBRequestCountPerTarget', - resourceLabel: pulumi - .all([loadBalancer.albArn, loadBalancer.targetGroupArn]) - .apply(([albArn, tgArn]: [string, string]) => { - // ALB ARN: arn:aws:elasticloadbalancing:region:account:loadbalancer/app/load-balancer-name/1234567890123456 - // Target Group ARN: arn:aws:elasticloadbalancing:region:account:targetgroup/target-group-name/1234567890123456 - // Required format: app/load-balancer-name/1234567890123456/targetgroup/target-group-name/1234567890123456 - const albParts = albArn.split('/'); - const tgParts = tgArn.split('/'); - return `${albParts.slice(-3).join('/')}/targetgroup/${tgParts.slice(-2).join('/')}`; - }), + // CPU-based Auto Scaling Policy + const cpuScalingPolicy = new aws.appautoscaling.Policy( + `${config.projectName}-${app.name}-cpu-scaling`, + { + name: `${config.projectName}-${app.name}-cpu-scaling`, + policyType: 'TargetTrackingScaling', + resourceId: ecsTarget.resourceId, + scalableDimension: ecsTarget.scalableDimension, + serviceNamespace: ecsTarget.serviceNamespace, + targetTrackingScalingPolicyConfiguration: { + targetValue: app.targetCPUPercent || 70.0, + predefinedMetricSpecification: { + predefinedMetricType: 'ECSServiceAverageCPUUtilization', + }, + scaleOutCooldown: 300, // 5 minutes + scaleInCooldown: 300, // 5 minutes + }, }, - scaleOutCooldown: 300, - scaleInCooldown: 300, - }, - }, - ); + ); - // Scheduled Scaling for predictable load patterns - const scheduledScalingUp = new aws.appautoscaling.ScheduledAction( - `${config.projectName}-scale-up-business-hours`, - { - name: `${config.projectName}-scale-up-business-hours`, - serviceNamespace: ecsTarget.serviceNamespace, - resourceId: ecsTarget.resourceId, - scalableDimension: ecsTarget.scalableDimension, - schedule: 'cron(0 9 ? * MON-FRI *)', // 9 AM UTC on weekdays - scalableTargetAction: { - minCapacity: 3, - maxCapacity: 10, - }, - }, - ); + // Memory-based Auto Scaling Policy + const memoryScalingPolicy = new aws.appautoscaling.Policy( + `${config.projectName}-${app.name}-memory-scaling`, + { + name: `${config.projectName}-${app.name}-memory-scaling`, + policyType: 'TargetTrackingScaling', + resourceId: ecsTarget.resourceId, + scalableDimension: ecsTarget.scalableDimension, + serviceNamespace: ecsTarget.serviceNamespace, + targetTrackingScalingPolicyConfiguration: { + targetValue: 80.0, // Target 80% memory utilization + predefinedMetricSpecification: { + predefinedMetricType: 'ECSServiceAverageMemoryUtilization', + }, + scaleOutCooldown: 300, + scaleInCooldown: 300, + }, + }, + ); - const scheduledScalingDown = new aws.appautoscaling.ScheduledAction( - `${config.projectName}-scale-down-off-hours`, - { - name: `${config.projectName}-scale-down-off-hours`, - serviceNamespace: ecsTarget.serviceNamespace, - resourceId: ecsTarget.resourceId, - scalableDimension: ecsTarget.scalableDimension, - schedule: 'cron(0 18 ? * MON-FRI *)', // 6 PM UTC on weekdays - scalableTargetAction: { - minCapacity: 2, - maxCapacity: 5, - }, - }, - ); + // Request count based scaling (if app has a target group) + let requestCountPolicy: aws.appautoscaling.Policy | undefined; + if (appContainer.targetGroupArn) { + requestCountPolicy = new aws.appautoscaling.Policy( + `${config.projectName}-${app.name}-request-scaling`, + { + name: `${config.projectName}-${app.name}-request-scaling`, + policyType: 'TargetTrackingScaling', + resourceId: ecsTarget.resourceId, + scalableDimension: ecsTarget.scalableDimension, + serviceNamespace: ecsTarget.serviceNamespace, + targetTrackingScalingPolicyConfiguration: { + targetValue: 1000.0, // Target 1000 requests per target + predefinedMetricSpecification: { + predefinedMetricType: 'ALBRequestCountPerTarget', + // More reliable approach: extract the suffix parts properly + resourceLabel: pulumi + .all([loadBalancer.albArn, appContainer.targetGroupArn]) + .apply(([albArn, tgArn]) => { + // ALB ARN format: arn:aws:elasticloadbalancing:region:account:loadbalancer/app/name/id + // TG ARN format: arn:aws:elasticloadbalancing:region:account:targetgroup/name/id + // Resource label format: app/name/id/targetgroup/name/id - // CloudWatch Alarms for scaling monitoring - const scaleOutAlarm = new aws.cloudwatch.MetricAlarm(`${config.projectName}-scale-out-alarm`, { - name: `${config.projectName}-scale-out-triggered`, - metricName: 'CPUUtilization', - namespace: 'AWS/ECS', - statistic: 'Average', - period: 300, - evaluationPeriods: 2, - threshold: 75, - comparisonOperator: 'GreaterThanThreshold', - dimensions: pulumi - .all([container.serviceName, container.clusterName]) - .apply(([serviceName, clusterName]: [string, string]) => ({ - ServiceName: serviceName, - ClusterName: clusterName, - })), - tags: { - ...commonTags, - Name: `${config.projectName}-scale-out-alarm`, - Type: 'cloudwatch-alarm', - }, - }); + const albMatch = albArn.match(/loadbalancer\/(app\/[^\/]+\/[^\/]+)$/); + const tgMatch = tgArn.match(/targetgroup\/([^\/]+\/[^\/]+)$/); - const scaleInAlarm = new aws.cloudwatch.MetricAlarm(`${config.projectName}-scale-in-alarm`, { - name: `${config.projectName}-scale-in-triggered`, - metricName: 'CPUUtilization', - namespace: 'AWS/ECS', - statistic: 'Average', - period: 600, - evaluationPeriods: 3, - threshold: 25, - comparisonOperator: 'LessThanThreshold', - dimensions: pulumi - .all([container.serviceName, container.clusterName]) - .apply(([serviceName, clusterName]: [string, string]) => ({ - ServiceName: serviceName, - ClusterName: clusterName, - })), - tags: { - ...commonTags, - Name: `${config.projectName}-scale-in-alarm`, - Type: 'cloudwatch-alarm', + if (!albMatch || !tgMatch) { + throw new Error( + `Failed to parse ALB or Target Group ARN: ${albArn}, ${tgArn}`, + ); + } + + return `${albMatch[1]}/targetgroup/${tgMatch[1]}`; + }), + }, + scaleOutCooldown: 60, + scaleInCooldown: 180, + }, + }, + ); + } + + acc[app.name] = { + target: ecsTarget, + cpuPolicy: cpuScalingPolicy, + memoryPolicy: memoryScalingPolicy, + requestCountPolicy, + }; + + return acc; }, - }); + {} as Record, + ); return { - minCapacity: ecsTarget.minCapacity, - maxCapacity: ecsTarget.maxCapacity, - cpuScaleUpThreshold: 70, - cpuScaleDownThreshold: 25, - memoryScaleUpThreshold: 80, + applicationScaling, }; } diff --git a/apps/infra/modules/validation.ts b/apps/infra/modules/validation.ts new file mode 100644 index 000000000..62220a652 --- /dev/null +++ b/apps/infra/modules/validation.ts @@ -0,0 +1,117 @@ +import { ApplicationConfig } from '../types'; + +export function validateApplicationConfigs(applications: ApplicationConfig[]): void { + // Check for duplicate app names + const appNames = applications.map((app) => app.name); + const uniqueNames = new Set(appNames); + if (appNames.length !== uniqueNames.size) { + const duplicates = appNames.filter((name, index) => appNames.indexOf(name) !== index); + throw new Error(`Duplicate application names found: ${duplicates.join(', ')}`); + } + + // Check for port conflicts when using host-based routing on same domain + const hostRoutingApps = applications.filter((app) => app.routing?.hostnames); + const portsByHost = new Map>(); + + hostRoutingApps.forEach((app) => { + app.routing?.hostnames?.forEach((hostname) => { + if (!portsByHost.has(hostname)) { + portsByHost.set(hostname, new Set()); + } + portsByHost.get(hostname)!.add(app.containerPort); + }); + }); + + // Check each app's configuration + applications.forEach((app) => { + // Validate app name (AWS resource naming constraints) + if (!/^[a-zA-Z][a-zA-Z0-9-]*$/.test(app.name)) { + throw new Error( + `Invalid app name '${app.name}': must start with letter and contain only letters, numbers, and hyphens`, + ); + } + + if (app.name.length > 32) { + throw new Error(`App name '${app.name}' is too long: max 32 characters`); + } + + // Validate port + if (app.containerPort < 1 || app.containerPort > 65535) { + throw new Error( + `Invalid container port ${app.containerPort} for app '${app.name}': must be between 1-65535`, + ); + } + + // Validate routing - must have either path or hostname, not both + if (app.routing) { + if (app.routing.pathPattern && app.routing.hostnames) { + throw new Error(`App '${app.name}' cannot have both path-based and host-based routing`); + } + if (!app.routing.pathPattern && !app.routing.hostnames) { + throw new Error(`App '${app.name}' must have either pathPattern or hostnames for routing`); + } + } + + // Validate scaling configuration + if (app.minCount !== undefined && app.maxCount !== undefined) { + if (app.minCount > app.maxCount) { + throw new Error( + `App '${app.name}': minCount (${app.minCount}) cannot be greater than maxCount (${app.maxCount})`, + ); + } + if (app.minCount < 0) { + throw new Error(`App '${app.name}': minCount cannot be negative`); + } + } + + if (app.desiredCount !== undefined) { + if (app.desiredCount < 0) { + throw new Error(`App '${app.name}': desiredCount cannot be negative`); + } + if (app.minCount !== undefined && app.desiredCount < app.minCount) { + throw new Error( + `App '${app.name}': desiredCount (${app.desiredCount}) cannot be less than minCount (${app.minCount})`, + ); + } + if (app.maxCount !== undefined && app.desiredCount > app.maxCount) { + throw new Error( + `App '${app.name}': desiredCount (${app.desiredCount}) cannot be greater than maxCount (${app.maxCount})`, + ); + } + } + + // Validate CPU/memory + if (app.cpu !== undefined && app.cpu <= 0) { + throw new Error(`App '${app.name}': CPU must be positive`); + } + if (app.memory !== undefined && app.memory <= 0) { + throw new Error(`App '${app.name}': memory must be positive`); + } + + // Validate target CPU percent for scaling + if (app.targetCPUPercent !== undefined) { + if (app.targetCPUPercent <= 0 || app.targetCPUPercent > 100) { + throw new Error(`App '${app.name}': targetCPUPercent must be between 1-100`); + } + } + + // Validate environment variables don't contain sensitive data + if (app.environmentVariables) { + const sensitivePatterns = ['password', 'secret', 'key', 'token', 'credential']; + Object.keys(app.environmentVariables).forEach((key) => { + const lowerKey = key.toLowerCase(); + if (sensitivePatterns.some((pattern) => lowerKey.includes(pattern))) { + throw new Error( + `App '${app.name}': environment variable '${key}' appears to be sensitive. ` + + `Use requiredSecrets array for sensitive values.`, + ); + } + }); + } + }); + + // Ensure at least one app is configured + if (applications.length === 0) { + throw new Error('At least one application must be configured'); + } +} diff --git a/apps/infra/types.ts b/apps/infra/types.ts index 89d9163c2..cc9b18952 100644 --- a/apps/infra/types.ts +++ b/apps/infra/types.ts @@ -1,3 +1,4 @@ +import * as aws from '@pulumi/aws'; import * as pulumi from '@pulumi/pulumi'; // ========================================== @@ -13,7 +14,6 @@ export interface CommonConfig { enableRDSReadReplicas: boolean; region: string; awsRegion: string; - nodeEnv: string; enableDebugEndpoints: boolean; githubOrg: string; githubRepo: string; @@ -129,14 +129,18 @@ export interface DatabaseOutputs { export interface ContainerOutputs { clusterName: pulumi.Output; clusterArn: pulumi.Output; - serviceName: pulumi.Output; - repositoryUrl: pulumi.Output; - repositoryArn: pulumi.Output; - taskDefinitionArn: pulumi.Output; - logGroupName: pulumi.Output; - logGroupArn: pulumi.Output; taskExecutionRoleArn: pulumi.Output; taskRoleArn: pulumi.Output; + // Multi-app outputs + applications: Array<{ + serviceName: pulumi.Output; + repositoryUrl: pulumi.Output; + repositoryArn: pulumi.Output; + taskDefinitionArn: pulumi.Output; + logGroupName: pulumi.Output; + logGroupArn: pulumi.Output; + targetGroupArn?: pulumi.Output; + }>; } export interface LoadBalancerOutputs { @@ -167,6 +171,15 @@ export interface BuildSystemOutputs { app: ApplicationConfig, database: DatabaseOutputs, container: ContainerOutputs, + appContainer: { + serviceName: pulumi.Output; + repositoryUrl: pulumi.Output; + repositoryArn: pulumi.Output; + taskDefinitionArn: pulumi.Output; + logGroupName: pulumi.Output; + logGroupArn: pulumi.Output; + targetGroupArn?: pulumi.Output; + }, ) => ApplicationDeployment; } @@ -217,11 +230,15 @@ export interface MonitoringOutputs { } export interface ScalingOutputs { - minCapacity: pulumi.Output; - maxCapacity: pulumi.Output; - cpuScaleUpThreshold: number; - cpuScaleDownThreshold: number; - memoryScaleUpThreshold: number; + applicationScaling: Record< + string, + { + target: aws.appautoscaling.Target; + cpuPolicy: aws.appautoscaling.Policy; + memoryPolicy: aws.appautoscaling.Policy; + requestCountPolicy?: aws.appautoscaling.Policy; + } + >; } // ========================================== @@ -230,21 +247,38 @@ export interface ScalingOutputs { export interface ApplicationConfig { name: string; - contextPath: string; - requiresDatabaseAccess: boolean; - dependsOnMigrations: boolean; - buildCommand?: string; - healthCheckPath: string; - environmentVariables: Record; - resourceRequirements: { - cpu: number; - memory: number; + containerPort: number; + healthCheck?: { + path?: string; + interval?: number; + timeout?: number; + healthyThreshold?: number; + unhealthyThreshold?: number; }; - scaling: { - minInstances: number; - maxInstances: number; - targetCpuPercent: number; + routing?: { + pathPattern?: string; // e.g., '/portal/*' + hostnames?: string[]; // e.g., ['portal.example.com'] }; + cpu?: number; + memory?: number; + desiredCount?: number; + minCount?: number; + maxCount?: number; + targetCPUPercent?: number; + requiredSecrets?: string[]; + includeDatabaseUrl?: boolean; // Whether this app needs DATABASE_URL injected as environment variable + environmentVariables?: Record; // Non-sensitive env vars +} + +export interface ApplicationOutput { + url: pulumi.Output; + serviceName: pulumi.Output; + ecrRepository: pulumi.Output; + logGroup: pulumi.Output; + buildProject: pulumi.Output; + healthCheckUrl: pulumi.Output; + secretArn?: pulumi.Output; + deployCommand: pulumi.Output; } // Duplicate ResourceTags interface removed - using the one at the top of the file diff --git a/apps/portal/Dockerfile b/apps/portal/Dockerfile new file mode 100644 index 000000000..04175def3 --- /dev/null +++ b/apps/portal/Dockerfile @@ -0,0 +1,37 @@ +# Build stage +FROM node:20-alpine AS builder + +WORKDIR /app + +# Copy package files +COPY package*.json ./ +COPY apps/portal/package*.json ./apps/portal/ + +# Install dependencies +RUN npm ci + +# Copy source code +COPY . . + +# Build the portal app +RUN npm run build --workspace=apps/portal + +# Production stage +FROM node:20-alpine AS runner + +WORKDIR /app + +# Copy necessary files from builder +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/apps/portal/.next ./apps/portal/.next +COPY --from=builder /app/apps/portal/public ./apps/portal/public +COPY --from=builder /app/apps/portal/package.json ./apps/portal/package.json + +# Set environment to production +ENV NODE_ENV=production + +# Expose the port +EXPOSE 3001 + +# Start the application +CMD ["npm", "run", "start", "--workspace=apps/portal"] \ No newline at end of file diff --git a/apps/portal/buildspec.yml b/apps/portal/buildspec.yml new file mode 100644 index 000000000..e34a5a4d4 --- /dev/null +++ b/apps/portal/buildspec.yml @@ -0,0 +1,45 @@ +version: 0.2 + +phases: + pre_build: + commands: + - echo Logging in to Amazon ECR... + - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com + - echo Building image tag... + - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) + - IMAGE_URI=$ECR_REPOSITORY_URI:$IMAGE_TAG + - IMAGE_URI_LATEST=$ECR_REPOSITORY_URI:latest + + build: + commands: + - echo Build started on `date` + - echo Building the Docker image for $APP_NAME... + - cd apps/$APP_NAME + - docker build -t $IMAGE_URI -t $IMAGE_URI_LATEST -f $DOCKERFILE_PATH . + - echo Build completed on `date` + + post_build: + commands: + - echo Pushing the Docker images... + - docker push $IMAGE_URI + - docker push $IMAGE_URI_LATEST + - echo Writing image definitions file... + - printf '[{"name":"%s-container","imageUri":"%s"}]' "$APP_NAME" "$IMAGE_URI" > imagedefinitions.json + - echo Updating ECS service... + - | + aws ecs update-service \ + --cluster $ECS_CLUSTER_NAME \ + --service $ECS_SERVICE_NAME \ + --force-new-deployment \ + --region $AWS_DEFAULT_REGION + - echo Deployment initiated successfully + +cache: + paths: + - '/root/.npm/**/*' + - '/root/.next/cache/**/*' + +artifacts: + files: + - imagedefinitions.json + name: ${APP_NAME}-build From 2ddfda6722122813db3e8b5750973dbbdf17e738 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 16:44:39 -0400 Subject: [PATCH 057/107] refactor(infra): update deploy script and infrastructure modules for improved clarity and functionality - Enhanced deploy.sh script with detailed comments and restructured deployment steps for better readability. - Removed the option to skip infrastructure updates, ensuring a more consistent deployment process. - Updated database migration step numbering for clarity in the deployment sequence. - Added service ARN and optional service reference in container outputs for better resource management. - Adjusted load balancer target group name to comply with AWS character limits. - Improved scaling configuration to ensure ECS service dependencies are respected during scaling operations. --- apps/infra/deploy.sh | 55 ++++++++---------------------- apps/infra/modules/container.ts | 5 ++- apps/infra/modules/loadbalancer.ts | 3 +- apps/infra/modules/scaling.ts | 6 +++- apps/infra/types.ts | 2 ++ 5 files changed, 28 insertions(+), 43 deletions(-) diff --git a/apps/infra/deploy.sh b/apps/infra/deploy.sh index f7563c2ec..7e9f0b241 100755 --- a/apps/infra/deploy.sh +++ b/apps/infra/deploy.sh @@ -1,4 +1,12 @@ #!/bin/bash +# Deploy script for applications and database migrations +# This script handles: +# 1. Running database migrations (via CodeBuild) +# 2. Building and deploying applications (via CodeBuild) +# 3. Verifying deployment success +# +# Infrastructure updates should be done separately with 'pulumi up' + set -e # Colors for output @@ -15,7 +23,6 @@ AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text 2>/de # Parse command line arguments DEPLOY_APP=true DEPLOY_PORTAL=true -SKIP_INFRA=false SKIP_MIGRATIONS=false while [[ $# -gt 0 ]]; do @@ -28,10 +35,6 @@ while [[ $# -gt 0 ]]; do DEPLOY_APP=false shift ;; - --skip-infra) - SKIP_INFRA=true - shift - ;; --skip-migrations) SKIP_MIGRATIONS=true shift @@ -41,7 +44,6 @@ while [[ $# -gt 0 ]]; do echo "Options:" echo " --app-only Deploy only the main app" echo " --portal-only Deploy only the portal" - echo " --skip-infra Skip Pulumi infrastructure update" echo " --skip-migrations Skip database migrations (DANGEROUS!)" echo " --help Show this help message" exit 0 @@ -114,14 +116,6 @@ echo -e "${YELLOW}📋 App CodeBuild Project: ${APP_PROJECT}${NC}" echo -e "${YELLOW}📋 Portal CodeBuild Project: ${PORTAL_PROJECT}${NC}" echo -e "${YELLOW}📋 AWS Region: ${AWS_REGION}${NC}" -# Confirm deployment -echo -e "${YELLOW}⚠️ This will deploy to the '${ENV_NAME}' environment. Continue? (y/N)${NC}" -read -r response -if [[ ! "$response" =~ ^[Yy]$ ]]; then - echo -e "${RED}❌ Deployment cancelled${NC}" - exit 1 -fi - # Function to generate CodeBuild console URL get_codebuild_url() { local build_id=$1 @@ -163,28 +157,9 @@ wait_for_build() { done } -# Step 1: Update Infrastructure -if [ "$SKIP_INFRA" = false ]; then - echo -e "${YELLOW}📋 Step 1: Updating infrastructure...${NC}" - cd "$INFRA_DIR" - export NODE_ENV=production - if ! pulumi up --yes; then - echo -e "${RED}❌ Pulumi update failed. Aborting deployment.${NC}" - exit 1 - fi - cd "$PROJECT_ROOT" - echo -e "${GREEN}✅ Infrastructure updated successfully${NC}" -else - echo -e "${YELLOW}⏭️ Step 1: Skipping infrastructure update${NC}" -fi - -# Add a small delay to ensure propagation -echo -e "${YELLOW}⏳ Waiting 15 seconds for infrastructure changes to propagate...${NC}" -sleep 15 - -# Step 2: Run Database Migrations (MUST complete before apps) +# Step 1: Run Database Migrations (MUST complete before apps) if [ "$SKIP_MIGRATIONS" = false ]; then - echo -e "${YELLOW}🗃️ Step 2: Running database migrations...${NC}" + echo -e "${YELLOW}🗃️ Step 1: Running database migrations...${NC}" migration_build_id=$(aws codebuild start-build \ --project-name "$MIGRATION_PROJECT" \ --query 'build.id' --output text) @@ -197,11 +172,11 @@ if [ "$SKIP_MIGRATIONS" = false ]; then exit 1 fi else - echo -e "${YELLOW}⏭️ Step 2: Skipping database migrations (DANGEROUS!)${NC}" + echo -e "${YELLOW}⏭️ Step 1: Skipping database migrations (DANGEROUS!)${NC}" fi -# Step 3: Build and Deploy Applications (in parallel) -echo -e "${YELLOW}🔨 Step 3: Building and deploying applications...${NC}" +# Step 2: Build and Deploy Applications (in parallel) +echo -e "${YELLOW}🔨 Step 2: Building and deploying applications...${NC}" # Display what will be deployed echo -e "${YELLOW}📦 Applications to deploy:${NC}" @@ -272,8 +247,8 @@ if [ "$build_failed" = true ]; then exit 1 fi -# Step 4: Verify Deployment -echo -e "${YELLOW}🔍 Step 4: Verifying deployment...${NC}" +# Step 3: Verify Deployment +echo -e "${YELLOW}🔍 Step 3: Verifying deployment...${NC}" # Wait for ECS service to stabilize after the build updated it echo -e "${YELLOW}⏳ Waiting for ECS deployment to stabilize...${NC}" diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index b2186e702..13cbc58d0 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -29,6 +29,7 @@ export function createApplicationContainer( const repository = new aws.ecr.Repository(`${appName}-repository`, { name: appName.toLowerCase(), // ECR names must be lowercase imageTagMutability: 'MUTABLE', + forceDelete: true, // Allow deletion even when images exist encryptionConfigurations: [ { encryptionType: 'AES256', @@ -145,7 +146,7 @@ export function createApplicationContainer( return JSON.stringify([ { name: `${app.name}-container`, - image: pulumi.interpolate`${repoUrl}:latest`, + image: `${repoUrl}:latest`, essential: true, portMappings: [ { @@ -210,6 +211,8 @@ export function createApplicationContainer( return { serviceName: service.name, + serviceArn: service.id, + service: service, // Return the actual service resource for dependencies repositoryUrl: repository.repositoryUrl, repositoryArn: repository.arn, taskDefinitionArn: taskDefinition.arn, diff --git a/apps/infra/modules/loadbalancer.ts b/apps/infra/modules/loadbalancer.ts index f2c040d18..3bfc31ffe 100644 --- a/apps/infra/modules/loadbalancer.ts +++ b/apps/infra/modules/loadbalancer.ts @@ -19,6 +19,7 @@ export function createLoadBalancer(config: CommonConfig, network: NetworkOutputs // Create a default target group (required for listener) const defaultTargetGroup = new aws.lb.TargetGroup(`${config.projectName}-default-tg`, { + name: `${config.projectName}-def-tg`.substring(0, 32), // AWS limit is 32 chars port: 80, protocol: 'HTTP', targetType: 'ip', @@ -34,7 +35,7 @@ export function createLoadBalancer(config: CommonConfig, network: NetworkOutputs }, tags: { ...commonTags, - Name: `${config.projectName}-default-tg`, + Name: `${config.projectName}-def-tg`, Type: 'target-group', }, }); diff --git a/apps/infra/modules/scaling.ts b/apps/infra/modules/scaling.ts index 9cf4611a2..4c5ca4283 100644 --- a/apps/infra/modules/scaling.ts +++ b/apps/infra/modules/scaling.ts @@ -32,7 +32,7 @@ export function createScaling( { maxCapacity: app.maxCount || 10, minCapacity: app.minCount || 1, - resourceId: pulumi.interpolate`service/${config.projectName}-cluster/${appContainer.serviceName}`, + resourceId: pulumi.interpolate`service/${container.clusterName}/${appContainer.serviceName}`, scalableDimension: 'ecs:service:DesiredCount', serviceNamespace: 'ecs', tags: { @@ -42,6 +42,10 @@ export function createScaling( App: app.name, }, }, + { + // Ensure the ECS service exists before creating the scaling target + dependsOn: appContainer.service ? [appContainer.service] : [], + }, ); // CPU-based Auto Scaling Policy diff --git a/apps/infra/types.ts b/apps/infra/types.ts index cc9b18952..2bc64c065 100644 --- a/apps/infra/types.ts +++ b/apps/infra/types.ts @@ -134,6 +134,8 @@ export interface ContainerOutputs { // Multi-app outputs applications: Array<{ serviceName: pulumi.Output; + serviceArn: pulumi.Output; + service?: aws.ecs.Service; // Optional to maintain backward compatibility repositoryUrl: pulumi.Output; repositoryArn: pulumi.Output; taskDefinitionArn: pulumi.Output; From 424f6ad684cd41f5ce9a343c96b234ef6db0d79f Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 16:46:24 -0400 Subject: [PATCH 058/107] feat(infra): add source version to build system configuration - Introduced a new property `sourceVersion` in the build system configuration to specify the GitHub branch being used. - This addition enhances traceability and clarity regarding the source of the build artifacts. --- apps/infra/modules/build.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index b3b0d46a9..aeb4cbe63 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -295,6 +295,7 @@ export function createBuildSystem( fetchSubmodules: false, }, }, + sourceVersion: config.githubBranch, cache: { type: 'LOCAL', modes: ['LOCAL_DOCKER_LAYER_CACHE', 'LOCAL_SOURCE_CACHE'], From 1140ebae1b1230eca4b6b3554f7a37cc388c92c1 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 16:48:20 -0400 Subject: [PATCH 059/107] fix(infra): correct echo command syntax in buildspec for database URL check - Updated the echo command in buildspec-migrations.yml to ensure proper syntax for displaying the DATABASE_URL configuration status. This change improves clarity in the migration logs. --- apps/infra/buildspec-migrations.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/infra/buildspec-migrations.yml b/apps/infra/buildspec-migrations.yml index 7880fdf97..4ee0d9f0e 100644 --- a/apps/infra/buildspec-migrations.yml +++ b/apps/infra/buildspec-migrations.yml @@ -25,7 +25,7 @@ phases: # Run database migrations - echo "Running database migrations..." - - echo "DATABASE_URL is configured: $([ -n \"$DATABASE_URL\" ] && echo 'YES' || echo 'NO')" + - 'echo "DATABASE_URL is configured: $([ -n \"$DATABASE_URL\" ] && echo ''YES'' || echo ''NO'')"' - bun x prisma migrate deploy # Verify migration success From bdd5f5fdd5380a77d4b2e77932a38c73a8f2378e Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 16:53:25 -0400 Subject: [PATCH 060/107] feat(infra): add NEXT_PUBLIC_PORTAL_URL to applications configuration - Included 'NEXT_PUBLIC_PORTAL_URL' in the applications configuration to support portal URL management. This addition enhances the flexibility of environment variable handling for the application. --- apps/infra/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/infra/index.ts b/apps/infra/index.ts index acf27fc95..616ac3286 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -70,6 +70,7 @@ const applications: ApplicationConfig[] = [ 'UPSTASH_REDIS_REST_TOKEN', 'OPENAI_API_KEY', // Used for populating policies with AI 'TRIGGER_SECRET_KEY', + 'NEXT_PUBLIC_PORTAL_URL', // Optional - comment out if not used. 'AUTH_GOOGLE_ID', From 7de1d6ca8000e020e44994317871ba8d1d06d9df Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 17:02:25 -0400 Subject: [PATCH 061/107] feat(infra): enhance build system to include required secrets from AWS Secrets Manager - Added functionality to the build system to automatically include required secrets from AWS Secrets Manager for applications. This improvement streamlines the management of sensitive information during the build process. --- apps/infra/index.ts | 1 + apps/infra/modules/build.ts | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/apps/infra/index.ts b/apps/infra/index.ts index 616ac3286..9c26836de 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -90,6 +90,7 @@ const applications: ApplicationConfig[] = [ environmentVariables: { NODE_ENV: 'production', NEXT_TELEMETRY_DISABLED: '1', + NEXT_PUBLIC_PORTAL_URL: 'PLACEHOLDER', // This will be injected from secrets }, }, { diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index aeb4cbe63..becb3244e 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -252,6 +252,14 @@ export function createBuildSystem( value, type: 'PLAINTEXT' as const, })), + // Add all required secrets from AWS Secrets Manager + ...(app.requiredSecrets && appSecrets?.[app.name] + ? app.requiredSecrets.map((secretName) => ({ + name: secretName, + value: pulumi.interpolate`${appSecrets[app.name].secretArn}:${secretName}`, + type: 'SECRETS_MANAGER' as const, + })) + : []), ], }, vpcConfig: app.includeDatabaseUrl From 72b00d4da3a9a10c3e9ac469fd1aaa923a8a89db Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 17:11:12 -0400 Subject: [PATCH 062/107] feat(infra): refactor application secrets management to support individual secrets - Updated the application secrets management to create individual secrets for each required secret in AWS Secrets Manager, enhancing clarity and organization. - Modified the application output structure to include a record of secrets, replacing the previous single ARN reference. - Adjusted container and build system modules to accommodate the new secrets structure, ensuring proper handling of application-specific secrets during deployment. --- apps/infra/index.ts | 15 ++++-- apps/infra/modules/app-secrets.ts | 87 ++++++++++++++++--------------- apps/infra/modules/build.ts | 17 ++++-- apps/infra/modules/container.ts | 58 ++++++++++++--------- apps/infra/types.ts | 2 +- 5 files changed, 100 insertions(+), 79 deletions(-) diff --git a/apps/infra/index.ts b/apps/infra/index.ts index 9c26836de..18d0bc556 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -90,7 +90,6 @@ const applications: ApplicationConfig[] = [ environmentVariables: { NODE_ENV: 'production', NEXT_TELEMETRY_DISABLED: '1', - NEXT_PUBLIC_PORTAL_URL: 'PLACEHOLDER', // This will be injected from secrets }, }, { @@ -231,7 +230,15 @@ export const applicationOutputs = deployments.reduce( logGroup: deployment.container.logGroupName, buildProject: deployment.buildProject.name, healthCheckUrl: pulumi.interpolate`${appUrl}${deployment.app.healthCheck?.path || '/health'}`, - secretArn: appSecrets[deployment.app.name]?.secretArn, + secrets: appSecrets[deployment.app.name] + ? Object.entries(appSecrets[deployment.app.name]).reduce( + (acc, [secretName, secret]) => { + acc[secretName] = secret.name; + return acc; + }, + {} as Record>, + ) + : undefined, deployCommand: pulumi.interpolate`aws codebuild start-build --project-name ${deployment.buildProject.name}`, }; @@ -288,7 +295,7 @@ IMPORTANT: Deployment Order To update secrets: 1. Go to AWS Secrets Manager -2. Find the secret for your app (format: ${projectName}/{appName}/secrets-*) -3. Update the secret values as needed +2. Find individual secrets for your app (format: ${projectName}/{appName}/SECRET_NAME) +3. Update each secret value as needed (they are stored as plaintext, not JSON) `, ); diff --git a/apps/infra/modules/app-secrets.ts b/apps/infra/modules/app-secrets.ts index fb7230d17..e43da3fc4 100644 --- a/apps/infra/modules/app-secrets.ts +++ b/apps/infra/modules/app-secrets.ts @@ -5,53 +5,54 @@ import { ApplicationConfig, CommonConfig } from '../types'; export function createAppSecrets(config: CommonConfig, applications: ApplicationConfig[]) { const { commonTags } = config; - // Create a secret for each application that needs secrets + // Create individual secrets for each application const appSecrets = applications .filter((app) => app.requiredSecrets && app.requiredSecrets.length > 0) - .map((app) => { - // Create app-specific secret - const secret = new aws.secretsmanager.Secret(`${config.projectName}-${app.name}-secret`, { - namePrefix: `${config.projectName}/${app.name}/secrets-`, - description: `Application secrets for ${app.name}. Update these values in AWS Secrets Manager.`, - tags: { - ...commonTags, - Name: `${config.projectName}-${app.name}-secret`, - Type: 'secret', - Purpose: 'application-secrets', - App: app.name, - }, - }); + .reduce( + (acc, app) => { + const secrets: Record; name: pulumi.Output }> = + {}; - // Create placeholders for all required secrets - const placeholders: Record = {}; - app.requiredSecrets!.forEach((secretName) => { - placeholders[secretName] = 'PLACEHOLDER'; - }); + // Create individual secret for each required secret + app.requiredSecrets!.forEach((secretName) => { + const secret = new aws.secretsmanager.Secret( + `${config.projectName}-${app.name}-${secretName}`, + { + name: `${config.projectName}/${app.name}/${secretName}`, + description: `${secretName} for ${app.name} application`, + tags: { + ...commonTags, + Name: `${config.projectName}-${app.name}-${secretName}`, + Type: 'secret', + App: app.name, + SecretName: secretName, + }, + }, + ); - const secretVersion = new aws.secretsmanager.SecretVersion( - `${config.projectName}-${app.name}-secret-version`, - { - secretId: secret.id, - secretString: JSON.stringify(placeholders), - }, - ); + // Create secret version with placeholder value + new aws.secretsmanager.SecretVersion( + `${config.projectName}-${app.name}-${secretName}-version`, + { + secretId: secret.id, + secretString: 'PLACEHOLDER', + }, + ); - return { - appName: app.name, - secretArn: secret.arn, - secretId: secret.id, - }; - }); + secrets[secretName] = { + arn: secret.arn, + name: secret.name, + }; + }); - // Return a map of app name to secret info - return appSecrets.reduce( - (acc, appSecret) => { - acc[appSecret.appName] = { - secretArn: appSecret.secretArn, - secretId: appSecret.secretId, - }; - return acc; - }, - {} as Record; secretId: pulumi.Output }>, - ); + acc[app.name] = secrets; + return acc; + }, + {} as Record< + string, + Record; name: pulumi.Output }> + >, + ); + + return appSecrets; } diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index becb3244e..d49daa655 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -15,7 +15,7 @@ export function createBuildSystem( container: ContainerOutputs, appSecrets?: Record< string, - { secretArn: pulumi.Output; secretId: pulumi.Output } + Record; name: pulumi.Output }> >, ) { const { commonTags } = config; @@ -42,12 +42,19 @@ export function createBuildSystem( }, }); + // Collect all secret ARNs from all applications + const allSecretArns = appSecrets + ? Object.values(appSecrets).flatMap((appSecretMap) => + Object.values(appSecretMap).map((secret) => secret.arn), + ) + : []; + // CodeBuild policy for basic operations const codebuildPolicy = new aws.iam.RolePolicy(`${config.projectName}-codebuild-policy`, { role: codebuildRole.id, policy: pulumi - .all([database.secretArn, appSecrets?.secretArn]) - .apply(([dbSecretArn, appSecretArn]) => + .all([database.secretArn, ...allSecretArns]) + .apply(([dbSecretArn, ...secretArns]) => JSON.stringify({ Version: '2012-10-17', Statement: [ @@ -91,7 +98,7 @@ export function createBuildSystem( { Effect: 'Allow', Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], - Resource: [dbSecretArn, ...(appSecretArn ? [appSecretArn] : [])], + Resource: [dbSecretArn, ...secretArns], }, ], }), @@ -256,7 +263,7 @@ export function createBuildSystem( ...(app.requiredSecrets && appSecrets?.[app.name] ? app.requiredSecrets.map((secretName) => ({ name: secretName, - value: pulumi.interpolate`${appSecrets[app.name].secretArn}:${secretName}`, + value: appSecrets[app.name][secretName].arn, type: 'SECRETS_MANAGER' as const, })) : []), diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index 13cbc58d0..432ef5902 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -20,7 +20,7 @@ export function createApplicationContainer( taskRole: aws.iam.Role; }, loadBalancer?: LoadBalancerOutputs, - appSecret?: { secretArn: pulumi.Output; secretId: pulumi.Output }, + appSecrets?: Record; name: pulumi.Output }>, ) { const { commonTags } = config; const appName = `${config.projectName}-${app.name}`; @@ -116,13 +116,8 @@ export function createApplicationContainer( executionRoleArn: sharedResources.taskExecutionRole.arn, taskRoleArn: sharedResources.taskRole.arn, containerDefinitions: pulumi - .all([ - repository.repositoryUrl, - logGroup.name, - database.secretArn, - appSecret?.secretArn || pulumi.output(''), - ]) - .apply(([repoUrl, logGroupName, dbSecretArn, appSecretArn]) => { + .all([repository.repositoryUrl, logGroup.name, database.secretArn]) + .apply(([repoUrl, logGroupName, dbSecretArn]) => { const secrets = []; // Add database secret if needed @@ -134,12 +129,14 @@ export function createApplicationContainer( } // Add app-specific secrets if provided - if (appSecretArn && app.requiredSecrets) { + if (appSecrets && app.requiredSecrets) { app.requiredSecrets.forEach((secretName) => { - secrets.push({ - name: secretName, - valueFrom: `${appSecretArn}:${secretName}::`, - }); + if (appSecrets[secretName]) { + secrets.push({ + name: secretName, + valueFrom: appSecrets[secretName].arn, + }); + } }); } @@ -231,7 +228,7 @@ export function createContainer( loadBalancer?: LoadBalancerOutputs, appSecrets?: Record< string, - { secretArn: pulumi.Output; secretId: pulumi.Output } + Record; name: pulumi.Output }> >, ) { const { commonTags } = config; @@ -283,23 +280,32 @@ export function createContainer( }, ); + // Collect all secret ARNs from all applications + const allAppSecretArns = appSecrets + ? Object.values(appSecrets).flatMap((appSecretMap) => + Object.values(appSecretMap).map((secret) => secret.arn), + ) + : []; + // Add policy for Secrets Manager access to task execution role const taskExecutionSecretsPolicy = new aws.iam.RolePolicy( `${config.projectName}-task-execution-secrets-policy`, { role: taskExecutionRole.id, - policy: pulumi.all([database.secretArn]).apply(([dbSecretArn]) => - JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], - Resource: [dbSecretArn, 'arn:aws:secretsmanager:*:*:secret:*'], - }, - ], - }), - ), + policy: pulumi + .all([database.secretArn, ...allAppSecretArns]) + .apply(([dbSecretArn, ...secretArns]) => + JSON.stringify({ + Version: '2012-10-17', + Statement: [ + { + Effect: 'Allow', + Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], + Resource: [dbSecretArn, ...secretArns], + }, + ], + }), + ), }, ); diff --git a/apps/infra/types.ts b/apps/infra/types.ts index 2bc64c065..0959252c2 100644 --- a/apps/infra/types.ts +++ b/apps/infra/types.ts @@ -279,7 +279,7 @@ export interface ApplicationOutput { logGroup: pulumi.Output; buildProject: pulumi.Output; healthCheckUrl: pulumi.Output; - secretArn?: pulumi.Output; + secrets?: Record>; deployCommand: pulumi.Output; } From b5a7ee714ae6d5fb4850d282a9c7656f56e705ab Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 17:13:02 -0400 Subject: [PATCH 063/107] feat(infra): enhance application container to support dynamic secret management - Updated the application container creation logic to dynamically include individual secret ARNs based on required application secrets. - Improved handling of application-specific secrets by utilizing a spread operator to collect all necessary ARNs, ensuring proper integration during deployment. --- apps/infra/modules/container.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index 432ef5902..00b3e5a06 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -116,8 +116,19 @@ export function createApplicationContainer( executionRoleArn: sharedResources.taskExecutionRole.arn, taskRoleArn: sharedResources.taskRole.arn, containerDefinitions: pulumi - .all([repository.repositoryUrl, logGroup.name, database.secretArn]) - .apply(([repoUrl, logGroupName, dbSecretArn]) => { + .all([ + repository.repositoryUrl, + logGroup.name, + database.secretArn, + // Resolve all secret ARNs + ...(appSecrets && app.requiredSecrets + ? app.requiredSecrets + .filter((secretName) => appSecrets[secretName]) + .map((secretName) => appSecrets[secretName].arn) + : []), + ]) + .apply((values) => { + const [repoUrl, logGroupName, dbSecretArn, ...appSecretArns] = values; const secrets = []; // Add database secret if needed @@ -130,12 +141,14 @@ export function createApplicationContainer( // Add app-specific secrets if provided if (appSecrets && app.requiredSecrets) { + let secretIndex = 0; app.requiredSecrets.forEach((secretName) => { if (appSecrets[secretName]) { secrets.push({ name: secretName, - valueFrom: appSecrets[secretName].arn, + valueFrom: appSecretArns[secretIndex], }); + secretIndex++; } }); } From cc53704188f96af17076b0353b23d75564746a93 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 17:18:03 -0400 Subject: [PATCH 064/107] feat(infra): refactor build system to improve environment variable handling - Updated the build system configuration to streamline the inclusion of environment variables and secrets from AWS Secrets Manager. - Enhanced the logic for managing application-specific secrets, ensuring proper integration during the build process. - Added support for custom environment variables and improved the structure of the build project configuration for better clarity and maintainability. --- apps/infra/modules/build.ts | 310 +++++++++++++++++++----------------- 1 file changed, 161 insertions(+), 149 deletions(-) diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts index d49daa655..fe65dc479 100644 --- a/apps/infra/modules/build.ts +++ b/apps/infra/modules/build.ts @@ -53,8 +53,8 @@ export function createBuildSystem( const codebuildPolicy = new aws.iam.RolePolicy(`${config.projectName}-codebuild-policy`, { role: codebuildRole.id, policy: pulumi - .all([database.secretArn, ...allSecretArns]) - .apply(([dbSecretArn, ...secretArns]) => + .all([database.secretArn, pulumi.all(allSecretArns)]) + .apply(([dbSecretArn, secretArns]) => JSON.stringify({ Version: '2012-10-17', Statement: [ @@ -195,166 +195,178 @@ export function createBuildSystem( // Default buildspec path is at the app's root directory const buildspecPath = `apps/${app.name}/buildspec.yml`; - return new aws.codebuild.Project(`${config.projectName}-${app.name}-build`, { - name: `${config.projectName}-${app.name}-build`, - description: `Build ${app.name} Docker image`, - serviceRole: codebuildRole.arn, - artifacts: { - type: 'NO_ARTIFACTS', - }, - environment: { - computeType: 'BUILD_GENERAL1_LARGE', - image: 'aws/codebuild/standard:7.0', - type: 'LINUX_CONTAINER', - privilegedMode: true, - environmentVariables: [ - { - name: 'AWS_ACCOUNT_ID', - value: aws.getCallerIdentityOutput().accountId, - type: 'PLAINTEXT', - }, - { - name: 'APP_NAME', - value: app.name, - type: 'PLAINTEXT', - }, - { - name: 'DOCKERFILE_PATH', - value: './Dockerfile', - type: 'PLAINTEXT', - }, - { - name: 'ECR_REPOSITORY_URI', - value: appContainer.repositoryUrl, - type: 'PLAINTEXT', - }, - { - name: 'ECS_CLUSTER_NAME', - value: container.clusterName, - type: 'PLAINTEXT', - }, - { - name: 'ECS_SERVICE_NAME', - value: appContainer.serviceName, - type: 'PLAINTEXT', - }, - { - name: 'AWS_DEFAULT_REGION', - value: config.awsRegion, - type: 'PLAINTEXT', - }, - // Only add DATABASE_URL if app needs it - ...(app.includeDatabaseUrl - ? [ - { - name: 'DATABASE_URL', - value: pulumi.interpolate`${database.secretArn}:connectionString`, + return new aws.codebuild.Project( + `${config.projectName}-${app.name}-build`, + { + name: `${config.projectName}-${app.name}-build`, + description: `Build ${app.name} Docker image`, + serviceRole: codebuildRole.arn, + artifacts: { + type: 'NO_ARTIFACTS', + }, + environment: { + computeType: 'BUILD_GENERAL1_LARGE', + image: 'aws/codebuild/standard:7.0', + type: 'LINUX_CONTAINER', + privilegedMode: true, + environmentVariables: [ + { + name: 'AWS_ACCOUNT_ID', + value: aws.getCallerIdentityOutput().accountId, + type: 'PLAINTEXT', + }, + { + name: 'APP_NAME', + value: app.name, + type: 'PLAINTEXT', + }, + { + name: 'DOCKERFILE_PATH', + value: './Dockerfile', + type: 'PLAINTEXT', + }, + { + name: 'ECR_REPOSITORY_URI', + value: appContainer.repositoryUrl, + type: 'PLAINTEXT', + }, + { + name: 'ECS_CLUSTER_NAME', + value: container.clusterName, + type: 'PLAINTEXT', + }, + { + name: 'ECS_SERVICE_NAME', + value: appContainer.serviceName, + type: 'PLAINTEXT', + }, + { + name: 'AWS_DEFAULT_REGION', + value: config.awsRegion, + type: 'PLAINTEXT', + }, + // Only add DATABASE_URL if app needs it + ...(app.includeDatabaseUrl + ? [ + { + name: 'DATABASE_URL', + value: pulumi.interpolate`${database.secretArn}:connectionString`, + type: 'SECRETS_MANAGER' as const, + }, + ] + : []), + // Add custom environment variables from app config + ...Object.entries(app.environmentVariables || {}).map(([key, value]) => ({ + name: key, + value, + type: 'PLAINTEXT' as const, + })), + // Add all required secrets from AWS Secrets Manager + ...(app.requiredSecrets && appSecrets?.[app.name] + ? app.requiredSecrets.map((secretName) => ({ + name: secretName, + value: appSecrets[app.name][secretName].arn, type: 'SECRETS_MANAGER' as const, - }, - ] - : []), - // Add custom environment variables from app config - ...Object.entries(app.environmentVariables || {}).map(([key, value]) => ({ - name: key, - value, - type: 'PLAINTEXT' as const, - })), - // Add all required secrets from AWS Secrets Manager - ...(app.requiredSecrets && appSecrets?.[app.name] - ? app.requiredSecrets.map((secretName) => ({ - name: secretName, - value: appSecrets[app.name][secretName].arn, - type: 'SECRETS_MANAGER' as const, - })) - : []), - ], - }, - vpcConfig: app.includeDatabaseUrl - ? { - vpcId: network.vpcId, - subnets: network.privateSubnetIds, - securityGroupIds: [network.securityGroups.codeBuild], - } - : undefined, - source: { - type: 'GITHUB', - location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, - buildspec: buildspecPath, - gitCloneDepth: 1, + })) + : []), + ], + }, + vpcConfig: app.includeDatabaseUrl + ? { + vpcId: network.vpcId, + subnets: network.privateSubnetIds, + securityGroupIds: [network.securityGroups.codeBuild], + } + : undefined, + source: { + type: 'GITHUB', + location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, + buildspec: buildspecPath, + gitCloneDepth: 1, + }, + sourceVersion: config.githubBranch, + tags: { + ...commonTags, + Name: `${config.projectName}-${app.name}-build`, + Type: 'codebuild-project', + App: app.name, + }, }, - sourceVersion: config.githubBranch, - tags: { - ...commonTags, - Name: `${config.projectName}-${app.name}-build`, - Type: 'codebuild-project', - App: app.name, + { + dependsOn: [codebuildPolicy, ecsDeployPolicy], }, - }); + ); } // Create Database Migration Project function createMigrationProject() { - const migrationProject = new aws.codebuild.Project(`${config.projectName}-migrations`, { - name: `${config.projectName}-migrations`, - description: 'Run database migrations before application deployments', - serviceRole: codebuildRole.arn, - artifacts: { - type: 'NO_ARTIFACTS', - }, - source: { - type: 'GITHUB', - location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, - buildspec: 'apps/infra/buildspec-migrations.yml', - gitCloneDepth: 1, - gitSubmodulesConfig: { - fetchSubmodules: false, + const migrationProject = new aws.codebuild.Project( + `${config.projectName}-migrations`, + { + name: `${config.projectName}-migrations`, + description: 'Run database migrations before application deployments', + serviceRole: codebuildRole.arn, + artifacts: { + type: 'NO_ARTIFACTS', }, - }, - sourceVersion: config.githubBranch, - cache: { - type: 'LOCAL', - modes: ['LOCAL_DOCKER_LAYER_CACHE', 'LOCAL_SOURCE_CACHE'], - }, - environment: { - type: 'LINUX_CONTAINER', - image: 'aws/codebuild/standard:7.0', - computeType: 'BUILD_GENERAL1_MEDIUM', - privilegedMode: true, - environmentVariables: [ - { - name: 'PROJECT_NAME', - value: config.projectName, - type: 'PLAINTEXT', + source: { + type: 'GITHUB', + location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, + buildspec: 'apps/infra/buildspec-migrations.yml', + gitCloneDepth: 1, + gitSubmodulesConfig: { + fetchSubmodules: false, }, - { - name: 'DATABASE_URL', - value: pulumi.interpolate`${database.secretArn}:connectionString`, - type: 'SECRETS_MANAGER' as const, + }, + sourceVersion: config.githubBranch, + cache: { + type: 'LOCAL', + modes: ['LOCAL_DOCKER_LAYER_CACHE', 'LOCAL_SOURCE_CACHE'], + }, + environment: { + type: 'LINUX_CONTAINER', + image: 'aws/codebuild/standard:7.0', + computeType: 'BUILD_GENERAL1_MEDIUM', + privilegedMode: true, + environmentVariables: [ + { + name: 'PROJECT_NAME', + value: config.projectName, + type: 'PLAINTEXT', + }, + { + name: 'DATABASE_URL', + value: pulumi.interpolate`${database.secretArn}:connectionString`, + type: 'SECRETS_MANAGER' as const, + }, + ], + }, + vpcConfig: { + vpcId: network.vpcId, + subnets: [network.privateSubnetIds[0], network.privateSubnetIds[1]], + securityGroupIds: [network.securityGroups.codeBuild], + }, + logsConfig: { + cloudwatchLogs: { + status: 'ENABLED', + groupName: `/aws/codebuild/${config.projectName}-migrations`, }, - ], - }, - vpcConfig: { - vpcId: network.vpcId, - subnets: [network.privateSubnetIds[0], network.privateSubnetIds[1]], - securityGroupIds: [network.securityGroups.codeBuild], - }, - logsConfig: { - cloudwatchLogs: { - status: 'ENABLED', - groupName: `/aws/codebuild/${config.projectName}-migrations`, + }, + buildBatchConfig: { + serviceRole: codebuildRole.arn, + timeoutInMins: 10, + }, + tags: { + ...commonTags, + Name: `${config.projectName}-migrations`, + Type: 'codebuild-project', + Purpose: 'database-migrations', }, }, - buildBatchConfig: { - serviceRole: codebuildRole.arn, - timeoutInMins: 10, - }, - tags: { - ...commonTags, - Name: `${config.projectName}-migrations`, - Type: 'codebuild-project', - Purpose: 'database-migrations', + { + dependsOn: [codebuildPolicy, ecsDeployPolicy], }, - }); + ); return migrationProject; } From b5a70c4895a2d0a13e50899e13cfe5cd42b0f6b9 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 17:25:04 -0400 Subject: [PATCH 065/107] feat(infra): add STS VPC endpoint for IAM role assumption - Introduced a new VPC endpoint for AWS STS to facilitate IAM role assumption within the VPC. - Updated the networking configuration to include the STS endpoint, enhancing security and functionality for applications requiring IAM role access. --- apps/infra/modules/networking.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/infra/modules/networking.ts b/apps/infra/modules/networking.ts index ea1c0947e..96df13ef3 100644 --- a/apps/infra/modules/networking.ts +++ b/apps/infra/modules/networking.ts @@ -457,6 +457,20 @@ export function createNetworking(config: CommonConfig, applications: Application }, }); + // STS VPC Endpoint (essential for IAM role assumption in VPC) + const stsVpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-sts-endpoint`, { + vpcId: vpc.id, + serviceName: `com.amazonaws.${config.awsRegion}.sts`, + vpcEndpointType: 'Interface', + subnetIds: privateSubnetIds, + securityGroupIds: [vpcEndpointSecurityGroup.id], + tags: { + ...commonTags, + Name: `${config.projectName}-sts-endpoint`, + Type: 'vpc-endpoint', + }, + }); + // CloudWatch Logs VPC Endpoint (for CodeBuild logging) const logsVpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-logs-endpoint`, { vpcId: vpc.id, @@ -496,6 +510,7 @@ export function createNetworking(config: CommonConfig, applications: Application ecrDkr: ecrDkrVpcEndpoint.id, codebuild: codebuildVpcEndpoint.id, logs: logsVpcEndpoint.id, + sts: stsVpcEndpoint.id, }, }; } From eb0ec6b038cfbbf977ee2b8fb1fb7d66868a1248 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 17:27:27 -0400 Subject: [PATCH 066/107] refactor(env): update AWS environment variable names for consistency - Renamed AWS-related environment variables to include the 'APP_' prefix for better clarity and to distinguish application-specific settings. - Updated references in the application code to ensure compatibility with the new variable names across various modules. --- apps/app/src/app/s3.ts | 6 +++--- apps/app/src/env.mjs | 8 ++++---- apps/infra/index.ts | 8 ++++---- apps/portal/src/utils/s3.ts | 8 ++++---- turbo.json | 8 ++++---- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/apps/app/src/app/s3.ts b/apps/app/src/app/s3.ts index 52e5125ad..542dca41b 100644 --- a/apps/app/src/app/s3.ts +++ b/apps/app/src/app/s3.ts @@ -1,8 +1,8 @@ import { GetObjectCommand, S3Client } from '@aws-sdk/client-s3'; -const AWS_REGION = process.env.AWS_REGION; -const AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID; -const AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY; +const AWS_REGION = process.env.APP_AWS_REGION; +const AWS_ACCESS_KEY_ID = process.env.APP_AWS_ACCESS_KEY_ID; +const AWS_SECRET_ACCESS_KEY = process.env.APP_AWS_SECRET_ACCESS_KEY; export const BUCKET_NAME = process.env.AWS_BUCKET_NAME; diff --git a/apps/app/src/env.mjs b/apps/app/src/env.mjs index ac5e93e1b..e8687838c 100644 --- a/apps/app/src/env.mjs +++ b/apps/app/src/env.mjs @@ -23,10 +23,10 @@ export const env = createEnv({ VERCEL_PROJECT_ID: z.string().optional(), TRUST_PORTAL_PROJECT_ID: z.string().optional(), NODE_ENV: z.string().optional(), - AWS_ACCESS_KEY_ID: z.string().optional(), - AWS_SECRET_ACCESS_KEY: z.string().optional(), - AWS_REGION: z.string().optional(), - AWS_BUCKET_NAME: z.string().optional(), + APP_AWS_ACCESS_KEY_ID: z.string().optional(), + APP_AWS_SECRET_ACCESS_KEY: z.string().optional(), + APP_AWS_REGION: z.string().optional(), + APP_AWS_BUCKET_NAME: z.string().optional(), GROQ_API_KEY: z.string().optional(), NEXT_PUBLIC_PORTAL_URL: z.string(), RESEND_AUDIENCE_ID: z.string().optional(), diff --git a/apps/infra/index.ts b/apps/infra/index.ts index 18d0bc556..362725249 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -77,10 +77,10 @@ const applications: ApplicationConfig[] = [ 'AUTH_GOOGLE_SECRET', 'AUTH_GITHUB_ID', 'AUTH_GITHUB_SECRET', - 'AWS_BUCKET_NAME', - 'AWS_REGION', - 'AWS_ACCESS_KEY_ID', - 'AWS_SECRET_ACCESS_KEY', + 'APP_AWS_BUCKET_NAME', + 'APP_AWS_REGION', + 'APP_AWS_ACCESS_KEY_ID', + 'APP_AWS_SECRET_ACCESS_KEY', 'DISCORD_WEBHOOK_URL', 'SLACK_SALES_WEBHOOK', 'HUBSPOT_ACCESS_TOKEN', diff --git a/apps/portal/src/utils/s3.ts b/apps/portal/src/utils/s3.ts index fe3498684..6f3a706b0 100644 --- a/apps/portal/src/utils/s3.ts +++ b/apps/portal/src/utils/s3.ts @@ -1,10 +1,10 @@ import { GetObjectCommand, PutObjectCommand, S3Client } from '@aws-sdk/client-s3'; import { getSignedUrl } from '@aws-sdk/s3-request-presigner'; -const AWS_REGION = process.env.AWS_REGION; -const AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID; -const AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY; -export const BUCKET_NAME = process.env.AWS_BUCKET_NAME; +const AWS_REGION = process.env.APP_AWS_REGION; +const AWS_ACCESS_KEY_ID = process.env.APP_AWS_ACCESS_KEY_ID; +const AWS_SECRET_ACCESS_KEY = process.env.APP_AWS_SECRET_ACCESS_KEY; +export const BUCKET_NAME = process.env.APP_AWS_BUCKET_NAME; if (!AWS_ACCESS_KEY_ID || !AWS_SECRET_ACCESS_KEY || !BUCKET_NAME || !AWS_REGION) { // Log the error in production environments diff --git a/turbo.json b/turbo.json index d2ba97916..f643a1fa2 100644 --- a/turbo.json +++ b/turbo.json @@ -28,10 +28,10 @@ "ZAP_WEBHOOK_URL", "BETTER_AUTH_SECRET", "BETTER_AUTH_URL", - "AWS_BUCKET_NAME", - "AWS_REGION", - "AWS_ACCESS_KEY_ID", - "AWS_SECRET_ACCESS_KEY", + "APP_AWS_BUCKET_NAME", + "APP_AWS_REGION", + "APP_AWS_ACCESS_KEY_ID", + "APP_AWS_SECRET_ACCESS_KEY", "ANTHROPIC_API_KEY", "REVALIDATION_SECRET", "GROQ_API_KEY", From 39f3710cda9cf6ba57f3aa0308ee5f19868acff9 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 17:51:18 -0400 Subject: [PATCH 067/107] fix(config): update Vercel environment check for standalone output - Modified the condition for setting the output to 'standalone' in the Next.js configuration to ensure it only applies when the application is not running on Vercel. This change improves compatibility with Docker builds. --- apps/app/next.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/app/next.config.ts b/apps/app/next.config.ts index 469f066d4..93d4ce371 100644 --- a/apps/app/next.config.ts +++ b/apps/app/next.config.ts @@ -49,7 +49,7 @@ const config: NextConfig = { skipTrailingSlashRedirect: true, }; -if (!process.env.IS_VERCEL || process.env.IS_VERCEL === 'false') { +if (process.env.VERCEL !== '1') { config.output = 'standalone'; // Required for Docker builds } From 82f6124dfd6e79f8f5e299cea690506bf4387b21 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 18:08:28 -0400 Subject: [PATCH 068/107] refactor(deploy): streamline deployment script and enhance error handling - Removed the verification step for deployment success, simplifying the deployment process. - Updated the deployment script to check for the existence of CodeBuild projects before starting builds for the app and portal, improving error handling and user feedback. - Adjusted the output for application URLs to provide clearer information upon successful deployment. - Enhanced the buildspec for the portal to include detailed steps for dependency installation, Prisma client generation, and Docker image building, ensuring a more robust build process. - Updated the Dockerfile to use a standalone build approach for better compatibility with the monorepo structure. --- apps/infra/deploy.sh | 165 ++++++++----------------------------- apps/infra/index.ts | 1 - apps/portal/Dockerfile | 45 ++++------ apps/portal/buildspec.yml | 102 +++++++++++++++++------ apps/portal/next.config.ts | 7 +- 5 files changed, 138 insertions(+), 182 deletions(-) diff --git a/apps/infra/deploy.sh b/apps/infra/deploy.sh index 7e9f0b241..442ceb4a1 100755 --- a/apps/infra/deploy.sh +++ b/apps/infra/deploy.sh @@ -3,7 +3,6 @@ # This script handles: # 1. Running database migrations (via CodeBuild) # 2. Building and deploying applications (via CodeBuild) -# 3. Verifying deployment success # # Infrastructure updates should be done separately with 'pulumi up' @@ -92,25 +91,12 @@ fi # Construct resource names based on environment PROJECT_PREFIX="${PROJECT_NAME}-${ENV_NAME}" -CLUSTER_NAME="${PROJECT_PREFIX}" -SERVICE_NAME="${PROJECT_PREFIX}" # Service name matches project prefix APP_PROJECT="${PROJECT_PREFIX}-app-build" PORTAL_PROJECT="${PROJECT_PREFIX}-portal-build" MIGRATION_PROJECT="${PROJECT_PREFIX}-migrations" echo -e "${GREEN}🚀 Starting deployment for environment: ${ENV_NAME}${NC}" echo -e "${YELLOW}📋 Using resource prefix: ${PROJECT_PREFIX}${NC}" - -# Try to get actual values from Pulumi outputs -ACTUAL_CLUSTER=$(cd "$INFRA_DIR" && pulumi stack output ecsClusterName 2>/dev/null || echo "") -ACTUAL_SERVICE=$(cd "$INFRA_DIR" && pulumi stack output ecsServiceName 2>/dev/null || echo "") - -# Use actual values if available, otherwise use constructed names -CLUSTER_NAME=${ACTUAL_CLUSTER:-$CLUSTER_NAME} -SERVICE_NAME=${ACTUAL_SERVICE:-$SERVICE_NAME} - -echo -e "${YELLOW}📋 Cluster: ${CLUSTER_NAME}${NC}" -echo -e "${YELLOW}📋 Service: ${SERVICE_NAME}${NC}" echo -e "${YELLOW}📋 Migration Project: ${MIGRATION_PROJECT}${NC}" echo -e "${YELLOW}📋 App CodeBuild Project: ${APP_PROJECT}${NC}" echo -e "${YELLOW}📋 Portal CodeBuild Project: ${PORTAL_PROJECT}${NC}" @@ -194,23 +180,36 @@ echo "" # Start app build if [ "$DEPLOY_APP" = true ]; then - app_build_id=$(aws codebuild start-build \ - --project-name "$APP_PROJECT" \ - --query 'build.id' --output text) - echo "App build ID: $app_build_id" - app_url=$(get_codebuild_url "$app_build_id") - echo -e "${YELLOW}🔗 View app build: ${app_url}${NC}" + echo -e "${YELLOW}🔨 Starting app build...${NC}" + if aws codebuild batch-get-projects --names "$APP_PROJECT" --query 'projects[0].name' --output text &>/dev/null; then + app_build_id=$(aws codebuild start-build \ + --project-name "$APP_PROJECT" \ + --query 'build.id' --output text) + echo "App build ID: $app_build_id" + app_url=$(get_codebuild_url "$app_build_id") + echo -e "${YELLOW}🔗 View app build: ${app_url}${NC}" + else + echo -e "${RED}❌ App CodeBuild project '$APP_PROJECT' does not exist${NC}" + exit 1 + fi fi -# Start portal build (if project exists) +# Start portal build portal_build_id="" -if [ "$DEPLOY_PORTAL" = true ] && aws codebuild describe-projects --names "$PORTAL_PROJECT" &>/dev/null; then - portal_build_id=$(aws codebuild start-build \ - --project-name "$PORTAL_PROJECT" \ - --query 'build.id' --output text) - echo "Portal build ID: $portal_build_id" - portal_url=$(get_codebuild_url "$portal_build_id") - echo -e "${YELLOW}🔗 View portal build: ${portal_url}${NC}" +if [ "$DEPLOY_PORTAL" = true ]; then + echo -e "${YELLOW}🔨 Starting portal build...${NC}" + if aws codebuild batch-get-projects --names "$PORTAL_PROJECT" --query 'projects[0].name' --output text &>/dev/null; then + portal_build_id=$(aws codebuild start-build \ + --project-name "$PORTAL_PROJECT" \ + --query 'build.id' --output text) + echo "Portal build ID: $portal_build_id" + portal_url=$(get_codebuild_url "$portal_build_id") + echo -e "${YELLOW}🔗 View portal build: ${portal_url}${NC}" + else + echo -e "${RED}❌ Portal CodeBuild project '$PORTAL_PROJECT' does not exist${NC}" + echo -e "${YELLOW}💡 You may need to update your Pulumi configuration to include the portal app${NC}" + exit 1 + fi fi # Display summary of running builds @@ -247,108 +246,16 @@ if [ "$build_failed" = true ]; then exit 1 fi -# Step 3: Verify Deployment -echo -e "${YELLOW}🔍 Step 3: Verifying deployment...${NC}" - -# Wait for ECS service to stabilize after the build updated it -echo -e "${YELLOW}⏳ Waiting for ECS deployment to stabilize...${NC}" - -# Set a timeout of 10 minutes (600 seconds) for the wait -# Use a cross-platform timeout implementation -wait_with_timeout() { - local timeout_duration=$1 - shift - local command=("$@") - - # Start the command in the background - "${command[@]}" & - local cmd_pid=$! - - # Wait for either the command to complete or timeout - local count=0 - while kill -0 "$cmd_pid" 2>/dev/null && [ $count -lt $timeout_duration ]; do - sleep 1 - ((count++)) - done - - # Check if command is still running (timed out) - if kill -0 "$cmd_pid" 2>/dev/null; then - kill "$cmd_pid" 2>/dev/null - wait "$cmd_pid" 2>/dev/null - return 1 # Timeout occurred - else - wait "$cmd_pid" - return $? # Return the command's exit status - fi -} - -if ! wait_with_timeout 600 aws ecs wait services-stable \ - --cluster "$CLUSTER_NAME" \ - --services "$SERVICE_NAME"; then - - echo -e "${RED}❌ ECS service failed to stabilize within 10 minutes${NC}" - - # Get the current service status for debugging - echo -e "${RED}Current service status:${NC}" - aws ecs describe-services \ - --cluster "$CLUSTER_NAME" \ - --services "$SERVICE_NAME" \ - --query 'services[0].{desired:desiredCount,running:runningCount,pending:pendingCount,status:status}' \ - --output table - - # Get recent events - echo -e "${RED}Recent service events:${NC}" - aws ecs describe-services \ - --cluster "$CLUSTER_NAME" \ - --services "$SERVICE_NAME" \ - --query 'services[0].events[0:5]' \ - --output json - - # Check for failed tasks - echo -e "${RED}Checking for task failures:${NC}" - TASK_ARNS=$(aws ecs list-tasks \ - --cluster "$CLUSTER_NAME" \ - --service-name "$SERVICE_NAME" \ - --desired-status STOPPED \ - --query 'taskArns[0:3]' \ - --output json) - - if [ "$TASK_ARNS" != "[]" ] && [ -n "$TASK_ARNS" ]; then - aws ecs describe-tasks \ - --cluster "$CLUSTER_NAME" \ - --tasks $TASK_ARNS \ - --query 'tasks[*].{taskArn:taskArn,stoppedReason:stoppedReason}' \ - --output table - fi - - echo -e "${RED}❌ Deployment failed - ECS service is not stable${NC}" - exit 1 -fi - -echo -e "${GREEN}✅ ECS service is stable${NC}" - -# Get ALB DNS name -alb_dns=$(aws elbv2 describe-load-balancers \ - --query "LoadBalancers[?contains(LoadBalancerName, \`${PROJECT_PREFIX}-lb\`)].DNSName" \ - --output text) - -# If not found via AWS CLI, try to get from Pulumi outputs -if [ -z "$alb_dns" ]; then - echo -e "${YELLOW}⚠️ Could not find load balancer via AWS CLI, checking Pulumi outputs...${NC}" - alb_dns=$(cd "$INFRA_DIR" && pulumi stack output albDns 2>/dev/null || echo "") -fi - -if [ -z "$alb_dns" ]; then - echo -e "${RED}❌ Could not find load balancer DNS name${NC}" - exit 1 -fi +# Get ALB DNS name for final output +alb_dns=$(cd "$INFRA_DIR" && pulumi stack output albUrl 2>/dev/null | sed 's|http://||' || echo "") -# Health check -if curl -sf "http://$alb_dns/" > /dev/null; then - echo -e "${GREEN}✅ Health check passed${NC}" - echo -e "${GREEN}🎉 Deployment completed successfully!${NC}" +if [ -n "$alb_dns" ]; then + echo -e "${GREEN}🎉 Build and deployment completed successfully!${NC}" echo -e "${GREEN}🌐 Application URL: http://$alb_dns${NC}" + if [ "$DEPLOY_PORTAL" = true ]; then + echo -e "${GREEN}🏛️ Portal URL: http://$alb_dns/portal${NC}" + fi else - echo -e "${RED}❌ Health check failed${NC}" - exit 1 + echo -e "${GREEN}🎉 Build and deployment completed successfully!${NC}" + echo -e "${YELLOW}ℹ️ Check Pulumi outputs for application URLs${NC}" fi \ No newline at end of file diff --git a/apps/infra/index.ts b/apps/infra/index.ts index 362725249..bda04c311 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -84,7 +84,6 @@ const applications: ApplicationConfig[] = [ 'DISCORD_WEBHOOK_URL', 'SLACK_SALES_WEBHOOK', 'HUBSPOT_ACCESS_TOKEN', - 'IS_VERCEL', ], includeDatabaseUrl: true, environmentVariables: { diff --git a/apps/portal/Dockerfile b/apps/portal/Dockerfile index 04175def3..0f53231cd 100644 --- a/apps/portal/Dockerfile +++ b/apps/portal/Dockerfile @@ -1,37 +1,28 @@ -# Build stage -FROM node:20-alpine AS builder +# Use Node.js Alpine for smaller runtime image +FROM node:20-alpine AS runtime WORKDIR /app -# Copy package files -COPY package*.json ./ -COPY apps/portal/package*.json ./apps/portal/ +# Install curl for health checks +RUN apk add --no-cache curl -# Install dependencies -RUN npm ci - -# Copy source code -COPY . . - -# Build the portal app -RUN npm run build --workspace=apps/portal - -# Production stage -FROM node:20-alpine AS runner +# Set production environment variables +ENV NODE_ENV=production +ENV NEXT_TELEMETRY_DISABLED=1 +ENV PORT=3001 +ENV HOSTNAME="0.0.0.0" -WORKDIR /app +# Copy the complete standalone build from CodeBuild +COPY .next/standalone ./ -# Copy necessary files from builder -COPY --from=builder /app/node_modules ./node_modules -COPY --from=builder /app/apps/portal/.next ./apps/portal/.next -COPY --from=builder /app/apps/portal/public ./apps/portal/public -COPY --from=builder /app/apps/portal/package.json ./apps/portal/package.json +# Create non-root user for security +RUN addgroup -g 1001 -S nodejs && \ + adduser -S nextjs -u 1001 && \ + chown -R nextjs:nodejs /app -# Set environment to production -ENV NODE_ENV=production +USER nextjs -# Expose the port EXPOSE 3001 -# Start the application -CMD ["npm", "run", "start", "--workspace=apps/portal"] \ No newline at end of file +# Use node to run the standalone server - handle monorepo structure +CMD ["sh", "-c", "if [ -f apps/portal/server.js ]; then node apps/portal/server.js; elif [ -f server.js ]; then node server.js; elif [ -f index.js ]; then node index.js; else echo 'No entry point found' && exit 1; fi"] \ No newline at end of file diff --git a/apps/portal/buildspec.yml b/apps/portal/buildspec.yml index e34a5a4d4..5f1306319 100644 --- a/apps/portal/buildspec.yml +++ b/apps/portal/buildspec.yml @@ -3,41 +3,95 @@ version: 0.2 phases: pre_build: commands: - - echo Logging in to Amazon ECR... + - echo "Logging in to Amazon ECR..." - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com - - echo Building image tag... - - IMAGE_TAG=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - - IMAGE_URI=$ECR_REPOSITORY_URI:$IMAGE_TAG - - IMAGE_URI_LATEST=$ECR_REPOSITORY_URI:latest + - REPOSITORY_URI=$ECR_REPOSITORY_URI + - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) + - IMAGE_TAG=${COMMIT_HASH:=latest} + - echo "Installing dependencies..." + - curl -fsSL https://bun.sh/install | bash build: commands: - - echo Build started on `date` - - echo Building the Docker image for $APP_NAME... + # Environment setup + - export PATH="/root/.bun/bin:$PATH" + - export PGSSLMODE=require + - export NEXT_TELEMETRY_DISABLED=1 + - export UV_THREADPOOL_SIZE=36 + - export NODE_OPTIONS="--max-old-space-size=65536" + + # Navigate to portal directory - cd apps/$APP_NAME - - docker build -t $IMAGE_URI -t $IMAGE_URI_LATEST -f $DOCKERFILE_PATH . - - echo Build completed on `date` + + # Install dependencies + - echo "Installing dependencies..." + - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile --concurrent 36 || SKIP_ENV_VALIDATION=true bun install --concurrent 36 + + # Generate Prisma client (portal also needs database access) + - echo "Generating Prisma client..." + - cd ../../ + - bun x prisma generate --schema=packages/db/prisma/schema.prisma + - cd packages/db && bun x prisma generate && cd ../../ + + # Type check + - echo "Type checking..." + - cd apps/$APP_NAME && bun run typecheck && cd ../../ + + # Build Next.js portal app + - echo "Building Next.js portal application..." + - cd apps/$APP_NAME + - NODE_TLS_REJECT_UNAUTHORIZED=0 bun run build + + # Prepare standalone build + - echo "Preparing standalone build..." + - echo "DEBUG - Checking what Next.js built..." + - ls -la .next/ + - ls -la .next/standalone/ || echo "No standalone directory" + - echo "DEBUG - Checking if static files exist..." + - ls -la .next/static/ || echo "No static directory found" + - echo "DEBUG - Copying static files to standalone..." + - cp -r public .next/standalone/apps/$APP_NAME/ || echo "No public folder" + - cp -r .next/static .next/standalone/apps/$APP_NAME/.next/ || echo "No .next/static directory" + - echo "DEBUG - Final verification..." + - ls -la .next/standalone/ || echo "Standalone empty" + - find .next/standalone -name "*.css" | head -3 || echo "No CSS files found" + - find .next/standalone -name "*.js" | head -3 || echo "No JS files found" + + # Copy Prisma client + - echo "Copying Prisma client..." + - mkdir -p .next/standalone/node_modules/.prisma .next/standalone/node_modules/@prisma + - if [ -d "../../node_modules/.prisma/client" ]; then + cp -r ../../node_modules/.prisma/client .next/standalone/node_modules/.prisma/; + elif [ -d "node_modules/.prisma/client" ]; then + cp -r node_modules/.prisma/client .next/standalone/node_modules/.prisma/; + fi + - if [ -d "../../node_modules/@prisma/client" ]; then + cp -r "../../node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/"; + elif [ -d "node_modules/@prisma/client" ]; then + cp -r "node_modules/@prisma/client" ".next/standalone/node_modules/@prisma/"; + fi + + # Build Docker image + - echo "Building Docker image..." + - docker build --build-arg BUILDKIT_INLINE_CACHE=1 -f ${DOCKERFILE_PATH:-Dockerfile} -t $ECR_REPOSITORY_URI:$IMAGE_TAG . + - docker tag $ECR_REPOSITORY_URI:$IMAGE_TAG $ECR_REPOSITORY_URI:latest post_build: commands: - - echo Pushing the Docker images... - - docker push $IMAGE_URI - - docker push $IMAGE_URI_LATEST - - echo Writing image definitions file... - - printf '[{"name":"%s-container","imageUri":"%s"}]' "$APP_NAME" "$IMAGE_URI" > imagedefinitions.json - - echo Updating ECS service... - - | - aws ecs update-service \ - --cluster $ECS_CLUSTER_NAME \ - --service $ECS_SERVICE_NAME \ - --force-new-deployment \ - --region $AWS_DEFAULT_REGION - - echo Deployment initiated successfully + - echo "Pushing images to ECR..." + - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG + - docker push $ECR_REPOSITORY_URI:latest + - echo "Updating ECS service..." + - aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment + - 'printf "[{\"name\":\"%s-container\",\"imageUri\":\"%s\"}]" $APP_NAME $ECR_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json' cache: paths: - - '/root/.npm/**/*' - - '/root/.next/cache/**/*' + - 'node_modules/**/*' + - 'packages/db/node_modules/**/*' + - '/root/.bun/install/cache/**/*' + - '.next/cache/**/*' + - 'bun.lock' artifacts: files: diff --git a/apps/portal/next.config.ts b/apps/portal/next.config.ts index 469c7cccc..6f6638895 100644 --- a/apps/portal/next.config.ts +++ b/apps/portal/next.config.ts @@ -1,6 +1,7 @@ +import type { NextConfig } from 'next'; import './src/env.mjs'; -const config = { +const config: NextConfig = { images: { remotePatterns: [ { @@ -28,4 +29,8 @@ const config = { skipTrailingSlashRedirect: true, }; +if (process.env.VERCEL !== '1') { + config.output = 'standalone'; // Required for Docker builds +} + export default config; From f151692672559c3ee2d9b00586befb0a3964b375 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 18:15:06 -0400 Subject: [PATCH 069/107] fix(buildspec): enhance type checking step with optional script handling - Updated the type checking phase in the buildspec to include a conditional check for the existence of the typecheck script. If the script is not found, a message will be displayed, allowing the build process to continue without interruption. --- apps/portal/buildspec.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/portal/buildspec.yml b/apps/portal/buildspec.yml index 5f1306319..0674dd31f 100644 --- a/apps/portal/buildspec.yml +++ b/apps/portal/buildspec.yml @@ -33,9 +33,9 @@ phases: - bun x prisma generate --schema=packages/db/prisma/schema.prisma - cd packages/db && bun x prisma generate && cd ../../ - # Type check + # Type check (optional - skip if script doesn't exist) - echo "Type checking..." - - cd apps/$APP_NAME && bun run typecheck && cd ../../ + - cd apps/$APP_NAME && (bun run typecheck || echo "No typecheck script found, skipping...") && cd ../../ # Build Next.js portal app - echo "Building Next.js portal application..." From 4294465b4955bc1def981018635d56ecd4fa7a86 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 19:20:55 -0400 Subject: [PATCH 070/107] refactor(infra): implement individual load balancers for applications - Refactored the load balancer implementation to create separate Application Load Balancers (ALBs) for each application, enhancing scalability and management. - Updated the application container logic to utilize the new individual load balancers, ensuring proper routing and health check configurations. - Removed unnecessary routing rules and simplified the deployment process by directly associating each application with its respective load balancer. - Adjusted the build system and application outputs to reflect the changes in load balancer structure, improving clarity and functionality. --- apps/app/buildspec.yml | 2 - apps/infra/index.ts | 67 ++++++++---------- apps/infra/modules/container.ts | 64 ++++++----------- apps/infra/modules/loadbalancer.ts | 107 +++++++++++------------------ 4 files changed, 92 insertions(+), 148 deletions(-) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index 764254efb..e8b0fa63b 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -29,8 +29,6 @@ phases: # Generate Prisma client - echo "Generating Prisma client..." - - cd ../../ - - bun x prisma generate --schema=packages/db/prisma/schema.prisma - cd packages/db && bun x prisma generate && cd ../../ # Validate environment variables diff --git a/apps/infra/index.ts b/apps/infra/index.ts index bda04c311..e1c774249 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -7,7 +7,7 @@ import { createConfig } from './modules/config'; import { createContainer } from './modules/container'; import { createDatabase } from './modules/database'; import { createGithubOidc } from './modules/github-oidc'; -import { createApplicationRouting, createLoadBalancer } from './modules/loadbalancer'; +import { createLoadBalancers } from './modules/loadbalancer'; import { createMonitoring } from './modules/monitoring'; import { createNetworking } from './modules/networking'; import { createScaling } from './modules/scaling'; @@ -51,9 +51,6 @@ const applications: ApplicationConfig[] = [ healthyThreshold: 2, unhealthyThreshold: 3, }, - routing: { - pathPattern: '/*', // Default route - }, cpu: 256, memory: 512, desiredCount: 2, @@ -101,16 +98,18 @@ const applications: ApplicationConfig[] = [ healthyThreshold: 2, unhealthyThreshold: 3, }, - routing: { - pathPattern: '/portal/*', - }, cpu: 256, memory: 512, desiredCount: 1, minCount: 1, maxCount: 5, targetCPUPercent: 70, - requiredSecrets: ['PORTAL_API_KEY'], + requiredSecrets: [ + 'BETTER_AUTH_SECRET', + 'BETTER_AUTH_URL', + 'RESEND_API_KEY', + 'NEXT_PUBLIC_BETTER_AUTH_URL', + ], includeDatabaseUrl: true, environmentVariables: { NODE_ENV: 'production', @@ -135,7 +134,7 @@ const database = createDatabase(config, network); const appSecrets = createAppSecrets(config, applications); // 4. Load Balancing - ALB with Health Checks -const loadBalancer = createLoadBalancer(config, network); +const loadBalancers = createLoadBalancers(config, network, applications); // 5. Container Platform - Multi-app ECS support const container = createContainer( @@ -143,7 +142,7 @@ const container = createContainer( applications, network, database, - loadBalancer, + loadBalancers, appSecrets, ); @@ -153,33 +152,23 @@ const build = createBuildSystem(config, network, database, container, appSecrets // 7. Wire up applications const deployments = applications.map((app, index) => { const appContainer = container.applications![index]; + const appLoadBalancer = loadBalancers.find((lb) => lb.app === app.name)?.loadBalancer; // Create build project for this app const buildProject = build.createApplicationBuildProject(app, appContainer); - // Create routing rules if app has routing config and target group - if (app.routing && appContainer.targetGroupArn) { - createApplicationRouting({ - projectName: config.projectName, - appName: app.name, - loadBalancerArn: loadBalancer.albArn, - targetGroupArn: appContainer.targetGroupArn, - pathPattern: app.routing.pathPattern, - hostHeader: app.routing.hostnames, - priority: (index + 1) * 100, - httpListenerArn: loadBalancer.httpListenerArn, - }); - } + // No routing rules needed with multiple ALBs return { app, buildProject, container: appContainer, + loadBalancer: appLoadBalancer, }; }); -// 8. Auto-scaling - ECS Service Scaling -const scaling = createScaling(config, applications, container, loadBalancer); +// 8. Auto-scaling - ECS Service Scaling (pass first load balancer for now) +const scaling = createScaling(config, applications, container, loadBalancers[0]?.loadBalancer); // 9. GitHub OIDC - For GitHub Actions authentication const githubOidc = createGithubOidc(config); @@ -201,10 +190,17 @@ const appContainers = {} as Record, ) || {}; -const monitoring = createMonitoring(config, applications, database, appContainers, loadBalancer, { - enableBetterStack, - enableDetailedMonitoring, -}); +const monitoring = createMonitoring( + config, + applications, + database, + appContainers, + loadBalancers[0]?.loadBalancer, + { + enableBetterStack, + enableDetailedMonitoring, + }, +); // ========================================== // STACK OUTPUTS @@ -215,12 +211,8 @@ export const applicationOutputs = deployments.reduce( (acc, deployment) => { const appName = deployment.app.name; - // Build URL based on routing config - const appUrl = deployment.app.routing?.pathPattern - ? pulumi.interpolate`${loadBalancer.applicationUrl}${deployment.app.routing.pathPattern.replace('/*', '')}` - : deployment.app.routing?.hostnames - ? pulumi.interpolate`http://${deployment.app.routing.hostnames[0]}` - : loadBalancer.applicationUrl; + // Each app now has its own load balancer, so use that directly + const appUrl = deployment.loadBalancer?.applicationUrl || pulumi.output(''); acc[appName] = { url: appUrl, @@ -228,7 +220,7 @@ export const applicationOutputs = deployments.reduce( ecrRepository: deployment.container.repositoryUrl, logGroup: deployment.container.logGroupName, buildProject: deployment.buildProject.name, - healthCheckUrl: pulumi.interpolate`${appUrl}${deployment.app.healthCheck?.path || '/health'}`, + healthCheckUrl: deployment.loadBalancer?.healthCheckUrl || pulumi.output(''), secrets: appSecrets[deployment.app.name] ? Object.entries(appSecrets[deployment.app.name]).reduce( (acc, [secretName, secret]) => { @@ -247,7 +239,8 @@ export const applicationOutputs = deployments.reduce( ); // Infrastructure outputs -export const albUrl = loadBalancer.applicationUrl; +export const albUrl = + loadBalancers[0]?.loadBalancer?.applicationUrl || pulumi.output('Main app ALB not found'); export const clusterName = container.clusterName; // Database outputs diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts index 00b3e5a06..ae09ae9bd 100644 --- a/apps/infra/modules/container.ts +++ b/apps/infra/modules/container.ts @@ -19,7 +19,7 @@ export function createApplicationContainer( taskExecutionRole: aws.iam.Role; taskRole: aws.iam.Role; }, - loadBalancer?: LoadBalancerOutputs, + loadBalancer: LoadBalancerOutputs, appSecrets?: Record; name: pulumi.Output }>, ) { const { commonTags } = config; @@ -79,33 +79,6 @@ export function createApplicationContainer( }, }); - // App-specific Target Group (if routing is configured) - let targetGroup: aws.lb.TargetGroup | undefined; - if (app.routing && loadBalancer) { - targetGroup = new aws.lb.TargetGroup(`${appName}-tg`, { - name: `${appName}-tg`.substring(0, 32), // AWS limit - port: app.containerPort, - protocol: 'HTTP', - targetType: 'ip', - vpcId: network.vpcId, - healthCheck: { - enabled: true, - path: app.healthCheck?.path || '/health', - interval: app.healthCheck?.interval || 60, - timeout: app.healthCheck?.timeout || 30, - healthyThreshold: app.healthCheck?.healthyThreshold || 2, - unhealthyThreshold: app.healthCheck?.unhealthyThreshold || 3, - matcher: '200', - }, - tags: { - ...commonTags, - Name: `${appName}-tg`, - Type: 'target-group', - App: app.name, - }, - }); - } - // App-specific Task Definition const taskDefinition = new aws.ecs.TaskDefinition(`${appName}-task`, { family: appName, @@ -202,15 +175,13 @@ export function createApplicationContainer( assignPublicIp: false, }, enableExecuteCommand: true, - loadBalancers: targetGroup - ? [ - { - targetGroupArn: targetGroup.arn, - containerName: `${app.name}-container`, - containerPort: app.containerPort, - }, - ] - : undefined, + loadBalancers: [ + { + targetGroupArn: loadBalancer.targetGroupArn, + containerName: `${app.name}-container`, + containerPort: app.containerPort, + }, + ], tags: { ...commonTags, Name: `${appName}-service`, @@ -228,7 +199,7 @@ export function createApplicationContainer( taskDefinitionArn: taskDefinition.arn, logGroupName: logGroup.name, logGroupArn: logGroup.arn, - targetGroupArn: targetGroup?.arn, + targetGroupArn: loadBalancer.targetGroupArn, }; } @@ -238,7 +209,7 @@ export function createContainer( applications: ApplicationConfig[], network: NetworkOutputs, database: DatabaseOutputs, - loadBalancer?: LoadBalancerOutputs, + loadBalancers: Array<{ app: string; loadBalancer: LoadBalancerOutputs }>, appSecrets?: Record< string, Record; name: pulumi.Output }> @@ -365,17 +336,22 @@ export function createContainer( }); // Create application-specific resources - const appContainers = applications.map((app) => - createApplicationContainer( + const appContainers = applications.map((app) => { + const appLoadBalancer = loadBalancers.find((lb) => lb.app === app.name); + if (!appLoadBalancer) { + throw new Error(`No load balancer found for app: ${app.name}`); + } + + return createApplicationContainer( config, app, network, database, { cluster, taskExecutionRole, taskRole }, - loadBalancer, + appLoadBalancer.loadBalancer, appSecrets?.[app.name], - ), - ); + ); + }); // Return shared resources and app-specific resources return { diff --git a/apps/infra/modules/loadbalancer.ts b/apps/infra/modules/loadbalancer.ts index 3bfc31ffe..e6cce7534 100644 --- a/apps/infra/modules/loadbalancer.ts +++ b/apps/infra/modules/loadbalancer.ts @@ -1,60 +1,69 @@ import * as aws from '@pulumi/aws'; -import * as pulumi from '@pulumi/pulumi'; -import { CommonConfig, NetworkOutputs } from '../types'; +import { ApplicationConfig, CommonConfig, NetworkOutputs } from '../types'; -export function createLoadBalancer(config: CommonConfig, network: NetworkOutputs) { +// Create individual ALB for each application +export function createApplicationLoadBalancer( + config: CommonConfig, + network: NetworkOutputs, + app: ApplicationConfig, +) { const { commonTags } = config; + const appName = `${config.projectName}-${app.name}`; - // Create ALB without default target group since we'll create app-specific ones - const lb = new aws.lb.LoadBalancer(`${config.projectName}-lb`, { + // Create ALB for this specific app + const lb = new aws.lb.LoadBalancer(`${appName}-lb`, { + name: `${appName}-lb`.substring(0, 32), // AWS limit loadBalancerType: 'application', subnets: network.publicSubnetIds, securityGroups: [network.securityGroups.alb], tags: { ...commonTags, - Name: `${config.projectName}-lb`, + Name: `${appName}-lb`, Type: 'application-load-balancer', + App: app.name, }, }); - // Create a default target group (required for listener) - const defaultTargetGroup = new aws.lb.TargetGroup(`${config.projectName}-default-tg`, { - name: `${config.projectName}-def-tg`.substring(0, 32), // AWS limit is 32 chars - port: 80, + // Create target group for this app + const targetGroup = new aws.lb.TargetGroup(`${appName}-tg`, { + name: `${appName}-tg`.substring(0, 32), // AWS limit + port: app.containerPort, protocol: 'HTTP', targetType: 'ip', vpcId: network.vpcId, healthCheck: { enabled: true, - path: '/', - healthyThreshold: 2, - unhealthyThreshold: 3, - timeout: 30, - interval: 60, + path: app.healthCheck?.path || '/health', + interval: app.healthCheck?.interval || 60, + timeout: app.healthCheck?.timeout || 30, + healthyThreshold: app.healthCheck?.healthyThreshold || 2, + unhealthyThreshold: app.healthCheck?.unhealthyThreshold || 3, matcher: '200', }, tags: { ...commonTags, - Name: `${config.projectName}-def-tg`, + Name: `${appName}-tg`, Type: 'target-group', + App: app.name, }, }); - // Create HTTP listener - const httpListener = new aws.lb.Listener(`${config.projectName}-http-listener`, { + // Create HTTP listener - no routing rules needed, direct to target group + const httpListener = new aws.lb.Listener(`${appName}-http-listener`, { loadBalancerArn: lb.arn, port: 80, protocol: 'HTTP', defaultActions: [ { type: 'forward', - targetGroupArn: defaultTargetGroup.arn, + targetGroupArn: targetGroup.arn, }, ], tags: { ...commonTags, - Name: `${config.projectName}-http-listener`, + Name: `${appName}-http-listener`, Type: 'listener', + App: app.name, }, }); @@ -62,54 +71,22 @@ export function createLoadBalancer(config: CommonConfig, network: NetworkOutputs albArn: lb.arn, albDnsName: lb.dnsName, albZoneId: lb.zoneId, - targetGroupArn: defaultTargetGroup.arn, + targetGroupArn: targetGroup.arn, applicationUrl: lb.dnsName.apply((dns) => `http://${dns}`), - healthCheckUrl: lb.dnsName.apply((dns) => `http://${dns}/health`), - certificateArn: undefined, + healthCheckUrl: lb.dnsName.apply((dns) => `http://${dns}${app.healthCheck?.path || '/health'}`), httpListenerArn: httpListener.arn, + certificateArn: undefined, }; } -// Create listener rules for app routing -export interface ApplicationRoutingArgs { - projectName: string; - appName: string; - loadBalancerArn: pulumi.Output; - targetGroupArn: pulumi.Output; - pathPattern?: string; - hostHeader?: string[]; - priority: number; - httpListenerArn: pulumi.Output; -} - -export function createApplicationRouting(args: ApplicationRoutingArgs) { - const conditions = []; - - if (args.pathPattern) { - conditions.push({ - pathPattern: { - values: [args.pathPattern], - }, - }); - } - - if (args.hostHeader) { - conditions.push({ - hostHeader: { - values: args.hostHeader, - }, - }); - } - - return new aws.lb.ListenerRule(`${args.projectName}-${args.appName}-rule`, { - listenerArn: args.httpListenerArn, - priority: args.priority, - conditions, - actions: [ - { - type: 'forward', - targetGroupArn: args.targetGroupArn, - }, - ], - }); +// Main function to create load balancers for all applications +export function createLoadBalancers( + config: CommonConfig, + network: NetworkOutputs, + applications: ApplicationConfig[], +) { + return applications.map((app) => ({ + app: app.name, + loadBalancer: createApplicationLoadBalancer(config, network, app), + })); } From 70c931a483969d9c03ea4e0f513ca147d40bbe5f Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 19:30:00 -0400 Subject: [PATCH 071/107] refactor(infra): update target group naming for load balancer - Modified the target group name for the application load balancer to include a version suffix ('-v2') to prevent naming conflicts. - Updated the associated tags to reflect the new target group name, ensuring consistency across the load balancer configuration. --- apps/infra/modules/loadbalancer.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/apps/infra/modules/loadbalancer.ts b/apps/infra/modules/loadbalancer.ts index e6cce7534..be3db2dd6 100644 --- a/apps/infra/modules/loadbalancer.ts +++ b/apps/infra/modules/loadbalancer.ts @@ -25,8 +25,8 @@ export function createApplicationLoadBalancer( }); // Create target group for this app - const targetGroup = new aws.lb.TargetGroup(`${appName}-tg`, { - name: `${appName}-tg`.substring(0, 32), // AWS limit + const targetGroup = new aws.lb.TargetGroup(`${appName}-tg-v2`, { + name: `${appName}-tg-v2`.substring(0, 32), // AWS limit - add v2 to avoid conflicts port: app.containerPort, protocol: 'HTTP', targetType: 'ip', @@ -42,7 +42,7 @@ export function createApplicationLoadBalancer( }, tags: { ...commonTags, - Name: `${appName}-tg`, + Name: `${appName}-tg-v2`, Type: 'target-group', App: app.name, }, From 0774214ef2aba48215acb24d4739884f578ff753 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 19:34:03 -0400 Subject: [PATCH 072/107] fix(buildspec): adjust working directory for dependency installation - Added a command to change the working directory before installing dependencies in the buildspec, ensuring the correct path is used for the installation process. --- apps/app/buildspec.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/app/buildspec.yml b/apps/app/buildspec.yml index e8b0fa63b..39e165825 100644 --- a/apps/app/buildspec.yml +++ b/apps/app/buildspec.yml @@ -26,6 +26,7 @@ phases: # Install dependencies - echo "Installing dependencies..." - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile --concurrent 36 || SKIP_ENV_VALIDATION=true bun install --concurrent 36 + - cd ../../ # Generate Prisma client - echo "Generating Prisma client..." From 01276971f614d8c07a7b8736eef4d349bad09161 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 20:03:40 -0400 Subject: [PATCH 073/107] refactor(deploy): update deployment script to retrieve individual application and portal URLs - Modified the deployment script to fetch individual application and portal URLs from Pulumi outputs instead of a single ALB DNS name, enhancing clarity in deployment feedback. - Added conditional checks to display URLs only if the respective applications are deployed, improving user experience and output relevance. --- apps/infra/deploy.sh | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/apps/infra/deploy.sh b/apps/infra/deploy.sh index 442ceb4a1..70d0eb5cb 100755 --- a/apps/infra/deploy.sh +++ b/apps/infra/deploy.sh @@ -246,16 +246,28 @@ if [ "$build_failed" = true ]; then exit 1 fi -# Get ALB DNS name for final output -alb_dns=$(cd "$INFRA_DIR" && pulumi stack output albUrl 2>/dev/null | sed 's|http://||' || echo "") - -if [ -n "$alb_dns" ]; then - echo -e "${GREEN}🎉 Build and deployment completed successfully!${NC}" - echo -e "${GREEN}🌐 Application URL: http://$alb_dns${NC}" - if [ "$DEPLOY_PORTAL" = true ]; then - echo -e "${GREEN}🏛️ Portal URL: http://$alb_dns/portal${NC}" - fi -else - echo -e "${GREEN}🎉 Build and deployment completed successfully!${NC}" +# Get individual ALB URLs for each app from applicationOutputs +app_url="" +portal_url="" + +if [ "$DEPLOY_APP" = true ]; then + app_url=$(cd "$INFRA_DIR" && pulumi stack output applicationOutputs --json 2>/dev/null | jq -r '.app.url // ""' || echo "") +fi + +if [ "$DEPLOY_PORTAL" = true ]; then + portal_url=$(cd "$INFRA_DIR" && pulumi stack output applicationOutputs --json 2>/dev/null | jq -r '.portal.url // ""' || echo "") +fi + +echo -e "${GREEN}🎉 Build and deployment completed successfully!${NC}" + +if [ "$DEPLOY_APP" = true ] && [ -n "$app_url" ]; then + echo -e "${GREEN}🌐 Application URL: $app_url${NC}" +fi + +if [ "$DEPLOY_PORTAL" = true ] && [ -n "$portal_url" ]; then + echo -e "${GREEN}🏛️ Portal URL: $portal_url${NC}" +fi + +if [ -z "$app_url" ] && [ -z "$portal_url" ]; then echo -e "${YELLOW}ℹ️ Check Pulumi outputs for application URLs${NC}" fi \ No newline at end of file From 2d677d05f54d9cc84c0def4369c1e07ed46bd511 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Wed, 23 Jul 2025 20:20:03 -0400 Subject: [PATCH 074/107] fix(buildspec, Dockerfile): update Node.js version and adjust Prisma client generation path - Changed the base image in the Dockerfile from Node.js 20-alpine to 18-alpine for compatibility. - Modified the buildspec to streamline the Prisma client generation process by removing unnecessary directory changes, ensuring a more efficient build step. --- apps/portal/Dockerfile | 3 ++- apps/portal/buildspec.yml | 5 ++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/portal/Dockerfile b/apps/portal/Dockerfile index 0f53231cd..02f8e2c1b 100644 --- a/apps/portal/Dockerfile +++ b/apps/portal/Dockerfile @@ -1,5 +1,5 @@ # Use Node.js Alpine for smaller runtime image -FROM node:20-alpine AS runtime +FROM node:18-alpine AS runtime WORKDIR /app @@ -11,6 +11,7 @@ ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 ENV PORT=3001 ENV HOSTNAME="0.0.0.0" +ENV NODE_TLS_REJECT_UNAUTHORIZED=0 # Copy the complete standalone build from CodeBuild COPY .next/standalone ./ diff --git a/apps/portal/buildspec.yml b/apps/portal/buildspec.yml index 0674dd31f..c4587acf2 100644 --- a/apps/portal/buildspec.yml +++ b/apps/portal/buildspec.yml @@ -26,11 +26,10 @@ phases: # Install dependencies - echo "Installing dependencies..." - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile --concurrent 36 || SKIP_ENV_VALIDATION=true bun install --concurrent 36 + - cd ../../ - # Generate Prisma client (portal also needs database access) + # Generate Prisma client - echo "Generating Prisma client..." - - cd ../../ - - bun x prisma generate --schema=packages/db/prisma/schema.prisma - cd packages/db && bun x prisma generate && cd ../../ # Type check (optional - skip if script doesn't exist) From f59dae60e1b296668bb469da7c74b2f3258978ea Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Thu, 24 Jul 2025 16:45:48 -0400 Subject: [PATCH 075/107] chore: update package configurations and enhance email utilities - Added new packages to the project, including `@semantic-release/exec` and `tsup`, to improve build and release processes. - Updated `.gitignore` to exclude build artifacts and package distribution directories. - Enhanced the `README.md` with package publishing instructions and usage examples. - Refactored email utility functions to improve error handling and streamline email sending processes. - Updated package.json files across multiple packages to include new scripts and dependencies, ensuring consistency and better development experience. - Adjusted release configuration to publish individual packages to npm, enhancing modularity and maintainability. --- .github/workflows/release.yml | 10 +- .gitignore | 4 +- README.md | 39 ++++++ bun.lock | 48 ++++--- package.json | 2 + packages/db/package.json | 72 +++++++--- packages/email/lib/invite-member.ts | 39 +++--- packages/email/lib/magic-link.ts | 29 ++-- packages/email/lib/waitlist.ts | 25 ++-- packages/email/package.json | 54 +++++--- packages/kv/package.json | 47 ++++++- packages/kv/src/index.ts | 3 + packages/ui/package.json | 197 ++++++++++++++++------------ packages/ui/src/components/index.ts | 71 ++++++++++ release.config.js | 50 +++++-- yarn.lock | 46 ++++--- 16 files changed, 522 insertions(+), 214 deletions(-) create mode 100644 packages/ui/src/components/index.ts diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8d085ceb0..3b1a1e4e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -51,10 +51,18 @@ jobs: - name: Install dependencies run: bun install --frozen-lockfile # Use --frozen-lockfile in CI + - name: Build packages + run: | + echo "🔨 Building packages before release..." + bun run -F @comp/db build + bun run -F @comp/email build + bun run -F @comp/kv build + bun run -F @comp/ui build + - name: Release env: GITHUB_TOKEN: ${{ secrets.GH_TOKEN || secrets.GITHUB_TOKEN }} - # NPM_TOKEN: ${{ secrets.NPM_TOKEN }} # Uncomment if publishing to npm + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} # Enable npm publishing DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }} HUSKY: 0 # Skip husky hooks in CI run: npx semantic-release diff --git a/.gitignore b/.gitignore index f42185fb3..3659fd5bd 100644 --- a/.gitignore +++ b/.gitignore @@ -76,4 +76,6 @@ playwright-report/ playwright/.cache/ debug-setup-page.png -.playground/ \ No newline at end of file +.playground/ + +packages/*/dist \ No newline at end of file diff --git a/README.md b/README.md index 0960f3be8..1fcba937e 100644 --- a/README.md +++ b/README.md @@ -375,6 +375,45 @@ Steps to deploy Comp AI on Docker are coming soon. Steps to deploy Comp AI on Vercel are coming soon. +## 📦 Package Publishing + +This repository uses semantic-release to automatically publish packages to npm when merging to the `release` branch. The following packages are published: + +- `@comp/db` - Database utilities with Prisma client +- `@comp/email` - Email templates and components +- `@comp/kv` - Key-value store utilities using Upstash Redis +- `@comp/ui` - UI component library with Tailwind CSS + +### Setup + +1. **NPM Token**: Add your npm token as `NPM_TOKEN` in GitHub repository secrets +2. **Release Branch**: Create and merge PRs into the `release` branch to trigger publishing +3. **Versioning**: Uses conventional commits for automatic version bumping + +### Usage + +```bash +# Install a published package +npm install @comp/ui + +# Use in your project +import { Button } from '@comp/ui/button' +import { client } from '@comp/kv' +``` + +### Development + +```bash +# Build all packages +bun run build + +# Build specific package +bun run -F @comp/ui build + +# Test packages locally +bun run release:packages --dry-run +``` + ## Contributors diff --git a/bun.lock b/bun.lock index 6d3fe9378..65b3ef9f5 100644 --- a/bun.lock +++ b/bun.lock @@ -17,6 +17,7 @@ "@react-email/render": "^1.1.2", "@semantic-release/changelog": "^6.0.3", "@semantic-release/commit-analyzer": "^13.0.1", + "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", "@semantic-release/github": "^11.0.3", "@semantic-release/npm": "^12.0.1", @@ -49,6 +50,7 @@ "semantic-release-discord-notifier": "^1.0.11", "sharp": "^0.34.2", "syncpack": "^13.0.4", + "tsup": "^8.5.0", "turbo": "^2.5.4", "typescript": "^5.8.3", "use-debounce": "^10.0.4", @@ -300,6 +302,7 @@ "@comp/tsconfig": "workspace:*", "prisma": "^6.9.0", "ts-node": "^10.9.2", + "tsup": "^8.4.0", "typescript": "^5.8.3", }, }, @@ -358,6 +361,10 @@ "@upstash/redis": "^1.34.2", "server-only": "0.0.1", }, + "devDependencies": { + "tsup": "^8.4.0", + "typescript": "^5.8.3", + }, }, "packages/tsconfig": { "name": "@comp/tsconfig", @@ -445,6 +452,7 @@ "react": "^19.1.0", "react-dom": "^19.1.0", "tailwindcss": "^4.1.8", + "tsup": "^8.4.0", "typescript": "^5.8.3", }, "peerDependencies": { @@ -1455,6 +1463,8 @@ "@semantic-release/error": ["@semantic-release/error@3.0.0", "", {}, "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw=="], + "@semantic-release/exec": ["@semantic-release/exec@6.0.3", "", { "dependencies": { "@semantic-release/error": "^3.0.0", "aggregate-error": "^3.0.0", "debug": "^4.0.0", "execa": "^5.0.0", "lodash": "^4.17.4", "parse-json": "^5.0.0" }, "peerDependencies": { "semantic-release": ">=18.0.0" } }, "sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ=="], + "@semantic-release/git": ["@semantic-release/git@10.0.1", "", { "dependencies": { "@semantic-release/error": "^3.0.0", "aggregate-error": "^3.0.0", "debug": "^4.0.0", "dir-glob": "^3.0.0", "execa": "^5.0.0", "lodash": "^4.17.4", "micromatch": "^4.0.0", "p-reduce": "^2.0.0" }, "peerDependencies": { "semantic-release": ">=18.0.0" } }, "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w=="], "@semantic-release/github": ["@semantic-release/github@11.0.3", "", { "dependencies": { "@octokit/core": "^7.0.0", "@octokit/plugin-paginate-rest": "^13.0.0", "@octokit/plugin-retry": "^8.0.0", "@octokit/plugin-throttling": "^11.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "debug": "^4.3.4", "dir-glob": "^3.0.1", "globby": "^14.0.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "issue-parser": "^7.0.0", "lodash-es": "^4.17.21", "mime": "^4.0.0", "p-filter": "^4.0.0", "url-join": "^5.0.0" }, "peerDependencies": { "semantic-release": ">=24.1.0" } }, "sha512-T2fKUyFkHHkUNa5XNmcsEcDPuG23hwBKptfUVcFXDVG2cSjXXZYDOfVYwfouqbWo/8UefotLaoGfQeK+k3ep6A=="], @@ -2877,7 +2887,7 @@ "fs.realpath": ["fs.realpath@1.0.0", "", {}, "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="], - "fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "fstream": ["fstream@1.0.12", "", { "dependencies": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", "mkdirp": ">=0.5 0", "rimraf": "2" } }, "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg=="], @@ -3203,7 +3213,7 @@ "json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], @@ -3721,7 +3731,7 @@ "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], - "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], + "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], @@ -4803,6 +4813,8 @@ "@npmcli/arborist/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + "@npmcli/arborist/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + "@npmcli/arborist/npm-package-arg": ["npm-package-arg@11.0.3", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], "@npmcli/arborist/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], @@ -4815,12 +4827,16 @@ "@npmcli/map-workspaces/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], + "@npmcli/metavuln-calculator/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + "@npmcli/metavuln-calculator/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], "@npmcli/package-json/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], "@npmcli/package-json/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], + "@npmcli/package-json/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + "@npmcli/package-json/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], "@npmcli/promise-spawn/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], @@ -5035,8 +5051,6 @@ "cosmiconfig/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], - "cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], - "crypto-random-string/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="], "css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -5577,6 +5591,8 @@ "pacote/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + "parse-conflict-json/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], "parse5-htmlparser2-tree-adapter/parse5": ["parse5@6.0.1", "", {}, "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="], @@ -5591,6 +5607,8 @@ "pkg-dir/find-up": ["find-up@6.3.0", "", { "dependencies": { "locate-path": "^7.1.0", "path-exists": "^5.0.0" } }, "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw=="], + "playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="], + "postcss-nested/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], "pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], @@ -5619,6 +5637,10 @@ "read-cache/pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], + "read-package-json-fast/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], + + "read-pkg/parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], + "read-pkg/unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], "read-yaml-file/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], @@ -5645,8 +5667,6 @@ "restore-cursor/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - "rollup/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "safe-array-concat/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], "safe-push-apply/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], @@ -5739,8 +5759,6 @@ "verror/core-util-is": ["core-util-is@1.0.2", "", {}, "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ=="], - "vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "vitest/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], "which-builtin-type/isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], @@ -5787,8 +5805,6 @@ "@dub/embed-react/vite/esbuild": ["esbuild@0.20.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.20.2", "@esbuild/android-arm": "0.20.2", "@esbuild/android-arm64": "0.20.2", "@esbuild/android-x64": "0.20.2", "@esbuild/darwin-arm64": "0.20.2", "@esbuild/darwin-x64": "0.20.2", "@esbuild/freebsd-arm64": "0.20.2", "@esbuild/freebsd-x64": "0.20.2", "@esbuild/linux-arm": "0.20.2", "@esbuild/linux-arm64": "0.20.2", "@esbuild/linux-ia32": "0.20.2", "@esbuild/linux-loong64": "0.20.2", "@esbuild/linux-mips64el": "0.20.2", "@esbuild/linux-ppc64": "0.20.2", "@esbuild/linux-riscv64": "0.20.2", "@esbuild/linux-s390x": "0.20.2", "@esbuild/linux-x64": "0.20.2", "@esbuild/netbsd-x64": "0.20.2", "@esbuild/openbsd-x64": "0.20.2", "@esbuild/sunos-x64": "0.20.2", "@esbuild/win32-arm64": "0.20.2", "@esbuild/win32-ia32": "0.20.2", "@esbuild/win32-x64": "0.20.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g=="], - "@dub/embed-react/vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "@eslint/config-array/minimatch/brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], "@eslint/eslintrc/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], @@ -5827,8 +5843,6 @@ "@opentelemetry/sdk-node/@opentelemetry/sdk-trace-node/@opentelemetry/propagator-jaeger": ["@opentelemetry/propagator-jaeger@1.25.1", "", { "dependencies": { "@opentelemetry/core": "1.25.1" }, "peerDependencies": { "@opentelemetry/api": ">=1.0.0 <1.10.0" } }, "sha512-nBprRf0+jlgxks78G/xq72PipVK+4or9Ypntw0gVZYNTCSK8rg5SeaGV19tV920CMqBD/9UIOiFr23Li/Q8tiA=="], - "@playwright/experimental-ct-core/vite/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "@pulumi/pulumi/@opentelemetry/instrumentation/@opentelemetry/api-logs": ["@opentelemetry/api-logs@0.55.0", "", { "dependencies": { "@opentelemetry/api": "^1.3.0" } }, "sha512-3cpa+qI45VHYcA5c0bHM6VHo9gicv3p5mlLHNG3rLyjQU8b7e0st1rWtrUn3JbZ3DwwCfhKop4eQ9UuYlC6Pkg=="], "@semantic-release/github/aggregate-error/clean-stack": ["clean-stack@5.2.0", "", { "dependencies": { "escape-string-regexp": "5.0.0" } }, "sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ=="], @@ -5913,8 +5927,6 @@ "are-we-there-yet/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - "babel-plugin-macros/cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], - "babel-plugin-macros/cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], @@ -5943,8 +5955,6 @@ "cosmiconfig/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "cosmiconfig/parse-json/json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - "duplexer2/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "duplexer2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], @@ -6163,8 +6173,6 @@ "@aws-crypto/util/@smithy/util-utf8/@smithy/util-buffer-from/@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="], - "@calcom/atoms/tailwindcss/chokidar/fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], - "@calcom/atoms/tailwindcss/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "@calcom/atoms/tailwindcss/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], @@ -6249,8 +6257,6 @@ "@trigger.dev/core/execa/onetime/mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], - "babel-plugin-macros/cosmiconfig/parse-json/json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - "cacache/tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], "cacache/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], diff --git a/package.json b/package.json index 093dc76ac..a815116c9 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "semantic-release-discord-notifier": "^1.0.11", "sharp": "^0.34.2", "syncpack": "^13.0.4", + "tsup": "^8.5.0", "turbo": "^2.5.4", "typescript": "^5.8.3", "use-debounce": "^10.0.4", @@ -84,6 +85,7 @@ "lint": "turbo lint && syncpack lint", "prepare": "husky", "test": "turbo test --parallel", + "test:release": "node scripts/test-release.js", "typecheck": "turbo typecheck", "typecheck:ci": "turbo typecheck --filter={apps/**} --filter={packages/**} --filter=!@comp/integrations --filter=!@comp/ui" }, diff --git a/packages/db/package.json b/packages/db/package.json index 03c471baf..3736429b0 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,43 +1,75 @@ { "name": "@comp/db", "version": "1.0.0", - "dependencies": { - "@prisma/client": "6.9.0" - }, - "devDependencies": { - "@comp/tsconfig": "workspace:*", - "prisma": "^6.9.0", - "ts-node": "^10.9.2", - "typescript": "^5.8.3" - }, + "description": "Database package with Prisma client and schema for Comp AI", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "dist/**", + "prisma/**", + "README.md" + ], "exports": { ".": { - "types": "./src/index.ts", - "default": "./src/index.ts" + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" }, "./types": { - "types": "./src/types.ts", - "default": "./src/types.ts" + "types": "./dist/types.d.ts", + "import": "./dist/types.mjs", + "require": "./dist/types.js" + }, + "./client": { + "types": "./dist/client.d.ts", + "import": "./dist/client.mjs", + "require": "./dist/client.js" } }, - "main": "./src/index.ts", - "prisma": { - "schema": "prisma", - "seed": "ts-node prisma/seed/seed.ts" - }, "scripts": { + "build": "tsup src/index.ts src/types.ts --format cjs,esm --dts && bun run db:generate", "clean": "rm -rf .turbo node_modules dist", "db:generate": "bunx prisma generate", "db:migrate": "bunx prisma migrate dev", "db:push": "bunx prisma db push", "db:seed": "bunx prisma db seed", "db:studio": "bunx prisma studio", - "dev": "tsc --watch", + "dev": "tsup src/index.ts src/types.ts --format cjs,esm --watch --dts", "docker:clean": "docker-compose down -v", "docker:down": "docker-compose down", "docker:up": "docker-compose up -d", "lint": "prettier --check 'src/**/*.{ts,tsx,js,jsx,json}' 'prisma/**/*.prisma' && tsc --noEmit", + "postbuild": "cp -r prisma dist/ || echo 'No prisma directory to copy'", "typecheck": "tsc --noEmit" }, - "types": "./src/index.ts" + "dependencies": { + "@prisma/client": "6.9.0" + }, + "devDependencies": { + "@comp/tsconfig": "workspace:*", + "prisma": "^6.9.0", + "ts-node": "^10.9.2", + "tsup": "^8.5.0", + "typescript": "^5.8.3" + }, + "prisma": { + "schema": "prisma", + "seed": "ts-node prisma/seed/seed.ts" + }, + "keywords": [ + "prisma", + "database", + "postgresql", + "comp-ai" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/comp-ai/comp.git", + "directory": "packages/db" + }, + "license": "MIT", + "publishConfig": { + "access": "public" + } } diff --git a/packages/email/lib/invite-member.ts b/packages/email/lib/invite-member.ts index 0f1890776..b448be888 100644 --- a/packages/email/lib/invite-member.ts +++ b/packages/email/lib/invite-member.ts @@ -1,26 +1,31 @@ -import InviteEmail from '@comp/email/emails/invite'; -import { sendEmail } from '@comp/email/lib/resend'; +import InviteEmail from '../emails/invite'; +import { sendEmail } from './resend'; export const sendInviteMemberEmail = async (params: { - email: string; - inviteLink: string; organizationName: string; + inviteLink: string; + inviteeEmail: string; }) => { - const { email, inviteLink, organizationName } = params; + const { organizationName, inviteLink, inviteeEmail } = params; - const emailTemplate = InviteEmail({ - email, - inviteLink, - organizationName, - }); try { - await sendEmail({ - to: email, - subject: "You've been invited to join an organization in Comp AI", - react: emailTemplate, + const sent = await sendEmail({ + to: inviteeEmail, + subject: `You've been invited to join ${organizationName} on Comp AI`, + react: InviteEmail({ + organizationName, + inviteLink, + }), }); - } catch (e) { - console.error(e); - throw e; + + if (!sent) { + console.error('Failed to send invite email'); + return { success: false }; + } + + return { success: true }; + } catch (error) { + console.error('Error sending invite email:', error); + return { success: false }; } }; diff --git a/packages/email/lib/magic-link.ts b/packages/email/lib/magic-link.ts index 0b118a3bc..79af54c5f 100644 --- a/packages/email/lib/magic-link.ts +++ b/packages/email/lib/magic-link.ts @@ -1,5 +1,5 @@ -import { MagicLinkEmail } from '@comp/email/emails/magic-link'; -import { sendEmail } from '@comp/email/lib/resend'; +import { MagicLinkEmail } from '../emails/magic-link'; +import { sendEmail } from './resend'; export const sendMagicLinkEmail = async (params: { url: string; @@ -8,20 +8,21 @@ export const sendMagicLinkEmail = async (params: { }) => { const { url, email, inviteCode } = params; - const emailTemplate = MagicLinkEmail({ - email, - url: url, - inviteCode, - }); - try { - await sendEmail({ + const sent = await sendEmail({ to: email, - subject: 'Comp AI Login Link', - react: emailTemplate, + subject: 'Your sign-in link for Comp AI', + react: MagicLinkEmail({ url, email, inviteCode }), }); - } catch (e) { - console.error(e); - throw e; + + if (!sent) { + console.error('Failed to send magic link email'); + return { success: false }; + } + + return { success: true }; + } catch (error) { + console.error('Error sending magic link email:', error); + return { success: false }; } }; diff --git a/packages/email/lib/waitlist.ts b/packages/email/lib/waitlist.ts index a52c1987b..0b52a7813 100644 --- a/packages/email/lib/waitlist.ts +++ b/packages/email/lib/waitlist.ts @@ -1,19 +1,24 @@ -import { WaitlistEmail } from '@comp/email/emails/waitlist'; -import { sendEmail } from '@comp/email/lib/resend'; +import { WaitlistEmail } from '../emails/waitlist'; +import { sendEmail } from './resend'; export const sendWaitlistEmail = async (params: { email: string }) => { const { email } = params; - const emailTemplate = WaitlistEmail({ email }); - try { - await sendEmail({ + const sent = await sendEmail({ to: email, - subject: 'Confirm your email to join the Comp AI waitlist', - react: emailTemplate, + subject: 'Welcome to the Comp AI waitlist!', + react: WaitlistEmail({ email }), }); - } catch (e) { - console.error(e); - throw e; + + if (!sent) { + console.error('Failed to send waitlist email'); + return { success: false }; + } + + return { success: true }; + } catch (error) { + console.error('Error sending waitlist email:', error); + return { success: false }; } }; diff --git a/packages/email/package.json b/packages/email/package.json index ae882b3e7..115190c2e 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -1,6 +1,31 @@ { "name": "@comp/email", "version": "1.0.0", + "description": "Email templates and utilities for Comp AI", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "dist/**", + "README.md" + ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + }, + "./emails/*": "./emails/*", + "./lib/*": "./lib/*" + }, + "scripts": { + "build": "tsup index.ts --format cjs,esm --dts", + "clean": "rm -rf .turbo node_modules dist", + "dev": "tsup index.ts --format cjs,esm --watch --dts", + "format": "prettier --write .", + "lint": "prettier --check .", + "typecheck": "tsc --noEmit" + }, "dependencies": { "@comp/ui": "workspace:*", "@comp/utils": "workspace:*", @@ -15,26 +40,25 @@ "devDependencies": { "react": "^19.1.0", "react-dom": "^19.1.0", - "tsup": "^8.4.0", + "tsup": "^8.5.0", "typescript": "^5.8.3" }, - "files": [ - "dist/**" - ], - "main": "./dist/index.js", - "module": "./dist/index.mjs", "peerDependencies": { "react": "^19.1.0", "react-dom": "^19.1.0" }, - "private": true, - "scripts": { - "build": "tsup index.ts --format cjs,esm --dts", - "clean": "rm -rf .turbo node_modules dist", - "dev": "tsup index.ts --format cjs,esm --watch --dts", - "format": "prettier --write .", - "lint": "prettier --check .", - "typecheck": "tsc --noEmit" + "keywords": [ + "react-email", + "email-templates", + "comp-ai" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/comp-ai/comp.git", + "directory": "packages/email" }, - "types": "./dist/index.d.ts" + "license": "MIT", + "publishConfig": { + "access": "public" + } } diff --git a/packages/kv/package.json b/packages/kv/package.json index 1e720650e..f53e4ac25 100644 --- a/packages/kv/package.json +++ b/packages/kv/package.json @@ -1,16 +1,51 @@ { "name": "@comp/kv", "version": "1.0.0", - "dependencies": { - "@upstash/redis": "^1.34.2", - "server-only": "0.0.1" + "description": "Key-value store utilities using Upstash Redis for Comp AI", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "dist/**", + "README.md" + ], + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + } }, - "main": "src/index.ts", - "private": true, "scripts": { - "clean": "rm -rf .turbo node_modules", + "build": "tsup src/index.ts --format cjs,esm --dts", + "clean": "rm -rf .turbo node_modules dist", + "dev": "tsup src/index.ts --format cjs,esm --watch --dts", "format": "prettier --write .", "lint": "prettier --check .", "typecheck": "tsc --noEmit" + }, + "dependencies": { + "@upstash/redis": "^1.34.2", + "server-only": "0.0.1" + }, + "devDependencies": { + "tsup": "^8.5.0", + "typescript": "^5.8.3" + }, + "keywords": [ + "redis", + "upstash", + "key-value", + "cache", + "comp-ai" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/comp-ai/comp.git", + "directory": "packages/kv" + }, + "license": "MIT", + "publishConfig": { + "access": "public" } } diff --git a/packages/kv/src/index.ts b/packages/kv/src/index.ts index 274013811..903947154 100644 --- a/packages/kv/src/index.ts +++ b/packages/kv/src/index.ts @@ -61,3 +61,6 @@ export const client = url: process.env.UPSTASH_REDIS_REST_URL!, token: process.env.UPSTASH_REDIS_REST_TOKEN!, }); + +// Re-export Redis types for convenience +export type { Redis } from '@upstash/redis'; diff --git a/packages/ui/package.json b/packages/ui/package.json index 85e371ffc..027960048 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,99 @@ { "name": "@comp/ui", "version": "1.0.0", + "description": "UI component library for Comp AI", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "dist/**", + "src/**", + "tailwind.config.ts", + "postcss.config.js", + "README.md" + ], + "exports": { + "./resizable": "./src/components/resizable.tsx", + "./secondary-menu": "./src/components/secondary-menu.tsx", + "./animated-size-container": "./src/components/animated-size-container.tsx", + "./accordion": "./src/components/accordion.tsx", + "./alert-dialog": "./src/components/alert-dialog.tsx", + "./breadcrumb": "./src/components/breadcrumb.tsx", + "./alert": "./src/components/alert.tsx", + "./chart": "./src/components/chart.tsx", + "./currency-input": "./src/components/currency-input.tsx", + "./submit-button": "./src/components/submit-button.tsx", + "./avatar": "./src/components/avatar.tsx", + "./button": "./src/components/button.tsx", + "./calendar": "./src/components/calendar.tsx", + "./card": "./src/components/card.tsx", + "./card-liquid-glass": "./src/components/card-liquid-glass.tsx", + "./slider": "./src/components/slider.tsx", + "./carousel": "./src/components/carousel.tsx", + "./checkbox": "./src/components/checkbox.tsx", + "./collapsible": "./src/components/collapsible.tsx", + "./combobox": "./src/components/combobox.tsx", + "./combobox-dropdown": "./src/components/combobox-dropdown.tsx", + "./command": "./src/components/command.tsx", + "./context-menu": "./src/components/context-menu.tsx", + "./date-range-picker": "./src/components/date-range-picker.tsx", + "./dialog": "./src/components/dialog.tsx", + "./drawer": "./src/components/drawer.tsx", + "./dropdown-menu": "./src/components/dropdown-menu.tsx", + "./form": "./src/components/form.tsx", + "./editor": "./src/components/editor/index.tsx", + "./globals.css": "./src/globals.css", + "./hover-card": "./src/components/hover-card.tsx", + "./icons": "./src/components/icons.tsx", + "./input": "./src/components/input.tsx", + "./input-otp": "./src/components/input-otp.tsx", + "./label": "./src/components/label.tsx", + "./navigation-menu": "./src/components/navigation-menu.tsx", + "./popover": "./src/components/popover.tsx", + "./postcss": "./postcss.config.js", + "./progress": "./src/components/progress.tsx", + "./radio-group": "./src/components/radio-group.tsx", + "./scroll-area": "./src/components/scroll-area.tsx", + "./select": "./src/components/select.tsx", + "./sheet": "./src/components/sheet.tsx", + "./badge": "./src/components/badge.tsx", + "./separator": "./src/components/separator.tsx", + "./skeleton": "./src/components/skeleton.tsx", + "./spinner": "./src/components/spinner.tsx", + "./switch": "./src/components/switch.tsx", + "./multiple-selector": "./src/components/multiple-selector.tsx", + "./table": "./src/components/table.tsx", + "./tabs": "./src/components/tabs.tsx", + "./tailwind.config": "./tailwind.config.ts", + "./textarea": "./src/components/textarea.tsx", + "./toast": "./src/components/toast.tsx", + "./toggle": "./src/components/toggle.tsx", + "./toaster": "./src/components/toaster.tsx", + "./tooltip": "./src/components/tooltip.tsx", + "./time-range-input": "./src/components/time-range-input.tsx", + "./use-toast": "./src/components/use-toast.tsx", + "./cn": "./src/utils/cn.ts", + "./truncate": "./src/utils/truncate.ts", + "./hooks": "./src/hooks/index.ts", + "./quantity-input": "./src/components/quantity-input.tsx", + "./use-media-query": "./src/hooks/use-media-query.tsx", + "./inner-menu": "./src/components/inner-menu.tsx", + "./empty-card": "./src/components/empty-card.tsx", + "./text-editor": "./src/text-editor.css", + "./prosemirror": "./src/prosemirror.css", + "./editor.css": "./src/editor.css", + "./chart-tooltip": "./src/components/chart-tooltip.tsx", + "./date-picker": "./src/components/date-picker.tsx", + "./select-pills": "./src/components/select-pills.tsx" + }, + "scripts": { + "build": "tsup src/components/index.ts src/hooks/index.ts src/utils/index.ts --format cjs,esm --dts", + "clean": "rm -rf .turbo node_modules dist", + "dev": "tsup src/components/index.ts src/hooks/index.ts src/utils/index.ts --format cjs,esm --watch --dts", + "format": "prettier --write .", + "lint": "prettier --check .", + "typecheck": "tsc --noEmit" + }, "dependencies": { "@radix-ui/react-accordion": "1.2.11", "@radix-ui/react-alert-dialog": "1.1.14", @@ -80,87 +173,9 @@ "react": "^19.1.0", "react-dom": "^19.1.0", "tailwindcss": "^4.1.8", + "tsup": "^8.5.0", "typescript": "^5.8.3" }, - "exports": { - "./resizable": "./src/components/resizable.tsx", - "./secondary-menu": "./src/components/secondary-menu.tsx", - "./animated-size-container": "./src/components/animated-size-container.tsx", - "./accordion": "./src/components/accordion.tsx", - "./alert-dialog": "./src/components/alert-dialog.tsx", - "./breadcrumb": "./src/components/breadcrumb.tsx", - "./alert": "./src/components/alert.tsx", - "./chart": "./src/components/chart.tsx", - "./currency-input": "./src/components/currency-input.tsx", - "./submit-button": "./src/components/submit-button.tsx", - "./avatar": "./src/components/avatar.tsx", - "./button": "./src/components/button.tsx", - "./calendar": "./src/components/calendar.tsx", - "./card": "./src/components/card.tsx", - "./card-liquid-glass": "./src/components/card-liquid-glass.tsx", - "./slider": "./src/components/slider.tsx", - "./carousel": "./src/components/carousel.tsx", - "./checkbox": "./src/components/checkbox.tsx", - "./collapsible": "./src/components/collapsible.tsx", - "./combobox": "./src/components/combobox.tsx", - "./combobox-dropdown": "./src/components/combobox-dropdown.tsx", - "./command": "./src/components/command.tsx", - "./context-menu": "./src/components/context-menu.tsx", - "./date-range-picker": "./src/components/date-range-picker.tsx", - "./dialog": "./src/components/dialog.tsx", - "./drawer": "./src/components/drawer.tsx", - "./dropdown-menu": "./src/components/dropdown-menu.tsx", - "./form": "./src/components/form.tsx", - "./editor": "./src/components/editor/index.tsx", - "./globals.css": "./src/globals.css", - "./hover-card": "./src/components/hover-card.tsx", - "./icons": "./src/components/icons.tsx", - "./input": "./src/components/input.tsx", - "./input-otp": "./src/components/input-otp.tsx", - "./label": "./src/components/label.tsx", - "./navigation-menu": "./src/components/navigation-menu.tsx", - "./popover": "./src/components/popover.tsx", - "./postcss": "./postcss.config.js", - "./progress": "./src/components/progress.tsx", - "./radio-group": "./src/components/radio-group.tsx", - "./scroll-area": "./src/components/scroll-area.tsx", - "./select": "./src/components/select.tsx", - "./sheet": "./src/components/sheet.tsx", - "./badge": "./src/components/badge.tsx", - "./separator": "./src/components/separator.tsx", - "./skeleton": "./src/components/skeleton.tsx", - "./spinner": "./src/components/spinner.tsx", - "./switch": "./src/components/switch.tsx", - "./multiple-selector": "./src/components/multiple-selector.tsx", - "./table": "./src/components/table.tsx", - "./tabs": "./src/components/tabs.tsx", - "./tailwind.config": "./tailwind.config.ts", - "./textarea": "./src/components/textarea.tsx", - "./toast": "./src/components/toast.tsx", - "./toggle": "./src/components/toggle.tsx", - "./toaster": "./src/components/toaster.tsx", - "./tooltip": "./src/components/tooltip.tsx", - "./time-range-input": "./src/components/time-range-input.tsx", - "./use-toast": "./src/components/use-toast.tsx", - "./cn": "./src/utils/cn.ts", - "./truncate": "./src/utils/truncate.ts", - "./hooks": "./src/hooks/index.ts", - "./quantity-input": "./src/components/quantity-input.tsx", - "./use-media-query": "./src/hooks/use-media-query.tsx", - "./inner-menu": "./src/components/inner-menu.tsx", - "./empty-card": "./src/components/empty-card.tsx", - "./text-editor": "./src/text-editor.css", - "./prosemirror": "./src/prosemirror.css", - "./editor.css": "./src/editor.css", - "./chart-tooltip": "./src/components/chart-tooltip.tsx", - "./date-picker": "./src/components/date-picker.tsx", - "./select-pills": "./src/components/select-pills.tsx" - }, - "files": [ - "tailwind.config.ts", - "postcss.config.js", - "globals.css" - ], "overrides": { "react-is": "^19.1.0" }, @@ -168,12 +183,22 @@ "react": "^19.1.0", "react-dom": "^19.1.0" }, - "private": true, - "scripts": { - "clean": "rm -rf .turbo node_modules", - "format": "prettier --write .", - "lint": "prettier --check .", - "typecheck": "tsc --noEmit" + "sideEffects": false, + "keywords": [ + "react", + "ui", + "components", + "tailwindcss", + "radix-ui", + "comp-ai" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/comp-ai/comp.git", + "directory": "packages/ui" }, - "sideEffects": false + "license": "MIT", + "publishConfig": { + "access": "public" + } } diff --git a/packages/ui/src/components/index.ts b/packages/ui/src/components/index.ts new file mode 100644 index 000000000..a5b797be1 --- /dev/null +++ b/packages/ui/src/components/index.ts @@ -0,0 +1,71 @@ +// Components +export * from './accordion'; +export * from './alert'; +export * from './alert-dialog'; +export * from './animated-size-container'; +export * from './avatar'; +export * from './badge'; +export * from './breadcrumb'; +export * from './button'; +export * from './calendar'; +export * from './card'; +export * from './card-liquid-glass'; +export * from './carousel'; +export * from './chart'; +export * from './checkbox'; +export * from './collapsible'; +export * from './combobox'; +export * from './combobox-dropdown'; +export * from './command'; +export * from './context-menu'; +export * from './currency-input'; +export * from './date-picker'; +export * from './date-range-picker'; +export * from './dialog'; +export * from './drawer'; +export * from './dropdown-menu'; +export * from './empty-card'; +export * from './form'; +export * from './hover-card'; +export * from './icons'; +export * from './inner-menu'; +export * from './input'; +export * from './input-otp'; +export * from './label'; +export * from './multiple-selector'; +export * from './navigation-menu'; +export * from './popover'; +export * from './progress'; +export * from './quantity-input'; +export * from './radio-group'; +export * from './resizable'; +export * from './scroll-area'; +export * from './secondary-menu'; +export * from './select'; +export * from './select-pills'; +export * from './separator'; +export * from './sheet'; +export * from './skeleton'; +export * from './slider'; +export * from './spinner'; +export * from './submit-button'; +export * from './switch'; +export * from './table'; +export * from './tabs'; +export * from './textarea'; +export * from './time-range-input'; +export * from './toast'; +export * from './toaster'; +export * from './toggle'; +export * from './tooltip'; +export * from './use-toast'; + +// Chart tooltip - explicitly re-export to avoid conflicts +export { + ClientTooltip as ChartTooltip, + TooltipContent as ChartTooltipContent, + TooltipTrigger as ChartTooltipTrigger, +} from './chart-tooltip'; + +// Editor components +export * from './editor'; diff --git a/release.config.js b/release.config.js index 290c82363..a7a80daad 100644 --- a/release.config.js +++ b/release.config.js @@ -1,8 +1,8 @@ module.exports = { - branches: ['release'], // Branches to release from + branches: ['release'], plugins: [ - '@semantic-release/commit-analyzer', // Analyzes commit messages - '@semantic-release/release-notes-generator', // Generates release notes + '@semantic-release/commit-analyzer', + '@semantic-release/release-notes-generator', [ 'semantic-release-discord-notifier', { @@ -13,15 +13,49 @@ module.exports = { }, }, ], - '@semantic-release/changelog', // Updates the CHANGELOG.md file - ['@semantic-release/npm', { npmPublish: false }], + '@semantic-release/changelog', [ - '@semantic-release/git', // Commits package.json and CHANGELOG.md + '@semantic-release/npm', { - assets: ['package.json', 'bun.lockb', 'CHANGELOG.md'], + npmPublish: false, // Root package stays private + }, + ], + // Publish each package individually + [ + '@semantic-release/npm', + { + npmPublish: true, + pkgRoot: 'packages/db', + }, + ], + [ + '@semantic-release/npm', + { + npmPublish: true, + pkgRoot: 'packages/email', + }, + ], + [ + '@semantic-release/npm', + { + npmPublish: true, + pkgRoot: 'packages/kv', + }, + ], + [ + '@semantic-release/npm', + { + npmPublish: true, + pkgRoot: 'packages/ui', + }, + ], + [ + '@semantic-release/git', + { + assets: ['package.json', 'bun.lockb', 'CHANGELOG.md', 'packages/*/package.json'], message: 'chore(release): ${nextRelease.version} [skip ci]\n\n${nextRelease.notes}', }, ], - '@semantic-release/github', // Creates a GitHub release + '@semantic-release/github', ], }; diff --git a/yarn.lock b/yarn.lock index e4fe48a5f..e32814b95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1339,14 +1339,14 @@ "@types/conventional-commits-parser" "^5.0.0" chalk "^5.3.0" -"@comp/analytics@^workspace:packages/analytics": +"@comp/analytics@packages/analytics": version "workspace:packages/analytics" resolved "workspace:packages/analytics" dependencies: posthog-js "^1.236.6" posthog-node "^4.14.0" -"@comp/app@^workspace:apps/app", "@comp/app@workspace:*": +"@comp/app@apps/app", "@comp/app@workspace:*": version "workspace:apps/app" resolved "workspace:apps/app" devDependencies: @@ -1456,19 +1456,19 @@ zaraz-ts "^1.2.0" zustand "^5.0.3" -"@comp/db@^workspace:packages/db", "@comp/db@workspace:*": +"@comp/db@packages/db", "@comp/db@workspace:*": version "workspace:packages/db" resolved "workspace:packages/db" devDependencies: "@comp/tsconfig" "workspace:*" - devDependencies: prisma "^6.9.0" ts-node "^10.9.2" + tsup "^8.4.0" typescript "^5.8.3" dependencies: "@prisma/client" "6.9.0" -"@comp/email@^workspace:packages/email": +"@comp/email@packages/email": version "workspace:packages/email" resolved "workspace:packages/email" devDependencies: @@ -1488,7 +1488,7 @@ react-email "^4.0.15" responsive-react-email "^0.0.5" -"@comp/framework-editor@^workspace:apps/framework-editor": +"@comp/framework-editor@apps/framework-editor": version "workspace:apps/framework-editor" resolved "workspace:apps/framework-editor" devDependencies: @@ -1518,7 +1518,7 @@ tippy.js "^6.3.7" zod "3.25.67" -"@comp/infra@^workspace:apps/infra": +"@comp/infra@apps/infra": version "workspace:apps/infra" resolved "workspace:apps/infra" devDependencies: @@ -1534,7 +1534,7 @@ "@pulumi/tailscale" "^0.17.0" dotenv "^17.2.0" -"@comp/integrations@^workspace:packages/integrations": +"@comp/integrations@packages/integrations": version "workspace:packages/integrations" resolved "workspace:packages/integrations" devDependencies: @@ -1557,14 +1557,17 @@ stoppable "^1.1.0" zod "3.25.67" -"@comp/kv@^workspace:packages/kv": +"@comp/kv@packages/kv": version "workspace:packages/kv" resolved "workspace:packages/kv" + devDependencies: + tsup "^8.4.0" + typescript "^5.8.3" dependencies: "@upstash/redis" "^1.34.2" server-only "0.0.1" -"@comp/portal@^workspace:apps/portal": +"@comp/portal@apps/portal": version "workspace:apps/portal" resolved "workspace:apps/portal" devDependencies: @@ -1595,7 +1598,7 @@ next "15.4.0-canary.85" react-email "^4.0.15" -"@comp/trust@^workspace:apps/trust": +"@comp/trust@apps/trust": version "workspace:apps/trust" resolved "workspace:apps/trust" devDependencies: @@ -1617,11 +1620,11 @@ lucide-react "^0.518.0" next "15.4.0-canary.85" -"@comp/tsconfig@^workspace:packages/tsconfig", "@comp/tsconfig@workspace:*": +"@comp/tsconfig@packages/tsconfig", "@comp/tsconfig@workspace:*": version "workspace:packages/tsconfig" resolved "workspace:packages/tsconfig" -"@comp/ui@^workspace:packages/ui", "@comp/ui@workspace:*": +"@comp/ui@packages/ui", "@comp/ui@workspace:*": version "workspace:packages/ui" resolved "workspace:packages/ui" devDependencies: @@ -1632,6 +1635,7 @@ react "^19.1.0" react-dom "^19.1.0" tailwindcss "^4.1.8" + tsup "^8.4.0" typescript "^5.8.3" dependencies: "@radix-ui/react-accordion" "1.2.11" @@ -1704,7 +1708,7 @@ use-debounce "^10.0.4" vaul "^0.9.6" -"@comp/utils@^workspace:packages/utils", "@comp/utils@workspace:*": +"@comp/utils@packages/utils", "@comp/utils@workspace:*": version "workspace:packages/utils" resolved "workspace:packages/utils" devDependencies: @@ -5002,6 +5006,18 @@ resolved "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz" integrity sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ== +"@semantic-release/exec@^6.0.3": + version "6.0.3" + resolved "https://registry.npmjs.org/@semantic-release/exec/-/exec-6.0.3.tgz" + integrity sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ== + dependencies: + debug "^4.0.0" + execa "^5.0.0" + lodash "^4.17.4" + parse-json "^5.0.0" + aggregate-error "^3.0.0" + "@semantic-release/error" "^3.0.0" + "@semantic-release/git@^10.0.1": version "10.0.1" resolved "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz" @@ -18146,7 +18162,7 @@ tsscmp@^1.0.6: resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz" integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== -tsup@^8.4.0: +tsup@^8.4.0, tsup@^8.5.0: version "8.5.0" resolved "https://registry.npmjs.org/tsup/-/tsup-8.5.0.tgz" integrity sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ== From 54312026524d977b2fd36e2c26cb2bf6ec1c87d1 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Thu, 24 Jul 2025 17:08:05 -0400 Subject: [PATCH 076/107] chore: rename packages to reflect new organization name - Updated package names from `@comp/*` to `@trycompai/*` across the database, email, key-value store, and UI component packages to align with the new branding. - Ensured consistency in package.json files for better organization and clarity. --- packages/db/package.json | 2 +- packages/email/package.json | 6 +++--- packages/kv/package.json | 2 +- packages/ui/package.json | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/db/package.json b/packages/db/package.json index 3736429b0..d1a426775 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,5 +1,5 @@ { - "name": "@comp/db", + "name": "@trycompai/db", "version": "1.0.0", "description": "Database package with Prisma client and schema for Comp AI", "main": "./dist/index.js", diff --git a/packages/email/package.json b/packages/email/package.json index 115190c2e..ae02c7c7c 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -1,5 +1,5 @@ { - "name": "@comp/email", + "name": "@trycompai/email", "version": "1.0.0", "description": "Email templates and utilities for Comp AI", "main": "./dist/index.js", @@ -27,8 +27,8 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@comp/ui": "workspace:*", - "@comp/utils": "workspace:*", + "@trycompai/ui": "workspace:*", + "@trycompai/utils": "workspace:*", "@react-email/components": "^0.0.41", "@react-email/render": "^1.1.2", "@react-email/tailwind": "1.0.5", diff --git a/packages/kv/package.json b/packages/kv/package.json index f53e4ac25..99e0a24b9 100644 --- a/packages/kv/package.json +++ b/packages/kv/package.json @@ -1,5 +1,5 @@ { - "name": "@comp/kv", + "name": "@trycompai/kv", "version": "1.0.0", "description": "Key-value store utilities using Upstash Redis for Comp AI", "main": "./dist/index.js", diff --git a/packages/ui/package.json b/packages/ui/package.json index 027960048..9682f86e8 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,5 +1,5 @@ { - "name": "@comp/ui", + "name": "@trycompai/ui", "version": "1.0.0", "description": "UI component library for Comp AI", "main": "./dist/index.js", From d6c9b21519eab2cddb027b11fa11f98fa82bec3b Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Thu, 24 Jul 2025 17:11:11 -0400 Subject: [PATCH 077/107] chore: update .prettierignore to exclude additional build artifacts - Added the 'dist' directory for all packages to the .prettierignore file to prevent formatting issues with generated files. - Ensured consistency in ignoring unnecessary files during the formatting process. --- .prettierignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.prettierignore b/.prettierignore index aeb37e397..e366cda0a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -27,4 +27,7 @@ coverage/ **/playwright-report/ **/test-results/ **/playwright/.cache/ -**/.playwright/ \ No newline at end of file +**/.playwright/ + +# Dist +packages/*/dist \ No newline at end of file From a7f6e5eb6777d73fe19989ab09e4627b7e77af3d Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Thu, 24 Jul 2025 17:11:53 -0400 Subject: [PATCH 078/107] chore: update .prettierignore to include additional dist directories - Added 'dist/*' to the .prettierignore file to ensure all distribution directories are excluded from formatting. - Improved consistency in ignoring generated files across the project. --- .prettierignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.prettierignore b/.prettierignore index e366cda0a..28d539c81 100644 --- a/.prettierignore +++ b/.prettierignore @@ -30,4 +30,5 @@ coverage/ **/.playwright/ # Dist -packages/*/dist \ No newline at end of file +packages/*/dist +dist/* \ No newline at end of file From 2e0686b836c5e2e519cd34f43e428dbdc6fe5ba2 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Thu, 24 Jul 2025 17:17:35 -0400 Subject: [PATCH 079/107] chore: update package.json files for db, email, kv, and ui packages - Standardized package.json configurations across the database, email, key-value store, and UI component packages. - Added missing fields such as `files`, `exports`, and `scripts` to enhance package structure and usability. - Updated dependencies and devDependencies to ensure compatibility and improve development experience. - Ensured consistent licensing and repository information across all packages. --- packages/db/package.json | 76 ++++++------- packages/email/package.json | 72 ++++++------ packages/kv/package.json | 62 +++++------ packages/ui/package.json | 212 ++++++++++++++++++------------------ 4 files changed, 211 insertions(+), 211 deletions(-) diff --git a/packages/db/package.json b/packages/db/package.json index d1a426775..2d8468ede 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,15 +1,17 @@ { "name": "@trycompai/db", - "version": "1.0.0", "description": "Database package with Prisma client and schema for Comp AI", - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", - "files": [ - "dist/**", - "prisma/**", - "README.md" - ], + "version": "1.0.0", + "dependencies": { + "@prisma/client": "6.9.0" + }, + "devDependencies": { + "@comp/tsconfig": "workspace:*", + "prisma": "^6.9.0", + "ts-node": "^10.9.2", + "tsup": "^8.5.0", + "typescript": "^5.8.3" + }, "exports": { ".": { "types": "./dist/index.d.ts", @@ -27,6 +29,32 @@ "require": "./dist/client.js" } }, + "files": [ + "dist/**", + "prisma/**", + "README.md" + ], + "keywords": [ + "comp-ai", + "database", + "postgresql", + "prisma" + ], + "license": "MIT", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "prisma": { + "schema": "prisma", + "seed": "ts-node prisma/seed/seed.ts" + }, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/comp-ai/comp.git", + "directory": "packages/db" + }, "scripts": { "build": "tsup src/index.ts src/types.ts --format cjs,esm --dts && bun run db:generate", "clean": "rm -rf .turbo node_modules dist", @@ -43,33 +71,5 @@ "postbuild": "cp -r prisma dist/ || echo 'No prisma directory to copy'", "typecheck": "tsc --noEmit" }, - "dependencies": { - "@prisma/client": "6.9.0" - }, - "devDependencies": { - "@comp/tsconfig": "workspace:*", - "prisma": "^6.9.0", - "ts-node": "^10.9.2", - "tsup": "^8.5.0", - "typescript": "^5.8.3" - }, - "prisma": { - "schema": "prisma", - "seed": "ts-node prisma/seed/seed.ts" - }, - "keywords": [ - "prisma", - "database", - "postgresql", - "comp-ai" - ], - "repository": { - "type": "git", - "url": "git+https://github.com/comp-ai/comp.git", - "directory": "packages/db" - }, - "license": "MIT", - "publishConfig": { - "access": "public" - } + "types": "./dist/index.d.ts" } diff --git a/packages/email/package.json b/packages/email/package.json index ae02c7c7c..f37be67c1 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -1,37 +1,13 @@ { "name": "@trycompai/email", - "version": "1.0.0", "description": "Email templates and utilities for Comp AI", - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", - "files": [ - "dist/**", - "README.md" - ], - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.mjs", - "require": "./dist/index.js" - }, - "./emails/*": "./emails/*", - "./lib/*": "./lib/*" - }, - "scripts": { - "build": "tsup index.ts --format cjs,esm --dts", - "clean": "rm -rf .turbo node_modules dist", - "dev": "tsup index.ts --format cjs,esm --watch --dts", - "format": "prettier --write .", - "lint": "prettier --check .", - "typecheck": "tsc --noEmit" - }, + "version": "1.0.0", "dependencies": { - "@trycompai/ui": "workspace:*", - "@trycompai/utils": "workspace:*", "@react-email/components": "^0.0.41", "@react-email/render": "^1.1.2", "@react-email/tailwind": "1.0.5", + "@trycompai/ui": "workspace:*", + "@trycompai/utils": "workspace:*", "date-fns": "^4.1.0", "next": "15.4.0-canary.85", "react-email": "^4.0.15", @@ -43,22 +19,46 @@ "tsup": "^8.5.0", "typescript": "^5.8.3" }, - "peerDependencies": { - "react": "^19.1.0", - "react-dom": "^19.1.0" + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + }, + "./emails/*": "./emails/*", + "./lib/*": "./lib/*" }, + "files": [ + "dist/**", + "README.md" + ], "keywords": [ - "react-email", + "comp-ai", "email-templates", - "comp-ai" + "react-email" ], + "license": "MIT", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "peerDependencies": { + "react": "^19.1.0", + "react-dom": "^19.1.0" + }, + "publishConfig": { + "access": "public" + }, "repository": { "type": "git", "url": "git+https://github.com/comp-ai/comp.git", "directory": "packages/email" }, - "license": "MIT", - "publishConfig": { - "access": "public" - } + "scripts": { + "build": "tsup index.ts --format cjs,esm --dts", + "clean": "rm -rf .turbo node_modules dist", + "dev": "tsup index.ts --format cjs,esm --watch --dts", + "format": "prettier --write .", + "lint": "prettier --check .", + "typecheck": "tsc --noEmit" + }, + "types": "./dist/index.d.ts" } diff --git a/packages/kv/package.json b/packages/kv/package.json index 99e0a24b9..5cd9c8779 100644 --- a/packages/kv/package.json +++ b/packages/kv/package.json @@ -1,29 +1,7 @@ { "name": "@trycompai/kv", - "version": "1.0.0", "description": "Key-value store utilities using Upstash Redis for Comp AI", - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", - "files": [ - "dist/**", - "README.md" - ], - "exports": { - ".": { - "types": "./dist/index.d.ts", - "import": "./dist/index.mjs", - "require": "./dist/index.js" - } - }, - "scripts": { - "build": "tsup src/index.ts --format cjs,esm --dts", - "clean": "rm -rf .turbo node_modules dist", - "dev": "tsup src/index.ts --format cjs,esm --watch --dts", - "format": "prettier --write .", - "lint": "prettier --check .", - "typecheck": "tsc --noEmit" - }, + "version": "1.0.0", "dependencies": { "@upstash/redis": "^1.34.2", "server-only": "0.0.1" @@ -32,20 +10,42 @@ "tsup": "^8.5.0", "typescript": "^5.8.3" }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + } + }, + "files": [ + "dist/**", + "README.md" + ], "keywords": [ - "redis", - "upstash", - "key-value", "cache", - "comp-ai" + "comp-ai", + "key-value", + "redis", + "upstash" ], + "license": "MIT", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "publishConfig": { + "access": "public" + }, "repository": { "type": "git", "url": "git+https://github.com/comp-ai/comp.git", "directory": "packages/kv" }, - "license": "MIT", - "publishConfig": { - "access": "public" - } + "scripts": { + "build": "tsup src/index.ts --format cjs,esm --dts", + "clean": "rm -rf .turbo node_modules dist", + "dev": "tsup src/index.ts --format cjs,esm --watch --dts", + "format": "prettier --write .", + "lint": "prettier --check .", + "typecheck": "tsc --noEmit" + }, + "types": "./dist/index.d.ts" } diff --git a/packages/ui/package.json b/packages/ui/package.json index 9682f86e8..effce21ee 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,99 +1,7 @@ { "name": "@trycompai/ui", - "version": "1.0.0", "description": "UI component library for Comp AI", - "main": "./dist/index.js", - "module": "./dist/index.mjs", - "types": "./dist/index.d.ts", - "files": [ - "dist/**", - "src/**", - "tailwind.config.ts", - "postcss.config.js", - "README.md" - ], - "exports": { - "./resizable": "./src/components/resizable.tsx", - "./secondary-menu": "./src/components/secondary-menu.tsx", - "./animated-size-container": "./src/components/animated-size-container.tsx", - "./accordion": "./src/components/accordion.tsx", - "./alert-dialog": "./src/components/alert-dialog.tsx", - "./breadcrumb": "./src/components/breadcrumb.tsx", - "./alert": "./src/components/alert.tsx", - "./chart": "./src/components/chart.tsx", - "./currency-input": "./src/components/currency-input.tsx", - "./submit-button": "./src/components/submit-button.tsx", - "./avatar": "./src/components/avatar.tsx", - "./button": "./src/components/button.tsx", - "./calendar": "./src/components/calendar.tsx", - "./card": "./src/components/card.tsx", - "./card-liquid-glass": "./src/components/card-liquid-glass.tsx", - "./slider": "./src/components/slider.tsx", - "./carousel": "./src/components/carousel.tsx", - "./checkbox": "./src/components/checkbox.tsx", - "./collapsible": "./src/components/collapsible.tsx", - "./combobox": "./src/components/combobox.tsx", - "./combobox-dropdown": "./src/components/combobox-dropdown.tsx", - "./command": "./src/components/command.tsx", - "./context-menu": "./src/components/context-menu.tsx", - "./date-range-picker": "./src/components/date-range-picker.tsx", - "./dialog": "./src/components/dialog.tsx", - "./drawer": "./src/components/drawer.tsx", - "./dropdown-menu": "./src/components/dropdown-menu.tsx", - "./form": "./src/components/form.tsx", - "./editor": "./src/components/editor/index.tsx", - "./globals.css": "./src/globals.css", - "./hover-card": "./src/components/hover-card.tsx", - "./icons": "./src/components/icons.tsx", - "./input": "./src/components/input.tsx", - "./input-otp": "./src/components/input-otp.tsx", - "./label": "./src/components/label.tsx", - "./navigation-menu": "./src/components/navigation-menu.tsx", - "./popover": "./src/components/popover.tsx", - "./postcss": "./postcss.config.js", - "./progress": "./src/components/progress.tsx", - "./radio-group": "./src/components/radio-group.tsx", - "./scroll-area": "./src/components/scroll-area.tsx", - "./select": "./src/components/select.tsx", - "./sheet": "./src/components/sheet.tsx", - "./badge": "./src/components/badge.tsx", - "./separator": "./src/components/separator.tsx", - "./skeleton": "./src/components/skeleton.tsx", - "./spinner": "./src/components/spinner.tsx", - "./switch": "./src/components/switch.tsx", - "./multiple-selector": "./src/components/multiple-selector.tsx", - "./table": "./src/components/table.tsx", - "./tabs": "./src/components/tabs.tsx", - "./tailwind.config": "./tailwind.config.ts", - "./textarea": "./src/components/textarea.tsx", - "./toast": "./src/components/toast.tsx", - "./toggle": "./src/components/toggle.tsx", - "./toaster": "./src/components/toaster.tsx", - "./tooltip": "./src/components/tooltip.tsx", - "./time-range-input": "./src/components/time-range-input.tsx", - "./use-toast": "./src/components/use-toast.tsx", - "./cn": "./src/utils/cn.ts", - "./truncate": "./src/utils/truncate.ts", - "./hooks": "./src/hooks/index.ts", - "./quantity-input": "./src/components/quantity-input.tsx", - "./use-media-query": "./src/hooks/use-media-query.tsx", - "./inner-menu": "./src/components/inner-menu.tsx", - "./empty-card": "./src/components/empty-card.tsx", - "./text-editor": "./src/text-editor.css", - "./prosemirror": "./src/prosemirror.css", - "./editor.css": "./src/editor.css", - "./chart-tooltip": "./src/components/chart-tooltip.tsx", - "./date-picker": "./src/components/date-picker.tsx", - "./select-pills": "./src/components/select-pills.tsx" - }, - "scripts": { - "build": "tsup src/components/index.ts src/hooks/index.ts src/utils/index.ts --format cjs,esm --dts", - "clean": "rm -rf .turbo node_modules dist", - "dev": "tsup src/components/index.ts src/hooks/index.ts src/utils/index.ts --format cjs,esm --watch --dts", - "format": "prettier --write .", - "lint": "prettier --check .", - "typecheck": "tsc --noEmit" - }, + "version": "1.0.0", "dependencies": { "@radix-ui/react-accordion": "1.2.11", "@radix-ui/react-alert-dialog": "1.1.14", @@ -176,6 +84,98 @@ "tsup": "^8.5.0", "typescript": "^5.8.3" }, + "exports": { + "./resizable": "./src/components/resizable.tsx", + "./secondary-menu": "./src/components/secondary-menu.tsx", + "./animated-size-container": "./src/components/animated-size-container.tsx", + "./accordion": "./src/components/accordion.tsx", + "./alert-dialog": "./src/components/alert-dialog.tsx", + "./breadcrumb": "./src/components/breadcrumb.tsx", + "./alert": "./src/components/alert.tsx", + "./chart": "./src/components/chart.tsx", + "./currency-input": "./src/components/currency-input.tsx", + "./submit-button": "./src/components/submit-button.tsx", + "./avatar": "./src/components/avatar.tsx", + "./button": "./src/components/button.tsx", + "./calendar": "./src/components/calendar.tsx", + "./card": "./src/components/card.tsx", + "./card-liquid-glass": "./src/components/card-liquid-glass.tsx", + "./slider": "./src/components/slider.tsx", + "./carousel": "./src/components/carousel.tsx", + "./checkbox": "./src/components/checkbox.tsx", + "./collapsible": "./src/components/collapsible.tsx", + "./combobox": "./src/components/combobox.tsx", + "./combobox-dropdown": "./src/components/combobox-dropdown.tsx", + "./command": "./src/components/command.tsx", + "./context-menu": "./src/components/context-menu.tsx", + "./date-range-picker": "./src/components/date-range-picker.tsx", + "./dialog": "./src/components/dialog.tsx", + "./drawer": "./src/components/drawer.tsx", + "./dropdown-menu": "./src/components/dropdown-menu.tsx", + "./form": "./src/components/form.tsx", + "./editor": "./src/components/editor/index.tsx", + "./globals.css": "./src/globals.css", + "./hover-card": "./src/components/hover-card.tsx", + "./icons": "./src/components/icons.tsx", + "./input": "./src/components/input.tsx", + "./input-otp": "./src/components/input-otp.tsx", + "./label": "./src/components/label.tsx", + "./navigation-menu": "./src/components/navigation-menu.tsx", + "./popover": "./src/components/popover.tsx", + "./postcss": "./postcss.config.js", + "./progress": "./src/components/progress.tsx", + "./radio-group": "./src/components/radio-group.tsx", + "./scroll-area": "./src/components/scroll-area.tsx", + "./select": "./src/components/select.tsx", + "./sheet": "./src/components/sheet.tsx", + "./badge": "./src/components/badge.tsx", + "./separator": "./src/components/separator.tsx", + "./skeleton": "./src/components/skeleton.tsx", + "./spinner": "./src/components/spinner.tsx", + "./switch": "./src/components/switch.tsx", + "./multiple-selector": "./src/components/multiple-selector.tsx", + "./table": "./src/components/table.tsx", + "./tabs": "./src/components/tabs.tsx", + "./tailwind.config": "./tailwind.config.ts", + "./textarea": "./src/components/textarea.tsx", + "./toast": "./src/components/toast.tsx", + "./toggle": "./src/components/toggle.tsx", + "./toaster": "./src/components/toaster.tsx", + "./tooltip": "./src/components/tooltip.tsx", + "./time-range-input": "./src/components/time-range-input.tsx", + "./use-toast": "./src/components/use-toast.tsx", + "./cn": "./src/utils/cn.ts", + "./truncate": "./src/utils/truncate.ts", + "./hooks": "./src/hooks/index.ts", + "./quantity-input": "./src/components/quantity-input.tsx", + "./use-media-query": "./src/hooks/use-media-query.tsx", + "./inner-menu": "./src/components/inner-menu.tsx", + "./empty-card": "./src/components/empty-card.tsx", + "./text-editor": "./src/text-editor.css", + "./prosemirror": "./src/prosemirror.css", + "./editor.css": "./src/editor.css", + "./chart-tooltip": "./src/components/chart-tooltip.tsx", + "./date-picker": "./src/components/date-picker.tsx", + "./select-pills": "./src/components/select-pills.tsx" + }, + "files": [ + "dist/**", + "src/**", + "tailwind.config.ts", + "postcss.config.js", + "README.md" + ], + "keywords": [ + "comp-ai", + "components", + "radix-ui", + "react", + "tailwindcss", + "ui" + ], + "license": "MIT", + "main": "./dist/index.js", + "module": "./dist/index.mjs", "overrides": { "react-is": "^19.1.0" }, @@ -183,22 +183,22 @@ "react": "^19.1.0", "react-dom": "^19.1.0" }, - "sideEffects": false, - "keywords": [ - "react", - "ui", - "components", - "tailwindcss", - "radix-ui", - "comp-ai" - ], + "publishConfig": { + "access": "public" + }, "repository": { "type": "git", "url": "git+https://github.com/comp-ai/comp.git", "directory": "packages/ui" }, - "license": "MIT", - "publishConfig": { - "access": "public" - } + "scripts": { + "build": "tsup src/components/index.ts src/hooks/index.ts src/utils/index.ts --format cjs,esm --dts", + "clean": "rm -rf .turbo node_modules dist", + "dev": "tsup src/components/index.ts src/hooks/index.ts src/utils/index.ts --format cjs,esm --watch --dts", + "format": "prettier --write .", + "lint": "prettier --check .", + "typecheck": "tsc --noEmit" + }, + "sideEffects": false, + "types": "./dist/index.d.ts" } From 9b387349ed2eddb36c80f03b6b7288a6aa9e143a Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Thu, 24 Jul 2025 17:19:39 -0400 Subject: [PATCH 080/107] chore: update typecheck CI script and build commands for new package names - Modified the `typecheck:ci` script in package.json to exclude the updated package `@trycompai/ui`. - Updated build commands in the release workflow to reflect the new package names under `@trycompai/*`, ensuring consistency with recent branding changes. --- .github/workflows/release.yml | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3b1a1e4e2..8df9573df 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -54,10 +54,10 @@ jobs: - name: Build packages run: | echo "🔨 Building packages before release..." - bun run -F @comp/db build - bun run -F @comp/email build - bun run -F @comp/kv build - bun run -F @comp/ui build + bun run -F @trycompai/db build + bun run -F @trycompai/email build + bun run -F @trycompai/kv build + bun run -F @trycompai/ui build - name: Release env: diff --git a/package.json b/package.json index a815116c9..68cf5b651 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "test": "turbo test --parallel", "test:release": "node scripts/test-release.js", "typecheck": "turbo typecheck", - "typecheck:ci": "turbo typecheck --filter={apps/**} --filter={packages/**} --filter=!@comp/integrations --filter=!@comp/ui" + "typecheck:ci": "turbo typecheck --filter={apps/**} --filter={packages/**} --filter=!@comp/integrations --filter=!@trycompai/ui" }, "workspaces": [ "apps/*", From 8c4847b6a546b281ca8bfc052e61152303d7d1bf Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Thu, 24 Jul 2025 17:21:51 -0400 Subject: [PATCH 081/107] chore: update package names and build commands for consistency - Changed package names from `@trycompai/*` to `@comp/*` in package.json files for db, email, kv, and ui packages to align with new branding. - Updated the `typecheck:ci` script to exclude the renamed package `@comp/ui`. - Modified build commands in the release workflow to reflect the new package names, ensuring consistency across the project. --- .github/workflows/release.yml | 8 ++++---- package.json | 2 +- packages/db/package.json | 5 +++-- packages/email/package.json | 9 +++++---- packages/kv/package.json | 5 +++-- packages/ui/package.json | 5 +++-- 6 files changed, 19 insertions(+), 15 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8df9573df..3b1a1e4e2 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -54,10 +54,10 @@ jobs: - name: Build packages run: | echo "🔨 Building packages before release..." - bun run -F @trycompai/db build - bun run -F @trycompai/email build - bun run -F @trycompai/kv build - bun run -F @trycompai/ui build + bun run -F @comp/db build + bun run -F @comp/email build + bun run -F @comp/kv build + bun run -F @comp/ui build - name: Release env: diff --git a/package.json b/package.json index 68cf5b651..a815116c9 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "test": "turbo test --parallel", "test:release": "node scripts/test-release.js", "typecheck": "turbo typecheck", - "typecheck:ci": "turbo typecheck --filter={apps/**} --filter={packages/**} --filter=!@comp/integrations --filter=!@trycompai/ui" + "typecheck:ci": "turbo typecheck --filter={apps/**} --filter={packages/**} --filter=!@comp/integrations --filter=!@comp/ui" }, "workspaces": [ "apps/*", diff --git a/packages/db/package.json b/packages/db/package.json index 2d8468ede..6f4deeb39 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,5 +1,5 @@ { - "name": "@trycompai/db", + "name": "@comp/db", "description": "Database package with Prisma client and schema for Comp AI", "version": "1.0.0", "dependencies": { @@ -48,7 +48,8 @@ "seed": "ts-node prisma/seed/seed.ts" }, "publishConfig": { - "access": "public" + "access": "public", + "name": "@trycompai/db" }, "repository": { "type": "git", diff --git a/packages/email/package.json b/packages/email/package.json index f37be67c1..1667be1c5 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -1,13 +1,13 @@ { - "name": "@trycompai/email", + "name": "@comp/email", "description": "Email templates and utilities for Comp AI", "version": "1.0.0", "dependencies": { + "@comp/ui": "workspace:*", + "@comp/utils": "workspace:*", "@react-email/components": "^0.0.41", "@react-email/render": "^1.1.2", "@react-email/tailwind": "1.0.5", - "@trycompai/ui": "workspace:*", - "@trycompai/utils": "workspace:*", "date-fns": "^4.1.0", "next": "15.4.0-canary.85", "react-email": "^4.0.15", @@ -45,7 +45,8 @@ "react-dom": "^19.1.0" }, "publishConfig": { - "access": "public" + "access": "public", + "name": "@trycompai/email" }, "repository": { "type": "git", diff --git a/packages/kv/package.json b/packages/kv/package.json index 5cd9c8779..c91bdce11 100644 --- a/packages/kv/package.json +++ b/packages/kv/package.json @@ -1,5 +1,5 @@ { - "name": "@trycompai/kv", + "name": "@comp/kv", "description": "Key-value store utilities using Upstash Redis for Comp AI", "version": "1.0.0", "dependencies": { @@ -32,7 +32,8 @@ "main": "./dist/index.js", "module": "./dist/index.mjs", "publishConfig": { - "access": "public" + "access": "public", + "name": "@trycompai/kv" }, "repository": { "type": "git", diff --git a/packages/ui/package.json b/packages/ui/package.json index effce21ee..7c2bff1a3 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,5 +1,5 @@ { - "name": "@trycompai/ui", + "name": "@comp/ui", "description": "UI component library for Comp AI", "version": "1.0.0", "dependencies": { @@ -184,7 +184,8 @@ "react-dom": "^19.1.0" }, "publishConfig": { - "access": "public" + "access": "public", + "name": "@trycompai/ui" }, "repository": { "type": "git", From 089cf1a809f517059469a3af4956c2b45cc94d35 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Thu, 24 Jul 2025 17:28:09 -0400 Subject: [PATCH 082/107] chore: update package dependencies and paths for improved module resolution - Removed the `@semantic-release/exec` dependency from the project. - Upgraded `tsup` version from `8.4.0` to `8.5.0` across multiple packages for better build performance. - Added path mappings in `tsconfig.json` for various components, enhancing module resolution for `db`, `email`, `kv`, `ui`, and `utils` packages. --- apps/app/src/lib/db/employee.ts | 3 +- apps/app/tsconfig.json | 12 +++++++- bun.lock | 35 ++++++++++------------- yarn.lock | 49 +++++++++++++-------------------- 4 files changed, 45 insertions(+), 54 deletions(-) diff --git a/apps/app/src/lib/db/employee.ts b/apps/app/src/lib/db/employee.ts index 1c89fcd64..22235904d 100644 --- a/apps/app/src/lib/db/employee.ts +++ b/apps/app/src/lib/db/employee.ts @@ -2,8 +2,7 @@ import { env } from '@/env.mjs'; import { trainingVideos } from '@/lib/data/training-videos'; import { db } from '@comp/db'; import type { Departments, Member, Role } from '@comp/db/types'; -import { InvitePortalEmail } from '@comp/email/emails/invite-portal'; -import { sendEmail } from '@comp/email/lib/resend'; +import { InvitePortalEmail, sendEmail } from '@comp/email'; import { revalidatePath } from 'next/cache'; if (!env.NEXT_PUBLIC_PORTAL_URL) { diff --git a/apps/app/tsconfig.json b/apps/app/tsconfig.json index 77156da9b..ac9c72315 100644 --- a/apps/app/tsconfig.json +++ b/apps/app/tsconfig.json @@ -19,7 +19,17 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": ["./src/*"], + "@comp/db": ["../../packages/db/src/index.ts"], + "@comp/db/*": ["../../packages/db/src/*"], + "@comp/email": ["../../packages/email/index.ts"], + "@comp/email/*": ["../../packages/email/*"], + "@comp/kv": ["../../packages/kv/src/index.ts"], + "@comp/kv/*": ["../../packages/kv/src/*"], + "@comp/ui": ["../../packages/ui/src/components/index.ts"], + "@comp/ui/*": ["../../packages/ui/src/*"], + "@comp/utils": ["../../packages/utils/src/index.ts"], + "@comp/utils/*": ["../../packages/utils/src/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "trigger.config.ts"], diff --git a/bun.lock b/bun.lock index 65b3ef9f5..b8627efc4 100644 --- a/bun.lock +++ b/bun.lock @@ -17,7 +17,6 @@ "@react-email/render": "^1.1.2", "@semantic-release/changelog": "^6.0.3", "@semantic-release/commit-analyzer": "^13.0.1", - "@semantic-release/exec": "^6.0.3", "@semantic-release/git": "^10.0.1", "@semantic-release/github": "^11.0.3", "@semantic-release/npm": "^12.0.1", @@ -302,7 +301,7 @@ "@comp/tsconfig": "workspace:*", "prisma": "^6.9.0", "ts-node": "^10.9.2", - "tsup": "^8.4.0", + "tsup": "^8.5.0", "typescript": "^5.8.3", }, }, @@ -323,7 +322,7 @@ "devDependencies": { "react": "^19.1.0", "react-dom": "^19.1.0", - "tsup": "^8.4.0", + "tsup": "^8.5.0", "typescript": "^5.8.3", }, "peerDependencies": { @@ -362,7 +361,7 @@ "server-only": "0.0.1", }, "devDependencies": { - "tsup": "^8.4.0", + "tsup": "^8.5.0", "typescript": "^5.8.3", }, }, @@ -452,7 +451,7 @@ "react": "^19.1.0", "react-dom": "^19.1.0", "tailwindcss": "^4.1.8", - "tsup": "^8.4.0", + "tsup": "^8.5.0", "typescript": "^5.8.3", }, "peerDependencies": { @@ -1463,8 +1462,6 @@ "@semantic-release/error": ["@semantic-release/error@3.0.0", "", {}, "sha512-5hiM4Un+tpl4cKw3lV4UgzJj+SmfNIDCLLw0TepzQxz9ZGV5ixnqkzIVF+3tp0ZHgcMKE+VNGHJjEeyFG2dcSw=="], - "@semantic-release/exec": ["@semantic-release/exec@6.0.3", "", { "dependencies": { "@semantic-release/error": "^3.0.0", "aggregate-error": "^3.0.0", "debug": "^4.0.0", "execa": "^5.0.0", "lodash": "^4.17.4", "parse-json": "^5.0.0" }, "peerDependencies": { "semantic-release": ">=18.0.0" } }, "sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ=="], - "@semantic-release/git": ["@semantic-release/git@10.0.1", "", { "dependencies": { "@semantic-release/error": "^3.0.0", "aggregate-error": "^3.0.0", "debug": "^4.0.0", "dir-glob": "^3.0.0", "execa": "^5.0.0", "lodash": "^4.17.4", "micromatch": "^4.0.0", "p-reduce": "^2.0.0" }, "peerDependencies": { "semantic-release": ">=18.0.0" } }, "sha512-eWrx5KguUcU2wUPaO6sfvZI0wPafUKAMNC18aXY4EnNcrZL86dEmpNVnC9uMpGZkmZJ9EfCVJBQx4pV4EMGT1w=="], "@semantic-release/github": ["@semantic-release/github@11.0.3", "", { "dependencies": { "@octokit/core": "^7.0.0", "@octokit/plugin-paginate-rest": "^13.0.0", "@octokit/plugin-retry": "^8.0.0", "@octokit/plugin-throttling": "^11.0.0", "@semantic-release/error": "^4.0.0", "aggregate-error": "^5.0.0", "debug": "^4.3.4", "dir-glob": "^3.0.1", "globby": "^14.0.0", "http-proxy-agent": "^7.0.0", "https-proxy-agent": "^7.0.0", "issue-parser": "^7.0.0", "lodash-es": "^4.17.21", "mime": "^4.0.0", "p-filter": "^4.0.0", "url-join": "^5.0.0" }, "peerDependencies": { "semantic-release": ">=24.1.0" } }, "sha512-T2fKUyFkHHkUNa5XNmcsEcDPuG23hwBKptfUVcFXDVG2cSjXXZYDOfVYwfouqbWo/8UefotLaoGfQeK+k3ep6A=="], @@ -3213,7 +3210,7 @@ "json-parse-better-errors": ["json-parse-better-errors@1.0.2", "", {}, "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw=="], - "json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + "json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], "json-schema": ["json-schema@0.4.0", "", {}, "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA=="], @@ -3731,7 +3728,7 @@ "parse-entities": ["parse-entities@4.0.2", "", { "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" } }, "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw=="], - "parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + "parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], @@ -4813,8 +4810,6 @@ "@npmcli/arborist/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], - "@npmcli/arborist/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], - "@npmcli/arborist/npm-package-arg": ["npm-package-arg@11.0.3", "", { "dependencies": { "hosted-git-info": "^7.0.0", "proc-log": "^4.0.0", "semver": "^7.3.5", "validate-npm-package-name": "^5.0.0" } }, "sha512-sHGJy8sOC1YraBywpzQlIKBE4pBbGbiF95U6Auspzyem956E0+FtDtsx1ZxlOJkQCZ1AFXAY/yuvtFYrOxF+Bw=="], "@npmcli/arborist/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], @@ -4827,16 +4822,12 @@ "@npmcli/map-workspaces/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], - "@npmcli/metavuln-calculator/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], - "@npmcli/metavuln-calculator/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], "@npmcli/package-json/glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="], "@npmcli/package-json/hosted-git-info": ["hosted-git-info@7.0.2", "", { "dependencies": { "lru-cache": "^10.0.1" } }, "sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w=="], - "@npmcli/package-json/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], - "@npmcli/package-json/proc-log": ["proc-log@4.2.0", "", {}, "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA=="], "@npmcli/promise-spawn/which": ["which@4.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg=="], @@ -5051,6 +5042,8 @@ "cosmiconfig/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], + "cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + "crypto-random-string/type-fest": ["type-fest@1.4.0", "", {}, "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA=="], "css-tree/source-map": ["source-map@0.6.1", "", {}, "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="], @@ -5591,8 +5584,6 @@ "pacote/tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], - "parse-conflict-json/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], - "parse-entities/@types/unist": ["@types/unist@2.0.11", "", {}, "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA=="], "parse5-htmlparser2-tree-adapter/parse5": ["parse5@6.0.1", "", {}, "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw=="], @@ -5637,10 +5628,6 @@ "read-cache/pify": ["pify@2.3.0", "", {}, "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog=="], - "read-package-json-fast/json-parse-even-better-errors": ["json-parse-even-better-errors@3.0.2", "", {}, "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ=="], - - "read-pkg/parse-json": ["parse-json@8.3.0", "", { "dependencies": { "@babel/code-frame": "^7.26.2", "index-to-position": "^1.1.0", "type-fest": "^4.39.1" } }, "sha512-ybiGyvspI+fAoRQbIPRddCcSTV9/LsJbf0e/S85VLowVGzRmokfneg2kwVW/KU5rOXrPSbF1qAKPMgNTqqROQQ=="], - "read-pkg/unicorn-magic": ["unicorn-magic@0.1.0", "", {}, "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ=="], "read-yaml-file/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], @@ -5927,6 +5914,8 @@ "are-we-there-yet/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], + "babel-plugin-macros/cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], + "babel-plugin-macros/cosmiconfig/yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], @@ -5955,6 +5944,8 @@ "cosmiconfig/js-yaml/argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], + "cosmiconfig/parse-json/json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + "duplexer2/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "duplexer2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], @@ -6257,6 +6248,8 @@ "@trigger.dev/core/execa/onetime/mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], + "babel-plugin-macros/cosmiconfig/parse-json/json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], + "cacache/tar/fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], "cacache/tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], diff --git a/yarn.lock b/yarn.lock index e32814b95..0f786fcc5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1339,14 +1339,14 @@ "@types/conventional-commits-parser" "^5.0.0" chalk "^5.3.0" -"@comp/analytics@packages/analytics": +"@comp/analytics@^workspace:packages/analytics": version "workspace:packages/analytics" resolved "workspace:packages/analytics" dependencies: posthog-js "^1.236.6" posthog-node "^4.14.0" -"@comp/app@apps/app", "@comp/app@workspace:*": +"@comp/app@^workspace:apps/app", "@comp/app@workspace:*": version "workspace:apps/app" resolved "workspace:apps/app" devDependencies: @@ -1456,25 +1456,26 @@ zaraz-ts "^1.2.0" zustand "^5.0.3" -"@comp/db@packages/db", "@comp/db@workspace:*": +"@comp/db@^workspace:packages/db", "@comp/db@workspace:*": version "workspace:packages/db" resolved "workspace:packages/db" devDependencies: "@comp/tsconfig" "workspace:*" + devDependencies: prisma "^6.9.0" ts-node "^10.9.2" - tsup "^8.4.0" + tsup "^8.5.0" typescript "^5.8.3" dependencies: "@prisma/client" "6.9.0" -"@comp/email@packages/email": +"@comp/email@^workspace:packages/email": version "workspace:packages/email" resolved "workspace:packages/email" devDependencies: react "^19.1.0" react-dom "^19.1.0" - tsup "^8.4.0" + tsup "^8.5.0" typescript "^5.8.3" dependencies: "@comp/ui" "workspace:*" @@ -1488,7 +1489,7 @@ react-email "^4.0.15" responsive-react-email "^0.0.5" -"@comp/framework-editor@apps/framework-editor": +"@comp/framework-editor@^workspace:apps/framework-editor": version "workspace:apps/framework-editor" resolved "workspace:apps/framework-editor" devDependencies: @@ -1518,7 +1519,7 @@ tippy.js "^6.3.7" zod "3.25.67" -"@comp/infra@apps/infra": +"@comp/infra@^workspace:apps/infra": version "workspace:apps/infra" resolved "workspace:apps/infra" devDependencies: @@ -1534,7 +1535,7 @@ "@pulumi/tailscale" "^0.17.0" dotenv "^17.2.0" -"@comp/integrations@packages/integrations": +"@comp/integrations@^workspace:packages/integrations": version "workspace:packages/integrations" resolved "workspace:packages/integrations" devDependencies: @@ -1557,17 +1558,17 @@ stoppable "^1.1.0" zod "3.25.67" -"@comp/kv@packages/kv": +"@comp/kv@^workspace:packages/kv": version "workspace:packages/kv" resolved "workspace:packages/kv" devDependencies: - tsup "^8.4.0" + tsup "^8.5.0" typescript "^5.8.3" dependencies: "@upstash/redis" "^1.34.2" server-only "0.0.1" -"@comp/portal@apps/portal": +"@comp/portal@^workspace:apps/portal": version "workspace:apps/portal" resolved "workspace:apps/portal" devDependencies: @@ -1598,7 +1599,7 @@ next "15.4.0-canary.85" react-email "^4.0.15" -"@comp/trust@apps/trust": +"@comp/trust@^workspace:apps/trust": version "workspace:apps/trust" resolved "workspace:apps/trust" devDependencies: @@ -1620,11 +1621,11 @@ lucide-react "^0.518.0" next "15.4.0-canary.85" -"@comp/tsconfig@packages/tsconfig", "@comp/tsconfig@workspace:*": +"@comp/tsconfig@^workspace:packages/tsconfig", "@comp/tsconfig@workspace:*": version "workspace:packages/tsconfig" resolved "workspace:packages/tsconfig" -"@comp/ui@packages/ui", "@comp/ui@workspace:*": +"@comp/ui@^workspace:packages/ui", "@comp/ui@workspace:*": version "workspace:packages/ui" resolved "workspace:packages/ui" devDependencies: @@ -1635,7 +1636,7 @@ react "^19.1.0" react-dom "^19.1.0" tailwindcss "^4.1.8" - tsup "^8.4.0" + tsup "^8.5.0" typescript "^5.8.3" dependencies: "@radix-ui/react-accordion" "1.2.11" @@ -1708,7 +1709,7 @@ use-debounce "^10.0.4" vaul "^0.9.6" -"@comp/utils@packages/utils", "@comp/utils@workspace:*": +"@comp/utils@^workspace:packages/utils", "@comp/utils@workspace:*": version "workspace:packages/utils" resolved "workspace:packages/utils" devDependencies: @@ -5006,18 +5007,6 @@ resolved "https://registry.npmjs.org/@semantic-release/error/-/error-4.0.0.tgz" integrity sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ== -"@semantic-release/exec@^6.0.3": - version "6.0.3" - resolved "https://registry.npmjs.org/@semantic-release/exec/-/exec-6.0.3.tgz" - integrity sha512-bxAq8vLOw76aV89vxxICecEa8jfaWwYITw6X74zzlO0mc/Bgieqx9kBRz9z96pHectiTAtsCwsQcUyLYWnp3VQ== - dependencies: - debug "^4.0.0" - execa "^5.0.0" - lodash "^4.17.4" - parse-json "^5.0.0" - aggregate-error "^3.0.0" - "@semantic-release/error" "^3.0.0" - "@semantic-release/git@^10.0.1": version "10.0.1" resolved "https://registry.npmjs.org/@semantic-release/git/-/git-10.0.1.tgz" @@ -18162,7 +18151,7 @@ tsscmp@^1.0.6: resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz" integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== -tsup@^8.4.0, tsup@^8.5.0: +tsup@^8.5.0: version "8.5.0" resolved "https://registry.npmjs.org/tsup/-/tsup-8.5.0.tgz" integrity sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ== From 95bb6c9c8c12f6543cfa4e4a3e4862c8471845e6 Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Thu, 24 Jul 2025 17:29:20 -0400 Subject: [PATCH 083/107] fix(auth): rename email parameter for invite function to improve clarity - Changed the parameter name from `email` to `inviteeEmail` in the `sendInviteMemberEmail` function call to enhance code readability and better reflect its purpose. --- apps/app/src/utils/auth.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/app/src/utils/auth.ts b/apps/app/src/utils/auth.ts index 351f29440..f335f212d 100644 --- a/apps/app/src/utils/auth.ts +++ b/apps/app/src/utils/auth.ts @@ -135,7 +135,7 @@ export const auth = betterAuth({ const url = `${protocol}://${domain}/auth`; await sendInviteMemberEmail({ - email: data.email, + inviteeEmail: data.email, inviteLink, organizationName: data.organization.name, }); From da41e909d4beae6ce462dc63a6e3c3edb7058d79 Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Thu, 24 Jul 2025 18:27:02 -0400 Subject: [PATCH 084/107] feat(infra): implement SSL certificate management and DNS validation - Added a new script to check SSL certificate and DNS record statuses, enhancing monitoring capabilities for custom domains. - Introduced modules for SSL certificate creation and DNS output generation, streamlining the process of managing SSL for applications with custom domains. - Updated the infrastructure configuration to support individual load balancers with HTTPS, improving security and routing for applications. - Enhanced application configuration validation to ensure proper hostname formatting and routing setup. - Removed obsolete windsurfrules file to clean up the project structure. --- .windsurfrules | 0 apps/infra/check-domain-status.sh | 56 ++++++++++ apps/infra/index.ts | 146 +++++++++++++------------- apps/infra/modules/app-outputs.ts | 68 ++++++++++++ apps/infra/modules/dns-utils.ts | 159 +++++++++++++++++++++++++++++ apps/infra/modules/loadbalancer.ts | 95 ++++++++++++++--- apps/infra/modules/ssl.ts | 71 +++++++++++++ apps/infra/modules/validation.ts | 18 ++-- apps/infra/types.ts | 8 +- 9 files changed, 522 insertions(+), 99 deletions(-) delete mode 100644 .windsurfrules create mode 100755 apps/infra/check-domain-status.sh create mode 100644 apps/infra/modules/app-outputs.ts create mode 100644 apps/infra/modules/dns-utils.ts create mode 100644 apps/infra/modules/ssl.ts diff --git a/.windsurfrules b/.windsurfrules deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/infra/check-domain-status.sh b/apps/infra/check-domain-status.sh new file mode 100755 index 000000000..19c941ee7 --- /dev/null +++ b/apps/infra/check-domain-status.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +echo "🔍 CHECKING SSL CERTIFICATES & DNS STATUS" +echo "========================================" + +export AWS_PAGER="" + +# Get certificate status +echo "" +echo "📜 SSL Certificate Status:" +aws acm list-certificates --region us-east-1 \ + --query "CertificateSummaryList[?contains(DomainName, 'trycomp.ai')].{Domain:DomainName,Status:Status}" \ + --output table + +echo "" +echo "🌐 DNS Record Status:" + +# Check SSL validation records +echo "" +echo "✅ SSL Validation Records:" +echo " app-aws validation:" +dig _8ffa855be73145a5b11081b41c94a817.app-aws.trycomp.ai CNAME +short || echo " ❌ Not found" + +echo " portal-aws validation:" +dig _eb89d8e153fcd05e3a085a83c16fffea.portal-aws.trycomp.ai CNAME +short || echo " ❌ Not found" + +# Check domain pointing records +echo "" +echo "🎯 Domain Pointing Records:" +echo " app-aws.trycomp.ai:" +APP_RESULT=$(dig app-aws.trycomp.ai CNAME +short) +if [ -z "$APP_RESULT" ]; then + echo " ❌ Not found" +else + echo " ✅ $APP_RESULT" +fi + +echo " portal-aws.trycomp.ai:" +PORTAL_RESULT=$(dig portal-aws.trycomp.ai CNAME +short) +if [ -z "$PORTAL_RESULT" ]; then + echo " ❌ Not found" +else + echo " ✅ $PORTAL_RESULT" +fi + +echo "" +echo "🚀 Next Steps:" +if [ -z "$APP_RESULT" ] || [ -z "$PORTAL_RESULT" ]; then + echo " 1. Add missing CNAME records to your DNS provider" + echo " 2. Run: pulumi stack output allDnsRecords" + echo " 3. Wait 5-10 minutes for certificate validation" + echo " 4. Run: pulumi config set comp-mariano-test:enableHttps true && pulumi up" +else + echo " 🎉 All DNS records are set! Certificates should validate soon." + echo " Run this script again in a few minutes to check validation status." +fi diff --git a/apps/infra/index.ts b/apps/infra/index.ts index e1c774249..4c9670eb5 100644 --- a/apps/infra/index.ts +++ b/apps/infra/index.ts @@ -1,19 +1,22 @@ import * as pulumi from '@pulumi/pulumi'; // import * as tailscale from "@pulumi/tailscale"; // Available for future Tailscale provider usage import * as dotenv from 'dotenv'; +import { createApplicationOutputs } from './modules/app-outputs'; import { createAppSecrets } from './modules/app-secrets'; import { createBuildSystem } from './modules/build'; import { createConfig } from './modules/config'; import { createContainer } from './modules/container'; import { createDatabase } from './modules/database'; +import { createDNSOutputs, createDeploymentInstructions } from './modules/dns-utils'; import { createGithubOidc } from './modules/github-oidc'; import { createLoadBalancers } from './modules/loadbalancer'; import { createMonitoring } from './modules/monitoring'; import { createNetworking } from './modules/networking'; import { createScaling } from './modules/scaling'; +import { createSSLCertificates } from './modules/ssl'; import { createTailscale } from './modules/tailscale'; import { validateApplicationConfigs } from './modules/validation'; -import { ApplicationConfig, ApplicationOutput } from './types'; +import { ApplicationConfig } from './types'; // Load environment variables from .env file dotenv.config(); @@ -31,6 +34,7 @@ const pathfinderConfig = new pulumi.Config(projectName); const enableTailscale = pathfinderConfig.getBoolean('enableTailscale') ?? false; const enableBetterStack = pathfinderConfig.getBoolean('enableBetterStack') ?? false; const enableDetailedMonitoring = pathfinderConfig.getBoolean('enableDetailedMonitoring') ?? false; +const enableHttps = pathfinderConfig.getBoolean('enableHttps') ?? false; // ========================================== // INFRASTRUCTURE CONFIGURATION @@ -44,6 +48,12 @@ const applications: ApplicationConfig[] = [ { name: 'app', containerPort: 3000, + // OPTION 1: Use custom domain (uncomment the routing section below) + routing: { + hostnames: ['app-aws.trycomp.ai'], + }, + // OPTION 2: No routing config = uses ALB DNS directly + // (just comment out the routing section above) healthCheck: { path: '/api/health', interval: 30, @@ -91,6 +101,12 @@ const applications: ApplicationConfig[] = [ { name: 'portal', containerPort: 3001, + // OPTION 1: Use custom domain (uncomment the routing section below) + routing: { + hostnames: ['portal-aws.trycomp.ai'], + }, + // OPTION 2: No routing config = uses ALB DNS directly + // (just comment out the routing section above) healthCheck: { path: '/health', interval: 30, @@ -133,10 +149,19 @@ const database = createDatabase(config, network); // 3. Application Secrets - Per-app secrets const appSecrets = createAppSecrets(config, applications); -// 4. Load Balancing - ALB with Health Checks -const loadBalancers = createLoadBalancers(config, network, applications); +// 4. SSL Certificates - Create certificates for custom domains +const ssl = createSSLCertificates(config, applications); + +// 5. Load Balancing - ALB with Health Checks and SSL +const loadBalancers = createLoadBalancers( + config, + network, + applications, + ssl.certificates, + enableHttps, +); -// 5. Container Platform - Multi-app ECS support +// 6. Container Platform - Multi-app ECS support const container = createContainer( config, applications, @@ -146,10 +171,10 @@ const container = createContainer( appSecrets, ); -// 6. Build System - CodeBuild with VPC Database Access +// 7. Build System - CodeBuild with VPC Database Access const build = createBuildSystem(config, network, database, container, appSecrets); -// 7. Wire up applications +// 8. Wire up applications const deployments = applications.map((app, index) => { const appContainer = container.applications![index]; const appLoadBalancer = loadBalancers.find((lb) => lb.app === app.name)?.loadBalancer; @@ -167,20 +192,20 @@ const deployments = applications.map((app, index) => { }; }); -// 8. Auto-scaling - ECS Service Scaling (pass first load balancer for now) +// 9. Auto-scaling - ECS Service Scaling (pass first load balancer for now) const scaling = createScaling(config, applications, container, loadBalancers[0]?.loadBalancer); -// 9. GitHub OIDC - For GitHub Actions authentication +// 10. GitHub OIDC - For GitHub Actions authentication const githubOidc = createGithubOidc(config); // ========================================== // OPTIONAL INFRASTRUCTURE (FEATURE-GATED) // ========================================== -// 10. Development Access - Tailscale Subnet Router (Optional) +// 11. Development Access - Tailscale Subnet Router (Optional) const tailscale = enableTailscale ? createTailscale(config, network, database) : undefined; -// 11. Observability - Better Stack + CloudWatch (Optional/Configurable) +// 12. Observability - Better Stack + CloudWatch (Optional/Configurable) const appContainers = container.applications?.reduce( (acc, appContainer, index) => { @@ -203,44 +228,26 @@ const monitoring = createMonitoring( ); // ========================================== -// STACK OUTPUTS +// DNS AND DEPLOYMENT OUTPUTS // ========================================== -// Application-specific outputs -export const applicationOutputs = deployments.reduce( - (acc, deployment) => { - const appName = deployment.app.name; - - // Each app now has its own load balancer, so use that directly - const appUrl = deployment.loadBalancer?.applicationUrl || pulumi.output(''); - - acc[appName] = { - url: appUrl, - serviceName: deployment.container.serviceName, - ecrRepository: deployment.container.repositoryUrl, - logGroup: deployment.container.logGroupName, - buildProject: deployment.buildProject.name, - healthCheckUrl: deployment.loadBalancer?.healthCheckUrl || pulumi.output(''), - secrets: appSecrets[deployment.app.name] - ? Object.entries(appSecrets[deployment.app.name]).reduce( - (acc, [secretName, secret]) => { - acc[secretName] = secret.name; - return acc; - }, - {} as Record>, - ) - : undefined, - deployCommand: pulumi.interpolate`aws codebuild start-build --project-name ${deployment.buildProject.name}`, - }; - - return acc; - }, - {} as Record, +// Create consolidated DNS outputs +const dnsOutputs = createDNSOutputs( + applications, + ssl.validationRecords, + loadBalancers, + projectName, + enableHttps, ); +// ========================================== +// STACK OUTPUTS +// ========================================== + +// Application-specific outputs (from utility module) +export const applicationOutputs = createApplicationOutputs(deployments, appSecrets); + // Infrastructure outputs -export const albUrl = - loadBalancers[0]?.loadBalancer?.applicationUrl || pulumi.output('Main app ALB not found'); export const clusterName = container.clusterName; // Database outputs @@ -251,8 +258,25 @@ export const databaseName = database.dbName; export const migrationProjectName = build.migrationProject.name; export const runMigrationsCommand = pulumi.interpolate`aws codebuild start-build --project-name ${build.migrationProject.name}`; -// Tailscale outputs (if enabled) -export const tailscaleEnabled = enableTailscale; +// Monitoring outputs +export const dashboardUrl = monitoring.applicationDashboardUrl; +export const infrastructureDashboardUrl = monitoring.infrastructureDashboardUrl; + +// DNS setup (only if custom domains are configured) +export const allDnsRecords = + ssl.validationRecords.length > 0 ? dnsOutputs.allDnsRecords : undefined; + +// Deployment instructions (from utility module) +export const deploymentInstructions = createDeploymentInstructions( + migrationProjectName, + ssl.validationRecords, + enableHttps, + projectName, + applications, + loadBalancers, +); + +// Tailscale connection guide (only if enabled) export const tailscaleConnectionGuide = enableTailscale ? pulumi.interpolate` # Connect to database through Tailscale: @@ -260,34 +284,4 @@ export const tailscaleConnectionGuide = enableTailscale # 2. Use: postgresql://${database.username}:[PASSWORD]@${database.endpoint}:${database.port}/${database.dbName}?sslmode=require # 3. Get password with: pulumi stack output databasePassword --show-secrets (if stored) ` - : 'Tailscale not enabled'; - -// Monitoring outputs -export const dashboardUrl = monitoring.applicationDashboardUrl; -export const infrastructureDashboardUrl = monitoring.infrastructureDashboardUrl; - -// Deployment instructions -export const deploymentInstructions = pulumi - .all([migrationProjectName, applicationOutputs['app']?.deployCommand || pulumi.output('')]) - .apply( - ([migrationProject, appDeployCmd]) => ` -IMPORTANT: Deployment Order -=========================== -1. FIRST run database migrations (required before any app deployment): - aws codebuild start-build --project-name ${migrationProject} - -2. THEN deploy applications (can be run in parallel): - - App: ${appDeployCmd} - - Portal: aws codebuild start-build --project-name [portal-project-name] - -3. Monitor deployments: - - CodeBuild console for build progress - - ECS console for service updates - - CloudWatch logs for runtime issues - -To update secrets: -1. Go to AWS Secrets Manager -2. Find individual secrets for your app (format: ${projectName}/{appName}/SECRET_NAME) -3. Update each secret value as needed (they are stored as plaintext, not JSON) -`, - ); + : undefined; diff --git a/apps/infra/modules/app-outputs.ts b/apps/infra/modules/app-outputs.ts new file mode 100644 index 000000000..92bdbacb3 --- /dev/null +++ b/apps/infra/modules/app-outputs.ts @@ -0,0 +1,68 @@ +import * as pulumi from '@pulumi/pulumi'; +import { ApplicationOutput } from '../types'; + +export interface AppDeployment { + app: { + name: string; + }; + buildProject: { + name: pulumi.Output; + }; + container: { + serviceName: pulumi.Output; + repositoryUrl: pulumi.Output; + logGroupName: pulumi.Output; + }; + loadBalancer?: { + applicationUrl: pulumi.Output; + healthCheckUrl: pulumi.Output; + }; +} + +export interface AppSecrets { + [appName: string]: { + [secretName: string]: { + name: pulumi.Output; + }; + }; +} + +export function createApplicationOutputs( + deployments: AppDeployment[], + appSecrets: AppSecrets, +): Record { + return deployments.reduce( + (acc, deployment) => { + const appName = deployment.app.name; + + // Each app now has its own load balancer, so use that directly + const appUrl = deployment.loadBalancer?.applicationUrl || pulumi.output(''); + + // Handle secrets mapping safely + const appSecretsForApp = appSecrets[deployment.app.name]; + const secrets = appSecretsForApp + ? Object.entries(appSecretsForApp).reduce( + (acc, [secretName, secret]) => { + acc[secretName] = secret.name; + return acc; + }, + {} as Record>, + ) + : undefined; + + acc[appName] = { + url: appUrl, + serviceName: deployment.container.serviceName, + ecrRepository: deployment.container.repositoryUrl, + logGroup: deployment.container.logGroupName, + buildProject: deployment.buildProject.name, + healthCheckUrl: deployment.loadBalancer?.healthCheckUrl || pulumi.output(''), + secrets, + deployCommand: pulumi.interpolate`aws codebuild start-build --project-name ${deployment.buildProject.name}`, + }; + + return acc; + }, + {} as Record, + ); +} diff --git a/apps/infra/modules/dns-utils.ts b/apps/infra/modules/dns-utils.ts new file mode 100644 index 000000000..7524fb81a --- /dev/null +++ b/apps/infra/modules/dns-utils.ts @@ -0,0 +1,159 @@ +import * as pulumi from '@pulumi/pulumi'; +import { ApplicationConfig } from '../types'; + +export interface SSLValidationRecord { + domain: string; + name: pulumi.Output; + type: pulumi.Output; + value: pulumi.Output; +} + +export interface LoadBalancerInfo { + app: string; + loadBalancer: { + albDnsName: pulumi.Output; + applicationUrl: pulumi.Output; + }; +} + +export interface DNSRecordOutput { + purpose: string; + type: string; + name: string; + value: string; +} + +export function createDNSOutputs( + applications: ApplicationConfig[], + sslValidationRecords: SSLValidationRecord[], + loadBalancers: LoadBalancerInfo[], + projectName: string, + enableHttps: boolean, +) { + // Combined DNS Records - All records you need to create + const allDnsRecords = pulumi + .all([ + sslValidationRecords, + Object.entries( + applications.reduce( + (acc, app) => { + const hostname = app.routing?.hostnames?.[0]; + const loadBalancer = loadBalancers.find((lb) => lb.app === app.name)?.loadBalancer; + + if (hostname && loadBalancer) { + acc[hostname] = loadBalancer.albDnsName; + } + return acc; + }, + {} as Record>, + ), + ), + ]) + .apply(([validationRecords, domainRecords]) => { + const records: DNSRecordOutput[] = []; + + // Add certificate validation records (AWS determines the type - usually CNAME) + validationRecords.forEach((record) => { + records.push({ + purpose: `SSL Certificate Validation for ${record.domain}`, + type: record.type, + name: record.name, + value: record.value, + }); + }); + + // Add domain pointing records + domainRecords.forEach(([hostname, albDns]) => { + records.push({ + purpose: `Domain pointing for ${hostname}`, + type: 'CNAME', + name: hostname, + value: albDns, + }); + }); + + return records; + }); + + return { + allDnsRecords, + }; +} + +export function createDeploymentInstructions( + migrationProjectName: pulumi.Output, + sslValidationRecords: SSLValidationRecord[], + enableHttps: boolean, + projectName: string, + applications: ApplicationConfig[], + loadBalancers: LoadBalancerInfo[], +) { + // Get application URLs directly from load balancers + const applicationUrls = applications.reduce( + (acc, app) => { + const loadBalancer = loadBalancers.find((lb) => lb.app === app.name)?.loadBalancer; + if (loadBalancer) { + acc[app.name] = loadBalancer.applicationUrl; + } + return acc; + }, + {} as Record>, + ); + + return pulumi + .all([ + migrationProjectName, + sslValidationRecords.length > 0 ? 'SSL certificates created' : 'No SSL certificates needed', + enableHttps ? 'HTTPS enabled' : 'HTTPS disabled', + ...Object.values(applicationUrls), + ]) + .apply( + ([migrationProject, sslStatus, httpsStatus, ...urls]) => ` +DEPLOYMENT INSTRUCTIONS +======================= + +${ + sslValidationRecords.length > 0 + ? ` +SIMPLIFIED DEPLOYMENT PROCESS: + +1. DEPLOY: Initial infrastructure (HTTPS disabled) + pulumi up + +2. SETUP DNS: Create ALL required DNS records + pulumi stack output allDnsRecords + + This shows all records you need to create in your DNS provider: + - SSL certificate validation records (type: CNAME) + - Domain pointing records (type: CNAME) + +3. WAIT: 5-10 minutes for certificate validation + +4. ENABLE HTTPS: Update configuration and redeploy + pulumi config set ${projectName}:enableHttps true + pulumi up + +Current Status: ${httpsStatus} + +ALTERNATIVE SINGLE-STEP: +- Set enableHttps=true from the start +- Deploy, setup DNS, wait, deploy again +` + : ` +SIMPLE DEPLOYMENT (No custom domains): +1. Deploy: pulumi up +2. Your apps are ready! +` +} + +Database migrations: aws codebuild start-build --project-name ${migrationProject} +App deployments: Use the buildProject commands from applicationOutputs + +Your applications will be available at: +${applications.map((app, i) => ` - ${app.name}: ${urls[i] || 'pending'}`).join('\n')} + +DNS Setup: + pulumi stack output allDnsRecords # All DNS records needed +`, + ); +} diff --git a/apps/infra/modules/loadbalancer.ts b/apps/infra/modules/loadbalancer.ts index be3db2dd6..1244ffe0d 100644 --- a/apps/infra/modules/loadbalancer.ts +++ b/apps/infra/modules/loadbalancer.ts @@ -1,4 +1,5 @@ import * as aws from '@pulumi/aws'; +import * as pulumi from '@pulumi/pulumi'; import { ApplicationConfig, CommonConfig, NetworkOutputs } from '../types'; // Create individual ALB for each application @@ -6,9 +7,12 @@ export function createApplicationLoadBalancer( config: CommonConfig, network: NetworkOutputs, app: ApplicationConfig, + certificate?: aws.acm.Certificate, + enableHttps?: boolean, ) { const { commonTags } = config; const appName = `${config.projectName}-${app.name}`; + const hasCustomDomain = app.routing?.hostnames && app.routing.hostnames.length > 0; // Create ALB for this specific app const lb = new aws.lb.LoadBalancer(`${appName}-lb`, { @@ -48,17 +52,32 @@ export function createApplicationLoadBalancer( }, }); - // Create HTTP listener - no routing rules needed, direct to target group + // Create HTTP listener + // If HTTPS is enabled and certificates exist: redirect to HTTPS + // Otherwise: serve HTTP directly + const shouldRedirectToHttps = enableHttps && hasCustomDomain && certificate; + const httpListener = new aws.lb.Listener(`${appName}-http-listener`, { loadBalancerArn: lb.arn, port: 80, protocol: 'HTTP', - defaultActions: [ - { - type: 'forward', - targetGroupArn: targetGroup.arn, - }, - ], + defaultActions: shouldRedirectToHttps + ? [ + { + type: 'redirect', + redirect: { + port: '443', + protocol: 'HTTPS', + statusCode: 'HTTP_301', + }, + }, + ] + : [ + { + type: 'forward', + targetGroupArn: targetGroup.arn, + }, + ], tags: { ...commonTags, Name: `${appName}-http-listener`, @@ -67,15 +86,55 @@ export function createApplicationLoadBalancer( }, }); + // Create HTTPS listener only if explicitly enabled + let httpsListener: aws.lb.Listener | undefined; + if (enableHttps && hasCustomDomain && certificate) { + httpsListener = new aws.lb.Listener(`${appName}-https-listener`, { + loadBalancerArn: lb.arn, + port: 443, + protocol: 'HTTPS', + sslPolicy: 'ELBSecurityPolicy-TLS-1-2-2017-01', + certificateArn: certificate.arn, + defaultActions: [ + { + type: 'forward', + targetGroupArn: targetGroup.arn, + }, + ], + tags: { + ...commonTags, + Name: `${appName}-https-listener`, + Type: 'listener', + App: app.name, + }, + }); + } + + // Determine the application URL based on configuration + const applicationUrl = + enableHttps && hasCustomDomain && certificate + ? pulumi.output(`https://${app.routing!.hostnames![0]}`) + : hasCustomDomain + ? pulumi.output(`http://${app.routing!.hostnames![0]}`) + : lb.dnsName.apply((dns) => `http://${dns}`); + + const healthCheckUrl = hasCustomDomain + ? pulumi.output( + `${enableHttps && certificate ? 'https' : 'http'}://${app.routing!.hostnames![0]}${app.healthCheck?.path || '/health'}`, + ) + : lb.dnsName.apply((dns) => `http://${dns}${app.healthCheck?.path || '/health'}`); + return { albArn: lb.arn, albDnsName: lb.dnsName, albZoneId: lb.zoneId, targetGroupArn: targetGroup.arn, - applicationUrl: lb.dnsName.apply((dns) => `http://${dns}`), - healthCheckUrl: lb.dnsName.apply((dns) => `http://${dns}${app.healthCheck?.path || '/health'}`), + applicationUrl, + healthCheckUrl, httpListenerArn: httpListener.arn, - certificateArn: undefined, + httpsListenerArn: httpsListener?.arn, + certificateArn: certificate?.arn, + hasCustomDomain, }; } @@ -84,9 +143,17 @@ export function createLoadBalancers( config: CommonConfig, network: NetworkOutputs, applications: ApplicationConfig[], + certificates?: Record, + enableHttps?: boolean, ) { - return applications.map((app) => ({ - app: app.name, - loadBalancer: createApplicationLoadBalancer(config, network, app), - })); + return applications.map((app) => { + // Find certificate for this app's first hostname (if it has one) + const hostname = app.routing?.hostnames?.[0]; + const certificate = hostname && certificates ? certificates[hostname] : undefined; + + return { + app: app.name, + loadBalancer: createApplicationLoadBalancer(config, network, app, certificate, enableHttps), + }; + }); } diff --git a/apps/infra/modules/ssl.ts b/apps/infra/modules/ssl.ts new file mode 100644 index 000000000..bb5d9a013 --- /dev/null +++ b/apps/infra/modules/ssl.ts @@ -0,0 +1,71 @@ +import * as aws from '@pulumi/aws'; +import * as pulumi from '@pulumi/pulumi'; +import { ApplicationConfig, CommonConfig } from '../types'; + +export interface SSLOutputs { + certificates: Record; + validationRecords: Array<{ + domain: string; + name: pulumi.Output; + type: pulumi.Output; + value: pulumi.Output; + }>; +} + +export function createSSLCertificates( + config: CommonConfig, + applications: ApplicationConfig[], +): SSLOutputs { + // Collect all unique domains that need certificates (only for apps with custom domains) + const domainsNeedingCerts = new Set(); + applications.forEach((app) => { + if (app.routing?.hostnames && app.routing.hostnames.length > 0) { + app.routing.hostnames.forEach((hostname) => { + domainsNeedingCerts.add(hostname); + }); + } + }); + + const certificates: Record = {}; + const validationRecords: Array<{ + domain: string; + name: pulumi.Output; + type: pulumi.Output; + value: pulumi.Output; + }> = []; + + // Only create certificates if we have domains that need them + if (domainsNeedingCerts.size > 0) { + Array.from(domainsNeedingCerts).forEach((domain) => { + // Create certificate + const cert = new aws.acm.Certificate( + `${config.projectName}-cert-${domain.replace(/\./g, '-')}`, + { + domainName: domain, + validationMethod: 'DNS', + tags: { + ...config.commonTags, + Name: `${config.projectName}-cert-${domain}`, + Type: 'ssl-certificate', + Domain: domain, + }, + }, + ); + + certificates[domain] = cert; + + // Store validation record info for manual creation in any DNS provider + validationRecords.push({ + domain, + name: cert.domainValidationOptions.apply((options) => options[0].resourceRecordName), + type: cert.domainValidationOptions.apply((options) => options[0].resourceRecordType), + value: cert.domainValidationOptions.apply((options) => options[0].resourceRecordValue), + }); + }); + } + + return { + certificates, + validationRecords, + }; +} diff --git a/apps/infra/modules/validation.ts b/apps/infra/modules/validation.ts index 62220a652..e60840481 100644 --- a/apps/infra/modules/validation.ts +++ b/apps/infra/modules/validation.ts @@ -42,14 +42,20 @@ export function validateApplicationConfigs(applications: ApplicationConfig[]): v ); } - // Validate routing - must have either path or hostname, not both + // Validate routing - routing is optional, if provided must have hostnames if (app.routing) { - if (app.routing.pathPattern && app.routing.hostnames) { - throw new Error(`App '${app.name}' cannot have both path-based and host-based routing`); - } - if (!app.routing.pathPattern && !app.routing.hostnames) { - throw new Error(`App '${app.name}' must have either pathPattern or hostnames for routing`); + if (!app.routing.hostnames || app.routing.hostnames.length === 0) { + throw new Error(`App '${app.name}' routing must have at least one hostname`); } + + // Validate hostname format + app.routing.hostnames.forEach((hostname) => { + if (!/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(hostname)) { + throw new Error( + `App '${app.name}' has invalid hostname '${hostname}': must be a valid domain name`, + ); + } + }); } // Validate scaling configuration diff --git a/apps/infra/types.ts b/apps/infra/types.ts index 0959252c2..65cca8e43 100644 --- a/apps/infra/types.ts +++ b/apps/infra/types.ts @@ -152,7 +152,10 @@ export interface LoadBalancerOutputs { targetGroupArn: pulumi.Output; applicationUrl: pulumi.Output; healthCheckUrl: pulumi.Output; - certificateArn?: string; + httpListenerArn: pulumi.Output; + httpsListenerArn?: pulumi.Output; + certificateArn?: pulumi.Output; + hasCustomDomain?: boolean; } export interface GithubOidcOutputs { @@ -258,8 +261,7 @@ export interface ApplicationConfig { unhealthyThreshold?: number; }; routing?: { - pathPattern?: string; // e.g., '/portal/*' - hostnames?: string[]; // e.g., ['portal.example.com'] + hostnames?: string[]; // e.g., ['portal.example.com'] - OPTIONAL, if not provided uses ALB DNS }; cpu?: number; memory?: number; From c69f7e5790b6f51ced93517b1476716971f10f7b Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Thu, 24 Jul 2025 18:29:35 -0400 Subject: [PATCH 085/107] chore(infra): remove obsolete infrastructure files and scripts - Deleted unused files including .gitignore, buildspecs, deployment scripts, and various modules to streamline the infrastructure codebase. - Cleaned up the project structure by removing legacy scripts and configuration files that are no longer needed. - This cleanup enhances maintainability and reduces clutter in the infrastructure directory. --- apps/infra/.gitignore | 8 - apps/infra/Pulumi.yaml | 10 - apps/infra/README.md | 97 ----- apps/infra/buildspec-migrations.yml | 43 --- apps/infra/buildspec-template.yml | 41 --- apps/infra/check-domain-status.sh | 56 --- apps/infra/debug_logs.sh | 6 - apps/infra/deploy.sh | 273 --------------- apps/infra/index.ts | 287 --------------- apps/infra/modules/app-outputs.ts | 68 ---- apps/infra/modules/app-secrets.ts | 58 --- apps/infra/modules/build.ts | 385 -------------------- apps/infra/modules/config.ts | 141 -------- apps/infra/modules/container.ts | 364 ------------------- apps/infra/modules/database.ts | 262 -------------- apps/infra/modules/dns-utils.ts | 159 --------- apps/infra/modules/github-oidc.ts | 249 ------------- apps/infra/modules/loadbalancer.ts | 159 --------- apps/infra/modules/monitoring.ts | 525 ---------------------------- apps/infra/modules/networking.ts | 516 --------------------------- apps/infra/modules/scaling.ts | 148 -------- apps/infra/modules/ssl.ts | 71 ---- apps/infra/modules/tailscale.ts | 293 ---------------- apps/infra/modules/validation.ts | 123 ------- apps/infra/package.json | 22 -- apps/infra/run_debug_task.sh | 1 - apps/infra/tsconfig.json | 16 - apps/infra/types.ts | 375 -------------------- 28 files changed, 4756 deletions(-) delete mode 100644 apps/infra/.gitignore delete mode 100644 apps/infra/Pulumi.yaml delete mode 100644 apps/infra/README.md delete mode 100644 apps/infra/buildspec-migrations.yml delete mode 100644 apps/infra/buildspec-template.yml delete mode 100755 apps/infra/check-domain-status.sh delete mode 100644 apps/infra/debug_logs.sh delete mode 100755 apps/infra/deploy.sh delete mode 100644 apps/infra/index.ts delete mode 100644 apps/infra/modules/app-outputs.ts delete mode 100644 apps/infra/modules/app-secrets.ts delete mode 100644 apps/infra/modules/build.ts delete mode 100644 apps/infra/modules/config.ts delete mode 100644 apps/infra/modules/container.ts delete mode 100644 apps/infra/modules/database.ts delete mode 100644 apps/infra/modules/dns-utils.ts delete mode 100644 apps/infra/modules/github-oidc.ts delete mode 100644 apps/infra/modules/loadbalancer.ts delete mode 100644 apps/infra/modules/monitoring.ts delete mode 100644 apps/infra/modules/networking.ts delete mode 100644 apps/infra/modules/scaling.ts delete mode 100644 apps/infra/modules/ssl.ts delete mode 100644 apps/infra/modules/tailscale.ts delete mode 100644 apps/infra/modules/validation.ts delete mode 100644 apps/infra/package.json delete mode 100644 apps/infra/run_debug_task.sh delete mode 100644 apps/infra/tsconfig.json delete mode 100644 apps/infra/types.ts diff --git a/apps/infra/.gitignore b/apps/infra/.gitignore deleted file mode 100644 index 7614bd035..000000000 --- a/apps/infra/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -node_modules/ -bin/ -Pulumi.*.yaml -!Pulumi.yaml -.pulumi/ - -# Debug directory for temporary files -.debug/ diff --git a/apps/infra/Pulumi.yaml b/apps/infra/Pulumi.yaml deleted file mode 100644 index 16cbfb174..000000000 --- a/apps/infra/Pulumi.yaml +++ /dev/null @@ -1,10 +0,0 @@ -name: comp-infra -description: Comp AI Infrastructure -runtime: - name: nodejs - options: - packagemanager: pnpm -config: - pulumi:tags: - value: - pulumi:template: aws-typescript diff --git a/apps/infra/README.md b/apps/infra/README.md deleted file mode 100644 index da383fca1..000000000 --- a/apps/infra/README.md +++ /dev/null @@ -1,97 +0,0 @@ -# Pathfinder Infrastructure - -This directory contains the Pulumi infrastructure code for deploying the Pathfinder app to AWS ECS Fargate. - -## Structure - -The infrastructure is kept separate from the main application to: - -- Keep deployment dependencies isolated from runtime dependencies -- Reduce Docker image size by excluding infrastructure packages -- Allow independent versioning and updates - -## Package Manager - -**Note:** This directory uses `pnpm` instead of Bun because Pulumi doesn't support Bun as a package manager yet. The rest of the monorepo uses Bun. - -## Setup - -1. Install dependencies: - - ```bash - pnpm install - # or from the root directory: - bun run infra:install - ``` - -2. Configure AWS credentials: - - ```bash - export AWS_PROFILE=your-profile - # or - export AWS_ACCESS_KEY_ID=... - export AWS_SECRET_ACCESS_KEY=... - ``` - -3. Deploy: - ```bash - pulumi up - # or from the root directory: - bun run infra:up - ``` - -## Available Commands - -From the root directory: - -- `bun run infra:install` - Install infrastructure dependencies -- `bun run infra:preview` - Preview infrastructure changes -- `bun run infra:up` - Deploy infrastructure -- `bun run infra:destroy` - Destroy infrastructure - -## What Gets Deployed - -- VPC with default configuration -- ECS Cluster -- Fargate Service with: - - 2-10 instances (auto-scaling based on CPU) - - Application Load Balancer - - Docker image built from the root Dockerfile - -## Troubleshooting - -### Docker Build Issues - -If you encounter issues during `pulumi up`: - -1. **"Cannot connect to Docker daemon"** - - ```bash - # Make sure Docker is running - docker ps - ``` - -2. **"No AWS credentials found"** - - ```bash - # Configure AWS credentials - aws configure - # Or use environment variables: - export AWS_ACCESS_KEY_ID=... - export AWS_SECRET_ACCESS_KEY=... - ``` - -3. **"ECR authorization failed"** - - Ensure your AWS user has ECR permissions - - Check AWS region matches your config - -4. **"Platform mismatch" warnings** - - The `platform: "linux/amd64"` ensures compatibility - - Ignore warnings if building on Apple Silicon - -### Deployment Flow - -1. `pulumi up` triggers the build -2. Docker builds the image locally -3. Image is pushed to ECR -4. ECS pulls from ECR when deploying diff --git a/apps/infra/buildspec-migrations.yml b/apps/infra/buildspec-migrations.yml deleted file mode 100644 index 4ee0d9f0e..000000000 --- a/apps/infra/buildspec-migrations.yml +++ /dev/null @@ -1,43 +0,0 @@ -version: 0.2 - -phases: - pre_build: - commands: - - echo "Installing dependencies for migrations..." - - curl -fsSL https://bun.sh/install | bash - - export PATH="/root/.bun/bin:$PATH" - - build: - commands: - # Environment setup - - export PATH="/root/.bun/bin:$PATH" - - export PGSSLMODE=require - - export NODE_TLS_REJECT_UNAUTHORIZED=0 - - # Install dependencies - - echo "Installing dependencies..." - - cd packages/db - - SKIP_ENV_VALIDATION=true bun install --frozen-lockfile || SKIP_ENV_VALIDATION=true bun install - - # Generate Prisma client - - echo "Generating Prisma client..." - - bun x prisma generate - - # Run database migrations - - echo "Running database migrations..." - - 'echo "DATABASE_URL is configured: $([ -n \"$DATABASE_URL\" ] && echo ''YES'' || echo ''NO'')"' - - bun x prisma migrate deploy - - # Verify migration success - - echo "Verifying database schema..." - - bun x prisma db pull --print - - post_build: - commands: - - echo "Database migrations completed successfully on `date`" - -cache: - paths: - - 'node_modules/**/*' - - 'packages/db/node_modules/**/*' - - '/root/.bun/install/cache/**/*' diff --git a/apps/infra/buildspec-template.yml b/apps/infra/buildspec-template.yml deleted file mode 100644 index 5baf8eff7..000000000 --- a/apps/infra/buildspec-template.yml +++ /dev/null @@ -1,41 +0,0 @@ -version: 0.2 - -# Generic buildspec template for Docker-based applications -# This template can be used by any app regardless of language -# Required environment variables: -# - AWS_ACCOUNT_ID: AWS account ID -# - AWS_DEFAULT_REGION: AWS region -# - ECR_REPOSITORY_URI: ECR repository URL for this app -# - ECS_CLUSTER_NAME: ECS cluster name -# - ECS_SERVICE_NAME: ECS service name for this app -# - APP_NAME: Application name -# - DOCKERFILE_PATH: Path to Dockerfile (default: ./Dockerfile) - -phases: - pre_build: - commands: - - echo "Logging in to Amazon ECR..." - - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com - - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - - IMAGE_TAG=${COMMIT_HASH:=latest} - - build: - commands: - - echo "Building Docker image for $APP_NAME..." - - cd apps/$APP_NAME - - docker build --build-arg BUILDKIT_INLINE_CACHE=1 -f ${DOCKERFILE_PATH:-Dockerfile} -t $ECR_REPOSITORY_URI:$IMAGE_TAG . - - docker tag $ECR_REPOSITORY_URI:$IMAGE_TAG $ECR_REPOSITORY_URI:latest - - post_build: - commands: - - echo "Pushing images to ECR..." - - docker push $ECR_REPOSITORY_URI:$IMAGE_TAG - - docker push $ECR_REPOSITORY_URI:latest - - echo "Updating ECS service..." - - aws ecs update-service --cluster $ECS_CLUSTER_NAME --service $ECS_SERVICE_NAME --force-new-deployment - - 'printf "[{\"name\":\"%s-container\",\"imageUri\":\"%s\"}]" $APP_NAME $ECR_REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json' - -artifacts: - files: - - imagedefinitions.json - name: ${APP_NAME}-build diff --git a/apps/infra/check-domain-status.sh b/apps/infra/check-domain-status.sh deleted file mode 100755 index 19c941ee7..000000000 --- a/apps/infra/check-domain-status.sh +++ /dev/null @@ -1,56 +0,0 @@ -#!/bin/bash - -echo "🔍 CHECKING SSL CERTIFICATES & DNS STATUS" -echo "========================================" - -export AWS_PAGER="" - -# Get certificate status -echo "" -echo "📜 SSL Certificate Status:" -aws acm list-certificates --region us-east-1 \ - --query "CertificateSummaryList[?contains(DomainName, 'trycomp.ai')].{Domain:DomainName,Status:Status}" \ - --output table - -echo "" -echo "🌐 DNS Record Status:" - -# Check SSL validation records -echo "" -echo "✅ SSL Validation Records:" -echo " app-aws validation:" -dig _8ffa855be73145a5b11081b41c94a817.app-aws.trycomp.ai CNAME +short || echo " ❌ Not found" - -echo " portal-aws validation:" -dig _eb89d8e153fcd05e3a085a83c16fffea.portal-aws.trycomp.ai CNAME +short || echo " ❌ Not found" - -# Check domain pointing records -echo "" -echo "🎯 Domain Pointing Records:" -echo " app-aws.trycomp.ai:" -APP_RESULT=$(dig app-aws.trycomp.ai CNAME +short) -if [ -z "$APP_RESULT" ]; then - echo " ❌ Not found" -else - echo " ✅ $APP_RESULT" -fi - -echo " portal-aws.trycomp.ai:" -PORTAL_RESULT=$(dig portal-aws.trycomp.ai CNAME +short) -if [ -z "$PORTAL_RESULT" ]; then - echo " ❌ Not found" -else - echo " ✅ $PORTAL_RESULT" -fi - -echo "" -echo "🚀 Next Steps:" -if [ -z "$APP_RESULT" ] || [ -z "$PORTAL_RESULT" ]; then - echo " 1. Add missing CNAME records to your DNS provider" - echo " 2. Run: pulumi stack output allDnsRecords" - echo " 3. Wait 5-10 minutes for certificate validation" - echo " 4. Run: pulumi config set comp-mariano-test:enableHttps true && pulumi up" -else - echo " 🎉 All DNS records are set! Certificates should validate soon." - echo " Run this script again in a few minutes to check validation status." -fi diff --git a/apps/infra/debug_logs.sh b/apps/infra/debug_logs.sh deleted file mode 100644 index 1012ff583..000000000 --- a/apps/infra/debug_logs.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash -echo "=== Getting ECS Log Streams ===" -aws logs describe-log-streams --log-group-name "/aws/ecs/comp-mariano-test" --region us-east-1 --query 'logStreams[0:2].{name:logStreamName,time:lastEventTime}' --output table -echo "" -echo "=== Getting CodeBuild Log Streams ===" -aws logs describe-log-streams --log-group-name "/aws/codebuild/comp-mariano-test-app-build" --region us-east-1 --query 'logStreams[0:2].{name:logStreamName,time:lastEventTime}' --output table diff --git a/apps/infra/deploy.sh b/apps/infra/deploy.sh deleted file mode 100755 index 70d0eb5cb..000000000 --- a/apps/infra/deploy.sh +++ /dev/null @@ -1,273 +0,0 @@ -#!/bin/bash -# Deploy script for applications and database migrations -# This script handles: -# 1. Running database migrations (via CodeBuild) -# 2. Building and deploying applications (via CodeBuild) -# -# Infrastructure updates should be done separately with 'pulumi up' - -set -e - -# Colors for output -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -NC='\033[0m' # No Color - -# Configuration -AWS_REGION=${AWS_REGION:-us-east-1} -PROJECT_NAME=${PROJECT_NAME:-comp} # Base project name, can be overridden -AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query Account --output text 2>/dev/null || echo "") - -# Parse command line arguments -DEPLOY_APP=true -DEPLOY_PORTAL=true -SKIP_MIGRATIONS=false - -while [[ $# -gt 0 ]]; do - case $1 in - --app-only) - DEPLOY_PORTAL=false - shift - ;; - --portal-only) - DEPLOY_APP=false - shift - ;; - --skip-migrations) - SKIP_MIGRATIONS=true - shift - ;; - --help) - echo "Usage: $0 [options]" - echo "Options:" - echo " --app-only Deploy only the main app" - echo " --portal-only Deploy only the portal" - echo " --skip-migrations Skip database migrations (DANGEROUS!)" - echo " --help Show this help message" - exit 0 - ;; - *) - echo "Unknown option: $1" - echo "Run '$0 --help' for usage information" - exit 1 - ;; - esac -done - -# Get the script's directory -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# Determine if we're in the infra directory or project root -if [[ "$SCRIPT_DIR" == *"/apps/infra" ]]; then - # Script is in apps/infra, so we're likely in the right place - INFRA_DIR="$SCRIPT_DIR" - PROJECT_ROOT="$SCRIPT_DIR/../.." -else - # Assume we're in project root - INFRA_DIR="./apps/infra" - PROJECT_ROOT="." -fi - -# Get the current Pulumi stack name to determine environment -cd "$INFRA_DIR" -STACK_NAME=$(pulumi stack --show-name 2>/dev/null || true) -cd "$PROJECT_ROOT" - -# Validate stack name -if [ -z "$STACK_NAME" ]; then - echo -e "${RED}❌ No Pulumi stack selected. Please run 'pulumi stack select' first.${NC}" - exit 1 -fi - -# Extract the environment suffix (e.g., "mariano-test" from "compai/mariano-test") -ENV_NAME=$(echo "$STACK_NAME" | cut -d'/' -f2) - -# Validate environment name -if [ -z "$ENV_NAME" ]; then - echo -e "${RED}❌ Could not determine environment name from stack: $STACK_NAME${NC}" - exit 1 -fi - -# Construct resource names based on environment -PROJECT_PREFIX="${PROJECT_NAME}-${ENV_NAME}" -APP_PROJECT="${PROJECT_PREFIX}-app-build" -PORTAL_PROJECT="${PROJECT_PREFIX}-portal-build" -MIGRATION_PROJECT="${PROJECT_PREFIX}-migrations" - -echo -e "${GREEN}🚀 Starting deployment for environment: ${ENV_NAME}${NC}" -echo -e "${YELLOW}📋 Using resource prefix: ${PROJECT_PREFIX}${NC}" -echo -e "${YELLOW}📋 Migration Project: ${MIGRATION_PROJECT}${NC}" -echo -e "${YELLOW}📋 App CodeBuild Project: ${APP_PROJECT}${NC}" -echo -e "${YELLOW}📋 Portal CodeBuild Project: ${PORTAL_PROJECT}${NC}" -echo -e "${YELLOW}📋 AWS Region: ${AWS_REGION}${NC}" - -# Function to generate CodeBuild console URL -get_codebuild_url() { - local build_id=$1 - # Extract project name from build ID (format: project-name:build-uuid) - local project_name=$(echo "$build_id" | cut -d':' -f1) - # URL encode the build ID (replace : with %3A) - local encoded_build_id=$(echo "$build_id" | sed 's/:/%3A/g') - echo "https://${AWS_REGION}.console.aws.amazon.com/codesuite/codebuild/${AWS_ACCOUNT_ID}/projects/${project_name}/build/${encoded_build_id}/?region=${AWS_REGION}" -} - -# Function to wait for CodeBuild -wait_for_build() { - local build_id=$1 - local project_name=$2 - - echo -e "${YELLOW}⏳ Waiting for $project_name build to complete...${NC}" - - while true; do - status=$(aws codebuild batch-get-builds --ids "$build_id" --query 'builds[0].buildStatus' --output text) - - case $status in - "SUCCEEDED") - echo -e "${GREEN}✅ $project_name build completed successfully${NC}" - return 0 - ;; - "FAILED"|"FAULT"|"STOPPED"|"TIMED_OUT") - echo -e "${RED}❌ $project_name build failed with status: $status${NC}" - return 1 - ;; - "IN_PROGRESS") - echo " Still building..." - sleep 30 - ;; - *) - echo " Status: $status" - sleep 30 - ;; - esac - done -} - -# Step 1: Run Database Migrations (MUST complete before apps) -if [ "$SKIP_MIGRATIONS" = false ]; then - echo -e "${YELLOW}🗃️ Step 1: Running database migrations...${NC}" - migration_build_id=$(aws codebuild start-build \ - --project-name "$MIGRATION_PROJECT" \ - --query 'build.id' --output text) - - echo "Migration build ID: $migration_build_id" - migration_url=$(get_codebuild_url "$migration_build_id") - echo -e "${YELLOW}🔗 View build: ${migration_url}${NC}" - if ! wait_for_build "$migration_build_id" "Database Migrations"; then - echo -e "${RED}❌ Migration failed. Aborting deployment.${NC}" - exit 1 - fi -else - echo -e "${YELLOW}⏭️ Step 1: Skipping database migrations (DANGEROUS!)${NC}" -fi - -# Step 2: Build and Deploy Applications (in parallel) -echo -e "${YELLOW}🔨 Step 2: Building and deploying applications...${NC}" - -# Display what will be deployed -echo -e "${YELLOW}📦 Applications to deploy:${NC}" -if [ "$DEPLOY_APP" = true ]; then - echo -e " - Main App ✓" -else - echo -e " - Main App ✗ (skipped)" -fi -if [ "$DEPLOY_PORTAL" = true ]; then - echo -e " - Portal ✓" -else - echo -e " - Portal ✗ (skipped)" -fi -echo "" - -# Start app build -if [ "$DEPLOY_APP" = true ]; then - echo -e "${YELLOW}🔨 Starting app build...${NC}" - if aws codebuild batch-get-projects --names "$APP_PROJECT" --query 'projects[0].name' --output text &>/dev/null; then - app_build_id=$(aws codebuild start-build \ - --project-name "$APP_PROJECT" \ - --query 'build.id' --output text) - echo "App build ID: $app_build_id" - app_url=$(get_codebuild_url "$app_build_id") - echo -e "${YELLOW}🔗 View app build: ${app_url}${NC}" - else - echo -e "${RED}❌ App CodeBuild project '$APP_PROJECT' does not exist${NC}" - exit 1 - fi -fi - -# Start portal build -portal_build_id="" -if [ "$DEPLOY_PORTAL" = true ]; then - echo -e "${YELLOW}🔨 Starting portal build...${NC}" - if aws codebuild batch-get-projects --names "$PORTAL_PROJECT" --query 'projects[0].name' --output text &>/dev/null; then - portal_build_id=$(aws codebuild start-build \ - --project-name "$PORTAL_PROJECT" \ - --query 'build.id' --output text) - echo "Portal build ID: $portal_build_id" - portal_url=$(get_codebuild_url "$portal_build_id") - echo -e "${YELLOW}🔗 View portal build: ${portal_url}${NC}" - else - echo -e "${RED}❌ Portal CodeBuild project '$PORTAL_PROJECT' does not exist${NC}" - echo -e "${YELLOW}💡 You may need to update your Pulumi configuration to include the portal app${NC}" - exit 1 - fi -fi - -# Display summary of running builds -echo "" -echo -e "${GREEN}📊 Build Summary:${NC}" -if [ "$DEPLOY_APP" = true ] && [ -n "$app_build_id" ]; then - echo -e "${YELLOW} 🔨 App Build:${NC}" - echo -e " ID: $app_build_id" - echo -e " 🔗 ${app_url}" -fi -if [ "$DEPLOY_PORTAL" = true ] && [ -n "$portal_build_id" ]; then - echo -e "${YELLOW} 🔨 Portal Build:${NC}" - echo -e " ID: $portal_build_id" - echo -e " 🔗 ${portal_url}" -fi -echo "" - -# Wait for builds to complete -build_failed=false -if [ "$DEPLOY_APP" = true ] && [ -n "$app_build_id" ]; then - if ! wait_for_build "$app_build_id" "Application"; then - build_failed=true - fi -fi - -if [ "$DEPLOY_PORTAL" = true ] && [ -n "$portal_build_id" ]; then - if ! wait_for_build "$portal_build_id" "Portal"; then - build_failed=true - fi -fi - -if [ "$build_failed" = true ]; then - echo -e "${RED}❌ One or more builds failed. Deployment incomplete.${NC}" - exit 1 -fi - -# Get individual ALB URLs for each app from applicationOutputs -app_url="" -portal_url="" - -if [ "$DEPLOY_APP" = true ]; then - app_url=$(cd "$INFRA_DIR" && pulumi stack output applicationOutputs --json 2>/dev/null | jq -r '.app.url // ""' || echo "") -fi - -if [ "$DEPLOY_PORTAL" = true ]; then - portal_url=$(cd "$INFRA_DIR" && pulumi stack output applicationOutputs --json 2>/dev/null | jq -r '.portal.url // ""' || echo "") -fi - -echo -e "${GREEN}🎉 Build and deployment completed successfully!${NC}" - -if [ "$DEPLOY_APP" = true ] && [ -n "$app_url" ]; then - echo -e "${GREEN}🌐 Application URL: $app_url${NC}" -fi - -if [ "$DEPLOY_PORTAL" = true ] && [ -n "$portal_url" ]; then - echo -e "${GREEN}🏛️ Portal URL: $portal_url${NC}" -fi - -if [ -z "$app_url" ] && [ -z "$portal_url" ]; then - echo -e "${YELLOW}ℹ️ Check Pulumi outputs for application URLs${NC}" -fi \ No newline at end of file diff --git a/apps/infra/index.ts b/apps/infra/index.ts deleted file mode 100644 index 4c9670eb5..000000000 --- a/apps/infra/index.ts +++ /dev/null @@ -1,287 +0,0 @@ -import * as pulumi from '@pulumi/pulumi'; -// import * as tailscale from "@pulumi/tailscale"; // Available for future Tailscale provider usage -import * as dotenv from 'dotenv'; -import { createApplicationOutputs } from './modules/app-outputs'; -import { createAppSecrets } from './modules/app-secrets'; -import { createBuildSystem } from './modules/build'; -import { createConfig } from './modules/config'; -import { createContainer } from './modules/container'; -import { createDatabase } from './modules/database'; -import { createDNSOutputs, createDeploymentInstructions } from './modules/dns-utils'; -import { createGithubOidc } from './modules/github-oidc'; -import { createLoadBalancers } from './modules/loadbalancer'; -import { createMonitoring } from './modules/monitoring'; -import { createNetworking } from './modules/networking'; -import { createScaling } from './modules/scaling'; -import { createSSLCertificates } from './modules/ssl'; -import { createTailscale } from './modules/tailscale'; -import { validateApplicationConfigs } from './modules/validation'; -import { ApplicationConfig } from './types'; - -// Load environment variables from .env file -dotenv.config(); - -if (!process.env.PULUMI_PROJECT_NAME) { - throw new Error('PULUMI_PROJECT_NAME is not set'); -} - -const projectName = process.env.PULUMI_PROJECT_NAME; - -// ========================================== -// FEATURE CONFIGURATION -// ========================================== -const pathfinderConfig = new pulumi.Config(projectName); -const enableTailscale = pathfinderConfig.getBoolean('enableTailscale') ?? false; -const enableBetterStack = pathfinderConfig.getBoolean('enableBetterStack') ?? false; -const enableDetailedMonitoring = pathfinderConfig.getBoolean('enableDetailedMonitoring') ?? false; -const enableHttps = pathfinderConfig.getBoolean('enableHttps') ?? false; - -// ========================================== -// INFRASTRUCTURE CONFIGURATION -// ========================================== -const config = createConfig(projectName); - -// ========================================== -// APPLICATION CONFIGURATIONS -// ========================================== -const applications: ApplicationConfig[] = [ - { - name: 'app', - containerPort: 3000, - // OPTION 1: Use custom domain (uncomment the routing section below) - routing: { - hostnames: ['app-aws.trycomp.ai'], - }, - // OPTION 2: No routing config = uses ALB DNS directly - // (just comment out the routing section above) - healthCheck: { - path: '/api/health', - interval: 30, - timeout: 5, - healthyThreshold: 2, - unhealthyThreshold: 3, - }, - cpu: 256, - memory: 512, - desiredCount: 2, - minCount: 1, - maxCount: 10, - targetCPUPercent: 70, - requiredSecrets: [ - // Core authentication and security - 'AUTH_SECRET', - 'RESEND_API_KEY', // For sending emails, and magic link sign in. - 'REVALIDATION_SECRET', - 'SECRET_KEY', // For encrypting api keys - 'UPSTASH_REDIS_REST_URL', - 'UPSTASH_REDIS_REST_TOKEN', - 'OPENAI_API_KEY', // Used for populating policies with AI - 'TRIGGER_SECRET_KEY', - 'NEXT_PUBLIC_PORTAL_URL', - - // Optional - comment out if not used. - 'AUTH_GOOGLE_ID', - 'AUTH_GOOGLE_SECRET', - 'AUTH_GITHUB_ID', - 'AUTH_GITHUB_SECRET', - 'APP_AWS_BUCKET_NAME', - 'APP_AWS_REGION', - 'APP_AWS_ACCESS_KEY_ID', - 'APP_AWS_SECRET_ACCESS_KEY', - 'DISCORD_WEBHOOK_URL', - 'SLACK_SALES_WEBHOOK', - 'HUBSPOT_ACCESS_TOKEN', - ], - includeDatabaseUrl: true, - environmentVariables: { - NODE_ENV: 'production', - NEXT_TELEMETRY_DISABLED: '1', - }, - }, - { - name: 'portal', - containerPort: 3001, - // OPTION 1: Use custom domain (uncomment the routing section below) - routing: { - hostnames: ['portal-aws.trycomp.ai'], - }, - // OPTION 2: No routing config = uses ALB DNS directly - // (just comment out the routing section above) - healthCheck: { - path: '/health', - interval: 30, - timeout: 5, - healthyThreshold: 2, - unhealthyThreshold: 3, - }, - cpu: 256, - memory: 512, - desiredCount: 1, - minCount: 1, - maxCount: 5, - targetCPUPercent: 70, - requiredSecrets: [ - 'BETTER_AUTH_SECRET', - 'BETTER_AUTH_URL', - 'RESEND_API_KEY', - 'NEXT_PUBLIC_BETTER_AUTH_URL', - ], - includeDatabaseUrl: true, - environmentVariables: { - NODE_ENV: 'production', - }, - }, -]; - -// Validate configurations before creating resources -validateApplicationConfigs(applications); - -// ========================================== -// CORE INFRASTRUCTURE (ALWAYS DEPLOYED) -// ========================================== - -// 1. Foundation Layer - VPC, Subnets, Security Groups -const network = createNetworking(config, applications); - -// 2. Data Layer - Private RDS PostgreSQL -const database = createDatabase(config, network); - -// 3. Application Secrets - Per-app secrets -const appSecrets = createAppSecrets(config, applications); - -// 4. SSL Certificates - Create certificates for custom domains -const ssl = createSSLCertificates(config, applications); - -// 5. Load Balancing - ALB with Health Checks and SSL -const loadBalancers = createLoadBalancers( - config, - network, - applications, - ssl.certificates, - enableHttps, -); - -// 6. Container Platform - Multi-app ECS support -const container = createContainer( - config, - applications, - network, - database, - loadBalancers, - appSecrets, -); - -// 7. Build System - CodeBuild with VPC Database Access -const build = createBuildSystem(config, network, database, container, appSecrets); - -// 8. Wire up applications -const deployments = applications.map((app, index) => { - const appContainer = container.applications![index]; - const appLoadBalancer = loadBalancers.find((lb) => lb.app === app.name)?.loadBalancer; - - // Create build project for this app - const buildProject = build.createApplicationBuildProject(app, appContainer); - - // No routing rules needed with multiple ALBs - - return { - app, - buildProject, - container: appContainer, - loadBalancer: appLoadBalancer, - }; -}); - -// 9. Auto-scaling - ECS Service Scaling (pass first load balancer for now) -const scaling = createScaling(config, applications, container, loadBalancers[0]?.loadBalancer); - -// 10. GitHub OIDC - For GitHub Actions authentication -const githubOidc = createGithubOidc(config); - -// ========================================== -// OPTIONAL INFRASTRUCTURE (FEATURE-GATED) -// ========================================== - -// 11. Development Access - Tailscale Subnet Router (Optional) -const tailscale = enableTailscale ? createTailscale(config, network, database) : undefined; - -// 12. Observability - Better Stack + CloudWatch (Optional/Configurable) -const appContainers = - container.applications?.reduce( - (acc, appContainer, index) => { - acc[applications[index].name] = appContainer; - return acc; - }, - {} as Record, - ) || {}; - -const monitoring = createMonitoring( - config, - applications, - database, - appContainers, - loadBalancers[0]?.loadBalancer, - { - enableBetterStack, - enableDetailedMonitoring, - }, -); - -// ========================================== -// DNS AND DEPLOYMENT OUTPUTS -// ========================================== - -// Create consolidated DNS outputs -const dnsOutputs = createDNSOutputs( - applications, - ssl.validationRecords, - loadBalancers, - projectName, - enableHttps, -); - -// ========================================== -// STACK OUTPUTS -// ========================================== - -// Application-specific outputs (from utility module) -export const applicationOutputs = createApplicationOutputs(deployments, appSecrets); - -// Infrastructure outputs -export const clusterName = container.clusterName; - -// Database outputs -export const databaseEndpoint = database.endpoint; -export const databaseName = database.dbName; - -// Migration outputs -export const migrationProjectName = build.migrationProject.name; -export const runMigrationsCommand = pulumi.interpolate`aws codebuild start-build --project-name ${build.migrationProject.name}`; - -// Monitoring outputs -export const dashboardUrl = monitoring.applicationDashboardUrl; -export const infrastructureDashboardUrl = monitoring.infrastructureDashboardUrl; - -// DNS setup (only if custom domains are configured) -export const allDnsRecords = - ssl.validationRecords.length > 0 ? dnsOutputs.allDnsRecords : undefined; - -// Deployment instructions (from utility module) -export const deploymentInstructions = createDeploymentInstructions( - migrationProjectName, - ssl.validationRecords, - enableHttps, - projectName, - applications, - loadBalancers, -); - -// Tailscale connection guide (only if enabled) -export const tailscaleConnectionGuide = enableTailscale - ? pulumi.interpolate` -# Connect to database through Tailscale: -# 1. Ensure you're connected to Tailscale network -# 2. Use: postgresql://${database.username}:[PASSWORD]@${database.endpoint}:${database.port}/${database.dbName}?sslmode=require -# 3. Get password with: pulumi stack output databasePassword --show-secrets (if stored) -` - : undefined; diff --git a/apps/infra/modules/app-outputs.ts b/apps/infra/modules/app-outputs.ts deleted file mode 100644 index 92bdbacb3..000000000 --- a/apps/infra/modules/app-outputs.ts +++ /dev/null @@ -1,68 +0,0 @@ -import * as pulumi from '@pulumi/pulumi'; -import { ApplicationOutput } from '../types'; - -export interface AppDeployment { - app: { - name: string; - }; - buildProject: { - name: pulumi.Output; - }; - container: { - serviceName: pulumi.Output; - repositoryUrl: pulumi.Output; - logGroupName: pulumi.Output; - }; - loadBalancer?: { - applicationUrl: pulumi.Output; - healthCheckUrl: pulumi.Output; - }; -} - -export interface AppSecrets { - [appName: string]: { - [secretName: string]: { - name: pulumi.Output; - }; - }; -} - -export function createApplicationOutputs( - deployments: AppDeployment[], - appSecrets: AppSecrets, -): Record { - return deployments.reduce( - (acc, deployment) => { - const appName = deployment.app.name; - - // Each app now has its own load balancer, so use that directly - const appUrl = deployment.loadBalancer?.applicationUrl || pulumi.output(''); - - // Handle secrets mapping safely - const appSecretsForApp = appSecrets[deployment.app.name]; - const secrets = appSecretsForApp - ? Object.entries(appSecretsForApp).reduce( - (acc, [secretName, secret]) => { - acc[secretName] = secret.name; - return acc; - }, - {} as Record>, - ) - : undefined; - - acc[appName] = { - url: appUrl, - serviceName: deployment.container.serviceName, - ecrRepository: deployment.container.repositoryUrl, - logGroup: deployment.container.logGroupName, - buildProject: deployment.buildProject.name, - healthCheckUrl: deployment.loadBalancer?.healthCheckUrl || pulumi.output(''), - secrets, - deployCommand: pulumi.interpolate`aws codebuild start-build --project-name ${deployment.buildProject.name}`, - }; - - return acc; - }, - {} as Record, - ); -} diff --git a/apps/infra/modules/app-secrets.ts b/apps/infra/modules/app-secrets.ts deleted file mode 100644 index e43da3fc4..000000000 --- a/apps/infra/modules/app-secrets.ts +++ /dev/null @@ -1,58 +0,0 @@ -import * as aws from '@pulumi/aws'; -import * as pulumi from '@pulumi/pulumi'; -import { ApplicationConfig, CommonConfig } from '../types'; - -export function createAppSecrets(config: CommonConfig, applications: ApplicationConfig[]) { - const { commonTags } = config; - - // Create individual secrets for each application - const appSecrets = applications - .filter((app) => app.requiredSecrets && app.requiredSecrets.length > 0) - .reduce( - (acc, app) => { - const secrets: Record; name: pulumi.Output }> = - {}; - - // Create individual secret for each required secret - app.requiredSecrets!.forEach((secretName) => { - const secret = new aws.secretsmanager.Secret( - `${config.projectName}-${app.name}-${secretName}`, - { - name: `${config.projectName}/${app.name}/${secretName}`, - description: `${secretName} for ${app.name} application`, - tags: { - ...commonTags, - Name: `${config.projectName}-${app.name}-${secretName}`, - Type: 'secret', - App: app.name, - SecretName: secretName, - }, - }, - ); - - // Create secret version with placeholder value - new aws.secretsmanager.SecretVersion( - `${config.projectName}-${app.name}-${secretName}-version`, - { - secretId: secret.id, - secretString: 'PLACEHOLDER', - }, - ); - - secrets[secretName] = { - arn: secret.arn, - name: secret.name, - }; - }); - - acc[app.name] = secrets; - return acc; - }, - {} as Record< - string, - Record; name: pulumi.Output }> - >, - ); - - return appSecrets; -} diff --git a/apps/infra/modules/build.ts b/apps/infra/modules/build.ts deleted file mode 100644 index fe65dc479..000000000 --- a/apps/infra/modules/build.ts +++ /dev/null @@ -1,385 +0,0 @@ -import * as aws from '@pulumi/aws'; -import * as pulumi from '@pulumi/pulumi'; -import { - ApplicationConfig, - CommonConfig, - ContainerOutputs, - DatabaseOutputs, - NetworkOutputs, -} from '../types'; - -export function createBuildSystem( - config: CommonConfig, - network: NetworkOutputs, - database: DatabaseOutputs, - container: ContainerOutputs, - appSecrets?: Record< - string, - Record; name: pulumi.Output }> - >, -) { - const { commonTags } = config; - - // IAM Service Role for CodeBuild - const codebuildRole = new aws.iam.Role(`${config.projectName}-codebuild-role`, { - name: `${config.projectName}-codebuild-role`, - assumeRolePolicy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Action: 'sts:AssumeRole', - Effect: 'Allow', - Principal: { - Service: 'codebuild.amazonaws.com', - }, - }, - ], - }), - tags: { - ...commonTags, - Name: `${config.projectName}-codebuild-role`, - Type: 'iam-role', - }, - }); - - // Collect all secret ARNs from all applications - const allSecretArns = appSecrets - ? Object.values(appSecrets).flatMap((appSecretMap) => - Object.values(appSecretMap).map((secret) => secret.arn), - ) - : []; - - // CodeBuild policy for basic operations - const codebuildPolicy = new aws.iam.RolePolicy(`${config.projectName}-codebuild-policy`, { - role: codebuildRole.id, - policy: pulumi - .all([database.secretArn, pulumi.all(allSecretArns)]) - .apply(([dbSecretArn, secretArns]) => - JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents'], - Resource: 'arn:aws:logs:*:*:*', - }, - { - Effect: 'Allow', - Action: [ - 'ecr:BatchCheckLayerAvailability', - 'ecr:GetDownloadUrlForLayer', - 'ecr:BatchGetImage', - 'ecr:GetAuthorizationToken', - 'ecr:PutImage', - 'ecr:InitiateLayerUpload', - 'ecr:UploadLayerPart', - 'ecr:CompleteLayerUpload', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: [ - 'ec2:CreateNetworkInterface', - 'ec2:DescribeDhcpOptions', - 'ec2:DescribeNetworkInterfaces', - 'ec2:DeleteNetworkInterface', - 'ec2:DescribeSubnets', - 'ec2:DescribeSecurityGroups', - 'ec2:DescribeVpcs', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['ec2:CreateNetworkInterfacePermission'], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], - Resource: [dbSecretArn, ...secretArns], - }, - ], - }), - ), - }); - - // Additional IAM permissions for ECS deployment - const ecsDeployPolicy = new aws.iam.RolePolicy(`${config.projectName}-ecs-deploy-policy`, { - role: codebuildRole.id, - policy: pulumi - .all([container.taskExecutionRoleArn, container.taskRoleArn]) - .apply(([taskExecRoleArn, taskRoleArn]: [string, string]) => - JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 'ecs:UpdateService', - 'ecs:DescribeServices', - 'ecs:DescribeTasks', - 'ecs:DescribeTaskDefinition', - 'ecs:RegisterTaskDefinition', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['iam:PassRole'], - Resource: [taskExecRoleArn, taskRoleArn], - }, - ], - }), - ), - }); - - // Application deployment function - function createApplicationDeployment( - app: { - name: string; - contextPath: string; - requiresDatabaseAccess: boolean; - dependsOnMigrations: boolean; - buildCommand: string; - healthCheckPath: string; - environmentVariables: Record; - resourceRequirements: { cpu: number; memory: number }; - scaling: { - minInstances: number; - maxInstances: number; - targetCpuPercent: number; - }; - }, - database: DatabaseOutputs, - container: ContainerOutputs, - appContainer: { - serviceName: pulumi.Output; - repositoryUrl: pulumi.Output; - repositoryArn: pulumi.Output; - taskDefinitionArn: pulumi.Output; - logGroupName: pulumi.Output; - logGroupArn: pulumi.Output; - targetGroupArn?: pulumi.Output; - }, - ) { - // Return deployment configuration for the application - return { - appName: app.name, - contextPath: app.contextPath, - // Single build command that does everything (migrations + app) - buildCommands: { - // Single step: Run the complete build (migrations + app + deploy) - deployWithMigrations: `aws codebuild start-build --project-name ${config.projectName}-${app.name}-build`, - }, - // Docker image reference - containerImage: pulumi.interpolate`${appContainer.repositoryUrl}:${app.name}-latest`, - healthCheckPath: app.healthCheckPath, - resourceRequirements: app.resourceRequirements, - scaling: app.scaling, - // Build project reference - buildProject: `${config.projectName}-${app.name}-build`, - }; - } - - // Create per-app build project function - function createApplicationBuildProject( - app: ApplicationConfig, - appContainer: { - repositoryUrl: pulumi.Output; - serviceName: pulumi.Output; - targetGroupArn?: pulumi.Output; - }, - ) { - // Default buildspec path is at the app's root directory - const buildspecPath = `apps/${app.name}/buildspec.yml`; - - return new aws.codebuild.Project( - `${config.projectName}-${app.name}-build`, - { - name: `${config.projectName}-${app.name}-build`, - description: `Build ${app.name} Docker image`, - serviceRole: codebuildRole.arn, - artifacts: { - type: 'NO_ARTIFACTS', - }, - environment: { - computeType: 'BUILD_GENERAL1_LARGE', - image: 'aws/codebuild/standard:7.0', - type: 'LINUX_CONTAINER', - privilegedMode: true, - environmentVariables: [ - { - name: 'AWS_ACCOUNT_ID', - value: aws.getCallerIdentityOutput().accountId, - type: 'PLAINTEXT', - }, - { - name: 'APP_NAME', - value: app.name, - type: 'PLAINTEXT', - }, - { - name: 'DOCKERFILE_PATH', - value: './Dockerfile', - type: 'PLAINTEXT', - }, - { - name: 'ECR_REPOSITORY_URI', - value: appContainer.repositoryUrl, - type: 'PLAINTEXT', - }, - { - name: 'ECS_CLUSTER_NAME', - value: container.clusterName, - type: 'PLAINTEXT', - }, - { - name: 'ECS_SERVICE_NAME', - value: appContainer.serviceName, - type: 'PLAINTEXT', - }, - { - name: 'AWS_DEFAULT_REGION', - value: config.awsRegion, - type: 'PLAINTEXT', - }, - // Only add DATABASE_URL if app needs it - ...(app.includeDatabaseUrl - ? [ - { - name: 'DATABASE_URL', - value: pulumi.interpolate`${database.secretArn}:connectionString`, - type: 'SECRETS_MANAGER' as const, - }, - ] - : []), - // Add custom environment variables from app config - ...Object.entries(app.environmentVariables || {}).map(([key, value]) => ({ - name: key, - value, - type: 'PLAINTEXT' as const, - })), - // Add all required secrets from AWS Secrets Manager - ...(app.requiredSecrets && appSecrets?.[app.name] - ? app.requiredSecrets.map((secretName) => ({ - name: secretName, - value: appSecrets[app.name][secretName].arn, - type: 'SECRETS_MANAGER' as const, - })) - : []), - ], - }, - vpcConfig: app.includeDatabaseUrl - ? { - vpcId: network.vpcId, - subnets: network.privateSubnetIds, - securityGroupIds: [network.securityGroups.codeBuild], - } - : undefined, - source: { - type: 'GITHUB', - location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, - buildspec: buildspecPath, - gitCloneDepth: 1, - }, - sourceVersion: config.githubBranch, - tags: { - ...commonTags, - Name: `${config.projectName}-${app.name}-build`, - Type: 'codebuild-project', - App: app.name, - }, - }, - { - dependsOn: [codebuildPolicy, ecsDeployPolicy], - }, - ); - } - - // Create Database Migration Project - function createMigrationProject() { - const migrationProject = new aws.codebuild.Project( - `${config.projectName}-migrations`, - { - name: `${config.projectName}-migrations`, - description: 'Run database migrations before application deployments', - serviceRole: codebuildRole.arn, - artifacts: { - type: 'NO_ARTIFACTS', - }, - source: { - type: 'GITHUB', - location: `https://github.com/${config.githubOrg}/${config.githubRepo}.git`, - buildspec: 'apps/infra/buildspec-migrations.yml', - gitCloneDepth: 1, - gitSubmodulesConfig: { - fetchSubmodules: false, - }, - }, - sourceVersion: config.githubBranch, - cache: { - type: 'LOCAL', - modes: ['LOCAL_DOCKER_LAYER_CACHE', 'LOCAL_SOURCE_CACHE'], - }, - environment: { - type: 'LINUX_CONTAINER', - image: 'aws/codebuild/standard:7.0', - computeType: 'BUILD_GENERAL1_MEDIUM', - privilegedMode: true, - environmentVariables: [ - { - name: 'PROJECT_NAME', - value: config.projectName, - type: 'PLAINTEXT', - }, - { - name: 'DATABASE_URL', - value: pulumi.interpolate`${database.secretArn}:connectionString`, - type: 'SECRETS_MANAGER' as const, - }, - ], - }, - vpcConfig: { - vpcId: network.vpcId, - subnets: [network.privateSubnetIds[0], network.privateSubnetIds[1]], - securityGroupIds: [network.securityGroups.codeBuild], - }, - logsConfig: { - cloudwatchLogs: { - status: 'ENABLED', - groupName: `/aws/codebuild/${config.projectName}-migrations`, - }, - }, - buildBatchConfig: { - serviceRole: codebuildRole.arn, - timeoutInMins: 10, - }, - tags: { - ...commonTags, - Name: `${config.projectName}-migrations`, - Type: 'codebuild-project', - Purpose: 'database-migrations', - }, - }, - { - dependsOn: [codebuildPolicy, ecsDeployPolicy], - }, - ); - - return migrationProject; - } - - const migrationProject = createMigrationProject(); - - return { - codebuildRole, - codebuildRoleArn: codebuildRole.arn, - buildInstanceType: 'BUILD_GENERAL1_2XLARGE', - buildTimeout: 20, - createApplicationDeployment, - createApplicationBuildProject, - migrationProject, - }; -} diff --git a/apps/infra/modules/config.ts b/apps/infra/modules/config.ts deleted file mode 100644 index c37c876ac..000000000 --- a/apps/infra/modules/config.ts +++ /dev/null @@ -1,141 +0,0 @@ -import * as pulumi from '@pulumi/pulumi'; -import * as dotenv from 'dotenv'; -import { CommonConfig } from '../types'; - -// Load environment variables from .env file -dotenv.config(); - -export function createConfig(projectName: string): CommonConfig { - const config = new pulumi.Config(projectName); - const awsConfig = new pulumi.Config('aws'); - - // NODE_ENV check removed for language-agnostic support - - if (!process.env.GITHUB_ORG) { - throw new Error('GITHUB_ORG is not set'); - } - - if (!process.env.GITHUB_REPO) { - throw new Error('GITHUB_REPO is not set'); - } - - if (!process.env.ENABLE_RDS_READ_REPLICAS) { - throw new Error('ENABLE_RDS_READ_REPLICAS is not set'); - } - - if (!process.env.ENABLE_DEBUG_ENDPOINTS) { - throw new Error('ENABLE_DEBUG_ENDPOINTS is not set'); - } - - const stack = pulumi.getStack(); // dev, staging, prod, mariano-test, etc. - const pulumiConfig = new pulumi.Config(projectName); - - // Get AWS region from Pulumi AWS config or environment - const awsRegion = awsConfig.require('region'); - - // Use PULUMI_PROJECT_NAME as the environment identifier for resource naming - const environmentName = process.env.PULUMI_PROJECT_NAME || stack; - - // Use the environment name for resource naming to ensure environment-specific names - const resourcePrefix = `${environmentName}`; - - // Feature flags - const enableTailscale = pulumiConfig.getBoolean('enableTailscale') ?? false; - const enableBetterStack = pulumiConfig.getBoolean('enableBetterStack') ?? false; - // const enableDetailedMonitoring = pulumiConfig.getBoolean('enableDetailedMonitoring') ?? false; - - // Base configuration applicable to all environments - const baseConfig = { - projectName: resourcePrefix, // Use stack-based naming for resources - enableRDSReadReplicas: process.env.ENABLE_RDS_READ_REPLICAS === 'true', - region: awsRegion, - awsRegion: awsRegion, - // nodeEnv removed for language-agnostic support - enableDebugEndpoints: process.env.ENABLE_DEBUG_ENDPOINTS === 'true', - githubOrg: process.env.GITHUB_ORG, - githubRepo: process.env.GITHUB_REPO, - githubBranch: pulumiConfig.get('githubBranch') || process.env.GITHUB_BRANCH || 'main', // Pulumi config takes precedence, then env var, then default - // Database configuration - dbName: process.env.DB_NAME || 'compdb', - dbUsername: process.env.DB_USERNAME || 'compadmin', - commonTags: { - Project: projectName, - Environment: stack, - ManagedBy: 'pulumi', - Owner: 'compai', - CreatedDate: new Date().toISOString().split('T')[0], - }, - }; - - // Environment-specific configurations - const envConfig = { - database: { - instanceClass: 'db.t3.medium', - allocatedStorage: 100, - maxAllocatedStorage: 1000, - deletionProtection: true, - backupRetentionPeriod: 30, - }, - scaling: { - minCapacity: 3, - maxCapacity: 20, - targetCpuUtilization: 50, - }, - tailscale: { - instanceType: 't3.small', - }, - monitoring: { - logRetentionDays: 30, - detailedMonitoring: true, - }, - networking: { - vpcCidr: '10.2.0.0/16', - subnets: { - public: [ - { cidr: '10.2.1.0/24', az: 0 }, - { cidr: '10.2.2.0/24', az: 1 }, - ], - private: [ - { cidr: '10.2.10.0/24', az: 0 }, - { cidr: '10.2.20.0/24', az: 1 }, - ], - }, - }, - security: { - allowedCidrBlocks: ['0.0.0.0/0'], - enableWaf: true, - }, - }; - - return { - ...baseConfig, - // Merge environment-specific config directly - dbInstanceClass: envConfig.database.instanceClass, - dbAllocatedStorage: envConfig.database.allocatedStorage, - dbMaxAllocatedStorage: envConfig.database.maxAllocatedStorage, - dbBackupRetentionPeriod: envConfig.database.backupRetentionPeriod, - dbDeletionProtection: envConfig.database.deletionProtection, - logRetentionDays: envConfig.monitoring.logRetentionDays, - networkConfig: envConfig.networking, - securityConfig: envConfig.security, - - // Load sensitive configuration from Pulumi config (only if features enabled) - tailscale: enableTailscale - ? { - apiKey: new pulumi.Config('tailscale').getSecret('apiKey') || pulumi.output('NOT_SET'), - tailnet: new pulumi.Config('tailscale').get('tailnet') || 'NOT_SET', - authKey: new pulumi.Config('tailscale').getSecret('authKey') || pulumi.output('NOT_SET'), - } - : undefined, - betterStack: enableBetterStack - ? { - entrypoint: - new pulumi.Config('betterstack').getSecret('entrypoint') || pulumi.output('NOT_SET'), - sourceToken: - new pulumi.Config('betterstack').getSecret('sourceToken') || pulumi.output('NOT_SET'), - } - : undefined, - }; -} - -// Removed duplicate feature flags - they're now handled in createConfig() function diff --git a/apps/infra/modules/container.ts b/apps/infra/modules/container.ts deleted file mode 100644 index ae09ae9bd..000000000 --- a/apps/infra/modules/container.ts +++ /dev/null @@ -1,364 +0,0 @@ -import * as aws from '@pulumi/aws'; -import * as pulumi from '@pulumi/pulumi'; -import { - ApplicationConfig, - CommonConfig, - DatabaseOutputs, - LoadBalancerOutputs, - NetworkOutputs, -} from '../types'; - -// Function to create container resources for a single application -export function createApplicationContainer( - config: CommonConfig, - app: ApplicationConfig, - network: NetworkOutputs, - database: DatabaseOutputs, - sharedResources: { - cluster: aws.ecs.Cluster; - taskExecutionRole: aws.iam.Role; - taskRole: aws.iam.Role; - }, - loadBalancer: LoadBalancerOutputs, - appSecrets?: Record; name: pulumi.Output }>, -) { - const { commonTags } = config; - const appName = `${config.projectName}-${app.name}`; - - // App-specific ECR Repository - const repository = new aws.ecr.Repository(`${appName}-repository`, { - name: appName.toLowerCase(), // ECR names must be lowercase - imageTagMutability: 'MUTABLE', - forceDelete: true, // Allow deletion even when images exist - encryptionConfigurations: [ - { - encryptionType: 'AES256', - }, - ], - imageScanningConfiguration: { - scanOnPush: true, - }, - tags: { - ...commonTags, - Name: `${appName}-repository`, - Type: 'ecr-repository', - App: app.name, - }, - }); - - // ECR Lifecycle Policy to manage image retention - const lifecyclePolicy = new aws.ecr.LifecyclePolicy(`${appName}-lifecycle-policy`, { - repository: repository.name, - policy: JSON.stringify({ - rules: [ - { - rulePriority: 1, - description: 'Keep last 10 images', - selection: { - tagStatus: 'any', - countType: 'imageCountMoreThan', - countNumber: 10, - }, - action: { - type: 'expire', - }, - }, - ], - }), - }); - - // App-specific CloudWatch Log Group - const logGroup = new aws.cloudwatch.LogGroup(`${appName}-logs`, { - name: `/ecs/${appName}`, - retentionInDays: 30, - tags: { - ...commonTags, - Name: `${appName}-logs`, - Type: 'cloudwatch-logs', - App: app.name, - }, - }); - - // App-specific Task Definition - const taskDefinition = new aws.ecs.TaskDefinition(`${appName}-task`, { - family: appName, - networkMode: 'awsvpc', - requiresCompatibilities: ['FARGATE'], - cpu: (app.cpu || 256).toString(), - memory: (app.memory || 512).toString(), - executionRoleArn: sharedResources.taskExecutionRole.arn, - taskRoleArn: sharedResources.taskRole.arn, - containerDefinitions: pulumi - .all([ - repository.repositoryUrl, - logGroup.name, - database.secretArn, - // Resolve all secret ARNs - ...(appSecrets && app.requiredSecrets - ? app.requiredSecrets - .filter((secretName) => appSecrets[secretName]) - .map((secretName) => appSecrets[secretName].arn) - : []), - ]) - .apply((values) => { - const [repoUrl, logGroupName, dbSecretArn, ...appSecretArns] = values; - const secrets = []; - - // Add database secret if needed - if (app.includeDatabaseUrl) { - secrets.push({ - name: 'DATABASE_URL', - valueFrom: `${dbSecretArn}:connectionString::`, - }); - } - - // Add app-specific secrets if provided - if (appSecrets && app.requiredSecrets) { - let secretIndex = 0; - app.requiredSecrets.forEach((secretName) => { - if (appSecrets[secretName]) { - secrets.push({ - name: secretName, - valueFrom: appSecretArns[secretIndex], - }); - secretIndex++; - } - }); - } - - return JSON.stringify([ - { - name: `${app.name}-container`, - image: `${repoUrl}:latest`, - essential: true, - portMappings: [ - { - containerPort: app.containerPort, - protocol: 'tcp', - }, - ], - environment: Object.entries(app.environmentVariables || {}).map(([key, value]) => ({ - name: key, - value: value, - })), - secrets, - logConfiguration: { - logDriver: 'awslogs', - options: { - 'awslogs-group': logGroupName, - 'awslogs-region': config.awsRegion, - 'awslogs-stream-prefix': 'ecs', - }, - }, - }, - ]); - }), - tags: { - ...commonTags, - Name: `${appName}-task`, - Type: 'ecs-task-definition', - App: app.name, - }, - }); - - // App-specific ECS Service - const service = new aws.ecs.Service(`${appName}-service`, { - name: appName, - cluster: sharedResources.cluster.id, - taskDefinition: taskDefinition.arn, - desiredCount: app.desiredCount || app.minCount || 1, - launchType: 'FARGATE', - platformVersion: 'LATEST', - networkConfiguration: { - subnets: network.privateSubnetIds, - securityGroups: [network.securityGroups.ecs], - assignPublicIp: false, - }, - enableExecuteCommand: true, - loadBalancers: [ - { - targetGroupArn: loadBalancer.targetGroupArn, - containerName: `${app.name}-container`, - containerPort: app.containerPort, - }, - ], - tags: { - ...commonTags, - Name: `${appName}-service`, - Type: 'ecs-service', - App: app.name, - }, - }); - - return { - serviceName: service.name, - serviceArn: service.id, - service: service, // Return the actual service resource for dependencies - repositoryUrl: repository.repositoryUrl, - repositoryArn: repository.arn, - taskDefinitionArn: taskDefinition.arn, - logGroupName: logGroup.name, - logGroupArn: logGroup.arn, - targetGroupArn: loadBalancer.targetGroupArn, - }; -} - -// Main container function that creates shared resources and calls createApplicationContainer for each app -export function createContainer( - config: CommonConfig, - applications: ApplicationConfig[], - network: NetworkOutputs, - database: DatabaseOutputs, - loadBalancers: Array<{ app: string; loadBalancer: LoadBalancerOutputs }>, - appSecrets?: Record< - string, - Record; name: pulumi.Output }> - >, -) { - const { commonTags } = config; - - // Create shared ECS Cluster - const cluster = new aws.ecs.Cluster(`${config.projectName}-cluster`, { - name: config.projectName, - settings: [ - { - name: 'containerInsights', - value: 'enabled', - }, - ], - tags: { - ...commonTags, - Name: `${config.projectName}-cluster`, - Type: 'ecs-cluster', - }, - }); - - // Create shared IAM roles that all apps can use - const taskExecutionRole = new aws.iam.Role(`${config.projectName}-task-execution-role`, { - name: `${config.projectName}-ecs-task-execution-role`, - assumeRolePolicy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Action: 'sts:AssumeRole', - Effect: 'Allow', - Principal: { - Service: 'ecs-tasks.amazonaws.com', - }, - }, - ], - }), - tags: { - ...commonTags, - Name: `${config.projectName}-task-execution-role`, - Type: 'iam-role', - }, - }); - - // Attach the ECS task execution role policy - const taskExecutionRolePolicyAttachment = new aws.iam.RolePolicyAttachment( - `${config.projectName}-task-execution-role-policy`, - { - role: taskExecutionRole.name, - policyArn: 'arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy', - }, - ); - - // Collect all secret ARNs from all applications - const allAppSecretArns = appSecrets - ? Object.values(appSecrets).flatMap((appSecretMap) => - Object.values(appSecretMap).map((secret) => secret.arn), - ) - : []; - - // Add policy for Secrets Manager access to task execution role - const taskExecutionSecretsPolicy = new aws.iam.RolePolicy( - `${config.projectName}-task-execution-secrets-policy`, - { - role: taskExecutionRole.id, - policy: pulumi - .all([database.secretArn, ...allAppSecretArns]) - .apply(([dbSecretArn, ...secretArns]) => - JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], - Resource: [dbSecretArn, ...secretArns], - }, - ], - }), - ), - }, - ); - - // ECS Task Role for application permissions - const taskRole = new aws.iam.Role(`${config.projectName}-task-role`, { - name: `${config.projectName}-ecs-task-role`, - assumeRolePolicy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Action: 'sts:AssumeRole', - Effect: 'Allow', - Principal: { - Service: 'ecs-tasks.amazonaws.com', - }, - }, - ], - }), - tags: { - ...commonTags, - Name: `${config.projectName}-task-role`, - Type: 'iam-role', - }, - }); - - // Task Role Policy for application access - const taskRolePolicy = new aws.iam.RolePolicy(`${config.projectName}-task-role-policy`, { - role: taskRole.id, - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['logs:CreateLogStream', 'logs:PutLogEvents'], - Resource: '*', - }, - ], - }), - }); - - // Create application-specific resources - const appContainers = applications.map((app) => { - const appLoadBalancer = loadBalancers.find((lb) => lb.app === app.name); - if (!appLoadBalancer) { - throw new Error(`No load balancer found for app: ${app.name}`); - } - - return createApplicationContainer( - config, - app, - network, - database, - { cluster, taskExecutionRole, taskRole }, - appLoadBalancer.loadBalancer, - appSecrets?.[app.name], - ); - }); - - // Return shared resources and app-specific resources - return { - clusterName: cluster.name, - clusterArn: cluster.arn, - taskExecutionRoleArn: taskExecutionRole.arn, - taskRoleArn: taskRole.arn, - applications: appContainers, - }; -} diff --git a/apps/infra/modules/database.ts b/apps/infra/modules/database.ts deleted file mode 100644 index 10127e058..000000000 --- a/apps/infra/modules/database.ts +++ /dev/null @@ -1,262 +0,0 @@ -import * as aws from '@pulumi/aws'; -import * as pulumi from '@pulumi/pulumi'; -import * as random from '@pulumi/random'; -import { CommonConfig, NetworkOutputs } from '../types'; - -export function createDatabase(config: CommonConfig, network: NetworkOutputs) { - const { commonTags } = config; - - // Generate a secure random password for the database (alphanumeric only - no special chars) - const dbPassword = new random.RandomPassword(`${config.projectName}-db-password`, { - length: 32, - special: false, - upper: true, - lower: true, - numeric: true, - // No override needed - upper/lower/numeric gives us alphanumeric - }); - - // Create AWS Secret for database credentials (will be populated after RDS instance is created) - const dbSecret = new aws.secretsmanager.Secret(`${config.projectName}-db-secret`, { - // Use a unique name to avoid conflicts with deleted secrets - namePrefix: `${config.projectName}/database/master-password-`, - description: 'Complete DATABASE_URL for PostgreSQL database', - tags: { - ...commonTags, - Name: `${config.projectName}-db-secret`, - Type: 'secret', - }, - }); - - // Database subnet group in private subnets only - const dbSubnetGroup = new aws.rds.SubnetGroup(`${config.projectName}-db-subnet-group`, { - subnetIds: network.privateSubnetIds, - description: 'Subnet group for private database access', - tags: { - ...commonTags, - Name: `${config.projectName}-db-subnet-group`, - Type: 'db-subnet-group', - }, - }); - - // Enhanced monitoring role for RDS - const enhancedMonitoringRole = new aws.iam.Role(`${config.projectName}-rds-monitoring-role`, { - assumeRolePolicy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Action: 'sts:AssumeRole', - Effect: 'Allow', - Principal: { - Service: 'monitoring.rds.amazonaws.com', - }, - }, - ], - }), - tags: { - ...commonTags, - Name: `${config.projectName}-rds-monitoring-role`, - Type: 'iam-role', - }, - }); - - const enhancedMonitoringRoleAttachment = new aws.iam.RolePolicyAttachment( - `${config.projectName}-rds-monitoring-policy`, - { - role: enhancedMonitoringRole.name, - policyArn: 'arn:aws:iam::aws:policy/service-role/AmazonRDSEnhancedMonitoringRole', - }, - ); - - // DB parameter group for PostgreSQL optimization - const dbParameterGroup = new aws.rds.ParameterGroup(`${config.projectName}-db-params`, { - family: 'postgres15', - description: 'Custom parameter group for PostgreSQL database', - parameters: [ - { - name: 'shared_preload_libraries', - value: 'pg_stat_statements', - }, - { - name: 'log_statement', - value: 'all', - }, - { - name: 'log_min_duration_statement', - value: '1000', - }, - ], - tags: { - ...commonTags, - Name: `${config.projectName}-db-params`, - Type: 'db-parameter-group', - }, - }); - - // Primary RDS instance in private subnets - const dbInstance = new aws.rds.Instance(`${config.projectName}-database-v2`, { - engine: 'postgres', - engineVersion: '15.8', - instanceClass: config.dbInstanceClass || 'db.t3.micro', - allocatedStorage: config.dbAllocatedStorage || 20, - maxAllocatedStorage: config.dbMaxAllocatedStorage || 100, - storageType: 'gp3', - storageEncrypted: true, - - dbName: config.dbName, - username: config.dbUsername, - password: dbPassword.result, - - vpcSecurityGroupIds: [network.securityGroups.database], - dbSubnetGroupName: dbSubnetGroup.name, - parameterGroupName: dbParameterGroup.name, - - publiclyAccessible: false, - multiAz: false, - - backupRetentionPeriod: config.dbBackupRetentionPeriod || 7, - backupWindow: '03:00-04:00', - maintenanceWindow: 'Sun:04:00-Sun:05:00', - - deletionProtection: config.dbDeletionProtection || true, - skipFinalSnapshot: !config.dbDeletionProtection, - finalSnapshotIdentifier: config.dbDeletionProtection - ? `${config.projectName}-final-snapshot` - : undefined, - - monitoringInterval: 60, - monitoringRoleArn: enhancedMonitoringRole.arn, - enabledCloudwatchLogsExports: ['postgresql'], - - performanceInsightsEnabled: true, - performanceInsightsRetentionPeriod: 7, - - tags: { - ...commonTags, - Name: `${config.projectName}-database`, - Type: 'rds-instance', - }, - }); - - // Store the complete DATABASE_URL in the secret after instance is created - const dbSecretVersion = new aws.secretsmanager.SecretVersion( - `${config.projectName}-db-secret-version`, - { - secretId: dbSecret.id, - secretString: pulumi - .all([ - dbInstance.endpoint, - dbInstance.username, - dbInstance.dbName, - dbPassword.result, - dbInstance.port, - ]) - .apply(([endpoint, username, dbName, password, port]) => - JSON.stringify({ - connectionString: `postgresql://${username}:${password}@${endpoint}/${dbName}?sslmode=require`, - }), - ), - }, - ); - - // Read replica for production environment - const readReplica = config.enableRDSReadReplicas - ? new aws.rds.Instance(`${config.projectName}-db-read-replica`, { - replicateSourceDb: dbInstance.id, - instanceClass: config.dbInstanceClass || 'db.t3.micro', - publiclyAccessible: false, - - monitoringInterval: 60, - monitoringRoleArn: enhancedMonitoringRole.arn, - - tags: { - ...commonTags, - Name: `${config.projectName}-db-read-replica`, - Type: 'rds-read-replica', - }, - }) - : undefined; - - // CloudWatch log group for database logs - const dbLogGroup = new aws.cloudwatch.LogGroup(`${config.projectName}-db-logs`, { - name: pulumi.interpolate`/aws/rds/instance/${dbInstance.id}/postgresql`, - retentionInDays: config.logRetentionDays || 14, - tags: { - ...commonTags, - Name: `${config.projectName}-db-logs`, - Type: 'log-group', - }, - }); - - // Database connection alarms - const dbConnectionAlarm = new aws.cloudwatch.MetricAlarm( - `${config.projectName}-db-connection-alarm`, - { - name: `${config.projectName}-database-high-connections`, - comparisonOperator: 'GreaterThanThreshold', - evaluationPeriods: 2, - metricName: 'DatabaseConnections', - namespace: 'AWS/RDS', - period: 300, - statistic: 'Average', - threshold: 40, - treatMissingData: 'notBreaching', - dimensions: { - DBInstanceIdentifier: dbInstance.id, - }, - tags: { - ...commonTags, - Name: `${config.projectName}-db-connection-alarm`, - Type: 'cloudwatch-alarm', - }, - }, - ); - - const dbCpuAlarm = new aws.cloudwatch.MetricAlarm(`${config.projectName}-db-cpu-alarm`, { - name: `${config.projectName}-database-high-cpu`, - comparisonOperator: 'GreaterThanThreshold', - evaluationPeriods: 3, - metricName: 'CPUUtilization', - namespace: 'AWS/RDS', - period: 300, - statistic: 'Average', - threshold: 80, - treatMissingData: 'notBreaching', - dimensions: { - DBInstanceIdentifier: dbInstance.id, - }, - tags: { - ...commonTags, - Name: `${config.projectName}-db-cpu-alarm`, - Type: 'cloudwatch-alarm', - }, - }); - - // Return database outputs - return { - instanceId: dbInstance.id, - endpoint: dbInstance.endpoint, - port: dbInstance.port, - dbName: dbInstance.dbName, - username: dbInstance.username, - password: dbPassword.result, - secretArn: dbSecret.arn, - secretId: dbSecret.id, - connectionString: pulumi - .all([ - dbInstance.username, - dbPassword.result, - dbInstance.endpoint, - dbInstance.port, - dbInstance.dbName, - ]) - .apply( - ([username, password, endpoint, port, dbName]) => - `postgresql://${username}:${password}@${endpoint}/${dbName}?sslmode=require`, - ), - readReplicaEndpoint: readReplica?.endpoint, - logGroupName: dbLogGroup.name, - connectionAlarmArn: dbConnectionAlarm.arn, - cpuAlarmArn: dbCpuAlarm.arn, - }; -} diff --git a/apps/infra/modules/dns-utils.ts b/apps/infra/modules/dns-utils.ts deleted file mode 100644 index 7524fb81a..000000000 --- a/apps/infra/modules/dns-utils.ts +++ /dev/null @@ -1,159 +0,0 @@ -import * as pulumi from '@pulumi/pulumi'; -import { ApplicationConfig } from '../types'; - -export interface SSLValidationRecord { - domain: string; - name: pulumi.Output; - type: pulumi.Output; - value: pulumi.Output; -} - -export interface LoadBalancerInfo { - app: string; - loadBalancer: { - albDnsName: pulumi.Output; - applicationUrl: pulumi.Output; - }; -} - -export interface DNSRecordOutput { - purpose: string; - type: string; - name: string; - value: string; -} - -export function createDNSOutputs( - applications: ApplicationConfig[], - sslValidationRecords: SSLValidationRecord[], - loadBalancers: LoadBalancerInfo[], - projectName: string, - enableHttps: boolean, -) { - // Combined DNS Records - All records you need to create - const allDnsRecords = pulumi - .all([ - sslValidationRecords, - Object.entries( - applications.reduce( - (acc, app) => { - const hostname = app.routing?.hostnames?.[0]; - const loadBalancer = loadBalancers.find((lb) => lb.app === app.name)?.loadBalancer; - - if (hostname && loadBalancer) { - acc[hostname] = loadBalancer.albDnsName; - } - return acc; - }, - {} as Record>, - ), - ), - ]) - .apply(([validationRecords, domainRecords]) => { - const records: DNSRecordOutput[] = []; - - // Add certificate validation records (AWS determines the type - usually CNAME) - validationRecords.forEach((record) => { - records.push({ - purpose: `SSL Certificate Validation for ${record.domain}`, - type: record.type, - name: record.name, - value: record.value, - }); - }); - - // Add domain pointing records - domainRecords.forEach(([hostname, albDns]) => { - records.push({ - purpose: `Domain pointing for ${hostname}`, - type: 'CNAME', - name: hostname, - value: albDns, - }); - }); - - return records; - }); - - return { - allDnsRecords, - }; -} - -export function createDeploymentInstructions( - migrationProjectName: pulumi.Output, - sslValidationRecords: SSLValidationRecord[], - enableHttps: boolean, - projectName: string, - applications: ApplicationConfig[], - loadBalancers: LoadBalancerInfo[], -) { - // Get application URLs directly from load balancers - const applicationUrls = applications.reduce( - (acc, app) => { - const loadBalancer = loadBalancers.find((lb) => lb.app === app.name)?.loadBalancer; - if (loadBalancer) { - acc[app.name] = loadBalancer.applicationUrl; - } - return acc; - }, - {} as Record>, - ); - - return pulumi - .all([ - migrationProjectName, - sslValidationRecords.length > 0 ? 'SSL certificates created' : 'No SSL certificates needed', - enableHttps ? 'HTTPS enabled' : 'HTTPS disabled', - ...Object.values(applicationUrls), - ]) - .apply( - ([migrationProject, sslStatus, httpsStatus, ...urls]) => ` -DEPLOYMENT INSTRUCTIONS -======================= - -${ - sslValidationRecords.length > 0 - ? ` -SIMPLIFIED DEPLOYMENT PROCESS: - -1. DEPLOY: Initial infrastructure (HTTPS disabled) - pulumi up - -2. SETUP DNS: Create ALL required DNS records - pulumi stack output allDnsRecords - - This shows all records you need to create in your DNS provider: - - SSL certificate validation records (type: CNAME) - - Domain pointing records (type: CNAME) - -3. WAIT: 5-10 minutes for certificate validation - -4. ENABLE HTTPS: Update configuration and redeploy - pulumi config set ${projectName}:enableHttps true - pulumi up - -Current Status: ${httpsStatus} - -ALTERNATIVE SINGLE-STEP: -- Set enableHttps=true from the start -- Deploy, setup DNS, wait, deploy again -` - : ` -SIMPLE DEPLOYMENT (No custom domains): -1. Deploy: pulumi up -2. Your apps are ready! -` -} - -Database migrations: aws codebuild start-build --project-name ${migrationProject} -App deployments: Use the buildProject commands from applicationOutputs - -Your applications will be available at: -${applications.map((app, i) => ` - ${app.name}: ${urls[i] || 'pending'}`).join('\n')} - -DNS Setup: - pulumi stack output allDnsRecords # All DNS records needed -`, - ); -} diff --git a/apps/infra/modules/github-oidc.ts b/apps/infra/modules/github-oidc.ts deleted file mode 100644 index 63a4778e4..000000000 --- a/apps/infra/modules/github-oidc.ts +++ /dev/null @@ -1,249 +0,0 @@ -import * as aws from '@pulumi/aws'; -import { CommonConfig } from '../types'; - -export function createGithubOidc(config: CommonConfig) { - const { commonTags } = config; - - // GitHub OIDC provider - matches the imported resource from AWS - const githubOidcUrl = 'https://token.actions.githubusercontent.com'; - - // Create OIDC provider (will use imported state if already imported) - const githubOidcProvider = new aws.iam.OpenIdConnectProvider( - 'github-actions-oidc-provider', - { - url: githubOidcUrl, - clientIdLists: ['sts.amazonaws.com'], - thumbprintLists: [ - '6938fd4d98bab03faadb97b34396831e3780aea1', // GitHub Actions OIDC thumbprint - '1c58a3a8518e8759bf075b76b750d4f2df264fcd', // Backup thumbprint - ], - tags: { - ...commonTags, - Name: 'github-actions-oidc-provider', - Type: 'oidc-provider', - Purpose: 'github-actions-authentication', - }, - }, - { - protect: true, // Protect from accidental deletion since it's shared across stacks - }, - ); - - // Deployment Role for GitHub Actions (read-write access) - const deploymentRole = new aws.iam.Role(`${config.projectName}-github-deployment-role`, { - name: `${config.projectName}-github-deployment-role`, - assumeRolePolicy: githubOidcProvider.arn.apply((providerArn) => - JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { - Federated: providerArn, - }, - Action: 'sts:AssumeRoleWithWebIdentity', - Condition: { - StringEquals: { - 'token.actions.githubusercontent.com:aud': 'sts.amazonaws.com', - }, - StringLike: { - 'token.actions.githubusercontent.com:sub': `repo:${config.githubOrg}/${config.githubRepo}:*`, - }, - }, - }, - ], - }), - ), - tags: { - ...commonTags, - Name: `${config.projectName}-github-deployment-role`, - Type: 'iam-role', - Purpose: 'github-deployment', - }, - }); - - // Build Role for GitHub Actions (CodeBuild access) - const buildRole = new aws.iam.Role(`${config.projectName}-github-build-role`, { - name: `${config.projectName}-github-build-role`, - assumeRolePolicy: githubOidcProvider.arn.apply((providerArn) => - JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { - Federated: providerArn, - }, - Action: 'sts:AssumeRoleWithWebIdentity', - Condition: { - StringEquals: { - 'token.actions.githubusercontent.com:aud': 'sts.amazonaws.com', - }, - StringLike: { - 'token.actions.githubusercontent.com:sub': `repo:${config.githubOrg}/${config.githubRepo}:*`, - }, - }, - }, - ], - }), - ), - tags: { - ...commonTags, - Name: `${config.projectName}-github-build-role`, - Type: 'iam-role', - Purpose: 'github-build', - }, - }); - - // Read-only Role for GitHub Actions (status checks, etc.) - const readOnlyRole = new aws.iam.Role(`${config.projectName}-github-readonly-role`, { - name: `${config.projectName}-github-readonly-role`, - assumeRolePolicy: githubOidcProvider.arn.apply((providerArn) => - JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Principal: { - Federated: providerArn, - }, - Action: 'sts:AssumeRoleWithWebIdentity', - Condition: { - StringEquals: { - 'token.actions.githubusercontent.com:aud': 'sts.amazonaws.com', - }, - StringLike: { - 'token.actions.githubusercontent.com:sub': `repo:${config.githubOrg}/${config.githubRepo}:*`, - }, - }, - }, - ], - }), - ), - tags: { - ...commonTags, - Name: `${config.projectName}-github-readonly-role`, - Type: 'iam-role', - Purpose: 'github-readonly', - }, - }); - - // Deployment Role Policies - const deploymentRolePolicy = new aws.iam.RolePolicy( - `${config.projectName}-github-deployment-policy`, - { - role: deploymentRole.id, - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 'ecs:UpdateService', - 'ecs:DescribeServices', - 'ecs:DescribeTasks', - 'ecs:DescribeTaskDefinition', - 'ecs:RegisterTaskDefinition', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: [ - 'ecr:GetAuthorizationToken', - 'ecr:BatchCheckLayerAvailability', - 'ecr:GetDownloadUrlForLayer', - 'ecr:BatchGetImage', - 'ecr:PutImage', - 'ecr:InitiateLayerUpload', - 'ecr:UploadLayerPart', - 'ecr:CompleteLayerUpload', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: [ - 'logs:CreateLogGroup', - 'logs:CreateLogStream', - 'logs:PutLogEvents', - 'logs:DescribeLogGroups', - 'logs:DescribeLogStreams', - ], - Resource: '*', - }, - ], - }), - }, - ); - - // Build Role Policies - const buildRolePolicy = new aws.iam.RolePolicy(`${config.projectName}-github-build-policy`, { - role: buildRole.id, - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 'codebuild:StartBuild', - 'codebuild:BatchGetBuilds', - 'codebuild:BatchGetProjects', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['logs:GetLogEvents', 'logs:DescribeLogGroups', 'logs:DescribeLogStreams'], - Resource: '*', - }, - ], - }), - }); - - // Read-only Role Policies - const readOnlyRolePolicy = new aws.iam.RolePolicy( - `${config.projectName}-github-readonly-policy`, - { - role: readOnlyRole.id, - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: [ - 'ecs:DescribeServices', - 'ecs:DescribeTasks', - 'ecs:DescribeTaskDefinition', - 'ecs:ListTasks', - 'ecs:ListServices', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: [ - 'cloudwatch:GetMetricStatistics', - 'cloudwatch:DescribeAlarms', - 'cloudwatch:GetDashboard', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['logs:DescribeLogGroups', 'logs:DescribeLogStreams', 'logs:GetLogEvents'], - Resource: '*', - }, - ], - }), - }, - ); - - return { - providerArn: githubOidcProvider.arn, - providerUrl: githubOidcProvider.url, - deploymentRoleArn: deploymentRole.arn, - buildRoleArn: buildRole.arn, - readOnlyRoleArn: readOnlyRole.arn, - }; -} diff --git a/apps/infra/modules/loadbalancer.ts b/apps/infra/modules/loadbalancer.ts deleted file mode 100644 index 1244ffe0d..000000000 --- a/apps/infra/modules/loadbalancer.ts +++ /dev/null @@ -1,159 +0,0 @@ -import * as aws from '@pulumi/aws'; -import * as pulumi from '@pulumi/pulumi'; -import { ApplicationConfig, CommonConfig, NetworkOutputs } from '../types'; - -// Create individual ALB for each application -export function createApplicationLoadBalancer( - config: CommonConfig, - network: NetworkOutputs, - app: ApplicationConfig, - certificate?: aws.acm.Certificate, - enableHttps?: boolean, -) { - const { commonTags } = config; - const appName = `${config.projectName}-${app.name}`; - const hasCustomDomain = app.routing?.hostnames && app.routing.hostnames.length > 0; - - // Create ALB for this specific app - const lb = new aws.lb.LoadBalancer(`${appName}-lb`, { - name: `${appName}-lb`.substring(0, 32), // AWS limit - loadBalancerType: 'application', - subnets: network.publicSubnetIds, - securityGroups: [network.securityGroups.alb], - tags: { - ...commonTags, - Name: `${appName}-lb`, - Type: 'application-load-balancer', - App: app.name, - }, - }); - - // Create target group for this app - const targetGroup = new aws.lb.TargetGroup(`${appName}-tg-v2`, { - name: `${appName}-tg-v2`.substring(0, 32), // AWS limit - add v2 to avoid conflicts - port: app.containerPort, - protocol: 'HTTP', - targetType: 'ip', - vpcId: network.vpcId, - healthCheck: { - enabled: true, - path: app.healthCheck?.path || '/health', - interval: app.healthCheck?.interval || 60, - timeout: app.healthCheck?.timeout || 30, - healthyThreshold: app.healthCheck?.healthyThreshold || 2, - unhealthyThreshold: app.healthCheck?.unhealthyThreshold || 3, - matcher: '200', - }, - tags: { - ...commonTags, - Name: `${appName}-tg-v2`, - Type: 'target-group', - App: app.name, - }, - }); - - // Create HTTP listener - // If HTTPS is enabled and certificates exist: redirect to HTTPS - // Otherwise: serve HTTP directly - const shouldRedirectToHttps = enableHttps && hasCustomDomain && certificate; - - const httpListener = new aws.lb.Listener(`${appName}-http-listener`, { - loadBalancerArn: lb.arn, - port: 80, - protocol: 'HTTP', - defaultActions: shouldRedirectToHttps - ? [ - { - type: 'redirect', - redirect: { - port: '443', - protocol: 'HTTPS', - statusCode: 'HTTP_301', - }, - }, - ] - : [ - { - type: 'forward', - targetGroupArn: targetGroup.arn, - }, - ], - tags: { - ...commonTags, - Name: `${appName}-http-listener`, - Type: 'listener', - App: app.name, - }, - }); - - // Create HTTPS listener only if explicitly enabled - let httpsListener: aws.lb.Listener | undefined; - if (enableHttps && hasCustomDomain && certificate) { - httpsListener = new aws.lb.Listener(`${appName}-https-listener`, { - loadBalancerArn: lb.arn, - port: 443, - protocol: 'HTTPS', - sslPolicy: 'ELBSecurityPolicy-TLS-1-2-2017-01', - certificateArn: certificate.arn, - defaultActions: [ - { - type: 'forward', - targetGroupArn: targetGroup.arn, - }, - ], - tags: { - ...commonTags, - Name: `${appName}-https-listener`, - Type: 'listener', - App: app.name, - }, - }); - } - - // Determine the application URL based on configuration - const applicationUrl = - enableHttps && hasCustomDomain && certificate - ? pulumi.output(`https://${app.routing!.hostnames![0]}`) - : hasCustomDomain - ? pulumi.output(`http://${app.routing!.hostnames![0]}`) - : lb.dnsName.apply((dns) => `http://${dns}`); - - const healthCheckUrl = hasCustomDomain - ? pulumi.output( - `${enableHttps && certificate ? 'https' : 'http'}://${app.routing!.hostnames![0]}${app.healthCheck?.path || '/health'}`, - ) - : lb.dnsName.apply((dns) => `http://${dns}${app.healthCheck?.path || '/health'}`); - - return { - albArn: lb.arn, - albDnsName: lb.dnsName, - albZoneId: lb.zoneId, - targetGroupArn: targetGroup.arn, - applicationUrl, - healthCheckUrl, - httpListenerArn: httpListener.arn, - httpsListenerArn: httpsListener?.arn, - certificateArn: certificate?.arn, - hasCustomDomain, - }; -} - -// Main function to create load balancers for all applications -export function createLoadBalancers( - config: CommonConfig, - network: NetworkOutputs, - applications: ApplicationConfig[], - certificates?: Record, - enableHttps?: boolean, -) { - return applications.map((app) => { - // Find certificate for this app's first hostname (if it has one) - const hostname = app.routing?.hostnames?.[0]; - const certificate = hostname && certificates ? certificates[hostname] : undefined; - - return { - app: app.name, - loadBalancer: createApplicationLoadBalancer(config, network, app, certificate, enableHttps), - }; - }); -} diff --git a/apps/infra/modules/monitoring.ts b/apps/infra/modules/monitoring.ts deleted file mode 100644 index 953b5f03e..000000000 --- a/apps/infra/modules/monitoring.ts +++ /dev/null @@ -1,525 +0,0 @@ -import * as aws from '@pulumi/aws'; -import * as pulumi from '@pulumi/pulumi'; -import { ApplicationConfig, CommonConfig, DatabaseOutputs, LoadBalancerOutputs } from '../types'; - -interface MonitoringOptions { - enableBetterStack?: boolean; - enableDetailedMonitoring?: boolean; -} - -interface ApplicationContainerOutputs { - serviceName: pulumi.Output; - repositoryUrl: pulumi.Output; - logGroupName: pulumi.Output; - targetGroupArn?: pulumi.Output; -} - -export function createMonitoring( - config: CommonConfig, - applications: ApplicationConfig[], - database: DatabaseOutputs, - appContainers: Record, - loadBalancer: LoadBalancerOutputs, - options: MonitoringOptions = {}, -) { - const { commonTags } = config; - const { enableBetterStack = false, enableDetailedMonitoring = true } = options; - - // Create dashboard widgets for each application - const appWidgets = applications.flatMap((app, index) => { - const container = appContainers[app.name]; - if (!container) return []; - - const yOffset = index * 12; // Stack app widgets vertically - - return [ - { - type: 'metric', - x: 0, - y: yOffset, - width: 12, - height: 6, - properties: { - metrics: [ - [ - 'AWS/ECS', - 'CPUUtilization', - 'ServiceName', - container.serviceName, - 'ClusterName', - `${config.projectName}-cluster`, - ], - ['.', 'MemoryUtilization', '.', '.', '.', '.'], - ], - view: 'timeSeries', - stacked: false, - region: config.awsRegion, - title: `${app.name} - ECS Service Metrics`, - period: 300, - }, - }, - { - type: 'log', - x: 12, - y: yOffset, - width: 12, - height: 6, - properties: { - query: `SOURCE '${container.logGroupName}' - | fields @timestamp, @message - | sort @timestamp desc - | limit 100`, - region: config.awsRegion, - title: `${app.name} - Recent Logs`, - }, - }, - ]; - }); - - // CloudWatch Dashboard for Application Monitoring - const applicationDashboard = new aws.cloudwatch.Dashboard(`${config.projectName}-app-dashboard`, { - dashboardName: `${config.projectName}-application`, - dashboardBody: pulumi - .all([loadBalancer.albArn, ...Object.values(appContainers).map((c) => c.logGroupName)]) - .apply(([albArn]) => - JSON.stringify({ - widgets: [ - // ALB metrics at the top - { - type: 'metric', - x: 0, - y: 0, - width: 24, - height: 6, - properties: { - metrics: [ - ['AWS/ApplicationELB', 'RequestCount', 'LoadBalancer', albArn], - ['.', 'TargetResponseTime', '.', '.'], - ['.', 'HTTPCode_Target_2XX_Count', '.', '.'], - ['.', 'HTTPCode_Target_4XX_Count', '.', '.'], - ['.', 'HTTPCode_Target_5XX_Count', '.', '.'], - ], - view: 'timeSeries', - stacked: false, - region: config.awsRegion, - title: 'Application Load Balancer Metrics', - period: 300, - }, - }, - // Application-specific widgets - ...appWidgets, - // Database metrics at the bottom - { - type: 'metric', - x: 0, - y: applications.length * 12, - width: 24, - height: 6, - properties: { - metrics: [ - ['AWS/RDS', 'CPUUtilization', 'DBInstanceIdentifier', database.instanceId], - ['.', 'DatabaseConnections', '.', '.'], - ['.', 'ReadLatency', '.', '.'], - ['.', 'WriteLatency', '.', '.'], - ], - view: 'timeSeries', - stacked: false, - region: config.awsRegion, - title: 'Database Metrics', - period: 300, - }, - }, - ], - }), - ), - }); - - // Infrastructure Dashboard for Operations - const infrastructureDashboard = new aws.cloudwatch.Dashboard( - `${config.projectName}-infra-dashboard`, - { - dashboardName: `${config.projectName}-infrastructure`, - dashboardBody: pulumi - .all(Object.entries(appContainers).map(([appName, container]) => ({ appName, container }))) - .apply((apps) => - JSON.stringify({ - widgets: [ - // ECS Task counts for all apps - ...apps.map((appData, index) => ({ - type: 'metric', - x: (index % 2) * 12, - y: Math.floor(index / 2) * 6, - width: 12, - height: 6, - properties: { - metrics: [ - [ - 'AWS/ECS', - 'RunningTaskCount', - 'ServiceName', - appData.container.serviceName, - 'ClusterName', - `${config.projectName}-cluster`, - ], - ['.', 'DesiredCount', '.', '.', '.', '.'], - ], - view: 'timeSeries', - stacked: false, - region: config.awsRegion, - title: `${appData.appName} - ECS Task Counts`, - period: 300, - }, - })), - // ALB Target Health at the bottom - { - type: 'metric', - x: 0, - y: Math.ceil(apps.length / 2) * 6, - width: 24, - height: 6, - properties: { - metrics: apps.flatMap((appData) => - appData.container.targetGroupArn - ? [ - [ - 'AWS/ApplicationELB', - 'HealthyHostCount', - 'TargetGroup', - appData.container.targetGroupArn, - ], - ['.', 'UnHealthyHostCount', '.', '.'], - ] - : [], - ), - view: 'timeSeries', - stacked: false, - region: config.awsRegion, - title: 'Target Group Health', - period: 300, - }, - }, - ], - }), - ), - }, - ); - - // Create alarms for each application if detailed monitoring is enabled - const appAlarms = enableDetailedMonitoring - ? applications.flatMap((app) => { - const container = appContainers[app.name]; - if (!container) return []; - - return [ - // High CPU utilization alarm - new aws.cloudwatch.MetricAlarm(`${config.projectName}-${app.name}-cpu-alarm`, { - name: `${config.projectName}-${app.name}-high-cpu`, - alarmDescription: `High CPU utilization for ${app.name} ECS service`, - metricName: 'CPUUtilization', - namespace: 'AWS/ECS', - statistic: 'Average', - period: 300, - evaluationPeriods: 2, - threshold: 85, - comparisonOperator: 'GreaterThanThreshold', - dimensions: { - ServiceName: container.serviceName, - ClusterName: `${config.projectName}-cluster`, - }, - treatMissingData: 'notBreaching', - tags: { - ...commonTags, - Name: `${config.projectName}-${app.name}-cpu-alarm`, - Type: 'cloudwatch-alarm', - App: app.name, - }, - }), - - // High memory utilization alarm - new aws.cloudwatch.MetricAlarm(`${config.projectName}-${app.name}-memory-alarm`, { - name: `${config.projectName}-${app.name}-high-memory`, - alarmDescription: `High memory utilization for ${app.name} ECS service`, - metricName: 'MemoryUtilization', - namespace: 'AWS/ECS', - statistic: 'Average', - period: 300, - evaluationPeriods: 2, - threshold: 85, - comparisonOperator: 'GreaterThanThreshold', - dimensions: { - ServiceName: container.serviceName, - ClusterName: `${config.projectName}-cluster`, - }, - treatMissingData: 'notBreaching', - tags: { - ...commonTags, - Name: `${config.projectName}-${app.name}-memory-alarm`, - Type: 'cloudwatch-alarm', - App: app.name, - }, - }), - ]; - }) - : []; - - // Custom Metrics Lambda Function - const customMetricsRole = new aws.iam.Role(`${config.projectName}-custom-metrics-role`, { - name: `${config.projectName}-custom-metrics-role`, - assumeRolePolicy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Action: 'sts:AssumeRole', - Effect: 'Allow', - Principal: { - Service: 'lambda.amazonaws.com', - }, - }, - ], - }), - tags: { - ...commonTags, - Name: 'custom-metrics-role', - Type: 'iam-role', - }, - }); - - const customMetricsPolicy = new aws.iam.RolePolicy( - `${config.projectName}-custom-metrics-policy`, - { - role: customMetricsRole.id, - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['logs:CreateLogGroup', 'logs:CreateLogStream', 'logs:PutLogEvents'], - Resource: 'arn:aws:logs:*:*:*', - }, - { - Effect: 'Allow', - Action: ['cloudwatch:PutMetricData'], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['ecs:DescribeServices', 'ecs:DescribeTasks', 'ecs:ListTasks'], - Resource: '*', - }, - { - Effect: 'Allow', - Action: ['rds:DescribeDBInstances'], - Resource: '*', - }, - ], - }), - }, - ); - - const customMetricsFunction = new aws.lambda.Function( - `${config.projectName}-custom-metrics-function`, - { - name: `${config.projectName}-custom-metrics`, - runtime: 'python3.9', - handler: 'index.handler', - role: customMetricsRole.arn, - code: new pulumi.asset.AssetArchive({ - 'index.py': new pulumi.asset.StringAsset(` -import json -import boto3 -import logging - -logger = logging.getLogger() -logger.setLevel(logging.INFO) - -cloudwatch = boto3.client('cloudwatch') -ecs = boto3.client('ecs') -rds = boto3.client('rds') - -def handler(event, context): - try: - # Get ECS service metrics for all apps - cluster_name = '${config.projectName}-cluster' - service_names = ${JSON.stringify(Object.values(appContainers).map(() => ''))} - - # This would need to be populated with actual service names at runtime - # For now, this is a placeholder for the Lambda function - - # Custom metric: Service health ratio - health_ratio = running_count / desired_count if desired_count > 0 else 0 - - cloudwatch.put_metric_data( - Namespace='${config.projectName}/Application', - MetricData=[ - { - 'MetricName': 'ServiceHealthRatio', - 'Value': health_ratio, - 'Unit': 'Percent', - 'Dimensions': [ - { - 'Name': 'ProjectName', - 'Value': '${config.projectName}' - }, - { - 'Name': 'AwsRegion', - 'Value': '${config.awsRegion}' - } - ] - } - ] - ) - - logger.info('Custom metrics published successfully') - return { - 'statusCode': 200, - 'body': json.dumps('Metrics published successfully') - } - - except Exception as e: - logger.error(f'Error publishing metrics: {str(e)}') - return { - 'statusCode': 500, - 'body': json.dumps(f'Error: {str(e)}') - } -`), - }), - timeout: 60, - tags: { - ...commonTags, - Name: 'custom-metrics-function', - Type: 'lambda-function', - }, - }, - ); - - // Schedule custom metrics function - const customMetricsSchedule = new aws.cloudwatch.EventRule( - `${config.projectName}-custom-metrics-schedule`, - { - scheduleExpression: 'rate(5 minutes)', - tags: { - ...commonTags, - Name: 'custom-metrics-schedule', - Type: 'event-rule', - }, - }, - ); - - const customMetricsTarget = new aws.cloudwatch.EventTarget( - `${config.projectName}-custom-metrics-target`, - { - rule: customMetricsSchedule.name, - arn: customMetricsFunction.arn, - }, - ); - - const customMetricsPermission = new aws.lambda.Permission( - `${config.projectName}-custom-metrics-permission`, - { - action: 'lambda:InvokeFunction', - function: customMetricsFunction.name, - principal: 'events.amazonaws.com', - sourceArn: customMetricsSchedule.arn, - }, - ); - - // High Error Rate Alarm - const highErrorRateAlarm = new aws.cloudwatch.MetricAlarm( - `${config.projectName}-high-error-rate-alarm`, - { - name: `${config.projectName}-high-error-rate`, - metricName: 'HTTPCode_Target_5XX_Count', - namespace: 'AWS/ApplicationELB', - statistic: 'Sum', - period: 300, - evaluationPeriods: 2, - threshold: 10, - comparisonOperator: 'GreaterThanThreshold', - dimensions: { - LoadBalancer: loadBalancer.albArn, - }, - tags: { - ...commonTags, - Name: 'high-error-rate-alarm', - Type: 'cloudwatch-alarm', - }, - }, - ); - - // Database Connection Alarm - const databaseConnectionAlarm = new aws.cloudwatch.MetricAlarm( - `${config.projectName}-database-connection-alarm`, - { - name: `${config.projectName}-database-connections`, - metricName: 'DatabaseConnections', - namespace: 'AWS/RDS', - statistic: 'Average', - period: 300, - evaluationPeriods: 2, - threshold: 80, - comparisonOperator: 'GreaterThanThreshold', - dimensions: { - DBInstanceIdentifier: database.instanceId, - }, - tags: { - ...commonTags, - Name: `${config.projectName}-database-connection-alarm`, - Type: 'cloudwatch-alarm', - }, - }, - ); - - // Better Stack Integration (optional) - let betterStackSecret: aws.secretsmanager.Secret | undefined; - let logForwarderFunction: aws.lambda.Function | undefined; - - if (enableBetterStack) { - betterStackSecret = new aws.secretsmanager.Secret(`${config.projectName}-betterstack-secret`, { - name: `${config.projectName}/betterstack/token`, - tags: { - ...commonTags, - Name: `${config.projectName}-betterstack-secret`, - Type: 'secret', - }, - }); - - // Better Stack log forwarder function would go here - // Implementation depends on Better Stack's API - } - - return { - applicationDashboardUrl: applicationDashboard.dashboardName.apply( - (name) => - `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#dashboards:name=${name}`, - ), - infrastructureDashboardUrl: infrastructureDashboard.dashboardName.apply( - (name) => - `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#dashboards:name=${name}`, - ), - applicationLogGroups: Object.entries(appContainers).reduce( - (acc, [appName, container]) => { - acc[appName] = container.logGroupName; - return acc; - }, - {} as Record>, - ), - logsUrls: Object.entries(appContainers).reduce( - (acc, [appName, container]) => { - acc[appName] = container.logGroupName.apply( - (logGroupName) => - `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#logsV2:log-groups/log-group/${encodeURIComponent(logGroupName)}`, - ); - return acc; - }, - {} as Record>, - ), - metricsNamespace: `${config.projectName}/Application`, - customMetricsFunctionArn: customMetricsFunction.arn, - metricsUrl: `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#metricsV2:graph=~();namespace=${config.projectName}/Application`, - highErrorRateAlarmArn: highErrorRateAlarm.arn, - databaseConnectionAlarmArn: databaseConnectionAlarm.arn, - alarmsUrl: `https://${config.awsRegion}.console.aws.amazon.com/cloudwatch/home?region=${config.awsRegion}#alarmsV2:`, - logForwarderFunctionArn: logForwarderFunction?.arn, - betterStackSecretArn: betterStackSecret?.arn, - }; -} diff --git a/apps/infra/modules/networking.ts b/apps/infra/modules/networking.ts deleted file mode 100644 index 96df13ef3..000000000 --- a/apps/infra/modules/networking.ts +++ /dev/null @@ -1,516 +0,0 @@ -import * as aws from '@pulumi/aws'; -import { ApplicationConfig, CommonConfig } from '../types'; - -export function createNetworking(config: CommonConfig, applications: ApplicationConfig[]) { - const { commonTags, networkConfig, securityConfig } = config; - - // ========================================== - // VPC AND CORE NETWORKING - // ========================================== - - // VPC with DNS support for RDS and enhanced networking - const vpc = new aws.ec2.Vpc(`${config.projectName}-vpc`, { - cidrBlock: networkConfig.vpcCidr, - enableDnsHostnames: true, // Required for RDS and ALB - enableDnsSupport: true, // Required for RDS and ALB - tags: { - ...commonTags, - Name: `${config.projectName}-vpc`, - Type: 'vpc', - }, - }); - - // Internet Gateway for public subnet access - const internetGateway = new aws.ec2.InternetGateway(`${config.projectName}-igw`, { - vpcId: vpc.id, - tags: { - ...commonTags, - Name: `${config.projectName}-igw`, - Type: 'internet-gateway', - }, - }); - - // Get availability zones dynamically - const availabilityZones = aws.getAvailabilityZonesOutput({ - state: 'available', - }); - - // ========================================== - // SUBNETS - // ========================================== - - // Public subnets (for ALB, NAT Gateway, and Tailscale) - const publicSubnets = networkConfig.subnets.public.map( - (subnet, index) => - new aws.ec2.Subnet(`${config.projectName}-public-subnet-${index + 1}`, { - vpcId: vpc.id, - cidrBlock: subnet.cidr, - availabilityZone: availabilityZones.apply((azs) => azs.names[subnet.az]), - mapPublicIpOnLaunch: true, - tags: { - ...commonTags, - Name: `${config.projectName}-public-subnet-${index + 1}`, - Type: 'public', - Tier: 'public', - }, - }), - ); - - // Private subnets (for RDS, ECS, and internal services) - const privateSubnets = networkConfig.subnets.private.map( - (subnet, index) => - new aws.ec2.Subnet(`${config.projectName}-private-subnet-${index + 1}`, { - vpcId: vpc.id, - cidrBlock: subnet.cidr, - availabilityZone: availabilityZones.apply((azs) => azs.names[subnet.az]), - mapPublicIpOnLaunch: false, // Private subnets don't auto-assign public IPs - tags: { - ...commonTags, - Name: `${config.projectName}-private-subnet-${index + 1}`, - Type: 'private', - Tier: 'private', - }, - }), - ); - - // Extract subnet IDs for use in other resources - const publicSubnetIds = publicSubnets.map((subnet) => subnet.id); - const privateSubnetIds = privateSubnets.map((subnet) => subnet.id); - - // ========================================== - // NAT GATEWAY FOR PRIVATE SUBNET INTERNET ACCESS - // ========================================== - - // Elastic IP for NAT Gateway - const natEip = new aws.ec2.Eip(`${config.projectName}-nat-eip`, { - domain: 'vpc', - tags: { - ...commonTags, - Name: `${config.projectName}-nat-eip`, - }, - }); - - // NAT Gateway in first public subnet - const natGateway = new aws.ec2.NatGateway(`${config.projectName}-nat-gateway`, { - allocationId: natEip.id, - subnetId: publicSubnets[0].id, - tags: { - ...commonTags, - Name: `${config.projectName}-nat-gateway`, - }, - }); - - // ========================================== - // ROUTE TABLES - // ========================================== - - // Public route table - const publicRouteTable = new aws.ec2.RouteTable(`${config.projectName}-public-rt`, { - vpcId: vpc.id, - tags: { - ...commonTags, - Name: `${config.projectName}-public-rt`, - Type: 'route-table', - Tier: 'public', - }, - }); - - // Route for public internet access via Internet Gateway - const publicRoute = new aws.ec2.Route(`${config.projectName}-public-route`, { - routeTableId: publicRouteTable.id, - destinationCidrBlock: '0.0.0.0/0', - gatewayId: internetGateway.id, - }); - - // Associate public subnets with public route table - publicSubnets.map( - (subnet, index) => - new aws.ec2.RouteTableAssociation(`${config.projectName}-public-rta-${index + 1}`, { - subnetId: subnet.id, - routeTableId: publicRouteTable.id, - }), - ); - - // Private route table - const privateRouteTable = new aws.ec2.RouteTable(`${config.projectName}-private-rt`, { - vpcId: vpc.id, - tags: { - ...commonTags, - Name: `${config.projectName}-private-rt`, - Type: 'route-table', - Tier: 'private', - }, - }); - - // Route for private internet access via NAT Gateway - const privateRoute = new aws.ec2.Route(`${config.projectName}-private-route`, { - routeTableId: privateRouteTable.id, - destinationCidrBlock: '0.0.0.0/0', - natGatewayId: natGateway.id, - }); - - // Associate private subnets with private route table - privateSubnets.map( - (subnet, index) => - new aws.ec2.RouteTableAssociation(`${config.projectName}-private-rta-${index + 1}`, { - subnetId: subnet.id, - routeTableId: privateRouteTable.id, - }), - ); - - // ========================================== - // SECURITY GROUPS - // ========================================== - - // ALB Security Group - const albSecurityGroup = new aws.ec2.SecurityGroup(`${config.projectName}-alb-sg`, { - vpcId: vpc.id, - description: 'Security group for Application Load Balancer', - ingress: [ - { - protocol: 'tcp', - fromPort: 80, - toPort: 80, - cidrBlocks: ['0.0.0.0/0'], - description: 'HTTP access from internet', - }, - { - protocol: 'tcp', - fromPort: 443, - toPort: 443, - cidrBlocks: ['0.0.0.0/0'], - description: 'HTTPS access from internet', - }, - ], - egress: [ - { - protocol: '-1', - fromPort: 0, - toPort: 0, - cidrBlocks: ['0.0.0.0/0'], - description: 'All outbound traffic', - }, - ], - tags: { - ...commonTags, - Name: `${config.projectName}-alb-sg`, - Type: 'security-group', - Tier: 'public', - }, - }); - - // ECS Security Group - const ecsSecurityGroup = new aws.ec2.SecurityGroup(`${config.projectName}-ecs-sg`, { - vpcId: vpc.id, - description: 'Security group for ECS services', - ingress: [ - // Create ingress rules for each application's port - ...applications.map((app) => ({ - protocol: 'tcp', - fromPort: app.containerPort, - toPort: app.containerPort, - securityGroups: [albSecurityGroup.id], - description: `HTTP access from ALB for ${app.name} app`, - })), - ], - egress: [ - { - protocol: '-1', - fromPort: 0, - toPort: 0, - cidrBlocks: ['0.0.0.0/0'], - description: 'All outbound traffic', - }, - ], - tags: { - ...commonTags, - Name: `${config.projectName}-ecs-sg`, - Type: 'security-group', - Tier: 'private', - }, - }); - - // Database Security Group - const databaseSecurityGroup = new aws.ec2.SecurityGroup(`${config.projectName}-db-sg`, { - vpcId: vpc.id, - description: 'Security group for RDS database', - ingress: [ - { - protocol: 'tcp', - fromPort: 5432, - toPort: 5432, - securityGroups: [ecsSecurityGroup.id], - description: 'PostgreSQL access from ECS only', - }, - ], - egress: [ - { - protocol: '-1', - fromPort: 0, - toPort: 0, - cidrBlocks: ['0.0.0.0/0'], - description: 'Outbound traffic for updates and maintenance', - }, - ], - tags: { - ...commonTags, - Name: `${config.projectName}-db-sg`, - Type: 'security-group', - Tier: 'private', - }, - }); - - // CodeBuild Security Group - const codeBuildSecurityGroup = new aws.ec2.SecurityGroup(`${config.projectName}-codebuild-sg`, { - vpcId: vpc.id, - description: 'Security group for CodeBuild projects', - egress: [ - { - protocol: '-1', - fromPort: 0, - toPort: 0, - cidrBlocks: ['0.0.0.0/0'], - description: 'Full outbound access for builds', - }, - ], - tags: { - ...commonTags, - Name: `${config.projectName}-codebuild-sg`, - Type: 'security-group', - Tier: 'private', - }, - }); - - // Allow CodeBuild to access database - explicit ingress rule - const buildDatabaseAccess = new aws.ec2.SecurityGroupRule( - `${config.projectName}-build-database-access`, - { - type: 'ingress', - fromPort: 5432, - toPort: 5432, - protocol: 'tcp', - sourceSecurityGroupId: codeBuildSecurityGroup.id, - securityGroupId: databaseSecurityGroup.id, - description: 'Allow CodeBuild to access database for builds', - }, - { - dependsOn: [codeBuildSecurityGroup, databaseSecurityGroup], - }, - ); - - // Also allow access from private subnet CIDR as backup (CodeBuild runs in private subnets) - const buildDatabaseCidrAccess = new aws.ec2.SecurityGroupRule( - `${config.projectName}-build-database-cidr-access`, - { - type: 'ingress', - fromPort: 5432, - toPort: 5432, - protocol: 'tcp', - cidrBlocks: [networkConfig.subnets.private[0].cidr, networkConfig.subnets.private[1].cidr], - securityGroupId: databaseSecurityGroup.id, - description: 'Allow access from private subnets (CodeBuild backup rule)', - }, - { - dependsOn: [databaseSecurityGroup], - }, - ); - - // Tailscale Security Group - const tailscaleSecurityGroup = new aws.ec2.SecurityGroup(`${config.projectName}-tailscale-sg`, { - vpcId: vpc.id, - description: 'Security group for Tailscale subnet router', - ingress: [ - { - protocol: 'tcp', - fromPort: 22, - toPort: 22, - cidrBlocks: securityConfig.allowedCidrBlocks, - description: 'SSH access from allowed IPs', - }, - { - protocol: 'udp', - fromPort: 41641, - toPort: 41641, - cidrBlocks: ['0.0.0.0/0'], - description: 'Tailscale UDP traffic', - }, - ], - egress: [ - { - protocol: '-1', - fromPort: 0, - toPort: 0, - cidrBlocks: ['0.0.0.0/0'], - description: 'All outbound traffic', - }, - ], - tags: { - ...commonTags, - Name: `${config.projectName}-tailscale-sg`, - Type: 'security-group', - Tier: 'public', - }, - }); - - // Allow Tailscale to access database - const tailscaleDatabaseAccess = new aws.ec2.SecurityGroupRule( - `${config.projectName}-tailscale-database-access`, - { - type: 'ingress', - fromPort: 5432, - toPort: 5432, - protocol: 'tcp', - sourceSecurityGroupId: tailscaleSecurityGroup.id, - securityGroupId: databaseSecurityGroup.id, - description: 'Allow Tailscale router to access database for development', - }, - ); - - // ========================================== - // VPC ENDPOINTS - // ========================================== - - // S3 VPC Endpoint - const s3VpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-s3-endpoint`, { - vpcId: vpc.id, - serviceName: `com.amazonaws.${config.awsRegion}.s3`, - vpcEndpointType: 'Gateway', - routeTableIds: [privateRouteTable.id], - tags: { - ...commonTags, - Name: `${config.projectName}-s3-endpoint`, - Type: 'vpc-endpoint', - }, - }); - - // Shared security group for VPC endpoints (allows both ECS and CodeBuild access) - const vpcEndpointSecurityGroup = new aws.ec2.SecurityGroup( - `${config.projectName}-vpc-endpoint-sg`, - { - vpcId: vpc.id, - description: 'Security group for VPC endpoints (ECR, CodeBuild, CloudWatch)', - ingress: [ - { - protocol: 'tcp', - fromPort: 443, - toPort: 443, - securityGroups: [ecsSecurityGroup.id, codeBuildSecurityGroup.id], - description: 'HTTPS access from ECS and CodeBuild', - }, - ], - egress: [ - { - protocol: '-1', - fromPort: 0, - toPort: 0, - cidrBlocks: ['0.0.0.0/0'], - description: 'All outbound traffic', - }, - ], - tags: { - ...commonTags, - Name: `${config.projectName}-vpc-endpoint-sg`, - Type: 'security-group', - }, - }, - ); - - // ECR API VPC Endpoint (for ECS in private subnets) - const ecrApiVpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-ecr-api-endpoint`, { - vpcId: vpc.id, - serviceName: `com.amazonaws.${config.awsRegion}.ecr.api`, - vpcEndpointType: 'Interface', - subnetIds: privateSubnetIds, - securityGroupIds: [vpcEndpointSecurityGroup.id], - tags: { - ...commonTags, - Name: `${config.projectName}-ecr-api-endpoint`, - Type: 'vpc-endpoint', - }, - }); - - // ECR DKR VPC Endpoint (for ECS in private subnets) - const ecrDkrVpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-ecr-dkr-endpoint`, { - vpcId: vpc.id, - serviceName: `com.amazonaws.${config.awsRegion}.ecr.dkr`, - vpcEndpointType: 'Interface', - subnetIds: privateSubnetIds, - securityGroupIds: [vpcEndpointSecurityGroup.id], - tags: { - ...commonTags, - Name: `${config.projectName}-ecr-dkr-endpoint`, - Type: 'vpc-endpoint', - }, - }); - - // CodeBuild VPC Endpoint (essential for CodeBuild to work in VPC) - const codebuildVpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-codebuild-endpoint`, { - vpcId: vpc.id, - serviceName: `com.amazonaws.${config.awsRegion}.codebuild`, - vpcEndpointType: 'Interface', - subnetIds: privateSubnetIds, // CodeBuild runs in private subnets, so endpoints should be there too - securityGroupIds: [vpcEndpointSecurityGroup.id], - tags: { - ...commonTags, - Name: `${config.projectName}-codebuild-endpoint`, - Type: 'vpc-endpoint', - }, - }); - - // STS VPC Endpoint (essential for IAM role assumption in VPC) - const stsVpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-sts-endpoint`, { - vpcId: vpc.id, - serviceName: `com.amazonaws.${config.awsRegion}.sts`, - vpcEndpointType: 'Interface', - subnetIds: privateSubnetIds, - securityGroupIds: [vpcEndpointSecurityGroup.id], - tags: { - ...commonTags, - Name: `${config.projectName}-sts-endpoint`, - Type: 'vpc-endpoint', - }, - }); - - // CloudWatch Logs VPC Endpoint (for CodeBuild logging) - const logsVpcEndpoint = new aws.ec2.VpcEndpoint(`${config.projectName}-logs-endpoint`, { - vpcId: vpc.id, - serviceName: `com.amazonaws.${config.awsRegion}.logs`, - vpcEndpointType: 'Interface', - subnetIds: privateSubnetIds, // CodeBuild logs from private subnets, so endpoint should be there too - securityGroupIds: [vpcEndpointSecurityGroup.id], - tags: { - ...commonTags, - Name: `${config.projectName}-logs-endpoint`, - Type: 'vpc-endpoint', - }, - }); - - return { - vpcId: vpc.id, - vpcCidr: vpc.cidrBlock, - internetGatewayId: internetGateway.id, - natGatewayId: natGateway.id, - publicSubnetIds, - privateSubnetIds, - availabilityZones: availabilityZones.apply((azs) => azs.names), - securityGroups: { - alb: albSecurityGroup.id, - ecs: ecsSecurityGroup.id, - database: databaseSecurityGroup.id, - codeBuild: codeBuildSecurityGroup.id, - tailscale: tailscaleSecurityGroup.id, - }, - routeTableIds: { - public: publicRouteTable.id, - private: privateRouteTable.id, - }, - vpcEndpoints: { - s3: s3VpcEndpoint.id, - ecrApi: ecrApiVpcEndpoint.id, - ecrDkr: ecrDkrVpcEndpoint.id, - codebuild: codebuildVpcEndpoint.id, - logs: logsVpcEndpoint.id, - sts: stsVpcEndpoint.id, - }, - }; -} diff --git a/apps/infra/modules/scaling.ts b/apps/infra/modules/scaling.ts deleted file mode 100644 index 4c5ca4283..000000000 --- a/apps/infra/modules/scaling.ts +++ /dev/null @@ -1,148 +0,0 @@ -import * as aws from '@pulumi/aws'; -import * as pulumi from '@pulumi/pulumi'; -import { ApplicationConfig, CommonConfig, ContainerOutputs, LoadBalancerOutputs } from '../types'; - -interface ApplicationScalingOutputs { - target: aws.appautoscaling.Target; - cpuPolicy: aws.appautoscaling.Policy; - memoryPolicy: aws.appautoscaling.Policy; - requestCountPolicy?: aws.appautoscaling.Policy; -} - -export function createScaling( - config: CommonConfig, - applications: ApplicationConfig[], - container: ContainerOutputs, - loadBalancer: LoadBalancerOutputs, -) { - const { commonTags } = config; - - // Create scaling resources for each application - const applicationScaling = applications.reduce( - (acc, app, index) => { - const appContainer = container.applications?.[index]; - if (!appContainer) return acc; - - // Skip if app doesn't want auto-scaling - if (app.minCount === app.maxCount) return acc; - - // Auto Scaling Target for ECS Service - const ecsTarget = new aws.appautoscaling.Target( - `${config.projectName}-${app.name}-ecs-target`, - { - maxCapacity: app.maxCount || 10, - minCapacity: app.minCount || 1, - resourceId: pulumi.interpolate`service/${container.clusterName}/${appContainer.serviceName}`, - scalableDimension: 'ecs:service:DesiredCount', - serviceNamespace: 'ecs', - tags: { - ...commonTags, - Name: `${config.projectName}-${app.name}-ecs-target`, - Type: 'autoscaling-target', - App: app.name, - }, - }, - { - // Ensure the ECS service exists before creating the scaling target - dependsOn: appContainer.service ? [appContainer.service] : [], - }, - ); - - // CPU-based Auto Scaling Policy - const cpuScalingPolicy = new aws.appautoscaling.Policy( - `${config.projectName}-${app.name}-cpu-scaling`, - { - name: `${config.projectName}-${app.name}-cpu-scaling`, - policyType: 'TargetTrackingScaling', - resourceId: ecsTarget.resourceId, - scalableDimension: ecsTarget.scalableDimension, - serviceNamespace: ecsTarget.serviceNamespace, - targetTrackingScalingPolicyConfiguration: { - targetValue: app.targetCPUPercent || 70.0, - predefinedMetricSpecification: { - predefinedMetricType: 'ECSServiceAverageCPUUtilization', - }, - scaleOutCooldown: 300, // 5 minutes - scaleInCooldown: 300, // 5 minutes - }, - }, - ); - - // Memory-based Auto Scaling Policy - const memoryScalingPolicy = new aws.appautoscaling.Policy( - `${config.projectName}-${app.name}-memory-scaling`, - { - name: `${config.projectName}-${app.name}-memory-scaling`, - policyType: 'TargetTrackingScaling', - resourceId: ecsTarget.resourceId, - scalableDimension: ecsTarget.scalableDimension, - serviceNamespace: ecsTarget.serviceNamespace, - targetTrackingScalingPolicyConfiguration: { - targetValue: 80.0, // Target 80% memory utilization - predefinedMetricSpecification: { - predefinedMetricType: 'ECSServiceAverageMemoryUtilization', - }, - scaleOutCooldown: 300, - scaleInCooldown: 300, - }, - }, - ); - - // Request count based scaling (if app has a target group) - let requestCountPolicy: aws.appautoscaling.Policy | undefined; - if (appContainer.targetGroupArn) { - requestCountPolicy = new aws.appautoscaling.Policy( - `${config.projectName}-${app.name}-request-scaling`, - { - name: `${config.projectName}-${app.name}-request-scaling`, - policyType: 'TargetTrackingScaling', - resourceId: ecsTarget.resourceId, - scalableDimension: ecsTarget.scalableDimension, - serviceNamespace: ecsTarget.serviceNamespace, - targetTrackingScalingPolicyConfiguration: { - targetValue: 1000.0, // Target 1000 requests per target - predefinedMetricSpecification: { - predefinedMetricType: 'ALBRequestCountPerTarget', - // More reliable approach: extract the suffix parts properly - resourceLabel: pulumi - .all([loadBalancer.albArn, appContainer.targetGroupArn]) - .apply(([albArn, tgArn]) => { - // ALB ARN format: arn:aws:elasticloadbalancing:region:account:loadbalancer/app/name/id - // TG ARN format: arn:aws:elasticloadbalancing:region:account:targetgroup/name/id - // Resource label format: app/name/id/targetgroup/name/id - - const albMatch = albArn.match(/loadbalancer\/(app\/[^\/]+\/[^\/]+)$/); - const tgMatch = tgArn.match(/targetgroup\/([^\/]+\/[^\/]+)$/); - - if (!albMatch || !tgMatch) { - throw new Error( - `Failed to parse ALB or Target Group ARN: ${albArn}, ${tgArn}`, - ); - } - - return `${albMatch[1]}/targetgroup/${tgMatch[1]}`; - }), - }, - scaleOutCooldown: 60, - scaleInCooldown: 180, - }, - }, - ); - } - - acc[app.name] = { - target: ecsTarget, - cpuPolicy: cpuScalingPolicy, - memoryPolicy: memoryScalingPolicy, - requestCountPolicy, - }; - - return acc; - }, - {} as Record, - ); - - return { - applicationScaling, - }; -} diff --git a/apps/infra/modules/ssl.ts b/apps/infra/modules/ssl.ts deleted file mode 100644 index bb5d9a013..000000000 --- a/apps/infra/modules/ssl.ts +++ /dev/null @@ -1,71 +0,0 @@ -import * as aws from '@pulumi/aws'; -import * as pulumi from '@pulumi/pulumi'; -import { ApplicationConfig, CommonConfig } from '../types'; - -export interface SSLOutputs { - certificates: Record; - validationRecords: Array<{ - domain: string; - name: pulumi.Output; - type: pulumi.Output; - value: pulumi.Output; - }>; -} - -export function createSSLCertificates( - config: CommonConfig, - applications: ApplicationConfig[], -): SSLOutputs { - // Collect all unique domains that need certificates (only for apps with custom domains) - const domainsNeedingCerts = new Set(); - applications.forEach((app) => { - if (app.routing?.hostnames && app.routing.hostnames.length > 0) { - app.routing.hostnames.forEach((hostname) => { - domainsNeedingCerts.add(hostname); - }); - } - }); - - const certificates: Record = {}; - const validationRecords: Array<{ - domain: string; - name: pulumi.Output; - type: pulumi.Output; - value: pulumi.Output; - }> = []; - - // Only create certificates if we have domains that need them - if (domainsNeedingCerts.size > 0) { - Array.from(domainsNeedingCerts).forEach((domain) => { - // Create certificate - const cert = new aws.acm.Certificate( - `${config.projectName}-cert-${domain.replace(/\./g, '-')}`, - { - domainName: domain, - validationMethod: 'DNS', - tags: { - ...config.commonTags, - Name: `${config.projectName}-cert-${domain}`, - Type: 'ssl-certificate', - Domain: domain, - }, - }, - ); - - certificates[domain] = cert; - - // Store validation record info for manual creation in any DNS provider - validationRecords.push({ - domain, - name: cert.domainValidationOptions.apply((options) => options[0].resourceRecordName), - type: cert.domainValidationOptions.apply((options) => options[0].resourceRecordType), - value: cert.domainValidationOptions.apply((options) => options[0].resourceRecordValue), - }); - }); - } - - return { - certificates, - validationRecords, - }; -} diff --git a/apps/infra/modules/tailscale.ts b/apps/infra/modules/tailscale.ts deleted file mode 100644 index c6170a101..000000000 --- a/apps/infra/modules/tailscale.ts +++ /dev/null @@ -1,293 +0,0 @@ -import * as aws from '@pulumi/aws'; -import { CommonConfig, DatabaseOutputs, NetworkOutputs } from '../types'; - -export function createTailscale( - config: CommonConfig, - network: NetworkOutputs, - database: DatabaseOutputs, -) { - const { commonTags } = config; - - // Tailscale Auth Key Secret - const tailscaleAuthSecret = new aws.secretsmanager.Secret( - `${config.projectName}-tailscale-auth-secret`, - { - name: `${config.projectName}/tailscale/auth-key`, - description: 'Tailscale auth key for subnet router', - tags: { - ...commonTags, - Name: `${config.projectName}-tailscale-auth-secret`, - Type: 'secret', - }, - }, - ); - - // Store the auth key version from configuration - const tailscaleAuthSecretVersion = new aws.secretsmanager.SecretVersion( - `${config.projectName}-tailscale-auth-secret-version`, - { - secretId: tailscaleAuthSecret.id, - secretString: - config.tailscale?.authKey.apply((key) => - JSON.stringify({ - authKey: key || 'tskey-auth-xxxxxx-REPLACE_WITH_REAL_KEY', - instructions: - key === 'NOT_SET' - ? 'Replace with real Tailscale auth key from https://login.tailscale.com/admin/settings/keys' - : 'Configured via Pulumi config', - }), - ) || - JSON.stringify({ - authKey: 'tskey-auth-xxxxxx-REPLACE_WITH_REAL_KEY', - instructions: - 'Replace with real Tailscale auth key from https://login.tailscale.com/admin/settings/keys', - }), - }, - ); - - // IAM Role for Tailscale EC2 instance - const tailscaleRole = new aws.iam.Role(`${config.projectName}-tailscale-instance-role`, { - name: `${config.projectName}-tailscale-instance-role`, - assumeRolePolicy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Action: 'sts:AssumeRole', - Effect: 'Allow', - Principal: { - Service: 'ec2.amazonaws.com', - }, - }, - ], - }), - tags: { - ...commonTags, - Name: 'tailscale-instance-role', - Type: 'iam-role', - }, - }); - - // IAM Policy for Tailscale instance - const tailscalePolicy = new aws.iam.RolePolicy( - `${config.projectName}-tailscale-instance-policy`, - { - role: tailscaleRole.id, - policy: JSON.stringify({ - Version: '2012-10-17', - Statement: [ - { - Effect: 'Allow', - Action: ['secretsmanager:GetSecretValue', 'secretsmanager:DescribeSecret'], - Resource: tailscaleAuthSecret.arn, - }, - { - Effect: 'Allow', - Action: [ - 'ec2:DescribeRouteTables', - 'ec2:CreateRoute', - 'ec2:DeleteRoute', - 'ec2:ReplaceRoute', - ], - Resource: '*', - }, - { - Effect: 'Allow', - Action: [ - 'logs:CreateLogGroup', - 'logs:CreateLogStream', - 'logs:PutLogEvents', - 'logs:DescribeLogGroups', - 'logs:DescribeLogStreams', - ], - Resource: '*', - }, - ], - }), - }, - ); - - // Instance Profile for Tailscale EC2 instance - const tailscaleInstanceProfile = new aws.iam.InstanceProfile( - `${config.projectName}-tailscale-instance-profile`, - { - name: `${config.projectName}-tailscale-instance-profile`, - role: tailscaleRole.name, - tags: { - ...commonTags, - Name: `${config.projectName}-tailscale-instance-profile`, - Type: 'instance-profile', - }, - }, - ); - - // User data script for Tailscale setup - const userData = `#!/bin/bash -set -e - -# Update system -yum update -y - -# Install Tailscale -curl -fsSL https://tailscale.com/install.sh | sh - -# Install AWS CLI and jq -yum install -y aws-cli jq - -# Create tailscale service log group -aws logs create-log-group --log-group-name /tailscale/${config.projectName} --region ${config.awsRegion} || true - -# Get Tailscale auth key from Secrets Manager -AUTH_KEY=$(aws secretsmanager get-secret-value --secret-id ${tailscaleAuthSecret.arn} --region ${config.awsRegion} --query SecretString --output text | jq -r .authKey) - -# Start Tailscale as subnet router -tailscale up --authkey=$AUTH_KEY --advertise-routes=${network.vpcCidr} --accept-routes --snat-subnet-routes=false - -# Enable IP forwarding -echo 'net.ipv4.ip_forward = 1' | tee -a /etc/sysctl.conf -echo 'net.ipv6.conf.all.forwarding = 1' | tee -a /etc/sysctl.conf -sysctl -p - -# Install CloudWatch agent for monitoring -yum install -y amazon-cloudwatch-agent - -# Configure CloudWatch agent -cat > /opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json << 'EOF' -{ - "logs": { - "logs_collected": { - "files": { - "collect_list": [ - { - "file_path": "/var/log/tailscaled.log", - "log_group_name": "/tailscale/${config.projectName}", - "log_stream_name": "tailscaled" - } - ] - } - } - }, - "metrics": { - "namespace": "Tailscale/${config.projectName}", - "metrics_collected": { - "cpu": { - "measurement": ["cpu_usage_idle", "cpu_usage_iowait"], - "metrics_collection_interval": 60 - }, - "disk": { - "measurement": ["used_percent"], - "metrics_collection_interval": 60, - "resources": ["*"] - }, - "mem": { - "measurement": ["mem_used_percent"], - "metrics_collection_interval": 60 - }, - "net": { - "measurement": ["bytes_sent", "bytes_recv"], - "metrics_collection_interval": 60 - } - } - } -} -EOF - -# Start CloudWatch agent -/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/etc/amazon-cloudwatch-agent.json -s - -# Create health check script -cat > /usr/local/bin/tailscale-health.sh << 'EOF' -#!/bin/bash -# Health check for Tailscale subnet router -tailscale status --json | jq -e '.BackendState == "Running"' > /dev/null -EOF - -chmod +x /usr/local/bin/tailscale-health.sh - -# Setup cron for periodic health checks -echo "*/5 * * * * /usr/local/bin/tailscale-health.sh || systemctl restart tailscaled" | crontab - - -echo "Tailscale subnet router setup completed" -`; - - // Tailscale EC2 instance - const tailscaleInstance = new aws.ec2.Instance(`${config.projectName}-tailscale-subnet-router`, { - instanceType: 't3.nano', // Small instance for routing - ami: aws.ec2 - .getAmi({ - mostRecent: true, - owners: ['amazon'], - filters: [ - { - name: 'name', - values: ['amzn2-ami-hvm-*-x86_64-gp2'], - }, - ], - }) - .then((ami) => ami.id), - // keyName: `${config.projectName}-key`, // Uncomment and set if key pair exists - vpcSecurityGroupIds: [network.securityGroups.tailscale], - subnetId: network.privateSubnetIds[0], // Deploy in private subnet - iamInstanceProfile: tailscaleInstanceProfile.name, - sourceDestCheck: false, // Required for routing - userData: Buffer.from(userData).toString('base64'), - tags: { - ...commonTags, - Name: `${config.projectName}-tailscale-subnet-router`, - Type: 'ec2-instance', - Purpose: 'tailscale-router', - }, - }); - - // CloudWatch Log Group for Tailscale - const tailscaleLogGroup = new aws.cloudwatch.LogGroup(`${config.projectName}-tailscale-logs`, { - name: `/tailscale/${config.projectName}`, - retentionInDays: config.logRetentionDays, - tags: { - ...commonTags, - Name: `${config.projectName}-tailscale-logs`, - Type: 'log-group', - }, - }); - - // CloudWatch Alarm for Tailscale health - const tailscaleHealthAlarm = new aws.cloudwatch.MetricAlarm( - `${config.projectName}-tailscale-health-alarm`, - { - name: `${config.projectName}-tailscale-health`, - metricName: 'StatusCheckFailed', - namespace: 'AWS/EC2', - statistic: 'Maximum', - period: 60, - evaluationPeriods: 2, - threshold: 1, - comparisonOperator: 'GreaterThanOrEqualToThreshold', - dimensions: { - InstanceId: tailscaleInstance.id, - }, - tags: { - ...commonTags, - Name: `${config.projectName}-tailscale-health-alarm`, - Type: 'cloudwatch-alarm', - }, - }, - ); - - return { - instanceId: tailscaleInstance.id, - instancePrivateIp: tailscaleInstance.privateIp, - subnetRoutes: [network.vpcCidr], - vpcCidr: network.vpcCidr, - authSecretArn: tailscaleAuthSecret.arn, - healthAlarmArn: tailscaleHealthAlarm.arn, - databaseConnectionInfo: { - databaseHost: database.endpoint, - databasePort: database.port, - steps: [ - '1. Connect to Tailscale network', - '2. Access database via Tailscale subnet router', - `3. Connect to ${database.endpoint}:${database.port}`, - '4. Use database credentials from Secrets Manager', - ], - }, - }; -} diff --git a/apps/infra/modules/validation.ts b/apps/infra/modules/validation.ts deleted file mode 100644 index e60840481..000000000 --- a/apps/infra/modules/validation.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { ApplicationConfig } from '../types'; - -export function validateApplicationConfigs(applications: ApplicationConfig[]): void { - // Check for duplicate app names - const appNames = applications.map((app) => app.name); - const uniqueNames = new Set(appNames); - if (appNames.length !== uniqueNames.size) { - const duplicates = appNames.filter((name, index) => appNames.indexOf(name) !== index); - throw new Error(`Duplicate application names found: ${duplicates.join(', ')}`); - } - - // Check for port conflicts when using host-based routing on same domain - const hostRoutingApps = applications.filter((app) => app.routing?.hostnames); - const portsByHost = new Map>(); - - hostRoutingApps.forEach((app) => { - app.routing?.hostnames?.forEach((hostname) => { - if (!portsByHost.has(hostname)) { - portsByHost.set(hostname, new Set()); - } - portsByHost.get(hostname)!.add(app.containerPort); - }); - }); - - // Check each app's configuration - applications.forEach((app) => { - // Validate app name (AWS resource naming constraints) - if (!/^[a-zA-Z][a-zA-Z0-9-]*$/.test(app.name)) { - throw new Error( - `Invalid app name '${app.name}': must start with letter and contain only letters, numbers, and hyphens`, - ); - } - - if (app.name.length > 32) { - throw new Error(`App name '${app.name}' is too long: max 32 characters`); - } - - // Validate port - if (app.containerPort < 1 || app.containerPort > 65535) { - throw new Error( - `Invalid container port ${app.containerPort} for app '${app.name}': must be between 1-65535`, - ); - } - - // Validate routing - routing is optional, if provided must have hostnames - if (app.routing) { - if (!app.routing.hostnames || app.routing.hostnames.length === 0) { - throw new Error(`App '${app.name}' routing must have at least one hostname`); - } - - // Validate hostname format - app.routing.hostnames.forEach((hostname) => { - if (!/^[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/.test(hostname)) { - throw new Error( - `App '${app.name}' has invalid hostname '${hostname}': must be a valid domain name`, - ); - } - }); - } - - // Validate scaling configuration - if (app.minCount !== undefined && app.maxCount !== undefined) { - if (app.minCount > app.maxCount) { - throw new Error( - `App '${app.name}': minCount (${app.minCount}) cannot be greater than maxCount (${app.maxCount})`, - ); - } - if (app.minCount < 0) { - throw new Error(`App '${app.name}': minCount cannot be negative`); - } - } - - if (app.desiredCount !== undefined) { - if (app.desiredCount < 0) { - throw new Error(`App '${app.name}': desiredCount cannot be negative`); - } - if (app.minCount !== undefined && app.desiredCount < app.minCount) { - throw new Error( - `App '${app.name}': desiredCount (${app.desiredCount}) cannot be less than minCount (${app.minCount})`, - ); - } - if (app.maxCount !== undefined && app.desiredCount > app.maxCount) { - throw new Error( - `App '${app.name}': desiredCount (${app.desiredCount}) cannot be greater than maxCount (${app.maxCount})`, - ); - } - } - - // Validate CPU/memory - if (app.cpu !== undefined && app.cpu <= 0) { - throw new Error(`App '${app.name}': CPU must be positive`); - } - if (app.memory !== undefined && app.memory <= 0) { - throw new Error(`App '${app.name}': memory must be positive`); - } - - // Validate target CPU percent for scaling - if (app.targetCPUPercent !== undefined) { - if (app.targetCPUPercent <= 0 || app.targetCPUPercent > 100) { - throw new Error(`App '${app.name}': targetCPUPercent must be between 1-100`); - } - } - - // Validate environment variables don't contain sensitive data - if (app.environmentVariables) { - const sensitivePatterns = ['password', 'secret', 'key', 'token', 'credential']; - Object.keys(app.environmentVariables).forEach((key) => { - const lowerKey = key.toLowerCase(); - if (sensitivePatterns.some((pattern) => lowerKey.includes(pattern))) { - throw new Error( - `App '${app.name}': environment variable '${key}' appears to be sensitive. ` + - `Use requiredSecrets array for sensitive values.`, - ); - } - }); - } - }); - - // Ensure at least one app is configured - if (applications.length === 0) { - throw new Error('At least one application must be configured'); - } -} diff --git a/apps/infra/package.json b/apps/infra/package.json deleted file mode 100644 index 57d12936d..000000000 --- a/apps/infra/package.json +++ /dev/null @@ -1,22 +0,0 @@ -{ - "name": "@comp/infra", - "dependencies": { - "@pulumi/aws": "^6.83.0", - "@pulumi/awsx": "^2.22.0", - "@pulumi/command": "^1.1.0", - "@pulumi/docker-build": "^0.0.12", - "@pulumi/pulumi": "^3.181.0", - "@pulumi/random": "^4.18.2", - "@pulumi/tailscale": "^0.17.0", - "dotenv": "^17.2.0" - }, - "devDependencies": { - "@types/node": "^24.0.3", - "typescript": "^5.8.3" - }, - "main": "index.ts", - "scripts": { - "lint": "echo 'No linting configured for infra'", - "typecheck": "tsc --noEmit" - } -} diff --git a/apps/infra/run_debug_task.sh b/apps/infra/run_debug_task.sh deleted file mode 100644 index e98c850c5..000000000 --- a/apps/infra/run_debug_task.sh +++ /dev/null @@ -1 +0,0 @@ -aws ecs run-task --cluster comp-mariano-test --task-definition comp-mariano-test --launch-type FARGATE --overrides "{\"containerOverrides\":[{\"name\":\"comp-mariano-test-app\",\"command\":[\"sh\",\"-c\",\"echo === Container Debug === && ls -la /app && echo === Static Check === && ls -la /app/.next/static/ || echo No static && echo === End === && sleep 120\"]}]}" --region us-east-1 diff --git a/apps/infra/tsconfig.json b/apps/infra/tsconfig.json deleted file mode 100644 index 4943671bb..000000000 --- a/apps/infra/tsconfig.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "compilerOptions": { - "strict": true, - "outDir": "bin", - "target": "es2020", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "experimentalDecorators": true, - "pretty": true, - "noFallthroughCasesInSwitch": true, - "noImplicitReturns": true, - "forceConsistentCasingInFileNames": true - }, - "files": ["index.ts"] -} diff --git a/apps/infra/types.ts b/apps/infra/types.ts deleted file mode 100644 index 65cca8e43..000000000 --- a/apps/infra/types.ts +++ /dev/null @@ -1,375 +0,0 @@ -import * as aws from '@pulumi/aws'; -import * as pulumi from '@pulumi/pulumi'; - -// ========================================== -// COMMON CONFIGURATION TYPES -// ========================================== - -export interface ResourceTags { - [key: string]: string | undefined; -} - -export interface CommonConfig { - projectName: string; - enableRDSReadReplicas: boolean; - region: string; - awsRegion: string; - enableDebugEndpoints: boolean; - githubOrg: string; - githubRepo: string; - githubBranch: string; - commonTags: ResourceTags; - networkConfig: NetworkConfig; - securityConfig: SecurityConfig; - dbInstanceClass: string; - dbAllocatedStorage: number; - dbMaxAllocatedStorage: number; - dbBackupRetentionPeriod: number; - dbDeletionProtection: boolean; - dbName: string; - dbUsername: string; - logRetentionDays: number; - // Optional feature configurations - tailscale?: { - apiKey: pulumi.Output; - tailnet: string; - authKey: pulumi.Output; - }; - betterStack?: { - entrypoint: pulumi.Output; - sourceToken: pulumi.Output; - }; -} - -export interface FeatureFlags { - enableCodeBuild: boolean; - enableTailscale: boolean; - enableBetterStack: boolean; - enableDetailedMonitoring: boolean; - enableAutoScaling: boolean; - enableBackups: boolean; - enableSSL: boolean; -} - -export interface EnvironmentConfig { - dbInstanceClass: string; - dbAllocatedStorage: number; - dbMaxAllocatedStorage: number; - dbBackupRetentionPeriod: number; - dbDeletionProtection: boolean; - ecsCpu: number; - ecsMemory: number; - ecsDesiredCount: number; - ecsMinCapacity: number; - ecsMaxCapacity: number; - logRetentionDays: number; - codeBuildInstanceType: string; - codeBuildTimeout: number; -} - -export interface NetworkConfig { - vpcCidr: string; - subnets: { - public: Array<{ cidr: string; az: number }>; - private: Array<{ cidr: string; az: number }>; - }; -} - -export interface SecurityConfig { - allowedCidrBlocks: string[]; - sslCertificateArn?: string; - enableWaf: boolean; -} - -// ========================================== -// INFRASTRUCTURE OUTPUT TYPES -// ========================================== - -export interface NetworkOutputs { - vpcId: pulumi.Output; - vpcCidr: pulumi.Output; - internetGatewayId: pulumi.Output; - natGatewayId: pulumi.Output; - publicSubnetIds: pulumi.Output[]; - privateSubnetIds: pulumi.Output[]; - availabilityZones: pulumi.Output; - securityGroups: { - alb: pulumi.Output; - ecs: pulumi.Output; - database: pulumi.Output; - codeBuild: pulumi.Output; - tailscale: pulumi.Output; - }; - routeTableIds: { - public: pulumi.Output; - private: pulumi.Output; - }; - vpcEndpoints: { - s3: pulumi.Output; - ecrApi: pulumi.Output; - ecrDkr: pulumi.Output; - codebuild: pulumi.Output; - logs: pulumi.Output; - }; -} - -export interface DatabaseOutputs { - instanceId: pulumi.Output; - endpoint: pulumi.Output; - port: pulumi.Output; - dbName: pulumi.Output; - username: pulumi.Output; - password: pulumi.Output; - secretArn: pulumi.Output; - secretId: pulumi.Output; - connectionString: pulumi.Output; - readReplicaEndpoint?: pulumi.Output; -} - -export interface ContainerOutputs { - clusterName: pulumi.Output; - clusterArn: pulumi.Output; - taskExecutionRoleArn: pulumi.Output; - taskRoleArn: pulumi.Output; - // Multi-app outputs - applications: Array<{ - serviceName: pulumi.Output; - serviceArn: pulumi.Output; - service?: aws.ecs.Service; // Optional to maintain backward compatibility - repositoryUrl: pulumi.Output; - repositoryArn: pulumi.Output; - taskDefinitionArn: pulumi.Output; - logGroupName: pulumi.Output; - logGroupArn: pulumi.Output; - targetGroupArn?: pulumi.Output; - }>; -} - -export interface LoadBalancerOutputs { - albArn: pulumi.Output; - albDnsName: pulumi.Output; - albZoneId: pulumi.Output; - targetGroupArn: pulumi.Output; - applicationUrl: pulumi.Output; - healthCheckUrl: pulumi.Output; - httpListenerArn: pulumi.Output; - httpsListenerArn?: pulumi.Output; - certificateArn?: pulumi.Output; - hasCustomDomain?: boolean; -} - -export interface GithubOidcOutputs { - providerArn: pulumi.Output; - providerUrl: pulumi.Output; - deploymentRoleArn: pulumi.Output; - buildRoleArn: pulumi.Output; - readOnlyRoleArn: pulumi.Output; -} - -export interface BuildSystemOutputs { - appProjectName: pulumi.Output; - appProjectArn: pulumi.Output; - codebuildRoleArn: pulumi.Output; - buildInstanceType: string; - buildTimeout: number; - createApplicationDeployment: ( - app: ApplicationConfig, - database: DatabaseOutputs, - container: ContainerOutputs, - appContainer: { - serviceName: pulumi.Output; - repositoryUrl: pulumi.Output; - repositoryArn: pulumi.Output; - taskDefinitionArn: pulumi.Output; - logGroupName: pulumi.Output; - logGroupArn: pulumi.Output; - targetGroupArn?: pulumi.Output; - }, - ) => ApplicationDeployment; -} - -export interface ApplicationDeployment { - appName: string; - contextPath: string; - buildCommands: { - deployWithMigrations: string; - }; - containerImage: pulumi.Output; - healthCheckPath: string; - resourceRequirements: { cpu: number; memory: number }; - scaling: { - minInstances: number; - maxInstances: number; - targetCpuPercent: number; - }; - buildProject: pulumi.Output; -} - -export interface TailscaleOutputs { - instanceId: pulumi.Output; - instancePrivateIp: pulumi.Output; - subnetRoutes: pulumi.Output; - vpcCidr: pulumi.Output; - authSecretArn: pulumi.Output; - healthAlarmArn: pulumi.Output; - databaseConnectionInfo: { - databaseHost: pulumi.Output; - databasePort: pulumi.Output; - steps: string[]; - }; -} - -export interface MonitoringOutputs { - applicationDashboardUrl: pulumi.Output; - infrastructureDashboardUrl: pulumi.Output; - applicationLogGroup: pulumi.Output; - logsUrl: pulumi.Output; - metricsNamespace: string; - customMetricsFunctionArn: pulumi.Output; - metricsUrl: pulumi.Output; - highErrorRateAlarmArn: pulumi.Output; - databaseConnectionAlarmArn: pulumi.Output; - alarmsUrl: pulumi.Output; - logForwarderFunctionArn?: pulumi.Output; - betterStackSecretArn?: pulumi.Output; -} - -export interface ScalingOutputs { - applicationScaling: Record< - string, - { - target: aws.appautoscaling.Target; - cpuPolicy: aws.appautoscaling.Policy; - memoryPolicy: aws.appautoscaling.Policy; - requestCountPolicy?: aws.appautoscaling.Policy; - } - >; -} - -// ========================================== -// APPLICATION CONFIGURATION TYPES -// ========================================== - -export interface ApplicationConfig { - name: string; - containerPort: number; - healthCheck?: { - path?: string; - interval?: number; - timeout?: number; - healthyThreshold?: number; - unhealthyThreshold?: number; - }; - routing?: { - hostnames?: string[]; // e.g., ['portal.example.com'] - OPTIONAL, if not provided uses ALB DNS - }; - cpu?: number; - memory?: number; - desiredCount?: number; - minCount?: number; - maxCount?: number; - targetCPUPercent?: number; - requiredSecrets?: string[]; - includeDatabaseUrl?: boolean; // Whether this app needs DATABASE_URL injected as environment variable - environmentVariables?: Record; // Non-sensitive env vars -} - -export interface ApplicationOutput { - url: pulumi.Output; - serviceName: pulumi.Output; - ecrRepository: pulumi.Output; - logGroup: pulumi.Output; - buildProject: pulumi.Output; - healthCheckUrl: pulumi.Output; - secrets?: Record>; - deployCommand: pulumi.Output; -} - -// Duplicate ResourceTags interface removed - using the one at the top of the file - -// ========================================== -// BUILD SYSTEM TYPES -// ========================================== - -export interface BuildSpecConfig { - version: string; - env: { - variables: Record; - 'parameter-store'?: Record; - 'secrets-manager'?: Record; - }; - phases: { - pre_build?: { - commands: string[]; - }; - build: { - commands: string[]; - }; - post_build?: { - commands: string[]; - }; - }; - cache?: { - paths: string[]; - }; - artifacts?: { - files: string[]; - name?: string; - }; -} - -// ========================================== -// MONITORING AND ALERTING TYPES -// ========================================== - -export interface MetricConfig { - name: string; - namespace: string; - dimensions: Record; - statistic: 'Average' | 'Sum' | 'Maximum' | 'Minimum'; - period: number; - evaluationPeriods: number; - threshold: number; - comparisonOperator: - | 'GreaterThanThreshold' - | 'LessThanThreshold' - | 'GreaterThanOrEqualToThreshold' - | 'LessThanOrEqualToThreshold'; -} - -export interface AlarmConfig extends MetricConfig { - alarmDescription: string; - treatMissingData: 'breaching' | 'notBreaching' | 'ignore' | 'missing'; - actions?: pulumi.Output[]; -} - -// ========================================== -// SECURITY AND ACCESS TYPES -// ========================================== - -export interface SecurityGroupRule { - type: 'ingress' | 'egress'; - fromPort: number; - toPort: number; - protocol: string; - cidrBlocks?: string[]; - securityGroups?: pulumi.Output[]; - description: string; -} - -export interface IAMPolicyDocument { - Version: string; - Statement: IAMPolicyStatement[]; -} - -export interface IAMPolicyStatement { - Effect: 'Allow' | 'Deny'; - Action: string | string[]; - Resource?: string | string[]; - Principal?: { - Service?: string | string[]; - AWS?: string | string[]; - Federated?: string | string[]; - }; - Condition?: Record>; -} From 6e0fd38b1401b58e214e37a8cb1930d61ff7c2ba Mon Sep 17 00:00:00 2001 From: Mariano Fuentes Date: Thu, 24 Jul 2025 18:31:28 -0400 Subject: [PATCH 086/107] chore: build passing --- .github/workflows/release.yml | 9 +- apps/app/package.json | 2 +- apps/app/tsconfig.json | 20 +- apps/framework-editor/package.json | 4 +- apps/framework-editor/tsconfig.json | 30 ++- apps/portal/package.json | 7 +- apps/portal/src/app/layout.tsx | 6 +- apps/portal/src/app/lib/auth.ts | 8 +- apps/portal/src/app/providers.tsx | 2 +- apps/portal/tsconfig.json | 30 ++- apps/trust/package.json | 4 +- apps/trust/tsconfig.json | 30 ++- bun.lock | 121 +++++---- package.json | 2 +- packages/analytics/package.json | 50 +++- packages/analytics/src/index.ts | 3 +- packages/analytics/tsconfig.json | 2 +- packages/db/package.json | 7 +- packages/email/package.json | 9 +- packages/integrations/package.json | 2 +- packages/kv/package.json | 5 +- packages/tsconfig/package.json | 32 ++- packages/ui/package.json | 6 +- packages/utils/package.json | 2 +- release.config.js | 14 ++ yarn.lock | 371 ++++++++++++++-------------- 26 files changed, 490 insertions(+), 288 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 3b1a1e4e2..71f1468f6 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -54,10 +54,11 @@ jobs: - name: Build packages run: | echo "🔨 Building packages before release..." - bun run -F @comp/db build - bun run -F @comp/email build - bun run -F @comp/kv build - bun run -F @comp/ui build + bun run -F @trycompai/db build + bun run -F @trycompai/email build + bun run -F @trycompai/kv build + bun run -F @trycompai/ui build + bun run -F @trycompai/analytics build - name: Release env: diff --git a/apps/app/package.json b/apps/app/package.json index 5918f26f5..fbd7d4b62 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -13,7 +13,7 @@ "@browserbasehq/sdk": "^2.5.0", "@calcom/atoms": "^1.0.102-framer", "@calcom/embed-react": "^1.5.3", - "@comp/db": "workspace:*", + "@trycompai/db": "workspace:*", "@date-fns/tz": "^1.2.0", "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", diff --git a/apps/app/tsconfig.json b/apps/app/tsconfig.json index ac9c72315..92b7d52b4 100644 --- a/apps/app/tsconfig.json +++ b/apps/app/tsconfig.json @@ -29,7 +29,25 @@ "@comp/ui": ["../../packages/ui/src/components/index.ts"], "@comp/ui/*": ["../../packages/ui/src/*"], "@comp/utils": ["../../packages/utils/src/index.ts"], - "@comp/utils/*": ["../../packages/utils/src/*"] + "@comp/utils/*": ["../../packages/utils/src/*"], + "@comp/analytics": ["../../packages/analytics/src/index.ts"], + "@comp/analytics/*": ["../../packages/analytics/src/*"], + "@comp/tsconfig": ["../../packages/tsconfig"], + "@comp/tsconfig/*": ["../../packages/tsconfig/*"], + "@trycompai/db": ["../../packages/db/src/index.ts"], + "@trycompai/db/*": ["../../packages/db/src/*"], + "@trycompai/email": ["../../packages/email/index.ts"], + "@trycompai/email/*": ["../../packages/email/*"], + "@trycompai/kv": ["../../packages/kv/src/index.ts"], + "@trycompai/kv/*": ["../../packages/kv/src/*"], + "@trycompai/ui": ["../../packages/ui/src/components/index.ts"], + "@trycompai/ui/*": ["../../packages/ui/src/*"], + "@trycompai/utils": ["../../packages/utils/src/index.ts"], + "@trycompai/utils/*": ["../../packages/utils/src/*"], + "@trycompai/analytics": ["../../packages/analytics/src/index.ts"], + "@trycompai/analytics/*": ["../../packages/analytics/src/*"], + "@trycompai/tsconfig": ["../../packages/tsconfig"], + "@trycompai/tsconfig/*": ["../../packages/tsconfig/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts", "trigger.config.ts"], diff --git a/apps/framework-editor/package.json b/apps/framework-editor/package.json index 08c13e903..32511e54d 100644 --- a/apps/framework-editor/package.json +++ b/apps/framework-editor/package.json @@ -1,8 +1,8 @@ { "name": "@comp/framework-editor", "dependencies": { - "@comp/db": "workspace:*", - "@comp/ui": "workspace:*", + "@trycompai/db": "workspace:*", + "@trycompai/ui": "workspace:*", "@hookform/resolvers": "^5.1.1", "@tanstack/react-table": "^8.21.3", "@tanstack/react-virtual": "^3.13.8", diff --git a/apps/framework-editor/tsconfig.json b/apps/framework-editor/tsconfig.json index 4b2dc7ba6..df8d56234 100644 --- a/apps/framework-editor/tsconfig.json +++ b/apps/framework-editor/tsconfig.json @@ -19,7 +19,35 @@ } ], "paths": { - "@/*": ["./*"] + "@/*": ["./*"], + "@comp/db": ["../../packages/db/src/index.ts"], + "@comp/db/*": ["../../packages/db/src/*"], + "@comp/email": ["../../packages/email/index.ts"], + "@comp/email/*": ["../../packages/email/*"], + "@comp/kv": ["../../packages/kv/src/index.ts"], + "@comp/kv/*": ["../../packages/kv/src/*"], + "@comp/ui": ["../../packages/ui/src/components/index.ts"], + "@comp/ui/*": ["../../packages/ui/src/*"], + "@comp/utils": ["../../packages/utils/src/index.ts"], + "@comp/utils/*": ["../../packages/utils/src/*"], + "@comp/analytics": ["../../packages/analytics/src/index.ts"], + "@comp/analytics/*": ["../../packages/analytics/src/*"], + "@comp/tsconfig": ["../../packages/tsconfig"], + "@comp/tsconfig/*": ["../../packages/tsconfig/*"], + "@trycompai/db": ["../../packages/db/src/index.ts"], + "@trycompai/db/*": ["../../packages/db/src/*"], + "@trycompai/email": ["../../packages/email/index.ts"], + "@trycompai/email/*": ["../../packages/email/*"], + "@trycompai/kv": ["../../packages/kv/src/index.ts"], + "@trycompai/kv/*": ["../../packages/kv/src/*"], + "@trycompai/ui": ["../../packages/ui/src/components/index.ts"], + "@trycompai/ui/*": ["../../packages/ui/src/*"], + "@trycompai/utils": ["../../packages/utils/src/index.ts"], + "@trycompai/utils/*": ["../../packages/utils/src/*"], + "@trycompai/analytics": ["../../packages/analytics/src/index.ts"], + "@trycompai/analytics/*": ["../../packages/analytics/src/*"], + "@trycompai/tsconfig": ["../../packages/tsconfig"], + "@trycompai/tsconfig/*": ["../../packages/tsconfig/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], diff --git a/apps/portal/package.json b/apps/portal/package.json index 45ce5c204..6d74a8eb1 100644 --- a/apps/portal/package.json +++ b/apps/portal/package.json @@ -3,8 +3,11 @@ "version": "0.1.0", "dependencies": { "@aws-sdk/s3-request-presigner": "^3.832.0", - "@comp/db": "workspace:*", - "@comp/ui": "workspace:*", + "@trycompai/analytics": "workspace:*", + "@trycompai/db": "workspace:*", + "@trycompai/email": "workspace:*", + "@trycompai/kv": "workspace:*", + "@trycompai/ui": "workspace:*", "@react-email/components": "^0.0.41", "@react-email/render": "^1.1.2", "@t3-oss/env-nextjs": "^0.13.8", diff --git a/apps/portal/src/app/layout.tsx b/apps/portal/src/app/layout.tsx index d6057a361..1a1635c2c 100644 --- a/apps/portal/src/app/layout.tsx +++ b/apps/portal/src/app/layout.tsx @@ -1,7 +1,7 @@ import { env } from '@/env.mjs'; -import { initializeServer } from '@comp/analytics/src/server'; -import { cn } from '@comp/ui/cn'; -import '@comp/ui/globals.css'; +import { initializeServer } from '@trycompai/analytics/server'; +import { cn } from '@trycompai/ui/cn'; +import '@trycompai/ui/globals.css'; import { GeistMono } from 'geist/font/mono'; import type { Metadata } from 'next'; import localFont from 'next/font/local'; diff --git a/apps/portal/src/app/lib/auth.ts b/apps/portal/src/app/lib/auth.ts index 25c0b5e73..404f12ad2 100644 --- a/apps/portal/src/app/lib/auth.ts +++ b/apps/portal/src/app/lib/auth.ts @@ -1,7 +1,5 @@ -import { db } from '@comp/db'; -import { OTPVerificationEmail } from '@comp/email'; -import { sendInviteMemberEmail } from '@comp/email/lib/invite-member'; -import { sendEmail } from '@comp/email/lib/resend'; +import { db } from '@trycompai/db'; +import { OTPVerificationEmail, sendEmail, sendInviteMemberEmail } from '@trycompai/email'; import { betterAuth } from 'better-auth'; import { prismaAdapter } from 'better-auth/adapters/prisma'; import { nextCookies } from 'better-auth/next-js'; @@ -29,7 +27,7 @@ export const auth = betterAuth({ const url = `${protocol}://${domain}/auth`; await sendInviteMemberEmail({ - email: data.email, + inviteeEmail: data.email, inviteLink, organizationName: data.organization.name, }); diff --git a/apps/portal/src/app/providers.tsx b/apps/portal/src/app/providers.tsx index 7801bc813..aa90c2c58 100644 --- a/apps/portal/src/app/providers.tsx +++ b/apps/portal/src/app/providers.tsx @@ -1,6 +1,6 @@ 'use client'; -import { AnalyticsProvider } from '@comp/analytics'; +import { AnalyticsProvider } from '@trycompai/analytics'; import { ThemeProvider } from 'next-themes'; import type { ReactNode } from 'react'; diff --git a/apps/portal/tsconfig.json b/apps/portal/tsconfig.json index c1334095f..80a7a063b 100644 --- a/apps/portal/tsconfig.json +++ b/apps/portal/tsconfig.json @@ -19,7 +19,35 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": ["./src/*"], + "@comp/db": ["../../packages/db/src/index.ts"], + "@comp/db/*": ["../../packages/db/src/*"], + "@comp/email": ["../../packages/email/index.ts"], + "@comp/email/*": ["../../packages/email/*"], + "@comp/kv": ["../../packages/kv/src/index.ts"], + "@comp/kv/*": ["../../packages/kv/src/*"], + "@comp/ui": ["../../packages/ui/src/components/index.ts"], + "@comp/ui/*": ["../../packages/ui/src/*"], + "@comp/utils": ["../../packages/utils/src/index.ts"], + "@comp/utils/*": ["../../packages/utils/src/*"], + "@comp/analytics": ["../../packages/analytics/src/index.ts"], + "@comp/analytics/*": ["../../packages/analytics/src/*"], + "@comp/tsconfig": ["../../packages/tsconfig"], + "@comp/tsconfig/*": ["../../packages/tsconfig/*"], + "@trycompai/db": ["../../packages/db/src/index.ts"], + "@trycompai/db/*": ["../../packages/db/src/*"], + "@trycompai/email": ["../../packages/email/index.ts"], + "@trycompai/email/*": ["../../packages/email/*"], + "@trycompai/kv": ["../../packages/kv/src/index.ts"], + "@trycompai/kv/*": ["../../packages/kv/src/*"], + "@trycompai/ui": ["../../packages/ui/src/components/index.ts"], + "@trycompai/ui/*": ["../../packages/ui/src/*"], + "@trycompai/utils": ["../../packages/utils/src/index.ts"], + "@trycompai/utils/*": ["../../packages/utils/src/*"], + "@trycompai/analytics": ["../../packages/analytics/src/index.ts"], + "@trycompai/analytics/*": ["../../packages/analytics/src/*"], + "@trycompai/tsconfig": ["../../packages/tsconfig"], + "@trycompai/tsconfig/*": ["../../packages/tsconfig/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], diff --git a/apps/trust/package.json b/apps/trust/package.json index 15c410e67..e293dc681 100644 --- a/apps/trust/package.json +++ b/apps/trust/package.json @@ -1,8 +1,8 @@ { "name": "@comp/trust", "dependencies": { - "@comp/db": "workspace:*", - "@comp/ui": "workspace:*", + "@trycompai/db": "workspace:*", + "@trycompai/ui": "workspace:*", "@lottiefiles/dotlottie-react": "^0.14.2", "lucide-react": "^0.518.0", "next": "15.4.0-canary.85" diff --git a/apps/trust/tsconfig.json b/apps/trust/tsconfig.json index c1334095f..80a7a063b 100644 --- a/apps/trust/tsconfig.json +++ b/apps/trust/tsconfig.json @@ -19,7 +19,35 @@ } ], "paths": { - "@/*": ["./src/*"] + "@/*": ["./src/*"], + "@comp/db": ["../../packages/db/src/index.ts"], + "@comp/db/*": ["../../packages/db/src/*"], + "@comp/email": ["../../packages/email/index.ts"], + "@comp/email/*": ["../../packages/email/*"], + "@comp/kv": ["../../packages/kv/src/index.ts"], + "@comp/kv/*": ["../../packages/kv/src/*"], + "@comp/ui": ["../../packages/ui/src/components/index.ts"], + "@comp/ui/*": ["../../packages/ui/src/*"], + "@comp/utils": ["../../packages/utils/src/index.ts"], + "@comp/utils/*": ["../../packages/utils/src/*"], + "@comp/analytics": ["../../packages/analytics/src/index.ts"], + "@comp/analytics/*": ["../../packages/analytics/src/*"], + "@comp/tsconfig": ["../../packages/tsconfig"], + "@comp/tsconfig/*": ["../../packages/tsconfig/*"], + "@trycompai/db": ["../../packages/db/src/index.ts"], + "@trycompai/db/*": ["../../packages/db/src/*"], + "@trycompai/email": ["../../packages/email/index.ts"], + "@trycompai/email/*": ["../../packages/email/*"], + "@trycompai/kv": ["../../packages/kv/src/index.ts"], + "@trycompai/kv/*": ["../../packages/kv/src/*"], + "@trycompai/ui": ["../../packages/ui/src/components/index.ts"], + "@trycompai/ui/*": ["../../packages/ui/src/*"], + "@trycompai/utils": ["../../packages/utils/src/index.ts"], + "@trycompai/utils/*": ["../../packages/utils/src/*"], + "@trycompai/analytics": ["../../packages/analytics/src/index.ts"], + "@trycompai/analytics/*": ["../../packages/analytics/src/*"], + "@trycompai/tsconfig": ["../../packages/tsconfig"], + "@trycompai/tsconfig/*": ["../../packages/tsconfig/*"] } }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], diff --git a/bun.lock b/bun.lock index b8627efc4..6bbc1d70c 100644 --- a/bun.lock +++ b/bun.lock @@ -71,7 +71,6 @@ "@browserbasehq/sdk": "^2.5.0", "@calcom/atoms": "^1.0.102-framer", "@calcom/embed-react": "^1.5.3", - "@comp/db": "workspace:*", "@date-fns/tz": "^1.2.0", "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", @@ -99,6 +98,7 @@ "@tiptap/extension-table-row": "^2.22.3", "@trigger.dev/react-hooks": "3.3.17", "@trigger.dev/sdk": "3.3.17", + "@trycompai/db": "workspace:*", "@types/canvas-confetti": "^1.9.0", "@types/three": "^0.177.0", "@uploadthing/react": "^7.3.0", @@ -173,11 +173,11 @@ "apps/framework-editor": { "name": "@comp/framework-editor", "dependencies": { - "@comp/db": "workspace:*", - "@comp/ui": "workspace:*", "@hookform/resolvers": "^5.1.1", "@tanstack/react-table": "^8.21.3", "@tanstack/react-virtual": "^3.13.8", + "@trycompai/db": "workspace:*", + "@trycompai/ui": "workspace:*", "better-auth": "^1.2.8", "lucide-react": "^0.518.0", "next": "15.4.0-canary.85", @@ -227,11 +227,14 @@ "version": "0.1.0", "dependencies": { "@aws-sdk/s3-request-presigner": "^3.832.0", - "@comp/db": "workspace:*", - "@comp/ui": "workspace:*", "@react-email/components": "^0.0.41", "@react-email/render": "^1.1.2", "@t3-oss/env-nextjs": "^0.13.8", + "@trycompai/analytics": "workspace:*", + "@trycompai/db": "workspace:*", + "@trycompai/email": "workspace:*", + "@trycompai/kv": "workspace:*", + "@trycompai/ui": "workspace:*", "@types/jszip": "^3.4.1", "archiver": "^7.0.1", "better-auth": "^1.2.8", @@ -260,9 +263,9 @@ "apps/trust": { "name": "@comp/trust", "dependencies": { - "@comp/db": "workspace:*", - "@comp/ui": "workspace:*", "@lottiefiles/dotlottie-react": "^0.14.2", + "@trycompai/db": "workspace:*", + "@trycompai/ui": "workspace:*", "lucide-react": "^0.518.0", "next": "15.4.0-canary.85", }, @@ -284,21 +287,25 @@ }, }, "packages/analytics": { - "name": "@comp/analytics", + "name": "@trycompai/analytics", "version": "1.0.0", "dependencies": { "posthog-js": "^1.236.6", "posthog-node": "^4.14.0", }, + "devDependencies": { + "tsup": "^8.4.0", + "typescript": "^5.8.3", + }, }, "packages/db": { - "name": "@comp/db", + "name": "@trycompai/db", "version": "1.0.0", "dependencies": { "@prisma/client": "6.9.0", }, "devDependencies": { - "@comp/tsconfig": "workspace:*", + "@trycompai/tsconfig": "workspace:*", "prisma": "^6.9.0", "ts-node": "^10.9.2", "tsup": "^8.5.0", @@ -306,14 +313,14 @@ }, }, "packages/email": { - "name": "@comp/email", + "name": "@trycompai/email", "version": "1.0.0", "dependencies": { - "@comp/ui": "workspace:*", - "@comp/utils": "workspace:*", "@react-email/components": "^0.0.41", "@react-email/render": "^1.1.2", "@react-email/tailwind": "1.0.5", + "@trycompai/ui": "workspace:*", + "@trycompai/utils": "workspace:*", "date-fns": "^4.1.0", "next": "15.4.0-canary.85", "react-email": "^4.0.15", @@ -331,7 +338,7 @@ }, }, "packages/integrations": { - "name": "@comp/integrations", + "name": "@trycompai/integrations", "version": "1.0.0", "dependencies": { "@ai-sdk/openai": "^1.3.19", @@ -354,7 +361,7 @@ }, }, "packages/kv": { - "name": "@comp/kv", + "name": "@trycompai/kv", "version": "1.0.0", "dependencies": { "@upstash/redis": "^1.34.2", @@ -366,11 +373,11 @@ }, }, "packages/tsconfig": { - "name": "@comp/tsconfig", + "name": "@trycompai/tsconfig", "version": "1.0.0", }, "packages/ui": { - "name": "@comp/ui", + "name": "@trycompai/ui", "version": "1.0.0", "dependencies": { "@radix-ui/react-accordion": "1.2.11", @@ -460,7 +467,7 @@ }, }, "packages/utils": { - "name": "@comp/utils", + "name": "@trycompai/utils", "version": "1.0.0", "devDependencies": { "typescript": "^5.8.3", @@ -688,32 +695,16 @@ "@commitlint/types": ["@commitlint/types@19.8.1", "", { "dependencies": { "@types/conventional-commits-parser": "^5.0.0", "chalk": "^5.3.0" } }, "sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw=="], - "@comp/analytics": ["@comp/analytics@workspace:packages/analytics"], - "@comp/app": ["@comp/app@workspace:apps/app"], - "@comp/db": ["@comp/db@workspace:packages/db"], - - "@comp/email": ["@comp/email@workspace:packages/email"], - "@comp/framework-editor": ["@comp/framework-editor@workspace:apps/framework-editor"], "@comp/infra": ["@comp/infra@workspace:apps/infra"], - "@comp/integrations": ["@comp/integrations@workspace:packages/integrations"], - - "@comp/kv": ["@comp/kv@workspace:packages/kv"], - "@comp/portal": ["@comp/portal@workspace:apps/portal"], "@comp/trust": ["@comp/trust@workspace:apps/trust"], - "@comp/tsconfig": ["@comp/tsconfig@workspace:packages/tsconfig"], - - "@comp/ui": ["@comp/ui@workspace:packages/ui"], - - "@comp/utils": ["@comp/utils@workspace:packages/utils"], - "@cspotcode/source-map-support": ["@cspotcode/source-map-support@0.8.1", "", { "dependencies": { "@jridgewell/trace-mapping": "0.3.9" } }, "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw=="], "@csstools/color-helpers": ["@csstools/color-helpers@5.0.2", "", {}, "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA=="], @@ -1760,6 +1751,22 @@ "@trigger.dev/sdk": ["@trigger.dev/sdk@3.3.17", "", { "dependencies": { "@opentelemetry/api": "1.9.0", "@opentelemetry/api-logs": "0.52.1", "@opentelemetry/semantic-conventions": "1.25.1", "@trigger.dev/core": "3.3.17", "chalk": "^5.2.0", "cronstrue": "^2.21.0", "debug": "^4.3.4", "evt": "^2.4.13", "slug": "^6.0.0", "terminal-link": "^3.0.0", "ulid": "^2.3.0", "uncrypto": "^0.1.3", "uuid": "^9.0.0", "ws": "^8.11.0" }, "peerDependencies": { "zod": "^3.0.0" } }, "sha512-wjIjlQWKybYWw/J7LxFIOO1pXzxXoj9lxbFMvjb51JtfebxnQnh6aExN47nOGhVhV38wHYstfBI/8ClWwBnFYw=="], + "@trycompai/analytics": ["@trycompai/analytics@workspace:packages/analytics"], + + "@trycompai/db": ["@trycompai/db@workspace:packages/db"], + + "@trycompai/email": ["@trycompai/email@workspace:packages/email"], + + "@trycompai/integrations": ["@trycompai/integrations@workspace:packages/integrations"], + + "@trycompai/kv": ["@trycompai/kv@workspace:packages/kv"], + + "@trycompai/tsconfig": ["@trycompai/tsconfig@workspace:packages/tsconfig"], + + "@trycompai/ui": ["@trycompai/ui@workspace:packages/ui"], + + "@trycompai/utils": ["@trycompai/utils@workspace:packages/utils"], + "@tsconfig/node10": ["@tsconfig/node10@1.0.11", "", {}, "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw=="], "@tsconfig/node12": ["@tsconfig/node12@1.0.11", "", {}, "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag=="], @@ -2822,7 +2829,7 @@ "fdir": ["fdir@6.4.6", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w=="], - "fflate": ["fflate@0.4.8", "", {}, "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="], + "fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], "figures": ["figures@6.1.0", "", { "dependencies": { "is-unicode-supported": "^2.0.0" } }, "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg=="], @@ -4110,7 +4117,7 @@ "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], - "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], @@ -4992,14 +4999,10 @@ "@trigger.dev/sdk/uuid": ["uuid@9.0.1", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA=="], - "@types/three/fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], "@uploadthing/shared/effect": ["effect@3.16.8", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "fast-check": "^3.23.1" } }, "sha512-E4U0MZFBun99myxOogy9ZZ1c3IYR47L/A5GqCP9Lp+6ORag0YLmGHOrYxQ3agN1FOMTrElgtJmciicwnHdE+Ug=="], - "@vitest/ui/fflate": ["fflate@0.8.2", "", {}, "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A=="], - "accepts/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], "anymatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], @@ -5040,6 +5043,8 @@ "config-chain/ini": ["ini@1.3.8", "", {}, "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew=="], + "content-disposition/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "cosmiconfig/js-yaml": ["js-yaml@4.1.0", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="], "cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], @@ -5056,6 +5061,8 @@ "duplexer2/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "ecdsa-sig-formatter/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "engine.io/cookie": ["cookie@0.7.2", "", {}, "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w=="], "engine.io/debug": ["debug@4.3.7", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ=="], @@ -5104,6 +5111,8 @@ "express/path-to-regexp": ["path-to-regexp@0.1.12", "", {}, "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ=="], + "express/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "extract-zip/get-stream": ["get-stream@5.2.0", "", { "dependencies": { "pump": "^3.0.0" } }, "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA=="], "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], @@ -5152,6 +5161,10 @@ "jszip/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], + "jwa/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + + "jws/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "lazystream/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="], "load-json-file/parse-json": ["parse-json@4.0.0", "", { "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw=="], @@ -5602,6 +5615,8 @@ "postcss-nested/postcss-selector-parser": ["postcss-selector-parser@6.1.2", "", { "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" } }, "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg=="], + "posthog-js/fflate": ["fflate@0.4.8", "", {}, "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="], + "pretty-format/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "pretty-format/ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], @@ -5644,6 +5659,8 @@ "request/qs": ["qs@6.5.3", "", {}, "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA=="], + "request/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "request/tough-cookie": ["tough-cookie@2.5.0", "", { "dependencies": { "psl": "^1.1.28", "punycode": "^2.1.1" } }, "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g=="], "request/uuid": ["uuid@3.4.0", "", { "bin": { "uuid": "./bin/uuid" } }, "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="], @@ -5710,6 +5727,8 @@ "string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], "strip-literal/js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], @@ -5736,6 +5755,8 @@ "tsup/tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], + "tunnel-agent/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "tunnel-rat/zustand": ["zustand@4.5.7", "", { "dependencies": { "use-sync-external-store": "^1.2.2" }, "peerDependencies": { "@types/react": ">=16.8", "immer": ">=9.0.6", "react": ">=16.8" }, "optionalPeers": ["@types/react", "immer", "react"] }, "sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw=="], "type-is/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], @@ -5910,8 +5931,6 @@ "archiver-utils/glob/path-scurry": ["path-scurry@1.11.1", "", { "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" } }, "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA=="], - "are-we-there-yet/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - "are-we-there-yet/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], "babel-plugin-macros/cosmiconfig/parse-json": ["parse-json@5.2.0", "", { "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } }, "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg=="], @@ -5946,8 +5965,6 @@ "cosmiconfig/parse-json/json-parse-even-better-errors": ["json-parse-even-better-errors@2.3.1", "", {}, "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="], - "duplexer2/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - "duplexer2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], "enquirer/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], @@ -5982,8 +5999,6 @@ "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - "from2/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - "from2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], "fstream/rimraf/glob": ["glob@7.2.3", "", { "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="], @@ -5992,12 +6007,8 @@ "gauge/strip-ansi/ansi-regex": ["ansi-regex@2.1.1", "", {}, "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA=="], - "jszip/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - "jszip/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], - "lazystream/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - "lazystream/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], "minipass-fetch/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], @@ -6130,8 +6141,6 @@ "source-map/whatwg-url/webidl-conversions": ["webidl-conversions@4.0.2", "", {}, "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg=="], - "stream-combiner2/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - "stream-combiner2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], "string-width-cjs/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], @@ -6146,8 +6155,6 @@ "terminal-link/supports-hyperlinks/supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "through2/readable-stream/safe-buffer": ["safe-buffer@5.1.2", "", {}, "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="], - "through2/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="], "type-is/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], @@ -6240,10 +6247,16 @@ "@slack/bolt/@slack/web-api/form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + "@slack/bolt/@slack/web-api/form-data/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "@slack/oauth/@slack/web-api/form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + "@slack/oauth/@slack/web-api/form-data/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "@slack/socket-mode/@slack/web-api/form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], + "@slack/socket-mode/@slack/web-api/form-data/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], + "@trigger.dev/core/execa/npm-run-path/path-key": ["path-key@4.0.0", "", {}, "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="], "@trigger.dev/core/execa/onetime/mimic-fn": ["mimic-fn@4.0.0", "", {}, "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="], diff --git a/package.json b/package.json index a815116c9..68cf5b651 100644 --- a/package.json +++ b/package.json @@ -87,7 +87,7 @@ "test": "turbo test --parallel", "test:release": "node scripts/test-release.js", "typecheck": "turbo typecheck", - "typecheck:ci": "turbo typecheck --filter={apps/**} --filter={packages/**} --filter=!@comp/integrations --filter=!@comp/ui" + "typecheck:ci": "turbo typecheck --filter={apps/**} --filter={packages/**} --filter=!@comp/integrations --filter=!@trycompai/ui" }, "workspaces": [ "apps/*", diff --git a/packages/analytics/package.json b/packages/analytics/package.json index 651bfc295..8e565176e 100644 --- a/packages/analytics/package.json +++ b/packages/analytics/package.json @@ -1,16 +1,56 @@ { - "name": "@comp/analytics", + "name": "@trycompai/analytics", + "description": "Analytics utilities using PostHog for Comp AI", "version": "1.0.0", "dependencies": { "posthog-js": "^1.236.6", "posthog-node": "^4.14.0" }, - "main": "src/index.ts", - "private": true, + "devDependencies": { + "tsup": "^8.5.0", + "typescript": "^5.8.3" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/index.mjs", + "require": "./dist/index.js" + }, + "./server": { + "types": "./dist/server.d.ts", + "import": "./dist/server.mjs", + "require": "./dist/server.js" + }, + "./components": "./src/components" + }, + "files": [ + "dist/**", + "README.md" + ], + "keywords": [ + "analytics", + "comp-ai", + "posthog", + "tracking" + ], + "license": "MIT", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/comp-ai/comp.git", + "directory": "packages/analytics" + }, "scripts": { - "clean": "rm -rf .turbo node_modules", + "build": "tsup src/index.ts src/server.ts --format cjs,esm --dts", + "clean": "rm -rf .turbo node_modules dist", + "dev": "tsup src/index.ts src/server.ts --format cjs,esm --watch --dts", "format": "prettier --write .", "lint": "prettier --check .", "typecheck": "tsc --noEmit" - } + }, + "types": "./dist/index.d.ts" } diff --git a/packages/analytics/src/index.ts b/packages/analytics/src/index.ts index a9eb7ee27..0ff62235d 100644 --- a/packages/analytics/src/index.ts +++ b/packages/analytics/src/index.ts @@ -23,7 +23,6 @@ export const Analytics = { }, }; -// Export components for client usage +// Export components for client usage only export * from './components/page-view'; export * from './components/provider'; -export * from './server'; diff --git a/packages/analytics/tsconfig.json b/packages/analytics/tsconfig.json index 496e89916..475d4e479 100644 --- a/packages/analytics/tsconfig.json +++ b/packages/analytics/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@comp/tsconfig/base.json", + "extends": "@trycompai/tsconfig/base.json", "include": ["src"], "exclude": ["node_modules"], "compilerOptions": { diff --git a/packages/db/package.json b/packages/db/package.json index 6f4deeb39..a2b1eeaa8 100644 --- a/packages/db/package.json +++ b/packages/db/package.json @@ -1,12 +1,12 @@ { - "name": "@comp/db", + "name": "@trycompai/db", "description": "Database package with Prisma client and schema for Comp AI", "version": "1.0.0", "dependencies": { "@prisma/client": "6.9.0" }, "devDependencies": { - "@comp/tsconfig": "workspace:*", + "@trycompai/tsconfig": "workspace:*", "prisma": "^6.9.0", "ts-node": "^10.9.2", "tsup": "^8.5.0", @@ -48,8 +48,7 @@ "seed": "ts-node prisma/seed/seed.ts" }, "publishConfig": { - "access": "public", - "name": "@trycompai/db" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/email/package.json b/packages/email/package.json index 1667be1c5..d1329529b 100644 --- a/packages/email/package.json +++ b/packages/email/package.json @@ -1,10 +1,10 @@ { - "name": "@comp/email", + "name": "@trycompai/email", "description": "Email templates and utilities for Comp AI", "version": "1.0.0", "dependencies": { - "@comp/ui": "workspace:*", - "@comp/utils": "workspace:*", + "@trycompai/ui": "workspace:*", + "@trycompai/utils": "workspace:*", "@react-email/components": "^0.0.41", "@react-email/render": "^1.1.2", "@react-email/tailwind": "1.0.5", @@ -45,8 +45,7 @@ "react-dom": "^19.1.0" }, "publishConfig": { - "access": "public", - "name": "@trycompai/email" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/integrations/package.json b/packages/integrations/package.json index 5994fed21..6d31afbd4 100644 --- a/packages/integrations/package.json +++ b/packages/integrations/package.json @@ -1,5 +1,5 @@ { - "name": "@comp/integrations", + "name": "@trycompai/integrations", "version": "1.0.0", "dependencies": { "@ai-sdk/openai": "^1.3.19", diff --git a/packages/kv/package.json b/packages/kv/package.json index c91bdce11..5cd9c8779 100644 --- a/packages/kv/package.json +++ b/packages/kv/package.json @@ -1,5 +1,5 @@ { - "name": "@comp/kv", + "name": "@trycompai/kv", "description": "Key-value store utilities using Upstash Redis for Comp AI", "version": "1.0.0", "dependencies": { @@ -32,8 +32,7 @@ "main": "./dist/index.js", "module": "./dist/index.mjs", "publishConfig": { - "access": "public", - "name": "@trycompai/kv" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json index 342d9c4a3..f1505ffcb 100644 --- a/packages/tsconfig/package.json +++ b/packages/tsconfig/package.json @@ -1,8 +1,34 @@ { - "name": "@comp/tsconfig", + "name": "@trycompai/tsconfig", + "description": "Shared TypeScript configurations for Comp AI", "version": "1.0.0", + "exports": { + "./base": "./base.json", + "./base.json": "./base.json", + "./nextjs": "./nextjs.json", + "./nextjs.json": "./nextjs.json", + "./react-library": "./react-library.json", + "./react-library.json": "./react-library.json" + }, "files": [ - "base.json" + "base.json", + "nextjs.json", + "react-library.json", + "README.md" ], - "private": true + "keywords": [ + "comp-ai", + "configuration", + "tsconfig", + "typescript" + ], + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/comp-ai/comp.git", + "directory": "packages/tsconfig" + } } diff --git a/packages/ui/package.json b/packages/ui/package.json index 7c2bff1a3..69603f363 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,5 +1,6 @@ { - "name": "@comp/ui", + "name": "@trycompai/ui", + "type": "module", "description": "UI component library for Comp AI", "version": "1.0.0", "dependencies": { @@ -184,8 +185,7 @@ "react-dom": "^19.1.0" }, "publishConfig": { - "access": "public", - "name": "@trycompai/ui" + "access": "public" }, "repository": { "type": "git", diff --git a/packages/utils/package.json b/packages/utils/package.json index c54ad9802..203890f16 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,5 +1,5 @@ { - "name": "@comp/utils", + "name": "@trycompai/utils", "version": "1.0.0", "devDependencies": { "typescript": "^5.8.3" diff --git a/release.config.js b/release.config.js index a7a80daad..44d1c1cff 100644 --- a/release.config.js +++ b/release.config.js @@ -49,6 +49,20 @@ module.exports = { pkgRoot: 'packages/ui', }, ], + [ + '@semantic-release/npm', + { + npmPublish: true, + pkgRoot: 'packages/analytics', + }, + ], + [ + '@semantic-release/npm', + { + npmPublish: true, + pkgRoot: 'packages/tsconfig', + }, + ], [ '@semantic-release/git', { diff --git a/yarn.lock b/yarn.lock index 0f786fcc5..02de3f2fd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1339,13 +1339,6 @@ "@types/conventional-commits-parser" "^5.0.0" chalk "^5.3.0" -"@comp/analytics@^workspace:packages/analytics": - version "workspace:packages/analytics" - resolved "workspace:packages/analytics" - dependencies: - posthog-js "^1.236.6" - posthog-node "^4.14.0" - "@comp/app@^workspace:apps/app", "@comp/app@workspace:*": version "workspace:apps/app" resolved "workspace:apps/app" @@ -1384,9 +1377,6 @@ "@browserbasehq/sdk" "^2.5.0" "@calcom/atoms" "^1.0.102-framer" "@calcom/embed-react" "^1.5.3" - dependencies: - "@comp/db" "workspace:*" - dependencies: "@date-fns/tz" "^1.2.0" "@dnd-kit/core" "^6.3.1" "@dnd-kit/modifiers" "^9.0.0" @@ -1414,6 +1404,9 @@ "@tiptap/extension-table-row" "^2.22.3" "@trigger.dev/react-hooks" "3.3.17" "@trigger.dev/sdk" "3.3.17" + dependencies: + "@trycompai/db" "workspace:*" + dependencies: "@types/canvas-confetti" "^1.9.0" "@types/three" "^0.177.0" "@uploadthing/react" "^7.3.0" @@ -1456,39 +1449,6 @@ zaraz-ts "^1.2.0" zustand "^5.0.3" -"@comp/db@^workspace:packages/db", "@comp/db@workspace:*": - version "workspace:packages/db" - resolved "workspace:packages/db" - devDependencies: - "@comp/tsconfig" "workspace:*" - devDependencies: - prisma "^6.9.0" - ts-node "^10.9.2" - tsup "^8.5.0" - typescript "^5.8.3" - dependencies: - "@prisma/client" "6.9.0" - -"@comp/email@^workspace:packages/email": - version "workspace:packages/email" - resolved "workspace:packages/email" - devDependencies: - react "^19.1.0" - react-dom "^19.1.0" - tsup "^8.5.0" - typescript "^5.8.3" - dependencies: - "@comp/ui" "workspace:*" - "@comp/utils" "workspace:*" - dependencies: - "@react-email/components" "^0.0.41" - "@react-email/render" "^1.1.2" - "@react-email/tailwind" "1.0.5" - date-fns "^4.1.0" - next "15.4.0-canary.85" - react-email "^4.0.15" - responsive-react-email "^0.0.5" - "@comp/framework-editor@^workspace:apps/framework-editor": version "workspace:apps/framework-editor" resolved "workspace:apps/framework-editor" @@ -1502,13 +1462,14 @@ react-dom "^19.1.0" tailwindcss "^4.1.8" typescript "^5.8.3" - dependencies: - "@comp/db" "workspace:*" - "@comp/ui" "workspace:*" dependencies: "@hookform/resolvers" "^5.1.1" "@tanstack/react-table" "^8.21.3" "@tanstack/react-virtual" "^3.13.8" + dependencies: + "@trycompai/db" "workspace:*" + "@trycompai/ui" "workspace:*" + dependencies: better-auth "^1.2.8" lucide-react "^0.518.0" next "15.4.0-canary.85" @@ -1535,39 +1496,6 @@ "@pulumi/tailscale" "^0.17.0" dotenv "^17.2.0" -"@comp/integrations@^workspace:packages/integrations": - version "workspace:packages/integrations" - resolved "workspace:packages/integrations" - devDependencies: - "@types/node" "^24.0.3" - "@types/node-fetch" "^2.6.2" - typescript "^5.8.3" - dependencies: - "@ai-sdk/openai" "^1.3.19" - "@aws-sdk/client-securityhub" "^3.0.0" - "@azure/identity" "^4.10.0" - dependencies: - "@comp/app" "workspace:*" - dependencies: - "@slack/bolt" "^3.22.0" - "@slack/web-api" "^7.8.0" - ai "^4.3.16" - jsonwebtoken "^9.0.2" - node-fetch "^2.6.7" - sharp "^0.34.2" - stoppable "^1.1.0" - zod "3.25.67" - -"@comp/kv@^workspace:packages/kv": - version "workspace:packages/kv" - resolved "workspace:packages/kv" - devDependencies: - tsup "^8.5.0" - typescript "^5.8.3" - dependencies: - "@upstash/redis" "^1.34.2" - server-only "0.0.1" - "@comp/portal@^workspace:apps/portal": version "workspace:apps/portal" resolved "workspace:apps/portal" @@ -1584,13 +1512,16 @@ typescript "^5.8.3" dependencies: "@aws-sdk/s3-request-presigner" "^3.832.0" - dependencies: - "@comp/db" "workspace:*" - "@comp/ui" "workspace:*" - dependencies: "@react-email/components" "^0.0.41" "@react-email/render" "^1.1.2" "@t3-oss/env-nextjs" "^0.13.8" + dependencies: + "@trycompai/analytics" "workspace:*" + "@trycompai/db" "workspace:*" + "@trycompai/email" "workspace:*" + "@trycompai/kv" "workspace:*" + "@trycompai/ui" "workspace:*" + dependencies: "@types/jszip" "^3.4.1" archiver "^7.0.1" better-auth "^1.2.8" @@ -1613,107 +1544,14 @@ react-dom "^19.1.0" tailwindcss "^4.1.8" typescript "^5.8.3" - dependencies: - "@comp/db" "workspace:*" - "@comp/ui" "workspace:*" dependencies: "@lottiefiles/dotlottie-react" "^0.14.2" - lucide-react "^0.518.0" - next "15.4.0-canary.85" - -"@comp/tsconfig@^workspace:packages/tsconfig", "@comp/tsconfig@workspace:*": - version "workspace:packages/tsconfig" - resolved "workspace:packages/tsconfig" - -"@comp/ui@^workspace:packages/ui", "@comp/ui@workspace:*": - version "workspace:packages/ui" - resolved "workspace:packages/ui" - devDependencies: - "@tailwindcss/cli" "^4.1.10" - "@tailwindcss/postcss" "^4.1.10" - autoprefixer "^10.4.21" - postcss "^8.5.4" - react "^19.1.0" - react-dom "^19.1.0" - tailwindcss "^4.1.8" - tsup "^8.5.0" - typescript "^5.8.3" dependencies: - "@radix-ui/react-accordion" "1.2.11" - "@radix-ui/react-alert-dialog" "1.1.14" - "@radix-ui/react-avatar" "1.1.10" - "@radix-ui/react-checkbox" "1.3.2" - "@radix-ui/react-collapsible" "1.1.11" - "@radix-ui/react-context-menu" "2.2.15" - "@radix-ui/react-dialog" "1.1.14" - "@radix-ui/react-dropdown-menu" "2.1.15" - "@radix-ui/react-hover-card" "1.1.14" - "@radix-ui/react-icons" "^1.3.0" - "@radix-ui/react-label" "2.1.7" - "@radix-ui/react-navigation-menu" "1.2.13" - "@radix-ui/react-popover" "1.1.14" - "@radix-ui/react-progress" "1.1.7" - "@radix-ui/react-radio-group" "1.3.7" - "@radix-ui/react-scroll-area" "1.2.9" - "@radix-ui/react-select" "2.2.5" - "@radix-ui/react-separator" "1.1.7" - "@radix-ui/react-slider" "1.3.5" - "@radix-ui/react-slot" "1.2.3" - "@radix-ui/react-switch" "1.2.5" - "@radix-ui/react-tabs" "1.1.12" - "@radix-ui/react-toast" "1.2.14" - "@radix-ui/react-toggle" "1.1.9" - "@radix-ui/react-toggle-group" "1.1.10" - "@radix-ui/react-tooltip" "1.2.7" - "@radix-ui/react-use-is-hydrated" "^0.1.0" - "@tailwindcss/typography" "^0.5.16" - "@tiptap/extension-bold" "2.14.0" - "@tiptap/extension-character-count" "2.14.0" - "@tiptap/extension-code-block-lowlight" "2.14.0" - "@tiptap/extension-highlight" "2.22.3" - "@tiptap/extension-image" "2.14.0" - "@tiptap/extension-link" "2.14.0" - "@tiptap/extension-placeholder" "2.14.0" - "@tiptap/extension-table" "^2.22.3" - "@tiptap/extension-table-cell" "^2.22.3" - "@tiptap/extension-table-header" "^2.22.3" - "@tiptap/extension-table-row" "^2.22.3" - "@tiptap/extension-task-item" "2.22.3" - "@tiptap/extension-task-list" "2.14.0" - "@tiptap/extension-text-align" "2.22.3" - "@tiptap/extension-typography" "2.14.0" - "@tiptap/extension-underline" "2.22.3" - "@tiptap/pm" "2.22.3" - "@tiptap/react" "2.14.0" - "@tiptap/starter-kit" "2.14.0" - "@tiptap/suggestion" "2.14.0" - "@uidotdev/usehooks" "^2.4.1" - class-variance-authority "^0.7.1" - clsx "^2.1.1" - cmdk "1.0.4" - date-fns "^4.1.0" - embla-carousel-react "8.5.1" - input-otp "1.4.2" - jsonfile "^6.1.0" + "@trycompai/db" "workspace:*" + "@trycompai/ui" "workspace:*" + dependencies: lucide-react "^0.518.0" - react-day-picker "8.10.1" - react-dropzone "^14.3.5" - react-icons "^5.3.0" - react-number-format "^5.4.2" - react-resizable-panels "^3.0.3" - recharts "2.15.0" - tailwind-merge "^2.5.5" - tailwindcss-animate "^1.0.7" - tippy.js "^6.3.7" - use-callback-ref "^1.3.3" - use-debounce "^10.0.4" - vaul "^0.9.6" - -"@comp/utils@^workspace:packages/utils", "@comp/utils@workspace:*": - version "workspace:packages/utils" - resolved "workspace:packages/utils" - devDependencies: - typescript "^5.8.3" + next "15.4.0-canary.85" "@cspotcode/source-map-support@^0.8.0": version "0.8.1" @@ -6378,6 +6216,177 @@ uuid "^9.0.0" ws "^8.11.0" +"@trycompai/analytics@^workspace:packages/analytics", "@trycompai/analytics@workspace:*": + version "workspace:packages/analytics" + resolved "workspace:packages/analytics" + devDependencies: + tsup "^8.4.0" + typescript "^5.8.3" + dependencies: + posthog-js "^1.236.6" + posthog-node "^4.14.0" + +"@trycompai/db@^workspace:packages/db", "@trycompai/db@workspace:*": + version "workspace:packages/db" + resolved "workspace:packages/db" + devDependencies: + "@trycompai/tsconfig" "workspace:*" + devDependencies: + prisma "^6.9.0" + ts-node "^10.9.2" + tsup "^8.5.0" + typescript "^5.8.3" + dependencies: + "@prisma/client" "6.9.0" + +"@trycompai/email@^workspace:packages/email", "@trycompai/email@workspace:*": + version "workspace:packages/email" + resolved "workspace:packages/email" + devDependencies: + react "^19.1.0" + react-dom "^19.1.0" + tsup "^8.5.0" + typescript "^5.8.3" + dependencies: + "@react-email/components" "^0.0.41" + "@react-email/render" "^1.1.2" + "@react-email/tailwind" "1.0.5" + dependencies: + "@trycompai/ui" "workspace:*" + "@trycompai/utils" "workspace:*" + dependencies: + date-fns "^4.1.0" + next "15.4.0-canary.85" + react-email "^4.0.15" + responsive-react-email "^0.0.5" + +"@trycompai/integrations@^workspace:packages/integrations": + version "workspace:packages/integrations" + resolved "workspace:packages/integrations" + devDependencies: + "@types/node" "^24.0.3" + "@types/node-fetch" "^2.6.2" + typescript "^5.8.3" + dependencies: + "@ai-sdk/openai" "^1.3.19" + "@aws-sdk/client-securityhub" "^3.0.0" + "@azure/identity" "^4.10.0" + dependencies: + "@comp/app" "workspace:*" + dependencies: + "@slack/bolt" "^3.22.0" + "@slack/web-api" "^7.8.0" + ai "^4.3.16" + jsonwebtoken "^9.0.2" + node-fetch "^2.6.7" + sharp "^0.34.2" + stoppable "^1.1.0" + zod "3.25.67" + +"@trycompai/kv@^workspace:packages/kv", "@trycompai/kv@workspace:*": + version "workspace:packages/kv" + resolved "workspace:packages/kv" + devDependencies: + tsup "^8.5.0" + typescript "^5.8.3" + dependencies: + "@upstash/redis" "^1.34.2" + server-only "0.0.1" + +"@trycompai/tsconfig@^workspace:packages/tsconfig", "@trycompai/tsconfig@workspace:*": + version "workspace:packages/tsconfig" + resolved "workspace:packages/tsconfig" + +"@trycompai/ui@^workspace:packages/ui", "@trycompai/ui@workspace:*": + version "workspace:packages/ui" + resolved "workspace:packages/ui" + devDependencies: + "@tailwindcss/cli" "^4.1.10" + "@tailwindcss/postcss" "^4.1.10" + autoprefixer "^10.4.21" + postcss "^8.5.4" + react "^19.1.0" + react-dom "^19.1.0" + tailwindcss "^4.1.8" + tsup "^8.5.0" + typescript "^5.8.3" + dependencies: + "@radix-ui/react-accordion" "1.2.11" + "@radix-ui/react-alert-dialog" "1.1.14" + "@radix-ui/react-avatar" "1.1.10" + "@radix-ui/react-checkbox" "1.3.2" + "@radix-ui/react-collapsible" "1.1.11" + "@radix-ui/react-context-menu" "2.2.15" + "@radix-ui/react-dialog" "1.1.14" + "@radix-ui/react-dropdown-menu" "2.1.15" + "@radix-ui/react-hover-card" "1.1.14" + "@radix-ui/react-icons" "^1.3.0" + "@radix-ui/react-label" "2.1.7" + "@radix-ui/react-navigation-menu" "1.2.13" + "@radix-ui/react-popover" "1.1.14" + "@radix-ui/react-progress" "1.1.7" + "@radix-ui/react-radio-group" "1.3.7" + "@radix-ui/react-scroll-area" "1.2.9" + "@radix-ui/react-select" "2.2.5" + "@radix-ui/react-separator" "1.1.7" + "@radix-ui/react-slider" "1.3.5" + "@radix-ui/react-slot" "1.2.3" + "@radix-ui/react-switch" "1.2.5" + "@radix-ui/react-tabs" "1.1.12" + "@radix-ui/react-toast" "1.2.14" + "@radix-ui/react-toggle" "1.1.9" + "@radix-ui/react-toggle-group" "1.1.10" + "@radix-ui/react-tooltip" "1.2.7" + "@radix-ui/react-use-is-hydrated" "^0.1.0" + "@tailwindcss/typography" "^0.5.16" + "@tiptap/extension-bold" "2.14.0" + "@tiptap/extension-character-count" "2.14.0" + "@tiptap/extension-code-block-lowlight" "2.14.0" + "@tiptap/extension-highlight" "2.22.3" + "@tiptap/extension-image" "2.14.0" + "@tiptap/extension-link" "2.14.0" + "@tiptap/extension-placeholder" "2.14.0" + "@tiptap/extension-table" "^2.22.3" + "@tiptap/extension-table-cell" "^2.22.3" + "@tiptap/extension-table-header" "^2.22.3" + "@tiptap/extension-table-row" "^2.22.3" + "@tiptap/extension-task-item" "2.22.3" + "@tiptap/extension-task-list" "2.14.0" + "@tiptap/extension-text-align" "2.22.3" + "@tiptap/extension-typography" "2.14.0" + "@tiptap/extension-underline" "2.22.3" + "@tiptap/pm" "2.22.3" + "@tiptap/react" "2.14.0" + "@tiptap/starter-kit" "2.14.0" + "@tiptap/suggestion" "2.14.0" + "@uidotdev/usehooks" "^2.4.1" + class-variance-authority "^0.7.1" + clsx "^2.1.1" + cmdk "1.0.4" + date-fns "^4.1.0" + embla-carousel-react "8.5.1" + input-otp "1.4.2" + jsonfile "^6.1.0" + lucide-react "^0.518.0" + react-day-picker "8.10.1" + react-dropzone "^14.3.5" + react-icons "^5.3.0" + react-number-format "^5.4.2" + react-resizable-panels "^3.0.3" + recharts "2.15.0" + tailwind-merge "^2.5.5" + tailwindcss-animate "^1.0.7" + tippy.js "^6.3.7" + use-callback-ref "^1.3.3" + use-debounce "^10.0.4" + vaul "^0.9.6" + +"@trycompai/utils@^workspace:packages/utils", "@trycompai/utils@workspace:*": + version "workspace:packages/utils" + resolved "workspace:packages/utils" + devDependencies: + typescript "^5.8.3" + "@tsconfig/node10@^1.0.7": version "1.0.11" resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz" @@ -18151,7 +18160,7 @@ tsscmp@^1.0.6: resolved "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz" integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA== -tsup@^8.5.0: +tsup@^8.4.0, tsup@^8.5.0: version "8.5.0" resolved "https://registry.npmjs.org/tsup/-/tsup-8.5.0.tgz" integrity sha512-VmBp77lWNQq6PfuMqCHD3xWl22vEoWsKajkF8t+yMBawlUS8JzEI+vOVMeuNZIuMML8qXRizFKi9oD5glKQVcQ== From d418d5e6f8027a5dc365fcbe2d47a4ca9ac5569b Mon Sep 17 00:00:00 2001 From: Claudio Fuentes Date: Thu, 24 Jul 2025 18:36:11 -0400 Subject: [PATCH 087/107] chore: deleted private packages --- .github/BRANCH_PROTECTION.md | 4 - .github/workflows/unit-tests.yml | 2 +- apps/framework-editor/.env.example | 8 - apps/framework-editor/.eslintrc.json | 7 - apps/framework-editor/.gitignore | 28 -- .../app/(pages)/auth/Unauthorized.tsx | 36 -- .../app/(pages)/auth/button-icon.tsx | 38 -- .../app/(pages)/auth/google-sign-in.tsx | 44 -- .../app/(pages)/auth/page.tsx | 65 --- .../(pages)/controls/ControlsClientPage.tsx | 376 --------------- .../app/(pages)/controls/actions.ts | 368 -------------- .../controls/hooks/useChangeTracking.ts | 448 ------------------ .../app/(pages)/controls/page.tsx | 50 -- .../app/(pages)/controls/schemas.ts | 6 - .../app/(pages)/controls/types.ts | 74 --- .../frameworks/FrameworksClientPage.tsx | 47 -- .../FrameworkRequirementsClientPage.tsx | 214 --------- .../actions/add-requirement-action.ts | 88 ---- .../[frameworkId]/actions/delete-framework.ts | 75 --- .../actions/delete-requirement-action.ts | 76 --- .../components/AddRequirementDialog.tsx | 190 -------- .../components/DeleteFrameworkDialog.tsx | 108 ----- .../components/DeleteRequirementDialog.tsx | 109 ----- .../components/EditFrameworkDialog.tsx | 216 --------- .../components/EditRequirementDialog.tsx | 198 -------- .../[frameworkId]/components/columns.tsx | 128 ----- .../(pages)/frameworks/[frameworkId]/page.tsx | 54 --- .../actions/create-framework-action.ts | 79 --- .../actions/update-framework-action.ts | 81 ---- .../actions/update-requirement-action.ts | 79 --- .../components/CreateFrameworkDialog.tsx | 189 -------- .../(pages)/frameworks/components/columns.tsx | 77 --- .../app/(pages)/frameworks/page.tsx | 46 -- .../app/(pages)/frameworks/schemas.ts | 14 - apps/framework-editor/app/(pages)/layout.tsx | 3 - .../(pages)/policies/PoliciesClientPage.tsx | 39 -- .../[policyId]/PolicyDetailsClientPage.tsx | 103 ---- .../[policyId]/PolicyEditorClient.tsx | 45 -- .../(pages)/policies/[policyId]/actions.ts | 50 -- .../components/DeletePolicyDialog.tsx | 77 --- .../components/EditPolicyDialog.tsx | 192 -------- .../app/(pages)/policies/[policyId]/page.tsx | 53 --- .../app/(pages)/policies/actions.ts | 135 ------ .../components/CreatePolicyDialog.tsx | 192 -------- .../(pages)/policies/components/columns.tsx | 49 -- .../app/(pages)/policies/page.tsx | 18 - .../app/(pages)/policies/schemas.ts | 11 - .../app/(pages)/tasks/TasksClientPage.tsx | 309 ------------ .../app/(pages)/tasks/actions.ts | 223 --------- .../tasks/hooks/useTaskChangeTracking.ts | 429 ----------------- .../app/(pages)/tasks/page.tsx | 26 - .../app/api/auth/[...all]/route.ts | 4 - .../app/components/DataTable.tsx | 169 ------- .../app/components/HeaderFrameworks.tsx | 15 - .../app/components/MenuTabs.tsx | 33 -- .../app/components/PageLayout.tsx | 72 --- .../app/components/SearchAndLinkList.tsx | 213 --------- .../app/components/SearchableItemList.tsx | 78 --- .../app/components/TableToolbar.tsx | 113 ----- .../app/components/editor/AdvancedEditor.tsx | 37 -- .../app/components/editor/PolicyEditor.tsx | 62 --- .../app/components/grid/ActionCell.tsx | 39 -- .../app/components/grid/RelationalCell.tsx | 448 ------------------ .../app/components/grid/SelectCell.tsx | 123 ----- .../app/components/grid/TextAreaCell.tsx | 138 ------ .../app/components/gridUtils.tsx | 39 -- .../app/components/sign-out.tsx | 33 -- .../app/components/user-menu.tsx | 59 --- .../app/hooks/useTableSearchSort.ts | 101 ---- apps/framework-editor/app/layout.tsx | 40 -- apps/framework-editor/app/lib/auth-client.ts | 10 - apps/framework-editor/app/lib/auth.ts | 58 --- apps/framework-editor/app/lib/utils.ts | 28 -- apps/framework-editor/app/loading.tsx | 5 - apps/framework-editor/app/page.tsx | 12 - apps/framework-editor/app/types/common.ts | 15 - apps/framework-editor/components.json | 21 - apps/framework-editor/next.config.mjs | 14 - apps/framework-editor/package.json | 43 -- apps/framework-editor/postcss.config.mjs | 7 - apps/framework-editor/styles/globals.css | 35 -- apps/framework-editor/tailwind.config.js | 11 - apps/framework-editor/tsconfig.json | 27 -- apps/trust/.eslintrc.json | 3 - apps/trust/.gitignore | 41 -- apps/trust/README.md | 36 -- apps/trust/next.config.ts | 51 -- apps/trust/package.json | 34 -- apps/trust/postcss.config.mjs | 7 - apps/trust/public/apple-touch-icon.png | Bin 2445 -> 0 bytes apps/trust/public/favicon-96x96.png | Bin 1122 -> 0 bytes apps/trust/public/favicon.ico | Bin 15086 -> 0 bytes apps/trust/public/favicon.svg | 3 - .../public/fonts/GeneralSans-Variable.ttf | Bin 110820 -> 0 bytes .../fonts/GeneralSans-VariableItalic.ttf | Bin 112704 -> 0 bytes apps/trust/public/gdpr.avif | Bin 7416 -> 0 bytes apps/trust/public/iso27001.png | Bin 40323 -> 0 bytes apps/trust/public/site.webmanifest | 21 - apps/trust/public/soc2.avif | Bin 7761 -> 0 bytes .../trust/public/web-app-manifest-192x192.png | Bin 2647 -> 0 bytes .../trust/public/web-app-manifest-512x512.png | Bin 10855 -> 0 bytes .../app/[id]/components/compliance-header.tsx | 82 ---- .../app/[id]/components/compliance-item.tsx | 17 - .../[id]/components/compliance-overview.tsx | 23 - .../[id]/components/compliance-section.tsx | 50 -- .../[id]/components/compliance-summary.tsx | 11 - .../app/[id]/components/framework-item.tsx | 42 -- apps/trust/src/app/[id]/components/logo.tsx | 16 - apps/trust/src/app/[id]/components/logos.tsx | 122 ----- apps/trust/src/app/[id]/components/report.tsx | 122 ----- apps/trust/src/app/[id]/lib/data.ts | 137 ------ apps/trust/src/app/[id]/loading.tsx | 5 - apps/trust/src/app/[id]/page.tsx | 107 ----- apps/trust/src/app/api/get-sites/route.tsx | 52 -- apps/trust/src/app/layout.tsx | 34 -- apps/trust/src/app/page.tsx | 5 - apps/trust/src/app/providers.tsx | 40 -- apps/trust/src/app/sitemap.ts | 38 -- apps/trust/src/middleware.ts | 76 --- apps/trust/tailwind.config.ts | 11 - apps/trust/tsconfig.json | 27 -- bun.lock | 127 +---- yarn.lock | 304 +----------- 123 files changed, 23 insertions(+), 9299 deletions(-) delete mode 100644 apps/framework-editor/.env.example delete mode 100644 apps/framework-editor/.eslintrc.json delete mode 100644 apps/framework-editor/.gitignore delete mode 100644 apps/framework-editor/app/(pages)/auth/Unauthorized.tsx delete mode 100644 apps/framework-editor/app/(pages)/auth/button-icon.tsx delete mode 100644 apps/framework-editor/app/(pages)/auth/google-sign-in.tsx delete mode 100644 apps/framework-editor/app/(pages)/auth/page.tsx delete mode 100644 apps/framework-editor/app/(pages)/controls/ControlsClientPage.tsx delete mode 100644 apps/framework-editor/app/(pages)/controls/actions.ts delete mode 100644 apps/framework-editor/app/(pages)/controls/hooks/useChangeTracking.ts delete mode 100644 apps/framework-editor/app/(pages)/controls/page.tsx delete mode 100644 apps/framework-editor/app/(pages)/controls/schemas.ts delete mode 100644 apps/framework-editor/app/(pages)/controls/types.ts delete mode 100644 apps/framework-editor/app/(pages)/frameworks/FrameworksClientPage.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/[frameworkId]/FrameworkRequirementsClientPage.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/add-requirement-action.ts delete mode 100644 apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/delete-framework.ts delete mode 100644 apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/delete-requirement-action.ts delete mode 100644 apps/framework-editor/app/(pages)/frameworks/[frameworkId]/components/AddRequirementDialog.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/[frameworkId]/components/DeleteFrameworkDialog.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/[frameworkId]/components/DeleteRequirementDialog.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/[frameworkId]/components/EditFrameworkDialog.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/[frameworkId]/components/EditRequirementDialog.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/[frameworkId]/components/columns.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/[frameworkId]/page.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/actions/create-framework-action.ts delete mode 100644 apps/framework-editor/app/(pages)/frameworks/actions/update-framework-action.ts delete mode 100644 apps/framework-editor/app/(pages)/frameworks/actions/update-requirement-action.ts delete mode 100644 apps/framework-editor/app/(pages)/frameworks/components/CreateFrameworkDialog.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/components/columns.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/page.tsx delete mode 100644 apps/framework-editor/app/(pages)/frameworks/schemas.ts delete mode 100644 apps/framework-editor/app/(pages)/layout.tsx delete mode 100644 apps/framework-editor/app/(pages)/policies/PoliciesClientPage.tsx delete mode 100644 apps/framework-editor/app/(pages)/policies/[policyId]/PolicyDetailsClientPage.tsx delete mode 100644 apps/framework-editor/app/(pages)/policies/[policyId]/PolicyEditorClient.tsx delete mode 100644 apps/framework-editor/app/(pages)/policies/[policyId]/actions.ts delete mode 100644 apps/framework-editor/app/(pages)/policies/[policyId]/components/DeletePolicyDialog.tsx delete mode 100644 apps/framework-editor/app/(pages)/policies/[policyId]/components/EditPolicyDialog.tsx delete mode 100644 apps/framework-editor/app/(pages)/policies/[policyId]/page.tsx delete mode 100644 apps/framework-editor/app/(pages)/policies/actions.ts delete mode 100644 apps/framework-editor/app/(pages)/policies/components/CreatePolicyDialog.tsx delete mode 100644 apps/framework-editor/app/(pages)/policies/components/columns.tsx delete mode 100644 apps/framework-editor/app/(pages)/policies/page.tsx delete mode 100644 apps/framework-editor/app/(pages)/policies/schemas.ts delete mode 100644 apps/framework-editor/app/(pages)/tasks/TasksClientPage.tsx delete mode 100644 apps/framework-editor/app/(pages)/tasks/actions.ts delete mode 100644 apps/framework-editor/app/(pages)/tasks/hooks/useTaskChangeTracking.ts delete mode 100644 apps/framework-editor/app/(pages)/tasks/page.tsx delete mode 100644 apps/framework-editor/app/api/auth/[...all]/route.ts delete mode 100644 apps/framework-editor/app/components/DataTable.tsx delete mode 100644 apps/framework-editor/app/components/HeaderFrameworks.tsx delete mode 100644 apps/framework-editor/app/components/MenuTabs.tsx delete mode 100644 apps/framework-editor/app/components/PageLayout.tsx delete mode 100644 apps/framework-editor/app/components/SearchAndLinkList.tsx delete mode 100644 apps/framework-editor/app/components/SearchableItemList.tsx delete mode 100644 apps/framework-editor/app/components/TableToolbar.tsx delete mode 100644 apps/framework-editor/app/components/editor/AdvancedEditor.tsx delete mode 100644 apps/framework-editor/app/components/editor/PolicyEditor.tsx delete mode 100644 apps/framework-editor/app/components/grid/ActionCell.tsx delete mode 100644 apps/framework-editor/app/components/grid/RelationalCell.tsx delete mode 100644 apps/framework-editor/app/components/grid/SelectCell.tsx delete mode 100644 apps/framework-editor/app/components/grid/TextAreaCell.tsx delete mode 100644 apps/framework-editor/app/components/gridUtils.tsx delete mode 100644 apps/framework-editor/app/components/sign-out.tsx delete mode 100644 apps/framework-editor/app/components/user-menu.tsx delete mode 100644 apps/framework-editor/app/hooks/useTableSearchSort.ts delete mode 100644 apps/framework-editor/app/layout.tsx delete mode 100644 apps/framework-editor/app/lib/auth-client.ts delete mode 100644 apps/framework-editor/app/lib/auth.ts delete mode 100644 apps/framework-editor/app/lib/utils.ts delete mode 100644 apps/framework-editor/app/loading.tsx delete mode 100644 apps/framework-editor/app/page.tsx delete mode 100644 apps/framework-editor/app/types/common.ts delete mode 100644 apps/framework-editor/components.json delete mode 100644 apps/framework-editor/next.config.mjs delete mode 100644 apps/framework-editor/package.json delete mode 100644 apps/framework-editor/postcss.config.mjs delete mode 100644 apps/framework-editor/styles/globals.css delete mode 100644 apps/framework-editor/tailwind.config.js delete mode 100644 apps/framework-editor/tsconfig.json delete mode 100644 apps/trust/.eslintrc.json delete mode 100644 apps/trust/.gitignore delete mode 100644 apps/trust/README.md delete mode 100644 apps/trust/next.config.ts delete mode 100644 apps/trust/package.json delete mode 100644 apps/trust/postcss.config.mjs delete mode 100644 apps/trust/public/apple-touch-icon.png delete mode 100644 apps/trust/public/favicon-96x96.png delete mode 100644 apps/trust/public/favicon.ico delete mode 100644 apps/trust/public/favicon.svg delete mode 100644 apps/trust/public/fonts/GeneralSans-Variable.ttf delete mode 100644 apps/trust/public/fonts/GeneralSans-VariableItalic.ttf delete mode 100644 apps/trust/public/gdpr.avif delete mode 100644 apps/trust/public/iso27001.png delete mode 100644 apps/trust/public/site.webmanifest delete mode 100644 apps/trust/public/soc2.avif delete mode 100644 apps/trust/public/web-app-manifest-192x192.png delete mode 100644 apps/trust/public/web-app-manifest-512x512.png delete mode 100644 apps/trust/src/app/[id]/components/compliance-header.tsx delete mode 100644 apps/trust/src/app/[id]/components/compliance-item.tsx delete mode 100644 apps/trust/src/app/[id]/components/compliance-overview.tsx delete mode 100644 apps/trust/src/app/[id]/components/compliance-section.tsx delete mode 100644 apps/trust/src/app/[id]/components/compliance-summary.tsx delete mode 100644 apps/trust/src/app/[id]/components/framework-item.tsx delete mode 100644 apps/trust/src/app/[id]/components/logo.tsx delete mode 100644 apps/trust/src/app/[id]/components/logos.tsx delete mode 100644 apps/trust/src/app/[id]/components/report.tsx delete mode 100644 apps/trust/src/app/[id]/lib/data.ts delete mode 100644 apps/trust/src/app/[id]/loading.tsx delete mode 100644 apps/trust/src/app/[id]/page.tsx delete mode 100644 apps/trust/src/app/api/get-sites/route.tsx delete mode 100644 apps/trust/src/app/layout.tsx delete mode 100644 apps/trust/src/app/page.tsx delete mode 100644 apps/trust/src/app/providers.tsx delete mode 100644 apps/trust/src/app/sitemap.ts delete mode 100644 apps/trust/src/middleware.ts delete mode 100644 apps/trust/tailwind.config.ts delete mode 100644 apps/trust/tsconfig.json diff --git a/.github/BRANCH_PROTECTION.md b/.github/BRANCH_PROTECTION.md index 9131632d8..63c788f40 100644 --- a/.github/BRANCH_PROTECTION.md +++ b/.github/BRANCH_PROTECTION.md @@ -16,13 +16,11 @@ Go to **Settings → Branches** in your GitHub repository and add a branch prote ### Must Pass Before Merging: 1. **Quick Checks** (Quick Tests) - - Fast smoke tests that run on every PR - Includes type checking, linting, and critical middleware tests - Should complete in < 5 minutes 2. **Unit Tests** (Unit Tests / app) - - Vitest unit tests for the main app - Tests business logic, utilities, and components @@ -103,9 +101,7 @@ Protect matching branches: Status checks that are required: - Quick Checks - Unit Tests (app) - - Unit Tests (framework-editor) - Unit Tests (portal) - - Unit Tests (trust) - E2E Tests - chromium - E2E Tests - firefox - E2E Tests - webkit diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml index ada3f01b0..df30e34d6 100644 --- a/.github/workflows/unit-tests.yml +++ b/.github/workflows/unit-tests.yml @@ -29,7 +29,7 @@ jobs: strategy: matrix: - app: [app, framework-editor, portal, trust] + app: [app, portal] steps: - name: Checkout diff --git a/apps/framework-editor/.env.example b/apps/framework-editor/.env.example deleted file mode 100644 index 305175e60..000000000 --- a/apps/framework-editor/.env.example +++ /dev/null @@ -1,8 +0,0 @@ -DATABASE_URL="postgresql://postgres:postgres@localhost:5432/comp?schema=public" - -# BetterAuth -AUTH_SECRET="" - -# Authentication & Database -AUTH_GOOGLE_ID="" -AUTH_GOOGLE_SECRET="" diff --git a/apps/framework-editor/.eslintrc.json b/apps/framework-editor/.eslintrc.json deleted file mode 100644 index 6a495d57d..000000000 --- a/apps/framework-editor/.eslintrc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "extends": "next/core-web-vitals", - "rules": { - "react/no-unescaped-entities": "off", - "react-hooks/exhaustive-deps": "warn" - } -} diff --git a/apps/framework-editor/.gitignore b/apps/framework-editor/.gitignore deleted file mode 100644 index 3c35968eb..000000000 --- a/apps/framework-editor/.gitignore +++ /dev/null @@ -1,28 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules - -# next.js -/.next/ -/out/ - -# production -/build - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* -.pnpm-debug.log* - -# env files -.env* -!.env.example - -# vercel -.vercel - -# typescript -*.tsbuildinfo -next-env.d.ts \ No newline at end of file diff --git a/apps/framework-editor/app/(pages)/auth/Unauthorized.tsx b/apps/framework-editor/app/(pages)/auth/Unauthorized.tsx deleted file mode 100644 index 1fd927b45..000000000 --- a/apps/framework-editor/app/(pages)/auth/Unauthorized.tsx +++ /dev/null @@ -1,36 +0,0 @@ -'use client'; - -import { authClient } from '@/app/lib/auth-client'; -import { Button } from '@comp/ui/button'; -import { useRouter } from 'next/navigation'; -import { useState } from 'react'; - -export const Unauthorized = () => { - const router = useRouter(); - const [loading, setLoading] = useState(false); - - const handleSignOut = async () => { - setLoading(true); - await authClient.signOut({ - fetchOptions: { - onSuccess: () => { - router.push('/auth'); - }, - }, - }); - }; - - return ( -
-
-

Oops, you don't belong here

-

- You are not authorized to access this page. Please sign in with a different account. -

- -
-
- ); -}; diff --git a/apps/framework-editor/app/(pages)/auth/button-icon.tsx b/apps/framework-editor/app/(pages)/auth/button-icon.tsx deleted file mode 100644 index 71c40a295..000000000 --- a/apps/framework-editor/app/(pages)/auth/button-icon.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { cn } from '@comp/ui/cn'; -import { motion } from 'framer-motion'; - -export const ButtonIcon = ({ - className, - children, - loading, - isLoading, -}: { - className?: string; - children: React.ReactNode; - loading?: React.ReactNode; - isLoading: boolean; -}) => { - return ( -
- - {children} - - - {loading} - -
- ); -}; diff --git a/apps/framework-editor/app/(pages)/auth/google-sign-in.tsx b/apps/framework-editor/app/(pages)/auth/google-sign-in.tsx deleted file mode 100644 index 01f624438..000000000 --- a/apps/framework-editor/app/(pages)/auth/google-sign-in.tsx +++ /dev/null @@ -1,44 +0,0 @@ -'use client'; - -import { authClient } from '@/app/lib/auth-client'; -import { Button } from '@comp/ui/button'; -import { Icons } from '@comp/ui/icons'; -import { Loader2 } from 'lucide-react'; -import { useState } from 'react'; -import { ButtonIcon } from './button-icon'; - -export function GoogleSignIn({ inviteCode }: { inviteCode?: string }) { - const [isLoading, setLoading] = useState(false); - - const handleSignIn = async () => { - setLoading(true); - let redirectTo = '/'; - - if (inviteCode) { - redirectTo = `/invite/${inviteCode}`; - } - - await authClient.signIn.social({ - provider: 'google', - callbackURL: redirectTo, - }); - }; - - return ( - - ); -} diff --git a/apps/framework-editor/app/(pages)/auth/page.tsx b/apps/framework-editor/app/(pages)/auth/page.tsx deleted file mode 100644 index b4997581e..000000000 --- a/apps/framework-editor/app/(pages)/auth/page.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { auth } from '@/app/lib/auth'; -import type { Metadata } from 'next'; -import { headers } from 'next/headers'; -import { redirect } from 'next/navigation'; -import Balancer from 'react-wrap-balancer'; -import { GoogleSignIn } from './google-sign-in'; -import { Unauthorized } from './Unauthorized'; - -export const metadata: Metadata = { - title: 'Login | Comp AI', -}; - -export default async function Page() { - const session = await auth.api.getSession({ - headers: await headers(), - }); - - const hasSession = session?.user; - const isAllowed = session?.user.email.split('@')[1] === 'trycomp.ai'; - - if (hasSession && !isAllowed) { - return ; - } - - if (hasSession && isAllowed) { - redirect('/frameworks'); - } - - let preferredSignInOption: React.ReactNode; - - if (process.env.AUTH_GOOGLE_ID && process.env.AUTH_GOOGLE_SECRET) { - preferredSignInOption = ( -
- -
- ); - } - - return ( -
- ); -} diff --git a/apps/framework-editor/app/(pages)/controls/ControlsClientPage.tsx b/apps/framework-editor/app/(pages)/controls/ControlsClientPage.tsx deleted file mode 100644 index 7d31329bb..000000000 --- a/apps/framework-editor/app/(pages)/controls/ControlsClientPage.tsx +++ /dev/null @@ -1,376 +0,0 @@ -'use client'; - -import PageLayout from '@/app/components/PageLayout'; -import { useEffect, useMemo, useState } from 'react'; -import { toast } from 'sonner'; -import { relationalColumn } from '../../components/grid/RelationalCell'; -import { friendlyDateColumnBase } from '../../components/gridUtils'; -import { TableToolbar } from '../../components/TableToolbar'; -import { useTableSearchSort } from '../../hooks/useTableSearchSort'; -import type { SortConfig } from '../../types/common'; -import { - getAllPolicyTemplates, - getAllRequirements, - getAllTaskTemplates, - linkPolicyTemplateToControl, - linkRequirementToControl, - linkTaskTemplateToControl, - unlinkPolicyTemplateFromControl, - unlinkRequirementFromControl, - unlinkTaskTemplateFromControl, -} from './actions'; -import { simpleUUID, useChangeTracking } from './hooks/useChangeTracking'; -import type { - ControlsPageGridData, - ControlsPageSortableColumnKey, - FrameworkEditorControlTemplateWithRelatedData, - SortableColumnOption, -} from './types'; - -import { type Column, DataSheetGrid, keyColumn, textColumn } from 'react-datasheet-grid'; -import 'react-datasheet-grid/dist/style.css'; - -import { Button } from '@comp/ui/button'; -import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@comp/ui/select'; - -interface ControlsClientPageProps { - initialControls: FrameworkEditorControlTemplateWithRelatedData[]; -} - -const sortableColumnsOptions: SortableColumnOption[] = [ - { value: 'name', label: 'Name' }, - { value: 'description', label: 'Description' }, - { value: 'createdAt', label: 'Created At' }, - { value: 'updatedAt', label: 'Updated At' }, -]; - -const controlsSearchableKeys: ControlsPageSortableColumnKey[] = ['name', 'description']; -const controlsSortConfig: SortConfig = { - name: 'string', - description: 'string', - policyTemplatesLength: 'number', - requirementsLength: 'number', - taskTemplatesLength: 'number', - createdAt: 'number', - updatedAt: 'number', -}; - -export function ControlsClientPage({ initialControls }: ControlsClientPageProps) { - const ALL_FRAMEWORKS_OPTION_VALUE = '__ALL_FRAMEWORKS__'; - - const initialGridData: ControlsPageGridData[] = useMemo(() => { - return initialControls.map((control) => { - let cDate: Date | null = null; - if (control.createdAt) { - // Handles if control.createdAt is Date obj or valid date string - const parsedCDate = new Date(control.createdAt); - if (!isNaN(parsedCDate.getTime())) { - // Check if it's a valid date - cDate = parsedCDate; - } - } - - let uDate: Date | null = null; - if (control.updatedAt) { - // Handles if control.updatedAt is Date obj or valid date string - const parsedUDate = new Date(control.updatedAt); - if (!isNaN(parsedUDate.getTime())) { - // Check if it's a valid date - uDate = parsedUDate; - } - } - - return { - id: control.id || simpleUUID(), - name: control.name ?? null, - description: control.description ?? null, - policyTemplates: - control.policyTemplates?.map((pt) => ({ - id: pt.id, - name: pt.name, - })) ?? [], - requirements: - control.requirements?.map((r) => ({ - id: r.id, - name: r.name, - frameworkName: r.framework?.name, - })) ?? [], - taskTemplates: control.taskTemplates?.map((tt) => ({ id: tt.id, name: tt.name })) ?? [], - policyTemplatesLength: control.policyTemplates?.length ?? 0, - requirementsLength: control.requirements?.length ?? 0, - taskTemplatesLength: control.taskTemplates?.length ?? 0, - createdAt: cDate, - updatedAt: uDate, - }; - }); - }, [initialControls]); - - const { - dataForGrid, - handleGridChange, - getRowClassName, - handleCommit, - handleCancel, - isDirty, - createdRowIds, - changesSummaryString, - setDisplayedData, - } = useChangeTracking(initialGridData); - - const [selectedFramework, setSelectedFramework] = useState(''); - - const frameworkOptions = useMemo(() => { - const frameworkNames = new Set(); - initialControls.forEach((control) => { - control.requirements?.forEach((req) => { - if (req.framework?.name) { - frameworkNames.add(req.framework.name); - } - }); - }); - return Array.from(frameworkNames).map((name) => ({ - label: name, - value: name, - })); - }, [initialControls]); - - const filteredDataByFramework = useMemo(() => { - if (selectedFramework === '' || selectedFramework === ALL_FRAMEWORKS_OPTION_VALUE) { - return dataForGrid; - } - return dataForGrid.filter((control) => - control.requirements?.some((req) => req.frameworkName === selectedFramework), - ); - }, [dataForGrid, selectedFramework]); - - const { - searchTerm, - setSearchTerm, - sortColumnKey, - setSortColumnKey, - sortDirection, - toggleSortDirection, - processedData: sortedDataWithPotentialTimestamps, - } = useTableSearchSort( - filteredDataByFramework, - controlsSearchableKeys, - controlsSortConfig, - 'createdAt', - 'asc', - ); - - // Convert timestamps back to Date objects if useTableSearchSort changed them - const dataForDisplay = useMemo(() => { - return sortedDataWithPotentialTimestamps.map((row) => { - const newRow = { ...row }; - // If createdAt/updatedAt became a number (timestamp) after sorting, convert back to Date - if (typeof newRow.createdAt === 'number') { - newRow.createdAt = new Date(newRow.createdAt); - } - if (typeof newRow.updatedAt === 'number') { - newRow.updatedAt = new Date(newRow.updatedAt); - } - return newRow; - }); - }, [sortedDataWithPotentialTimestamps]); - - useEffect(() => { - setDisplayedData(dataForDisplay); - }, [dataForDisplay, setDisplayedData]); - - const columns: Column[] = [ - { ...keyColumn('name', textColumn), title: 'Name', minWidth: 300 }, - { - ...keyColumn('description', textColumn), - title: 'Description', - minWidth: 420, - grow: 1, - }, - { - ...relationalColumn({ - itemsKey: 'policyTemplates', - getAllSearchableItems: getAllPolicyTemplates, - linkItemAction: async (controlId, policyTemplateId) => { - try { - await linkPolicyTemplateToControl(controlId, policyTemplateId); - toast.success('Policy template linked successfully.'); - } catch (error) { - toast.error( - `Failed to link policy template: ${error instanceof Error ? error.message : String(error)}`, - ); - // Do not re-throw, error is handled with a toast - } - }, - unlinkItemAction: async (controlId, policyTemplateId) => { - try { - await unlinkPolicyTemplateFromControl(controlId, policyTemplateId); - toast.success('Policy template unlinked successfully.'); - } catch (error) { - toast.error( - `Failed to unlink policy template: ${error instanceof Error ? error.message : String(error)}`, - ); - } - }, - itemTypeLabel: 'Policy', - createdRowIds: createdRowIds, - }), - id: 'policyTemplates', - title: 'Linked Policies', - minWidth: 200, - }, - { - id: 'requirements', - title: 'Linked Requirements', - minWidth: 200, - ...relationalColumn({ - itemsKey: 'requirements', - getAllSearchableItems: getAllRequirements, - linkItemAction: async (controlId, requirementId) => { - try { - await linkRequirementToControl(controlId, requirementId); - toast.success('Requirement linked successfully.'); - } catch (error) { - toast.error( - `Failed to link requirement: ${error instanceof Error ? error.message : String(error)}`, - ); - } - }, - unlinkItemAction: async (controlId, requirementId) => { - try { - await unlinkRequirementFromControl(controlId, requirementId); - toast.success('Requirement unlinked successfully.'); - } catch (error) { - toast.error( - `Failed to unlink requirement: ${error instanceof Error ? error.message : String(error)}`, - ); - } - }, - itemTypeLabel: 'Requirement', - createdRowIds: createdRowIds, - }), - }, - { - id: 'taskTemplates', - title: 'Linked Tasks', - minWidth: 200, - ...relationalColumn({ - itemsKey: 'taskTemplates', - getAllSearchableItems: getAllTaskTemplates, - linkItemAction: async (controlId, taskTemplateId) => { - try { - await linkTaskTemplateToControl(controlId, taskTemplateId); - toast.success('Task template linked successfully.'); - } catch (error) { - toast.error( - `Failed to link task template: ${error instanceof Error ? error.message : String(error)}`, - ); - } - }, - unlinkItemAction: async (controlId, taskTemplateId) => { - try { - await unlinkTaskTemplateFromControl(controlId, taskTemplateId); - toast.success('Task template unlinked successfully.'); - } catch (error) { - toast.error( - `Failed to unlink task template: ${error instanceof Error ? error.message : String(error)}`, - ); - } - }, - itemTypeLabel: 'Task Template', - createdRowIds: createdRowIds, - }), - }, - { - ...keyColumn('createdAt', friendlyDateColumnBase), - title: 'Created At', - minWidth: 220, // Adjusted minWidth - disabled: true, - }, - { - ...keyColumn('updatedAt', friendlyDateColumnBase), - title: 'Updated At', - minWidth: 220, // Adjusted minWidth - disabled: true, - }, - { - ...keyColumn('id', textColumn as Partial>), - title: 'ID', - minWidth: 300, - disabled: true, - }, - ]; - - return ( - <> - - {isDirty && ( -
- {changesSummaryString} - - -
- )} - - setSortColumnKey(key as ControlsPageSortableColumnKey | null) - } - sortDirection={sortDirection} - onSortDirectionChange={toggleSortDirection} - > - <> - - - -
- ({ - id: simpleUUID(), - name: 'Control Name', - description: 'Control Description', - policyTemplates: [], - requirements: [], - taskTemplates: [], - policyTemplatesLength: 0, - requirementsLength: 0, - taskTemplatesLength: 0, - createdAt: new Date(), - updatedAt: new Date(), - })} - duplicateRow={({ rowData }) => ({ - ...rowData, - id: simpleUUID(), - createdAt: new Date(), - updatedAt: new Date(), - })} - /> -
-
- - ); -} diff --git a/apps/framework-editor/app/(pages)/controls/actions.ts b/apps/framework-editor/app/(pages)/controls/actions.ts deleted file mode 100644 index 91ea96566..000000000 --- a/apps/framework-editor/app/(pages)/controls/actions.ts +++ /dev/null @@ -1,368 +0,0 @@ -'use server'; - -import type { SearchableItemForLinking } from '@/app/components/SearchAndLinkList'; // Assuming this path is correct -import { db } from '@comp/db'; -import type { FrameworkEditorControlTemplate } from '@prisma/client'; -import { revalidatePath } from 'next/cache'; -import { z } from 'zod'; -import { createControlTemplateSchema } from './schemas'; - -/** - * Fetches all requirements, including their framework name and identifier. - */ -export async function getAllRequirements(): Promise { - try { - const requirements = await db.frameworkEditorRequirement.findMany({ - select: { - id: true, - identifier: true, - name: true, // Descriptive name - framework: { - select: { - name: true, - }, - }, - }, - orderBy: { - // Consider if ordering by identifier or name is preferred. Currently descriptive name. - name: 'asc', - }, - }); - return requirements.map((r) => { - let primaryDisplayLabel = r.identifier; // Start with identifier - if (r.identifier && r.name) { - // If both identifier and descriptive name exist - primaryDisplayLabel = `${r.identifier} - ${r.name}`; - } else if (r.name) { - // Else if only descriptive name exists - primaryDisplayLabel = r.name; - } - // If only identifier exists, it's already set. If neither, fallback. - primaryDisplayLabel = primaryDisplayLabel || 'Unnamed Requirement'; - - return { - id: r.id, - name: primaryDisplayLabel, - sublabel: r.framework?.name ? r.framework.name : undefined, - }; - }); - } catch (error) { - console.error('Error fetching all requirements:', error); - throw new Error('Failed to fetch all requirements.'); - } -} - -/** - * Links a requirement to a control template. - */ -export async function linkRequirementToControl( - controlId: string, - requirementId: string, -): Promise { - if (!controlId || !requirementId) { - throw new Error('Control ID and Requirement ID must be provided.'); - } - try { - await db.frameworkEditorControlTemplate.update({ - where: { id: controlId }, - data: { - requirements: { - connect: { id: requirementId }, - }, - }, - }); - revalidatePath(`/controls/${controlId}`); - revalidatePath('/controls'); // Also revalidate the list page if counts are shown there - } catch (error) { - console.error('Error linking requirement to control:', error); - throw new Error('Failed to link requirement.'); - } -} - -/** - * Unlinks a requirement from a control template. - */ -export async function unlinkRequirementFromControl( - controlId: string, - requirementId: string, -): Promise { - if (!controlId || !requirementId) { - throw new Error('Control ID and Requirement ID must be provided.'); - } - try { - await db.frameworkEditorControlTemplate.update({ - where: { id: controlId }, - data: { - requirements: { - disconnect: { id: requirementId }, - }, - }, - }); - revalidatePath(`/controls/${controlId}`); - revalidatePath('/controls'); - } catch (error) { - console.error('Error unlinking requirement from control:', error); - throw new Error('Failed to unlink requirement.'); - } -} - -// --- Policy Template Actions --- - -/** - * Fetches all policy templates. - */ -export async function getAllPolicyTemplates(): Promise { - try { - const policyTemplates = await db.frameworkEditorPolicyTemplate.findMany({ - select: { - id: true, - name: true, - }, - orderBy: { - name: 'asc', - }, - }); - // Policy templates only have a name, sublabel will be undefined - return policyTemplates.map((pt: { id: string; name: string }) => ({ - id: pt.id, - name: pt.name, - // sublabel will be implicitly undefined - })); - } catch (error) { - console.error('Error fetching all policy templates:', error); - throw new Error('Failed to fetch all policy templates.'); - } -} - -/** - * Links a policy template to a control template. - */ -export async function linkPolicyTemplateToControl( - controlId: string, - policyTemplateId: string, -): Promise { - if (!controlId || !policyTemplateId) { - throw new Error('Control ID and Policy Template ID must be provided.'); - } - try { - await db.frameworkEditorControlTemplate.update({ - where: { id: controlId }, - data: { - policyTemplates: { - // Assuming a 'policyTemplates' relation exists on the control model - connect: { id: policyTemplateId }, - }, - }, - }); - revalidatePath(`/controls/${controlId}`); - revalidatePath('/controls'); - } catch (error) { - console.error('Error linking policy template to control:', error); - throw new Error('Failed to link policy template.'); - } -} - -/** - * Unlinks a policy template from a control template. - */ -export async function unlinkPolicyTemplateFromControl( - controlId: string, - policyTemplateId: string, -): Promise { - if (!controlId || !policyTemplateId) { - throw new Error('Control ID and Policy Template ID must be provided.'); - } - try { - await db.frameworkEditorControlTemplate.update({ - where: { id: controlId }, - data: { - policyTemplates: { - disconnect: { id: policyTemplateId }, - }, - }, - }); - revalidatePath(`/controls/${controlId}`); - revalidatePath('/controls'); - } catch (error) { - console.error('Error unlinking policy template from control:', error); - throw new Error('Failed to unlink policy template.'); - } -} - -// --- Task Template Actions --- - -/** - * Fetches all task templates. - */ -export async function getAllTaskTemplates(): Promise { - try { - const taskTemplates = await db.frameworkEditorTaskTemplate.findMany({ - select: { - id: true, - name: true, - }, - orderBy: { - name: 'asc', - }, - }); - // Task templates only have a name, sublabel will be undefined - return taskTemplates.map((tt: { id: string; name: string }) => ({ - id: tt.id, - name: tt.name, - // sublabel will be implicitly undefined - })); - } catch (error) { - console.error('Error fetching all task templates:', error); - throw new Error('Failed to fetch all task templates.'); - } -} - -/** - * Links a task template to a control template. - */ -export async function linkTaskTemplateToControl( - controlId: string, - taskTemplateId: string, -): Promise { - if (!controlId || !taskTemplateId) { - throw new Error('Control ID and Task Template ID must be provided.'); - } - try { - await db.frameworkEditorControlTemplate.update({ - where: { id: controlId }, - data: { - taskTemplates: { - // Assuming a 'taskTemplates' relation exists on the control model - connect: { id: taskTemplateId }, - }, - }, - }); - revalidatePath(`/controls/${controlId}`); - revalidatePath('/controls'); - } catch (error) { - console.error('Error linking task template to control:', error); - throw new Error('Failed to link task template.'); - } -} - -/** - * Unlinks a task template from a control template. - */ -export async function unlinkTaskTemplateFromControl( - controlId: string, - taskTemplateId: string, -): Promise { - if (!controlId || !taskTemplateId) { - throw new Error('Control ID and Task Template ID must be provided.'); - } - try { - await db.frameworkEditorControlTemplate.update({ - where: { id: controlId }, - data: { - taskTemplates: { - disconnect: { id: taskTemplateId }, - }, - }, - }); - revalidatePath(`/controls/${controlId}`); - revalidatePath('/controls'); - } catch (error) { - console.error('Error unlinking task template from control:', error); - throw new Error('Failed to unlink task template.'); - } -} - -// --- Control Actions --- - -interface UpdateControlPayload { - name: string; - description: string; -} - -/** - * Updates the details of a control template. - */ -export async function updateControlDetails( - controlId: string, - data: UpdateControlPayload, -): Promise { - if (!controlId) { - throw new Error('Control ID must be provided.'); - } - if (!data.name || data.name.trim() === '') { - throw new Error('Control name must be provided.'); - } - - try { - await db.frameworkEditorControlTemplate.update({ - where: { id: controlId }, - data: { - name: data.name, - description: data.description, - }, - }); - revalidatePath(`/controls/${controlId}`); - revalidatePath('/controls'); - } catch (error) { - console.error('Error updating control details:', error); - throw new Error('Failed to update control details.'); - } -} - -/** - * Deletes a control template. - */ -export async function deleteControl(controlId: string): Promise { - if (!controlId) { - throw new Error('Control ID must be provided.'); - } - try { - // Note: Depending on DB constraints, you might need to disconnect relations first - // if there's no onDelete: Cascade or similar set up for related items. - await db.frameworkEditorControlTemplate.delete({ - where: { id: controlId }, - }); - revalidatePath(`/controls/${controlId}`); // Or just /controls if navigating away - revalidatePath('/controls'); - } catch (error) { - console.error('Error deleting control:', error); - // Consider more specific error handling, e.g., if control not found or if relations prevent deletion - throw new Error('Failed to delete control.'); - } -} - -/** - * Creates a new control template. - */ -export async function createControl(rawData: { - name: string | null; - description?: string | null; -}): Promise { - const validationResult = createControlTemplateSchema.safeParse(rawData); - - if (!validationResult.success) { - const errorMessages = validationResult.error.issues - .map((issue: z.ZodIssue) => `${issue.path.join('.')}: ${issue.message}`) - .join(', '); - throw new Error(`Invalid input for creating control: ${errorMessages}`); - } - - const { name, description } = validationResult.data; // name is string, description is string | undefined - - try { - const controlTemplate = await db.frameworkEditorControlTemplate.create({ - data: { - name, - description: description || '', // Ensure description is not undefined for Prisma - }, - }); - - revalidatePath('/controls'); - return controlTemplate; - } catch (error) { - console.error('Failed to create control template:', error); - const errorMessage = - error instanceof Error ? error.message : 'Failed to create control template in the database.'; - throw new Error(`Database error: ${errorMessage}`); - } -} diff --git a/apps/framework-editor/app/(pages)/controls/hooks/useChangeTracking.ts b/apps/framework-editor/app/(pages)/controls/hooks/useChangeTracking.ts deleted file mode 100644 index 6b301b2b6..000000000 --- a/apps/framework-editor/app/(pages)/controls/hooks/useChangeTracking.ts +++ /dev/null @@ -1,448 +0,0 @@ -import { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -// Import types from the new types.ts file -import { useToast } from '@comp/ui/use-toast'; -import type { FrameworkEditorControlTemplate } from '@prisma/client'; -import { createControl, deleteControl, updateControlDetails } from '../actions'; -import type { ControlsPageGridData, DSGOperation } from '../types'; - -// Define result types for creation operations to help with type inference -type CreationSuccessResult = { - success: true; - tempId: string; - newId: string; - newControl: FrameworkEditorControlTemplate; -}; -type CreationFailureResult = { success: false; tempId: string; error: any }; -type CreationOperationResult = CreationSuccessResult | CreationFailureResult; - -// GridData type definition, co-located as it's tightly coupled with the hook's data -export type GridData = { - id: string; - name: string | null; - description: string | null; - policyTemplatesCount: string | null; - requirementsCount: string | null; - taskTemplatesCount: string | null; -}; - -// simpleUUID can remain here or be moved to a general utils file later if used elsewhere -export const simpleUUID = () => crypto.randomUUID(); - -export const useChangeTracking = (initialData: ControlsPageGridData[]) => { - const [data, setData] = useState(initialData); - const [prevData, setPrevData] = useState(initialData); - const { toast } = useToast(); - - const isMounted = useRef(true); - const displayedDataRef = useRef(initialData); - - const createdRowIds = useMemo(() => new Set(), []); - const updatedRowIds = useMemo(() => new Set(), []); - const deletedRowIds = useMemo(() => new Set(), []); - - useEffect(() => { - setData(initialData); - setPrevData(initialData); - createdRowIds.clear(); - updatedRowIds.clear(); - deletedRowIds.clear(); - }, [initialData]); - - useEffect(() => { - isMounted.current = true; - return () => { - isMounted.current = false; - }; - }, []); - - const setDisplayedData = useCallback((displayedData: ControlsPageGridData[]) => { - displayedDataRef.current = displayedData; - }, []); - - const handleGridChange = useCallback( - (newValue: ControlsPageGridData[], operations: DSGOperation[]) => { - setData((currentDataState) => { - if (!isMounted.current) { - // If the component has unmounted by the time this debounced/async update fires, do nothing. - return currentDataState; // Return the existing state to prevent updates on unmounted component - } - - let workingNewValue = [...newValue]; - const originalDataForDelete = displayedDataRef.current; - - operations.forEach((op) => { - if (op.type === 'CREATE') { - workingNewValue.slice(op.fromRowIndex, op.toRowIndex).forEach((row) => { - if (row.id) createdRowIds.add(row.id); - }); - } else if (op.type === 'UPDATE') { - workingNewValue.slice(op.fromRowIndex, op.toRowIndex).forEach((row) => { - if (row.id && !createdRowIds.has(row.id) && !deletedRowIds.has(row.id)) { - updatedRowIds.add(row.id); - } - }); - } else if (op.type === 'DELETE') { - let keptRowsForDisplay = 0; - originalDataForDelete.slice(op.fromRowIndex, op.toRowIndex).forEach((deletedRow, i) => { - if (!deletedRow.id) return; - updatedRowIds.delete(deletedRow.id); - if (createdRowIds.has(deletedRow.id)) { - createdRowIds.delete(deletedRow.id); - } else { - deletedRowIds.add(deletedRow.id); - workingNewValue.splice( - op.fromRowIndex + keptRowsForDisplay++, - 0, - originalDataForDelete[op.fromRowIndex + i], - ); - } - }); - } - }); - return workingNewValue; - }); - }, - [createdRowIds, updatedRowIds, deletedRowIds], - ); - - const getRowClassName = useCallback( - ({ rowData }: { rowData: ControlsPageGridData }) => { - if (!rowData || !rowData.id) return ''; - if (deletedRowIds.has(rowData.id)) return 'row-deleted'; - if (createdRowIds.has(rowData.id)) return 'row-created'; - if (updatedRowIds.has(rowData.id)) return 'row-updated'; - return ''; - }, - [createdRowIds, updatedRowIds, deletedRowIds], - ); - - const handleCommit = useCallback(async () => { - let workingData = [...data]; - - // --- Handle Creations --- - const creationOps = Array.from(createdRowIds).map((tempId) => { - const row = workingData.find((r) => r.id === tempId); - if (row && row.name) { - return createControl({ name: row.name, description: row.description }) - .then( - (newControl: FrameworkEditorControlTemplate) => - ({ - success: true, - tempId, - newId: newControl.id, - newControl, - }) as CreationSuccessResult, - ) - .catch((error) => { - console.error(`Failed to create control (tempId: ${tempId}):`, error); - return { success: false, tempId, error } as CreationFailureResult; - }); - } - console.warn(`Skipping creation for row with tempId ${tempId} due to missing data or name.`); - return Promise.resolve({ - success: false, - tempId, - error: new Error('Missing data or name for creation'), - } as CreationFailureResult); - }); - const creationResults = await Promise.allSettled(creationOps); - - // --- Handle Updates (excluding newly created or already deleted items) --- - const idsToUpdateActually = Array.from(updatedRowIds).filter( - (id) => !createdRowIds.has(id) && !deletedRowIds.has(id), - ); - const updateOps = idsToUpdateActually.map((id) => { - const row = workingData.find((r) => r.id === id); - if (row && row.name) { - return updateControlDetails(id, { - name: row.name, - description: row.description || '', - }) - .then(() => ({ success: true, id })) - .catch((error) => { - console.error(`Failed to update control (id: ${id}):`, error); - return { success: false, id, error }; - }); - } - console.warn(`Skipping update for row with id ${id} due to missing data or name.`); - return Promise.resolve({ - success: false, - id, - error: new Error('Missing data or name for update'), - }); - }); - const updateResults = await Promise.allSettled(updateOps); - - // --- Handle Deletions --- - const deletionOps = Array.from(deletedRowIds).map((id) => { - if ( - createdRowIds.has(id) && - !creationResults.some( - (res) => - res.status === 'fulfilled' && - (res.value as CreationOperationResult).success && - (res.value as CreationSuccessResult).tempId === id && - (res.value as CreationSuccessResult).newId, - ) - ) { - // If it was a created item that didn't successfully get a server ID (e.g. creation failed or was skipped, or it's still pending somehow) - console.log(`Client-side deletion of temporary item: ${id}`); - return Promise.resolve({ success: true, id, clientSideDelete: true }); - } - return deleteControl(id) - .then(() => ({ success: true, id })) - .catch((error) => { - console.error(`Failed to delete control (id: ${id}):`, error); - return { success: false, id, error }; - }); - }); - const deletionResults = await Promise.allSettled(deletionOps); - - // --- Consolidate Data and Update State --- - // 1. Update IDs for successful creations and collect created data - const serverCreatedRows = new Map(); - creationResults.forEach((res) => { - if (res.status === 'fulfilled') { - const creationValue = res.value as CreationOperationResult; - if (creationValue.success) { - // Now TypeScript knows creationValue is CreationSuccessResult - const { tempId, newId } = creationValue; - const originalRow = workingData.find((r) => r.id === tempId); - if (originalRow) { - serverCreatedRows.set(newId, { - ...originalRow, - id: newId, - // For newly created items, counts are 0 as relations are not established yet. - policyTemplates: [], - requirements: [], - taskTemplates: [], - }); - } - createdRowIds.delete(tempId); - } - } - }); - - // 2. Remove successfully updated items from tracking set - updateResults.forEach((res) => { - if (res.status === 'fulfilled' && res.value.success && res.value.id) { - updatedRowIds.delete(res.value.id); - } - }); - - // 3. Prepare final list of data, handling deletions and incorporating server-created items - const actuallyDeletedIds = new Set(); - deletionResults.forEach((res) => { - if (res.status === 'fulfilled' && res.value.success && res.value.id) { - actuallyDeletedIds.add(res.value.id); - deletedRowIds.delete(res.value.id); - createdRowIds.delete(res.value.id); // If it was created then deleted - updatedRowIds.delete(res.value.id); // If it was updated then deleted - } - }); - - // Rebuild workingData: start with existing, filter deleted, then replace temp IDs with server IDs for created items - let finalProcessedData: ControlsPageGridData[] = []; - workingData.forEach((row) => { - if (actuallyDeletedIds.has(row.id)) return; // Skip if deleted - - // Check if this row corresponds to a successfully created item (identified by its original tempId) - let wasSuccessfullyCreated = false; - for (const res of creationResults) { - if (res.status === 'fulfilled') { - const creationValue = res.value as CreationOperationResult; - if (creationValue.success && creationValue.tempId === row.id && creationValue.newId) { - // This row was a temp row that got created. Its data is on serverCreatedRows map. - if (serverCreatedRows.has(creationValue.newId)) { - finalProcessedData.push(serverCreatedRows.get(creationValue.newId)!); - } - wasSuccessfullyCreated = true; - break; - } - } - } - if (!wasSuccessfullyCreated) { - finalProcessedData.push(row); - } - }); - - if (isMounted.current) { - setData(finalProcessedData); - setPrevData(finalProcessedData); - } - - console.log('Commit completed. Remaining dirty items:', { - created: Array.from(createdRowIds), - updated: Array.from(updatedRowIds), - deleted: Array.from(deletedRowIds), - }); - - if (isMounted.current) { - // Re-filter based on finalProcessedData if necessary for newData - const currentDataAfterFirstUpdate = finalProcessedData; // Assuming finalProcessedData is what we want to filter - const newData = currentDataAfterFirstUpdate.filter( - (row) => !row.id || !actuallyDeletedIds.has(row.id), - ); // Ensure we use actuallyDeletedIds - - setData(newData); - setPrevData(newData); - } - - // --- Display Toast Summary --- - const successes: string[] = []; - const errors: string[] = []; - - creationResults.forEach((res) => { - if (res.status === 'fulfilled') { - const result = res.value as CreationOperationResult; - if (result.success) { - const createdRow = serverCreatedRows.get(result.newId); - successes.push(`Created: ${createdRow?.name || result.newId}`); - } else { - errors.push( - `Failed to create (tempId: ${result.tempId}): ${result.error?.message || 'Unknown error'}`, - ); - } - } else { - // res.reason should be an Error object or contain a message - const reason = res.reason as any; - errors.push( - `Creation operation failed: ${reason?.message || String(reason) || 'Unknown reason'}`, - ); - } - }); - - updateResults.forEach((res) => { - if (res.status === 'fulfilled') { - const result = res.value as { - success: boolean; - id: string; - error?: any; - }; - if (result.success && result.id) { - // Find the name from finalProcessedData as workingData might be stale for updates if ID changed (not in this case but good practice) - const updatedRow = finalProcessedData.find((r) => r.id === result.id); - successes.push(`Updated: ${updatedRow?.name || result.id}`); - } else if (result.id) { - errors.push( - `Failed to update (${result.id}): ${result.error?.message || 'Unknown error'}`, - ); - } - // If result.id is undefined but it was a fulfilled promise, it implies an issue with the op function not returning id - else if (!result.id && !result.success) { - errors.push( - `Failed to update item: ${result.error?.message || 'Unknown error, ID missing'}`, - ); - } - } else { - const reason = res.reason as any; - errors.push( - `Update operation failed: ${reason?.message || String(reason) || 'Unknown reason'}`, - ); - } - }); - - deletionResults.forEach((res) => { - if (res.status === 'fulfilled') { - const result = res.value as { - success: boolean; - id: string; - error?: any; - clientSideDelete?: boolean; - }; - if (result.success && result.id) { - if (result.clientSideDelete) { - successes.push(`Client-side removal of temp item: ${result.id}`); - } else { - // Try to find the name of the deleted item from the prevData or original data if available and needed for toast - // For simplicity, just using ID here. - successes.push(`Deleted ID: ${result.id}`); - } - } else if (result.id) { - errors.push( - `Failed to delete (${result.id}): ${result.error?.message || 'Unknown error'}`, - ); - } - // If result.id is undefined but it was a fulfilled promise, it implies an issue with the op function not returning id - else if (!result.id && !result.success) { - errors.push( - `Failed to delete item: ${result.error?.message || 'Unknown error, ID missing'}`, - ); - } - } else { - const reason = res.reason as any; - errors.push( - `Deletion operation failed: ${reason?.message || String(reason) || 'Unknown reason'}`, - ); - } - }); - - const toastTitle = - errors.length > 0 - ? successes.length > 0 - ? 'Commit Partially Successful' - : 'Commit Failed' - : 'Commit Successful'; - let toastDescription = ''; - - if (successes.length > 0) { - toastDescription += `Successes (${successes.length}):\n${successes.map((s) => ` - ${s}`).join('\n')}`; - } - if (errors.length > 0) { - if (toastDescription) toastDescription += '\n\n'; // Add separator if there were successes - toastDescription += `Errors (${errors.length}):\n${errors.map((e) => ` - ${e}`).join('\n')}`; - } - if (successes.length === 0 && errors.length === 0) { - // This case might occur if handleCommit was called with no pending changes, though isDirty should prevent this. - // Or if all operations were somehow filtered out before being processed. - toastDescription = 'No operations were performed.'; - } - - if (isMounted.current && (successes.length > 0 || errors.length > 0)) { - // Only show toast if there's something to report - toast({ - title: toastTitle, - description: toastDescription, - variant: errors.length > 0 ? 'destructive' : 'default', - duration: errors.length > 0 || successes.length > 5 ? 9000 : 5000, // Longer duration for errors or many successes - }); - } - }, [data, createdRowIds, updatedRowIds, deletedRowIds, toast]); - - const handleCancel = useCallback(() => { - setData(prevData); - createdRowIds.clear(); - updatedRowIds.clear(); - deletedRowIds.clear(); - }, [prevData, createdRowIds, updatedRowIds, deletedRowIds]); - - const isDirty = createdRowIds.size > 0 || updatedRowIds.size > 0 || deletedRowIds.size > 0; - - const changesSummaryString = useMemo(() => { - if (!isDirty) return ''; - - const totalChanges = createdRowIds.size + updatedRowIds.size + deletedRowIds.size; - - if (totalChanges === 0) { - // This case should ideally not be hit if isDirty is true, - // but as a fallback if counts are 0 but something else makes it dirty. - return '(Pending Changes)'; // Or simply '' if the button text itself is enough. - } - - return `(${totalChanges} ${totalChanges === 1 ? 'change' : 'changes'})`; - }, [isDirty, createdRowIds.size, updatedRowIds.size, deletedRowIds.size]); - - return { - dataForGrid: data, - handleGridChange, - getRowClassName, - handleCommit, - handleCancel, - isDirty, - createdRowIds, - updatedRowIds, - deletedRowIds, - changesSummaryString, - setDisplayedData, - }; -}; diff --git a/apps/framework-editor/app/(pages)/controls/page.tsx b/apps/framework-editor/app/(pages)/controls/page.tsx deleted file mode 100644 index d1644eacc..000000000 --- a/apps/framework-editor/app/(pages)/controls/page.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { isAuthorized } from '@/app/lib/utils'; -import { db } from '@comp/db'; -import { redirect } from 'next/navigation'; -import { ControlsClientPage } from './ControlsClientPage'; - -export default async function Page() { - const isAllowed = await isAuthorized(); - - if (!isAllowed) { - redirect('/auth'); - } - - const controls = await db.frameworkEditorControlTemplate.findMany({ - select: { - id: true, - name: true, - description: true, - createdAt: true, - updatedAt: true, - policyTemplates: { - select: { - id: true, - name: true, - }, - }, - requirements: { - select: { - id: true, - name: true, - framework: { - select: { - name: true, - }, - }, - }, - }, - taskTemplates: { - select: { - id: true, - name: true, - }, - }, - }, - orderBy: { - createdAt: 'asc', - }, - }); - - return ; -} diff --git a/apps/framework-editor/app/(pages)/controls/schemas.ts b/apps/framework-editor/app/(pages)/controls/schemas.ts deleted file mode 100644 index 0b74e3609..000000000 --- a/apps/framework-editor/app/(pages)/controls/schemas.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { z } from 'zod'; - -export const createControlTemplateSchema = z.object({ - name: z.string().min(1, { message: 'Name is required' }), - description: z.string().optional(), -}); diff --git a/apps/framework-editor/app/(pages)/controls/types.ts b/apps/framework-editor/app/(pages)/controls/types.ts deleted file mode 100644 index 558a11970..000000000 --- a/apps/framework-editor/app/(pages)/controls/types.ts +++ /dev/null @@ -1,74 +0,0 @@ -import type { FrameworkEditorControlTemplate } from '@prisma/client'; -// Import shared types from the common location -import type { SortDirection, SortableColumnOption } from '../../types/common'; - -// Basic item with id and name -export interface ItemWithName { - id: string; - name: string; -} - -// Define a more specific type for requirement items that can include framework info -export interface RequirementItemWithFramework extends ItemWithName { - framework?: { - name: string; - }; -} - -export interface RequirementGridItem extends ItemWithName { - frameworkName?: string; -} - -// Base type for data from the server with potential related entities -export interface FrameworkEditorControlTemplateWithRelatedData - extends FrameworkEditorControlTemplate { - policyTemplates?: ItemWithName[]; - requirements?: RequirementItemWithFramework[]; - taskTemplates?: ItemWithName[]; -} - -// Specific structure for the data displayed in the Controls page grid -export type ControlsPageGridData = { - id: string; - name: string | null; - description: string | null; - // Store the actual arrays of related items - policyTemplates: ItemWithName[]; - requirements: RequirementGridItem[]; - taskTemplates: ItemWithName[]; - // Add separate fields for sorting by count - policyTemplatesLength: number; - requirementsLength: number; - taskTemplatesLength: number; - createdAt: Date | null; - updatedAt: Date | null; -}; - -// react-datasheet-grid operation type -export type DSGOperation = - | { type: 'CREATE'; fromRowIndex: number; toRowIndex: number } - | { type: 'UPDATE'; fromRowIndex: number; toRowIndex: number } - | { type: 'DELETE'; fromRowIndex: number; toRowIndex: number }; - -// General types for sorting and toolbar options are now imported -// export type SortDirection = 'asc' | 'desc'; // Moved to common.ts - -// Specific sortable column keys for the Controls page table -export type ControlsPageSortableColumnKey = - | 'name' - | 'description' - // Update to use length fields for sorting - | 'policyTemplatesLength' - | 'requirementsLength' - | 'taskTemplatesLength' - | 'createdAt' - | 'updatedAt'; - -// Generic type for options in the sort dropdown for the toolbar is now imported -// export interface SortableColumnOption { // Moved to common.ts -// value: string; -// label: string; -// } - -// Re-export for convenience if ControlsClientPage needs them directly from this file -export type { SortDirection, SortableColumnOption }; diff --git a/apps/framework-editor/app/(pages)/frameworks/FrameworksClientPage.tsx b/apps/framework-editor/app/(pages)/frameworks/FrameworksClientPage.tsx deleted file mode 100644 index 8120f6d54..000000000 --- a/apps/framework-editor/app/(pages)/frameworks/FrameworksClientPage.tsx +++ /dev/null @@ -1,47 +0,0 @@ -'use client'; - -import { useRouter } from 'next/navigation'; -import { useState } from 'react'; -// import { db } from "@comp/db"; -import { DataTable } from '@/app/components/DataTable'; -import PageLayout from '@/app/components/PageLayout'; -import type { FrameworkEditorFramework } from '@prisma/client'; -import { columns } from './components/columns'; -import { CreateFrameworkDialog } from './components/CreateFrameworkDialog'; - -export interface FrameworkWithCounts extends Omit { - requirementsCount: number; - controlsCount: number; -} - -interface FrameworksClientPageProps { - initialFrameworks: FrameworkWithCounts[]; -} - -export function FrameworksClientPage({ initialFrameworks }: FrameworksClientPageProps) { - const [isCreateDialogOpen, setIsCreateDialogOpen] = useState(false); - const router = useRouter(); - - const handleRowClick = (framework: FrameworkWithCounts) => { - router.push(`/frameworks/${framework.id}`); - }; - - return ( - - setIsCreateDialogOpen(true)} - createButtonLabel="Create New Framework" - onRowClick={handleRowClick} - /> - setIsCreateDialogOpen(false)} - /> - - ); -} diff --git a/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/FrameworkRequirementsClientPage.tsx b/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/FrameworkRequirementsClientPage.tsx deleted file mode 100644 index 474bf2084..000000000 --- a/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/FrameworkRequirementsClientPage.tsx +++ /dev/null @@ -1,214 +0,0 @@ -'use client'; - -import { DataTable } from '@/app/components/DataTable'; -import PageLayout from '@/app/components/PageLayout'; -import { Badge } from '@comp/ui/badge'; -import { Button } from '@comp/ui/button'; -import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@comp/ui/card'; -import type { FrameworkEditorFramework, FrameworkEditorRequirement } from '@prisma/client'; -import { FileText, PencilIcon, Trash2 } from 'lucide-react'; -import { useRouter } from 'next/navigation'; -import { useEffect, useState } from 'react'; -import { AddRequirementDialog } from './components/AddRequirementDialog'; -import { getColumns } from './components/columns'; -import { DeleteFrameworkDialog } from './components/DeleteFrameworkDialog'; -import { DeleteRequirementDialog } from './components/DeleteRequirementDialog'; -import { EditFrameworkDialog } from './components/EditFrameworkDialog'; -import { EditRequirementDialog } from './components/EditRequirementDialog'; - -interface FrameworkDetails - extends Pick {} - -interface FrameworkRequirementsClientPageProps { - frameworkDetails: FrameworkDetails; - initialRequirements: FrameworkEditorRequirement[]; -} - -interface SelectedRequirementToEdit extends FrameworkEditorRequirement { - frameworkId: string; -} - -export function FrameworkRequirementsClientPage({ - frameworkDetails, - initialRequirements, -}: FrameworkRequirementsClientPageProps) { - const router = useRouter(); - const [isFrameworkEditDialogOpen, setIsFrameworkEditDialogOpen] = useState(false); - const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); - const [isAddRequirementDialogOpen, setIsAddRequirementDialogOpen] = useState(false); - const [isDeleteRequirementDialogOpen, setIsDeleteRequirementDialogOpen] = useState(false); - const [requirementToDelete, setRequirementToDelete] = useState( - null, - ); - - const [requirementsList, setRequirementsList] = - useState(initialRequirements); - - const [isEditRequirementDialogOpen, setIsEditRequirementDialogOpen] = useState(false); - const [selectedRequirement, setSelectedRequirement] = useState( - null, - ); - - useEffect(() => { - setRequirementsList(initialRequirements); - }, [initialRequirements]); - - const handleFrameworkUpdated = () => { - setIsFrameworkEditDialogOpen(false); - router.refresh(); - }; - - const handleOpenEditRequirementDialog = (requirement: FrameworkEditorRequirement) => { - setSelectedRequirement({ - ...requirement, - frameworkId: frameworkDetails.id, - }); - setIsEditRequirementDialogOpen(true); - }; - - const handleRequirementUpdated = ( - updatedRequirement: Pick< - FrameworkEditorRequirement, - 'id' | 'name' | 'description' | 'identifier' - >, - ) => { - setRequirementsList((prevList) => - prevList.map((req) => - req.id === updatedRequirement.id ? { ...req, ...updatedRequirement } : req, - ), - ); - setIsEditRequirementDialogOpen(false); - router.refresh(); - }; - - const handleRequirementAdded = () => { - setIsAddRequirementDialogOpen(false); - router.refresh(); - }; - - const handleOpenDeleteRequirementDialog = (requirement: FrameworkEditorRequirement) => { - setRequirementToDelete(requirement); - setIsDeleteRequirementDialogOpen(true); - }; - - const handleRequirementDeleted = () => { - setRequirementToDelete(null); - setIsDeleteRequirementDialogOpen(false); - router.refresh(); - }; - - const columns = getColumns(handleOpenEditRequirementDialog, handleOpenDeleteRequirementDialog); - - return ( - - - -
-
- - {frameworkDetails.name} - - Version: {frameworkDetails.version} - - - {frameworkDetails.visible ? 'Visible' : 'Hidden'} - - - - {frameworkDetails.description} - -
-
- - -
-
-
- -
- - ID: {frameworkDetails.id} -
-
-
- - setIsAddRequirementDialogOpen(true)} - /> - {isFrameworkEditDialogOpen && ( - - )} - {isDeleteDialogOpen && ( - - )} - {isAddRequirementDialogOpen && ( - - )} - {isEditRequirementDialogOpen && selectedRequirement && ( - - )} - {isDeleteRequirementDialogOpen && requirementToDelete && ( - - )} -
- ); -} diff --git a/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/add-requirement-action.ts b/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/add-requirement-action.ts deleted file mode 100644 index bba504663..000000000 --- a/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/add-requirement-action.ts +++ /dev/null @@ -1,88 +0,0 @@ -'use server'; - -import { db } from '@comp/db'; -import type { FrameworkEditorRequirement } from '@prisma/client'; -import { revalidatePath } from 'next/cache'; -import { z } from 'zod'; - -// Schema for validating requirement input -const AddRequirementSchema = z.object({ - name: z.string().min(3, { message: 'Requirement name must be at least 3 characters long' }), - description: z.string().optional(), // Description can be optional - identifier: z.string().optional(), // Identifier can be optional - frameworkId: z.string().min(1, { message: 'Framework ID is required' }), -}); - -export interface AddRequirementActionState { - success: boolean; - data?: FrameworkEditorRequirement; // Return the created requirement on success - error?: string; - issues?: z.ZodIssue[]; - message?: string; // Added message property for success/general messages -} - -export async function addRequirementAction( - prevState: AddRequirementActionState | null, - formData: FormData, -): Promise { - const rawInput = { - name: formData.get('name'), - description: formData.get('description'), - identifier: formData.get('identifier'), - frameworkId: formData.get('frameworkId'), - }; - - const validationResult = AddRequirementSchema.safeParse(rawInput); - - if (!validationResult.success) { - return { - success: false, - error: 'Invalid input for requirement.', - issues: validationResult.error.issues, - }; - } - - const { name, description, identifier, frameworkId } = validationResult.data; - - try { - const newRequirement = await db.frameworkEditorRequirement.create({ - data: { - name, - description: description || '', // Ensure description is at least an empty string if optional and not provided - identifier: identifier || '', // Ensure identifier is at least an empty string if optional and not provided - framework: { - connect: { id: frameworkId }, - }, - // Assuming `order` might be a field you want to manage, e.g., for new requirements - // If not, it can be omitted if it has a default or is nullable. - // order: await getNextOrderForFramework(frameworkId) // Example: utility function to determine order - }, - }); - - // Revalidate the path to the framework's requirements page to show the new requirement - revalidatePath(`/frameworks/${frameworkId}`); - - return { - success: true, - data: newRequirement, - message: 'Requirement added successfully.', - }; - } catch (error) { - console.error('Failed to create requirement:', error); - const errorMessage = - error instanceof Error ? error.message : 'An unexpected database error occurred.'; - return { - success: false, - error: `Database error: ${errorMessage}`, - }; - } -} - -// Example utility function (if needed for fields like 'order') -// async function getNextOrderForFramework(frameworkId: string): Promise { -// const lastRequirement = await db.frameworkEditorRequirement.findFirst({ -// where: { frameworkId }, -// orderBy: { order: 'desc' }, -// }); -// return (lastRequirement?.order ?? 0) + 1; -// } diff --git a/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/delete-framework.ts b/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/delete-framework.ts deleted file mode 100644 index 2af2b6e5f..000000000 --- a/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/delete-framework.ts +++ /dev/null @@ -1,75 +0,0 @@ -'use server'; - -import { db } from '@comp/db'; // Uncommented and assuming this is the correct path to your Prisma client instance -import { revalidatePath } from 'next/cache'; -import { redirect } from 'next/navigation'; -import { z } from 'zod'; - -// Schema for input validation -const DeleteFrameworkSchema = z.object({ - frameworkId: z.string().min(1, { message: 'Framework ID is required' }), -}); - -export interface DeleteFrameworkActionState { - success: boolean; - error?: string; - message?: string; // Optional: for success messages before redirect or more detailed errors - issues?: z.ZodIssue[]; -} - -export async function deleteFrameworkAction( - // prevState is not strictly used here as redirect happens on success, but kept for pattern consistency - prevState: DeleteFrameworkActionState | null, - formData: FormData, -): Promise { - const rawInput = { - frameworkId: formData.get('frameworkId'), - }; - - const validationResult = DeleteFrameworkSchema.safeParse(rawInput); - - if (!validationResult.success) { - return { - success: false, - error: 'Invalid input: Framework ID is missing or invalid.', - issues: validationResult.error.issues, - }; - } - - const { frameworkId } = validationResult.data; - - try { - // Step 1: Delete all related FrameworkEditorRequirement records - // This is important if cascading deletes are not configured or if you want explicit control. - console.log(`Attempting to delete requirements for frameworkId: ${frameworkId}`); - await db.frameworkEditorRequirement.deleteMany({ - where: { frameworkId: frameworkId }, - }); - console.log(`Successfully deleted requirements for frameworkId: ${frameworkId}`); - - // Step 2: Delete the FrameworkEditorFramework itself - console.log(`Attempting to delete framework with id: ${frameworkId}`); - await db.frameworkEditorFramework.delete({ - where: { id: frameworkId }, - }); - console.log(`Successfully deleted framework with id: ${frameworkId}`); - - revalidatePath('/frameworks'); - revalidatePath(`/frameworks/${frameworkId}`); // Revalidate the specific framework page - } catch (error) { - console.error('Failed to delete framework and/or its requirements:', error); - const errorMessage = - error instanceof Error ? error.message : 'An unexpected server error occurred.'; - return { - success: false, - error: `Database operation failed: ${errorMessage}`, - }; - } - - // If deletion logic is successful, redirect to the frameworks list page. - // redirect() will throw a NEXT_REDIRECT error, and Next.js will handle the client-side redirection. - redirect('/frameworks'); - - // This part is effectively unreachable due to redirect(), but can be here for type consistency or if redirect was conditional. - // return { success: true, message: "Framework deleted successfully. Redirecting..." }; -} diff --git a/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/delete-requirement-action.ts b/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/delete-requirement-action.ts deleted file mode 100644 index 754be7c5b..000000000 --- a/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/actions/delete-requirement-action.ts +++ /dev/null @@ -1,76 +0,0 @@ -'use server'; - -import { db } from '@comp/db'; -import { Prisma } from '@prisma/client'; // Import Prisma for error types -import { revalidatePath } from 'next/cache'; -import { z } from 'zod'; - -const DeleteRequirementSchema = z.object({ - requirementId: z.string().min(1, { message: 'Requirement ID is required' }), - frameworkId: z.string().min(1, { message: 'Framework ID is required for revalidation' }), -}); - -export interface DeleteRequirementActionState { - success: boolean; - error?: string; - issues?: z.ZodIssue[]; -} - -export async function deleteRequirementAction( - prevState: DeleteRequirementActionState | null, - formData: FormData, -): Promise { - const rawInput = { - requirementId: formData.get('requirementId'), - frameworkId: formData.get('frameworkId'), - }; - - const validationResult = DeleteRequirementSchema.safeParse(rawInput); - - if (!validationResult.success) { - return { - success: false, - error: 'Invalid input for deleting requirement.', - issues: validationResult.error.issues, - }; - } - - const { requirementId, frameworkId } = validationResult.data; - - try { - // Before deleting a requirement, ensure any dependent entities are handled - // e.g., if controls are linked to requirements and there's a relation that needs cleanup. - // For a simple delete where Prisma handles cascades or there are no strict FK constraints preventing delete: - await db.frameworkEditorRequirement.delete({ - where: { id: requirementId }, - }); - - revalidatePath(`/frameworks/${frameworkId}`); - - return { - success: true, - }; - } catch (error) { - console.error('Failed to delete requirement:', error); - if (error instanceof Prisma.PrismaClientKnownRequestError) { - // Specific Prisma errors - if (error.code === 'P2025') { - return { - success: false, - error: 'Requirement not found or already deleted.', - }; - } - // Add other Prisma error codes to handle if needed, e.g., P2003 for foreign key constraints - // if (error.code === 'P2003') { - // return { success: false, error: 'Cannot delete requirement due to existing relations (e.g., linked controls).' }; - // } - } - // General error message - const errorMessage = - error instanceof Error ? error.message : 'An unexpected database error occurred.'; - return { - success: false, - error: `Database error: ${errorMessage}`, - }; - } -} diff --git a/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/components/AddRequirementDialog.tsx b/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/components/AddRequirementDialog.tsx deleted file mode 100644 index dd60fcc3e..000000000 --- a/apps/framework-editor/app/(pages)/frameworks/[frameworkId]/components/AddRequirementDialog.tsx +++ /dev/null @@ -1,190 +0,0 @@ -'use client'; - -import { Button } from '@comp/ui/button'; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, -} from '@comp/ui/dialog'; -import { Input } from '@comp/ui/input'; -import { Label } from '@comp/ui/label'; -import { Textarea } from '@comp/ui/textarea'; -import { useToast } from '@comp/ui/use-toast'; -import { useActionState, useEffect, useState } from 'react'; -import { useFormStatus } from 'react-dom'; -import { - addRequirementAction, - type AddRequirementActionState, -} from '../actions/add-requirement-action'; - -const initialFormState: AddRequirementActionState = { - success: false, - error: undefined, - issues: undefined, - data: undefined, - message: undefined, -}; - -interface AddRequirementDialogProps { - isOpen: boolean; - onOpenChange: (isOpen: boolean) => void; - frameworkId: string; - onRequirementAdded: () => void; -} - -function SubmitButton() { - const { pending } = useFormStatus(); - return ( - - ); -} - -export function AddRequirementDialog({ - isOpen, - onOpenChange, - frameworkId, - onRequirementAdded, -}: AddRequirementDialogProps) { - const { toast } = useToast(); - const [formKey, setFormKey] = useState(Date.now()); - const [formState, formAction, isPending] = useActionState(addRequirementAction, initialFormState); - const [name, setName] = useState(''); - const [description, setDescription] = useState(''); - const [identifier, setIdentifier] = useState(''); - - useEffect(() => { - if (formState.success && formState.data) { - toast({ - title: 'Success!', - description: formState.message || 'New requirement added successfully.', - }); - onRequirementAdded(); // Close dialog and refresh list - setName(''); // Reset local state - setDescription(''); - setIdentifier(''); - // The form itself will reset due to the key change on next open if desired, or if onOpenChange triggers a reset - } else if (!formState.success && (formState.error || formState.issues)) { - const issueMessages = - formState.issues?.map((i) => `${i.path.join('.')} : ${i.message}`).join('; ') || ''; - toast({ - title: 'Error Adding Requirement', - description: formState.error || issueMessages || 'An unexpected error occurred.', - variant: 'destructive', - }); - } - }, [formState, onRequirementAdded, toast]); - - const handleOpenChange = (open: boolean) => { - if (open) { - // Reset form fields and formState when dialog is opened - setName(''); - setDescription(''); - setIdentifier(''); - setFormKey(Date.now()); // Reset form state by changing key, ensuring useFormState re-initializes - } else { - // If dialog is closed ensure parent knows - onOpenChange(false); - } - // Call onOpenChange to control dialog visibility from parent - // This might be redundant if the above else already calls it, but ensures consistency. - // onOpenChange(open); - }; - - // We only want to call onOpenChange from parent when dialog truly intends to close. - // The Dialog component itself calls its onOpenChange prop for various reasons (escape, click outside). - // So, we manage our internal logic first, then call parent's onOpenChange when appropriate. - - return ( - - - - Add New Requirement - - Fill in the details for the new requirement for this framework. - - -
- {' '} - {/* Add key here */} - -
-
- - setName(e.target.value)} - className="col-span-3" - required - disabled={isPending} - /> - {formState.issues?.find((issue) => issue.path.includes('name')) && ( -

- {formState.issues.find((issue) => issue.path.includes('name'))?.message} -

- )} -
-
- - setIdentifier(e.target.value)} - className="col-span-3" - placeholder="e.g., cc1-1" - disabled={isPending} - /> - {formState.issues?.find((issue) => issue.path.includes('identifier')) && ( -

- {formState.issues.find((issue) => issue.path.includes('identifier'))?.message} -

- )} -
-
- -