From f63cc5697b01c1940ea73db745d9d102d69309af Mon Sep 17 00:00:00 2001 From: bartoval Date: Sat, 31 May 2025 10:07:11 +0200 Subject: [PATCH 1/7] fix backend standalone mode --- components/common/kube.js | 60 +++++++++++++++---- components/management-controller/src/certs.js | 11 +++- scripts/db-setup.sql | 3 +- 3 files changed, 61 insertions(+), 13 deletions(-) diff --git a/components/common/kube.js b/components/common/kube.js index f734858..62ed9d0 100644 --- a/components/common/kube.js +++ b/components/common/kube.js @@ -62,13 +62,30 @@ exports.Start = async function (k8s_mod, fs_mod, yaml_mod, standalone_namespace) fs = fs_mod; YAML = yaml_mod; - kc = new k8s.KubeConfig(); - if (!standalone_namespace) { - kc.loadFromCluster(); - } else { - kc.loadFromDefault(); + if (standalone_namespace) { + // Standalone mode - skip Kubernetes API client initialization + Log(`[Kube module] Running in standalone mode, namespace: ${standalone_namespace}`); + namespace = standalone_namespace; + + // Initialize dummy objects to prevent errors + client = null; + v1Api = null; + v1AppApi = null; + customApi = null; + secretWatch = null; + certificateWatch = null; + configMapWatch = null; + routeWatch = null; + serviceWatch = null; + podWatch = null; + + return; } + // Cluster mode - normal Kubernetes API initialization + kc = new k8s.KubeConfig(); + kc.loadFromCluster(); + client = k8s.KubernetesObjectApi.makeApiClient(kc); v1Api = kc.makeApiClient(k8s.CoreV1Api); v1AppApi = kc.makeApiClient(k8s.AppsV1Api); @@ -82,11 +99,7 @@ exports.Start = async function (k8s_mod, fs_mod, yaml_mod, standalone_namespace) podWatch = new k8s.Watch(kc); try { - if (standalone_namespace) { - namespace = standalone_namespace; - } else { - namespace = fs.readFileSync('/var/run/secrets/kubernetes.io/serviceaccount/namespace', 'utf8'); - } + namespace = fs.readFileSync('/var/run/secrets/kubernetes.io/serviceaccount/namespace', 'utf8'); Log(`Running in namespace: ${namespace}`); } catch (err) { Log(`Unable to determine namespace, assuming ${namespace}`); @@ -94,6 +107,10 @@ exports.Start = async function (k8s_mod, fs_mod, yaml_mod, standalone_namespace) } exports.GetIssuers = async function() { + if (!customApi) { + Log('[Kube module] GetIssuers called in standalone mode - returning empty list'); + return []; + } let list = await customApi.listNamespacedCustomObject( 'cert-manager.io', 'v1', @@ -125,6 +142,10 @@ exports.DeleteIssuer = async function(name) { } exports.GetCertificates = async function() { + if (!customApi) { + Log('[Kube module] GetCertificates called in standalone mode - returning empty list'); + return []; + } let list = await customApi.listNamespacedCustomObject( 'cert-manager.io', 'v1', @@ -135,6 +156,9 @@ exports.GetCertificates = async function() { } exports.LoadCertificate = async function(name) { + if (!customApi) { + throw new Error('[Kube module] LoadCertificate called in standalone mode'); + } let cert = await customApi.getNamespacedCustomObject( 'cert-manager.io', 'v1', @@ -146,6 +170,10 @@ exports.LoadCertificate = async function(name) { } exports.DeleteCertificate = async function(name) { + if (!customApi) { + Log('[Kube module] DeleteCertificate called in standalone mode - ignoring'); + return; + } await customApi.deleteNamespacedCustomObject( 'cert-manager.io', 'v1', @@ -156,11 +184,18 @@ exports.DeleteCertificate = async function(name) { } exports.GetSecrets = async function() { + if (!v1Api) { + Log('[Kube module] GetSecrets called in standalone mode - returning empty list'); + return []; + } let list = await v1Api.listNamespacedSecret(namespace); return list.body.items; } exports.LoadSecret = async function(name) { + if (!v1Api) { + throw new Error('[Kube module] LoadSecret called in standalone mode'); + } let secret = await v1Api.readNamespacedSecret(name, namespace); return secret.body; } @@ -438,6 +473,11 @@ exports.WatchPods = function(callback) { } exports.ApplyObject = async function(obj) { + if (!client) { + Log(`[Kube module] ApplyObject called in standalone mode for ${obj.kind} ${obj.metadata.name} - skipping`); + return null; + } + try { if (obj.metadata.annotations == undefined) { obj.metadata.annotations = {}; diff --git a/components/management-controller/src/certs.js b/components/management-controller/src/certs.js index 1b17ed2..42aa37d 100644 --- a/components/management-controller/src/certs.js +++ b/components/management-controller/src/certs.js @@ -604,7 +604,14 @@ exports.Start = async function() { setTimeout(processNewMemberSites, 1000); setTimeout(processNewCertificateRequests, 1000); - kube.WatchSecrets(onSecretWatch); - kube.WatchCertificates(onCertificateWatch); + // Skip Kubernetes watch operations in standalone mode + const STANDALONE_NS = process.env.SKX_STANDALONE_NAMESPACE; + if (!STANDALONE_NS) { + Log('[Certificate module] Setting up Kubernetes watches'); + kube.WatchSecrets(onSecretWatch); + kube.WatchCertificates(onCertificateWatch); + } else { + Log('[Certificate module] Skipping Kubernetes watches in standalone mode'); + } } diff --git a/scripts/db-setup.sql b/scripts/db-setup.sql index 53df72e..c668282 100644 --- a/scripts/db-setup.sql +++ b/scripts/db-setup.sql @@ -433,7 +433,8 @@ INSERT INTO BlockTypes (Name, AllowNorth, AllowSouth, AllocateToSite) VALUES ('skupperx.io/toplevel', false, false, false), ('skupperx.io/mixed', true, true, false), ('skupperx.io/ingress', true, false, true), - ('skupperx.io/egress', false, true, false); + ('skupperx.io/egress', false, true, false), + ('skupperx.io/container', true, true, true); INSERT INTO InterfaceRoles (Name) VALUES ('accept'), ('connect'), From a2ef58de848d7ee4b912dd64b70365fbe53a9eb1 Mon Sep 17 00:00:00 2001 From: bartoval Date: Sat, 31 May 2025 10:45:07 +0200 Subject: [PATCH 2/7] refactor dev environment --- components/console/webpack.dev.js | 16 +- components/management-controller/build.js | 9 +- scripts/README.md | 271 +++++++++++++++++ scripts/check-dependencies.sh | 319 ++++++++++++++++++++ scripts/start-console-dev.sh | 65 +++++ scripts/start-database.sh | 332 +++++++++++++++++++++ scripts/start-dev-mode.sh | 211 ++++++++++++++ scripts/start-skupper-standalone.sh | 336 ++++++++++++++++++++++ 8 files changed, 1556 insertions(+), 3 deletions(-) create mode 100644 scripts/README.md create mode 100755 scripts/check-dependencies.sh create mode 100755 scripts/start-console-dev.sh create mode 100755 scripts/start-database.sh create mode 100755 scripts/start-dev-mode.sh create mode 100755 scripts/start-skupper-standalone.sh diff --git a/components/console/webpack.dev.js b/components/console/webpack.dev.js index 06ceff7..3bcf7ff 100644 --- a/components/console/webpack.dev.js +++ b/components/console/webpack.dev.js @@ -13,7 +13,21 @@ const devConfig = { devServer: { port: 3000, historyApiFallback: true, - compress: true + compress: true, + proxy: [ + { + context: ['/api'], + target: 'http://localhost:8085', + changeOrigin: true, + secure: false + }, + { + context: ['/compose'], + target: 'http://localhost:8085', + changeOrigin: true, + secure: false + } + ] }, plugins: [ diff --git a/components/management-controller/build.js b/components/management-controller/build.js index 4e15f47..2ade2bc 100644 --- a/components/management-controller/build.js +++ b/components/management-controller/build.js @@ -25,14 +25,19 @@ const modules = [ 'certs', 'config', 'db', - 'manage-sync', + 'sync-management', + 'sync-application', 'mc-apiserver', 'mc-main', 'prune', + 'compose', + 'crd-templates', + 'ident', + 'claim-server', ]; // List of common modules to copy to the application directory -const commonModules = ['amqp', 'kube', 'log', 'protocol', 'util']; +const commonModules = ['amqp', 'common', 'kube', 'log', 'protocol', 'router', 'state-sync', 'util']; // Function to clean up previous build, if present async function cleanupPreviousBuild() { diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000..5be02ad --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,271 @@ +# Skupper-X Development Scripts + +This directory contains scripts to set up and run Skupper-X in various development and standalone modes. + +## Available Scripts + +### 🔧 `check-dependencies.sh` +**Dependency management** - Comprehensive check and installation of all project dependencies. + +```bash +# Check all dependencies +./scripts/check-dependencies.sh + +# Check with security audit +./scripts/check-dependencies.sh --security + +# Force reinstall all dependencies +./scripts/check-dependencies.sh --force + +# Show help +./scripts/check-dependencies.sh --help +``` + +**What it does:** +- Verifies system dependencies (Node.js, npm, yarn, Docker, curl) +- Checks and installs/updates npm/yarn dependencies for all components +- Validates dependency versions and compatibility +- Optional security vulnerability scanning +- Smart dependency caching (only updates when needed) + +**Best for:** Initial setup, troubleshooting dependency issues + +--- + +### 🚀 `start-dev-mode.sh` +**Complete development environment** - Starts both backend and frontend with hot reload. + +```bash +./scripts/start-dev-mode.sh +``` + +**What it does:** +- Sets up PostgreSQL database (Docker) +- Starts backend in background +- Starts frontend with hot reload in foreground +- Configures proxy for API calls +- Provides cleanup on Ctrl+C + +**Best for:** Active development with immediate feedback + +--- + +### 🖥️ `start-skupper-standalone.sh` +**Backend-only standalone mode** - Runs complete Skupper-X backend with integrated web console. + +```bash +./scripts/start-skupper-standalone.sh +``` + +**What it does:** +- Sets up PostgreSQL database (Docker) +- Builds and integrates web console +- Starts management controller with built console +- Single process serving both API and UI + +**Best for:** Testing, demos, production-like setup + +--- + +### 🎨 `start-console-dev.sh` +**Frontend-only development** - Starts just the React development server. + +```bash +./scripts/start-console-dev.sh +``` + +**Prerequisites:** Backend must be running (port 8085) + +**What it does:** +- Checks if backend is responding +- Starts React dev server with hot reload +- Proxies API calls to backend + +**Best for:** Frontend-only development + +--- + +### 🗄️ `start-database.sh` +**Database management** - Comprehensive PostgreSQL setup and management. + +```bash +# Setup database +./scripts/start-database.sh setup + +# Check status +./scripts/start-database.sh status + +# Start existing database +./scripts/start-database.sh start + +# Stop database +./scripts/start-database.sh stop + +# View logs +./scripts/start-database.sh logs + +# Connect to database +./scripts/start-database.sh connect + +# Remove database +./scripts/start-database.sh remove +``` + +**Best for:** Database-only operations, troubleshooting + +## Development Workflows + +### 🔄 Full Development Cycle +For active development with both frontend and backend changes: + +```bash +# Start complete development environment +./scripts/start-dev-mode.sh + +# Services available: +# - Frontend: http://localhost:3000 (with hot reload) +# - Backend: http://localhost:8085 +# - Database: localhost:5432 + +# Press Ctrl+C to stop all services +``` + +### 🎯 Frontend-Only Development +When working only on React components: + +```bash +# Terminal 1: Start backend +./scripts/start-skupper-standalone.sh + +# Terminal 2: Start frontend dev server +./scripts/start-console-dev.sh +``` + +### 🔧 Backend-Only Development +When working on API or business logic: + +```bash +# Setup database once +./scripts/start-database.sh setup + +# Start backend with built console +./scripts/start-skupper-standalone.sh +``` + +### 🚢 Production-Like Testing +To test the complete integrated system: + +```bash +# This mimics production deployment +./scripts/start-skupper-standalone.sh + +# Access at: http://localhost:8085 +``` + +## Environment Variables + +All scripts automatically set these variables for standalone mode: + +- `SKX_STANDALONE_NAMESPACE="skupper-system"` +- `POSTGRES_HOST="localhost"` +- `POSTGRES_PORT="5432"` +- `POSTGRES_DB="studiodb"` +- `POSTGRES_USER="access"` +- `POSTGRES_PASSWORD="password"` + +## Database Configuration + +PostgreSQL runs in Docker with these settings: +- **Container name:** `skupper-postgres` +- **Port:** 5432 +- **Database:** studiodb +- **User:** access +- **Password:** password +- **Persistent volume:** `skupper-postgres-data` + +## Ports Used + +| Service | Port | Description | +|---------|------|-------------| +| Backend API | 8085 | Management controller REST API | +| Frontend Dev | 3000 | React development server | +| PostgreSQL | 5432 | Database server | + +## Troubleshooting + +### Backend won't start +```bash +# Check logs +tail -f /tmp/skupper-backend.log + +# Check database +./scripts/start-database.sh status + +# Restart database +./scripts/start-database.sh stop +./scripts/start-database.sh start +``` + +### Frontend can't connect to backend +```bash +# Check if backend is responding +curl http://localhost:8085/healthz + +# Check proxy configuration in webpack.dev.js +``` + +### Database issues +```bash +# Check container status +docker ps | grep skupper-postgres + +# View database logs +./scripts/start-database.sh logs + +# Connect to database directly +./scripts/start-database.sh connect + +# Reset database +./scripts/start-database.sh remove +./scripts/start-database.sh setup +``` + +### Port conflicts +```bash +# Check what's using ports +lsof -i :8085 +lsof -i :3000 +lsof -i :5432 + +# Stop conflicting processes or use different ports +``` + +## Script Dependencies + +All scripts require: +- **Docker** (for PostgreSQL) +- **Node.js** (for backend and frontend) +- **Yarn** (for frontend dependencies) +- **curl** (for health checks) + +Install on Ubuntu/Debian: +```bash +sudo apt update +sudo apt install docker.io nodejs yarn curl +``` + +## Files Created + +The scripts create these temporary files: +- `/tmp/skupper-backend.log` - Backend logs +- `/tmp/skupper-backend.pid` - Backend process ID +- Docker volume `skupper-postgres-data` - Database persistence + +Clean up with: +```bash +# Remove temporary files +rm -f /tmp/skupper-backend.* + +# Remove Docker volume (loses data!) +docker volume rm skupper-postgres-data +``` diff --git a/scripts/check-dependencies.sh b/scripts/check-dependencies.sh new file mode 100755 index 0000000..5a0a3c8 --- /dev/null +++ b/scripts/check-dependencies.sh @@ -0,0 +1,319 @@ +#!/bin/bash + +# Script per verificare e installare tutte le dipendenze del progetto Skupper-X + +set -e + +echo "🔧 Checking and Installing Skupper-X Dependencies" +echo "=================================================" + +# Colori per output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Directory di progetto +PROJECT_DIR="$(dirname "$(dirname "$(realpath "$0")")")" +CONSOLE_DIR="$PROJECT_DIR/components/console" +MANAGEMENT_CONTROLLER_DIR="$PROJECT_DIR/components/management-controller" +SITE_CONTROLLER_DIR="$PROJECT_DIR/components/site-controller" + +# Funzioni per logging colorato +log_info() { + echo -e "${BLUE}ℹ️ $1${NC}" +} + +log_success() { + echo -e "${GREEN}✅ $1${NC}" +} + +log_warning() { + echo -e "${YELLOW}⚠️ $1${NC}" +} + +log_error() { + echo -e "${RED}❌ $1${NC}" +} + +# Funzione per verificare se un comando esiste +command_exists() { + command -v "$1" >/dev/null 2>&1 +} + +# Funzione per verificare le dipendenze del sistema +check_system_dependencies() { + log_info "Checking system dependencies..." + + local missing_deps=() + + # Verifica Node.js + if command_exists node; then + local node_version=$(node --version) + log_success "Node.js $node_version installed" + + # Verifica versione minima Node.js (v16+) + local major_version=$(echo $node_version | cut -d'.' -f1 | sed 's/v//') + if [ "$major_version" -lt 16 ]; then + log_warning "Node.js version $node_version is too old (minimum v16 required)" + fi + else + log_error "Node.js is not installed" + missing_deps+=("nodejs") + fi + + # Verifica npm + if command_exists npm; then + local npm_version=$(npm --version) + log_success "npm $npm_version installed" + else + log_error "npm is not installed" + missing_deps+=("npm") + fi + + # Verifica Yarn + if command_exists yarn; then + local yarn_version=$(yarn --version) + log_success "Yarn $yarn_version installed" + else + log_warning "Yarn is not installed (optional but recommended)" + log_info "Installing Yarn globally..." + if npm install -g yarn >/dev/null 2>&1; then + log_success "Yarn installed successfully" + else + log_error "Failed to install Yarn" + missing_deps+=("yarn") + fi + fi + + # Verifica Docker + if command_exists docker; then + local docker_version=$(docker --version | cut -d' ' -f3 | sed 's/,//') + log_success "Docker $docker_version installed" + + # Verifica se Docker daemon è in esecuzione + if docker info >/dev/null 2>&1; then + log_success "Docker daemon is running" + else + log_warning "Docker daemon is not running" + fi + else + log_error "Docker is not installed" + missing_deps+=("docker") + fi + + # Verifica curl + if command_exists curl; then + log_success "curl installed" + else + log_error "curl is not installed" + missing_deps+=("curl") + fi + + if [ ${#missing_deps[@]} -gt 0 ]; then + log_error "Missing system dependencies: ${missing_deps[*]}" + echo "" + echo "To install missing dependencies on Ubuntu/Debian:" + echo " sudo apt update" + echo " sudo apt install nodejs npm docker.io curl" + echo "" + echo "For other systems, please install the missing dependencies manually." + exit 1 + fi + + log_success "All system dependencies are available" +} + +# Funzione per verificare e installare dipendenze di un progetto +check_project_dependencies() { + local project_name="$1" + local project_dir="$2" + local package_manager="$3" # npm o yarn + + log_info "Checking $project_name dependencies..." + + if [ ! -d "$project_dir" ]; then + log_error "$project_name directory not found: $project_dir" + return 1 + fi + + cd "$project_dir" + + # Verifica se package.json esiste + if [ ! -f "package.json" ]; then + log_warning "$project_name has no package.json file" + return 0 + fi + + # Verifica se node_modules esiste + if [ ! -d "node_modules" ]; then + log_info "Installing $project_name dependencies with $package_manager..." + if [ "$package_manager" = "yarn" ]; then + if yarn install; then + log_success "$project_name dependencies installed" + else + log_error "Failed to install $project_name dependencies" + return 1 + fi + else + if npm install; then + log_success "$project_name dependencies installed" + else + log_error "Failed to install $project_name dependencies" + return 1 + fi + fi + else + # Verifica se le dipendenze sono aggiornate + local needs_update=false + + if [ "package.json" -nt "node_modules" ]; then + needs_update=true + fi + + if [ "$package_manager" = "yarn" ] && [ -f "yarn.lock" ] && [ "yarn.lock" -nt "node_modules" ]; then + needs_update=true + fi + + if [ "$package_manager" = "npm" ] && [ -f "package-lock.json" ] && [ "package-lock.json" -nt "node_modules" ]; then + needs_update=true + fi + + if [ "$needs_update" = true ]; then + log_info "Updating $project_name dependencies..." + if [ "$package_manager" = "yarn" ]; then + if yarn install; then + log_success "$project_name dependencies updated" + else + log_error "Failed to update $project_name dependencies" + return 1 + fi + else + if npm install; then + log_success "$project_name dependencies updated" + else + log_error "Failed to update $project_name dependencies" + return 1 + fi + fi + else + log_success "$project_name dependencies are up to date" + fi + fi +} + +# Funzione per verificare la vulnerabilità delle dipendenze +check_security() { + log_info "Checking for security vulnerabilities..." + + # Console (Yarn) + if [ -d "$CONSOLE_DIR/node_modules" ]; then + cd "$CONSOLE_DIR" + log_info "Checking console security..." + if yarn audit --json >/dev/null 2>&1; then + local high_vulns=$(yarn audit --json 2>/dev/null | grep '"type":"auditSummary"' | jq -r '.data.vulnerabilities.high // 0' 2>/dev/null || echo "0") + local critical_vulns=$(yarn audit --json 2>/dev/null | grep '"type":"auditSummary"' | jq -r '.data.vulnerabilities.critical // 0' 2>/dev/null || echo "0") + + if [ "$high_vulns" -gt 0 ] || [ "$critical_vulns" -gt 0 ]; then + log_warning "Found $high_vulns high and $critical_vulns critical vulnerabilities in console" + log_info "Run 'yarn audit --fix' in $CONSOLE_DIR to fix" + else + log_success "No high/critical vulnerabilities found in console" + fi + fi + fi + + # Management Controller (npm) + if [ -d "$MANAGEMENT_CONTROLLER_DIR/node_modules" ]; then + cd "$MANAGEMENT_CONTROLLER_DIR" + log_info "Checking management controller security..." + if npm audit --json >/dev/null 2>&1; then + local audit_result=$(npm audit --json 2>/dev/null || echo '{}') + local high_vulns=$(echo "$audit_result" | jq -r '.metadata.vulnerabilities.high // 0' 2>/dev/null || echo "0") + local critical_vulns=$(echo "$audit_result" | jq -r '.metadata.vulnerabilities.critical // 0' 2>/dev/null || echo "0") + + if [ "$high_vulns" -gt 0 ] || [ "$critical_vulns" -gt 0 ]; then + log_warning "Found $high_vulns high and $critical_vulns critical vulnerabilities in management controller" + log_info "Run 'npm audit fix' in $MANAGEMENT_CONTROLLER_DIR to fix" + else + log_success "No high/critical vulnerabilities found in management controller" + fi + fi + fi +} + +# Funzione principale +main() { + local check_security_flag=false + local force_install=false + + # Parse arguments + while [[ $# -gt 0 ]]; do + case $1 in + --security|-s) + check_security_flag=true + shift + ;; + --force|-f) + force_install=true + shift + ;; + --help|-h) + echo "Usage: $0 [options]" + echo "" + echo "Options:" + echo " --security, -s Check for security vulnerabilities" + echo " --force, -f Force reinstall all dependencies" + echo " --help, -h Show this help message" + exit 0 + ;; + *) + log_error "Unknown option: $1" + exit 1 + ;; + esac + done + + # Se force è abilitato, rimuovi node_modules + if [ "$force_install" = true ]; then + log_info "Force reinstall requested - removing existing node_modules..." + rm -rf "$CONSOLE_DIR/node_modules" 2>/dev/null || true + rm -rf "$MANAGEMENT_CONTROLLER_DIR/node_modules" 2>/dev/null || true + rm -rf "$SITE_CONTROLLER_DIR/node_modules" 2>/dev/null || true + fi + + # Verifica dipendenze del sistema + check_system_dependencies + echo "" + + # Verifica dipendenze dei progetti + check_project_dependencies "Console" "$CONSOLE_DIR" "yarn" + echo "" + + check_project_dependencies "Management Controller" "$MANAGEMENT_CONTROLLER_DIR" "npm" + echo "" + + check_project_dependencies "Site Controller" "$SITE_CONTROLLER_DIR" "npm" + echo "" + + # Verifica sicurezza se richiesto + if [ "$check_security_flag" = true ]; then + check_security + echo "" + fi + + log_success "🎉 All dependencies check completed!" + echo "" + echo "📋 What's next?" + echo " • Start development: ./scripts/start-dev-mode.sh" + echo " • Start standalone: ./scripts/start-skupper-standalone.sh" + echo " • Start frontend: ./scripts/start-console-dev.sh" + echo "" + echo "🔒 Security:" + echo " • Check vulnerabilities: $0 --security" + echo " • Force reinstall: $0 --force" +} + +# Esegui funzione principale +main "$@" diff --git a/scripts/start-console-dev.sh b/scripts/start-console-dev.sh new file mode 100755 index 0000000..25c803e --- /dev/null +++ b/scripts/start-console-dev.sh @@ -0,0 +1,65 @@ +#!/bin/bash + +# Script per avviare solo il frontend console in modalità sviluppo +# Assume che il backend sia già in esecuzione su porta 8085 + +set -e + +echo "🎨 Starting Frontend Console in Development Mode" +echo "================================================" + +# Colori per output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Directory di progetto +PROJECT_DIR="$(dirname "$(dirname "$(realpath "$0")")")" +CONSOLE_DIR="$PROJECT_DIR/components/console" + +log_info() { + echo -e "${BLUE}ℹ️ $1${NC}" +} + +log_success() { + echo -e "${GREEN}✅ $1${NC}" +} + +# Verifica che il backend sia in esecuzione +log_info "Checking if backend is running on port 8085..." +if ! curl -s http://localhost:8085/healthz >/dev/null 2>&1; then + echo "❌ Backend is not responding on port 8085" + echo "ℹ️ Start the backend first with:" + echo " cd $PROJECT_DIR" + echo " ./scripts/start-skupper-standalone.sh" + echo "" + echo "Or use the full development script:" + echo " ./scripts/start-dev-mode.sh" + exit 1 +fi + +log_success "Backend is responding" + +cd "$CONSOLE_DIR" + +# Verifica e installa dipendenze se necessario +log_info "Checking dependencies..." +if [ ! -d "node_modules" ]; then + log_info "Installing dependencies..." + yarn install +else + # Verifica se package.json è più recente di node_modules + if [ "package.json" -nt "node_modules" ] || [ "yarn.lock" -nt "node_modules" ]; then + log_info "Dependencies are outdated, updating..." + yarn install + else + log_success "Dependencies are up to date" + fi +fi + +log_info "Starting development server..." +log_success "🎯 Console will be available at: http://localhost:3000" +log_info "API calls will be proxied to backend at: http://localhost:8085" +echo "" + +yarn start diff --git a/scripts/start-database.sh b/scripts/start-database.sh new file mode 100755 index 0000000..e3e382b --- /dev/null +++ b/scripts/start-database.sh @@ -0,0 +1,332 @@ +#!/bin/bash + +# Script per installare e configurare solo il database PostgreSQL per Skupper-X +# Può essere usato indipendentemente dagli altri servizi + +set -e # Exit on any error + +echo "🗄️ Setting up PostgreSQL Database for Skupper-X" +echo "================================================" + +# Colori per output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Directory di progetto +PROJECT_DIR="$(dirname "$(dirname "$(realpath "$0")")")" + +# Configurazione database (da postgres-config.yaml) +DB_NAME="studiodb" +DB_USER="access" +DB_PASSWORD="password" +DB_HOST="localhost" +DB_PORT="5432" +POSTGRES_CONTAINER_NAME="skupper-postgres" +POSTGRES_VOLUME_NAME="skupper-postgres-data" + +# Funzione per logging colorato +log_info() { + echo -e "${BLUE}ℹ️ $1${NC}" +} + +log_success() { + echo -e "${GREEN}✅ $1${NC}" +} + +log_warning() { + echo -e "${YELLOW}⚠️ $1${NC}" +} + +log_error() { + echo -e "${RED}❌ $1${NC}" +} + +# Funzione per controllare se PostgreSQL container è pronto +wait_for_postgres_container() { + log_info "Waiting for PostgreSQL container to be ready..." + local max_attempts=30 + local attempt=1 + + while [ $attempt -le $max_attempts ]; do + if docker exec $POSTGRES_CONTAINER_NAME pg_isready -U $DB_USER >/dev/null 2>&1; then + log_success "PostgreSQL container is ready!" + return 0 + fi + + echo -n "." + sleep 1 + attempt=$((attempt + 1)) + done + + log_error "PostgreSQL container failed to become ready" + return 1 +} + +# Funzione per mostrare lo stato del database +show_database_status() { + log_info "Database Status:" + echo " Container Name: $POSTGRES_CONTAINER_NAME" + echo " Database Name: $DB_NAME" + echo " User: $DB_USER" + echo " Host: $DB_HOST" + echo " Port: $DB_PORT" + echo " Volume: $POSTGRES_VOLUME_NAME" + echo "" + + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_success "✅ PostgreSQL container is running" + elif docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_warning "⚠️ PostgreSQL container exists but is stopped" + else + log_info "ℹ️ PostgreSQL container does not exist" + fi + + if docker volume ls | grep -q "$POSTGRES_VOLUME_NAME"; then + log_success "✅ PostgreSQL data volume exists" + else + log_info "ℹ️ PostgreSQL data volume does not exist" + fi +} + +# Funzione per rimuovere completamente il database +remove_database() { + log_warning "This will PERMANENTLY DELETE all database data!" + echo -n "Are you sure? Type 'yes' to confirm: " + read confirmation + + if [ "$confirmation" = "yes" ]; then + log_info "Removing PostgreSQL container and data..." + + # Stop and remove container + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + docker stop $POSTGRES_CONTAINER_NAME + fi + + if docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + docker rm $POSTGRES_CONTAINER_NAME + fi + + # Remove volume + if docker volume ls | grep -q "$POSTGRES_VOLUME_NAME"; then + docker volume rm $POSTGRES_VOLUME_NAME + fi + + log_success "Database completely removed" + else + log_info "Database removal cancelled" + fi +} + +# Parse command line arguments +case "${1:-setup}" in + setup|install) + ACTION="setup" + ;; + status) + ACTION="status" + ;; + start) + ACTION="start" + ;; + stop) + ACTION="stop" + ;; + restart) + ACTION="restart" + ;; + remove|delete) + ACTION="remove" + ;; + logs) + ACTION="logs" + ;; + psql|connect) + ACTION="connect" + ;; + *) + echo "Usage: $0 [setup|status|start|stop|restart|remove|logs|connect]" + echo "" + echo "Commands:" + echo " setup - Install and configure PostgreSQL (default)" + echo " status - Show database status" + echo " start - Start PostgreSQL container" + echo " stop - Stop PostgreSQL container" + echo " restart - Restart PostgreSQL container" + echo " remove - Completely remove database and data" + echo " logs - Show PostgreSQL logs" + echo " connect - Connect to database with psql" + exit 1 + ;; +esac + +# 1. Verifica prerequisiti +if [ "$ACTION" != "status" ]; then + log_info "Checking prerequisites..." + + # Verifica Docker + if ! command -v docker &> /dev/null; then + log_error "Docker is not installed or not in PATH" + log_warning "Install Docker first: https://docs.docker.com/get-docker/" + exit 1 + fi + + # Verifica che Docker sia in esecuzione + if ! docker info >/dev/null 2>&1; then + log_error "Docker daemon is not running" + log_warning "Start Docker with: sudo systemctl start docker" + exit 1 + fi + + log_success "Prerequisites check passed" +fi + +# Esegui l'azione richiesta +case "$ACTION" in + setup) + show_database_status + echo "" + + # Assicurati che il container sia in esecuzione + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_success "PostgreSQL container is already running" + elif docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + # Container esiste ma è fermato - riavvialo + log_info "Starting existing PostgreSQL container..." + docker start $POSTGRES_CONTAINER_NAME + if [ $? -eq 0 ]; then + log_success "PostgreSQL container started successfully" + else + log_error "Failed to start PostgreSQL container" + exit 1 + fi + else + # Nessun container esistente - creane uno nuovo e avvialo + log_info "Creating and starting new PostgreSQL container..." + + # Crea e avvia nuovo container PostgreSQL con volume persistente + docker run -d \ + --name $POSTGRES_CONTAINER_NAME \ + -e POSTGRES_DB=$DB_NAME \ + -e POSTGRES_USER=$DB_USER \ + -e POSTGRES_PASSWORD=$DB_PASSWORD \ + -p $DB_PORT:5432 \ + -v $POSTGRES_VOLUME_NAME:/var/lib/postgresql/data \ + postgres:15-alpine + + if [ $? -eq 0 ]; then + log_success "PostgreSQL container created and started successfully" + else + log_error "Failed to create PostgreSQL container" + exit 1 + fi + fi + + # Attendi che PostgreSQL sia pronto + sleep 5 + if ! wait_for_postgres_container; then + log_error "PostgreSQL container failed to become ready" + log_info "Check container logs with: $0 logs" + exit 1 + fi + + # Inizializza il database se necessario + log_info "Checking if database schema needs initialization..." + + if docker exec $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME -c "SELECT 1 FROM Configuration LIMIT 1;" >/dev/null 2>&1; then + log_warning "Database already initialized, skipping schema setup" + else + log_info "Initializing database schema..." + + # Copia il file SQL nel container e eseguilo + docker cp "$PROJECT_DIR/scripts/db-setup.sql" $POSTGRES_CONTAINER_NAME:/tmp/db-setup.sql + + if docker exec $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME -f /tmp/db-setup.sql; then + log_success "Database schema initialized successfully" + # Rimuovi il file temporaneo + docker exec $POSTGRES_CONTAINER_NAME rm /tmp/db-setup.sql + else + log_error "Database initialization failed" + exit 1 + fi + fi + + echo "" + log_success "🎉 PostgreSQL setup completed successfully!" + echo "" + log_info "Connection details:" + echo " Host: $DB_HOST" + echo " Port: $DB_PORT" + echo " Database: $DB_NAME" + echo " User: $DB_USER" + echo " Password: $DB_PASSWORD" + echo "" + log_info "Environment variables for applications:" + echo " export PGHOST=$DB_HOST" + echo " export PGPORT=$DB_PORT" + echo " export PGDATABASE=$DB_NAME" + echo " export PGUSER=$DB_USER" + echo " export PGPASSWORD=$DB_PASSWORD" + ;; + + status) + show_database_status + ;; + + start) + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_warning "PostgreSQL container is already running" + elif docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_info "Starting PostgreSQL container..." + docker start $POSTGRES_CONTAINER_NAME + log_success "PostgreSQL container started" + else + log_error "PostgreSQL container does not exist. Run '$0 setup' first." + exit 1 + fi + ;; + + stop) + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_info "Stopping PostgreSQL container..." + docker stop $POSTGRES_CONTAINER_NAME + log_success "PostgreSQL container stopped" + else + log_warning "PostgreSQL container is not running" + fi + ;; + + restart) + log_info "Restarting PostgreSQL container..." + docker restart $POSTGRES_CONTAINER_NAME 2>/dev/null || { + log_error "PostgreSQL container does not exist. Run '$0 setup' first." + exit 1 + } + log_success "PostgreSQL container restarted" + ;; + + remove) + remove_database + ;; + + logs) + if docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + docker logs -f $POSTGRES_CONTAINER_NAME + else + log_error "PostgreSQL container does not exist" + exit 1 + fi + ;; + + connect) + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_info "Connecting to PostgreSQL database..." + docker exec -it $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME + else + log_error "PostgreSQL container is not running. Start it with '$0 start'" + exit 1 + fi + ;; +esac diff --git a/scripts/start-dev-mode.sh b/scripts/start-dev-mode.sh new file mode 100755 index 0000000..d9a1996 --- /dev/null +++ b/scripts/start-dev-mode.sh @@ -0,0 +1,211 @@ +#!/bin/bash + +# Script completo per modalità sviluppo: avvia backend e frontend insieme +# Backend in background, frontend in foreground con hot reload + +set -e + +echo "🔧 Starting Skupper-X in Development Mode" +echo "=========================================" + +# Colori per output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Directory di progetto +PROJECT_DIR="$(dirname "$(dirname "$(realpath "$0")")")" +SCRIPTS_DIR="$PROJECT_DIR/scripts" + +# Funzioni per logging colorato +log_info() { + echo -e "${BLUE}ℹ️ $1${NC}" +} + +log_success() { + echo -e "${GREEN}✅ $1${NC}" +} + +log_warning() { + echo -e "${YELLOW}⚠️ $1${NC}" +} + +log_error() { + echo -e "${RED}❌ $1${NC}" +} + +# File per salvare PID del backend +BACKEND_PID_FILE="/tmp/skupper-backend.pid" + +# Funzione di cleanup +cleanup() { + log_info "Cleaning up..." + + # Termina il backend se è in esecuzione + if [ -f "$BACKEND_PID_FILE" ]; then + BACKEND_PID=$(cat "$BACKEND_PID_FILE") + if kill -0 "$BACKEND_PID" 2>/dev/null; then + log_info "Stopping backend (PID: $BACKEND_PID)..." + kill "$BACKEND_PID" + wait "$BACKEND_PID" 2>/dev/null || true + fi + rm -f "$BACKEND_PID_FILE" + fi + + # Termina eventuali processi PostgreSQL Docker se avviati da noi + if docker ps -q --filter "name=skupper-postgres" | grep -q .; then + log_info "Stopping PostgreSQL container..." + docker stop skupper-postgres >/dev/null 2>&1 || true + fi + + log_success "Cleanup completed" + exit 0 +} + +# Trap per gestire interruzioni +trap cleanup SIGINT SIGTERM + +# Verifica dipendenze +log_info "Checking dependencies..." + +# Usa il sistema di check centralizzato +if [ -f "$SCRIPTS_DIR/check-dependencies.sh" ]; then + log_info "Running comprehensive dependency check..." + if ! "$SCRIPTS_DIR/check-dependencies.sh"; then + log_error "Dependency check failed" + exit 1 + fi + log_success "All dependencies verified" +else + # Fallback ai controlli manuali + log_warning "Using fallback dependency checks..." + + # Verifica Docker + if ! command -v docker &> /dev/null; then + log_error "Docker is required but not installed" + exit 1 + fi + + # Verifica Node.js e Yarn + if ! command -v node &> /dev/null; then + log_error "Node.js is required but not installed" + exit 1 + fi + + if ! command -v yarn &> /dev/null; then + log_error "Yarn is required but not installed" + exit 1 + fi + + log_success "Basic dependencies available" +fi + +# 1. Setup database +log_info "Setting up PostgreSQL database..." +if ! "$SCRIPTS_DIR/start-database.sh" setup; then + log_error "Failed to setup database" + exit 1 +fi + +# Aspetta che il database sia pronto +log_info "Waiting for database to be ready..." +sleep 5 + +# 2. Avvia il backend in background +log_info "Starting backend in background..." +cd "$PROJECT_DIR" + +# Verifica dipendenze management controller +log_info "Checking backend dependencies..." +cd "$PROJECT_DIR/components/management-controller" +if [ -f "package.json" ]; then + if [ ! -d "node_modules" ]; then + log_info "Installing backend dependencies..." + npm install >/dev/null 2>&1 + elif [ "package.json" -nt "node_modules" ] || [ -f "package-lock.json" -a "package-lock.json" -nt "node_modules" ]; then + log_info "Backend dependencies are outdated, updating..." + npm install >/dev/null 2>&1 + else + log_success "Backend dependencies are up to date" + fi +fi + +cd "$PROJECT_DIR" + +# Esporta variabili di ambiente per standalone +export SKX_STANDALONE_NAMESPACE=default +export PGUSER=access +export PGHOST=localhost +export PGPASSWORD=password +export PGDATABASE=studiodb +export PGPORT=5432 +export SKX_CONTROLLER_NAME=standalone-controller +export NODE_ENV=development + +# Avvia il backend e salva il PID +nohup node components/management-controller/index.js > /tmp/skupper-backend.log 2>&1 & +BACKEND_PID=$! +echo $BACKEND_PID > "$BACKEND_PID_FILE" + +log_success "Backend started with PID: $BACKEND_PID" +log_info "Backend logs: tail -f /tmp/skupper-backend.log" + +# Aspetta che il backend sia pronto +log_info "Waiting for backend to be ready..." +for i in {1..30}; do + if curl -s http://localhost:8085/healthz >/dev/null 2>&1; then + log_success "Backend is responding" + break + fi + if [ $i -eq 30 ]; then + log_error "Backend failed to start within 30 seconds" + log_info "Check backend logs: tail -f /tmp/skupper-backend.log" + cleanup + exit 1 + fi + sleep 1 +done + +# 3. Prepara e avvia il frontend +log_info "Setting up frontend console..." +cd "$PROJECT_DIR/components/console" + +# Verifica e installa dipendenze se necessario +log_info "Checking frontend dependencies..." +if [ ! -d "node_modules" ]; then + log_info "Installing frontend dependencies..." + yarn install +else + # Verifica se package.json è più recente di node_modules + if [ "package.json" -nt "node_modules" ] || [ "yarn.lock" -nt "node_modules" ]; then + log_info "Dependencies are outdated, updating..." + yarn install + else + log_success "Dependencies are up to date" + fi +fi + +log_success "🎯 Development environment ready!" +echo "" +echo "📊 Services:" +echo " • Backend API: http://localhost:8085" +echo " • Frontend: http://localhost:3000" +echo " • Database: localhost:5432" +echo "" +echo "📝 Logs:" +echo " • Backend: tail -f /tmp/skupper-backend.log" +echo " • Database: docker logs -f skupper-postgres" +echo "" +echo "🔧 Development workflow:" +echo " • Frontend has hot reload enabled" +echo " • API calls are proxied to backend" +echo " • Press Ctrl+C to stop all services" +echo "" + +log_info "Starting frontend development server..." +log_warning "This will run in foreground - press Ctrl+C to stop everything" + +# Avvia il frontend in foreground +yarn start \ No newline at end of file diff --git a/scripts/start-skupper-standalone.sh b/scripts/start-skupper-standalone.sh new file mode 100755 index 0000000..d152168 --- /dev/null +++ b/scripts/start-skupper-standalone.sh @@ -0,0 +1,336 @@ +#!/bin/bash + +# Script completo per avviare Skupper-X in modalità standalone +# U # Build console (React app) + log_info "Building console (React app)..." + cd "$CONSOLE_DIR" + + # Verifica e installa dipendenze console se necessario + if [ ! -d "node_modules" ]; then + log_info "Installing console dependencies..." + if ! yarn install >/dev/null 2>&1; then + log_error "Failed to install console dependencies" + return 1 + fi + else + # Verifica se package.json è più recente di node_modules + if [ "package.json" -nt "node_modules" ] || [ "yarn.lock" -nt "node_modules" ]; then + log_info "Console dependencies are outdated, updating..." + if ! yarn install >/dev/null 2>&1; then + log_error "Failed to update console dependencies" + return 1 + fi + else + log_success "Console dependencies are up to date" + fi + fi + + if ! yarn build >/dev/null 2>&1; then + log_error "Failed to build console" + return 1 + fi + log_success "Console built successfully" + + # Verifica dipendenze management controller + cd "$MANAGEMENT_CONTROLLER_DIR" + log_info "Checking management controller dependencies..." + + # Verifica se package.json esiste e se node_modules è aggiornato + if [ -f "package.json" ]; then + if [ ! -d "node_modules" ]; then + log_info "Installing management controller dependencies..." + if ! npm install >/dev/null 2>&1; then + log_error "Failed to install management controller dependencies" + return 1 + fi + else + # Verifica se package.json è più recente di node_modules + if [ "package.json" -nt "node_modules" ] || [ -f "package-lock.json" -a "package-lock.json" -nt "node_modules" ]; then + log_info "Management controller dependencies are outdated, updating..." + if ! npm install >/dev/null 2>&1; then + log_error "Failed to update management controller dependencies" + return 1 + fi + else + log_success "Management controller dependencies are up to date" + fi + fi + fi + + # Build management controller (includes console integration) + log_info "Building management controller with integrated console..." Docker + +set -e # Exit on any error + +echo "🚀 Starting Skupper-X in Standalone Mode (Docker PostgreSQL)" +echo "============================================================" + +# Colori per output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Directory di progetto +PROJECT_DIR="$(dirname "$(dirname "$(realpath "$0")")")" +MANAGEMENT_CONTROLLER_DIR="$PROJECT_DIR/components/management-controller" +CONSOLE_DIR="$PROJECT_DIR/components/console" + +# Configurazione database (da postgres-config.yaml) +DB_NAME="studiodb" +DB_USER="access" +DB_PASSWORD="password" +DB_HOST="localhost" +DB_PORT="5432" +POSTGRES_CONTAINER_NAME="skupper-postgres" + +# Funzione per logging colorato +log_info() { + echo -e "${BLUE}ℹ️ $1${NC}" +} + +log_success() { + echo -e "${GREEN}✅ $1${NC}" +} + +log_warning() { + echo -e "${YELLOW}⚠️ $1${NC}" +} + +log_error() { + echo -e "${RED}❌ $1${NC}" +} + +# Funzione per controllare se PostgreSQL container è pronto +wait_for_postgres_container() { + log_info "Waiting for PostgreSQL container to be ready..." + local max_attempts=30 + local attempt=1 + + while [ $attempt -le $max_attempts ]; do + if docker exec $POSTGRES_CONTAINER_NAME pg_isready -U $DB_USER >/dev/null 2>&1; then + log_success "PostgreSQL container is ready!" + return 0 + fi + + echo -n "." + sleep 1 + attempt=$((attempt + 1)) + done + + log_error "PostgreSQL container failed to become ready" + return 1 +} + +# Funzione per buildare la console e il management controller +build_console_and_controller() { + log_info "Building console and management controller..." + + # Check if yarn is available + if ! command -v yarn &> /dev/null; then + log_error "Yarn is not installed or not in PATH" + log_warning "Install yarn first: npm install -g yarn" + return 1 + fi + + # Build console + log_info "Building console (React app)..." + cd "$CONSOLE_DIR" + if ! yarn install >/dev/null 2>&1; then + log_error "Failed to install console dependencies" + return 1 + fi + + if ! yarn build >/dev/null 2>&1; then + log_error "Failed to build console" + return 1 + fi + log_success "Console built successfully" + + # Build management controller (includes console integration) + log_info "Building management controller with integrated console..." + cd "$MANAGEMENT_CONTROLLER_DIR" + if ! node build.js; then + log_error "Failed to build management controller" + return 1 + fi + log_success "Management controller built successfully" + + return 0 +} + +# Funzione per pulire i processi in uscita +cleanup() { + log_warning "Shutting down services..." + if [ ! -z "$CONTROLLER_PID" ]; then + log_info "Stopping Management Controller..." + kill $CONTROLLER_PID 2>/dev/null || true + fi + + # ✅ NON fermiamo il container PostgreSQL - rimane in esecuzione per preservare i dati + log_info "PostgreSQL container remains running to preserve data" + log_info "To stop PostgreSQL manually: docker stop $POSTGRES_CONTAINER_NAME" + + log_success "Cleanup completed" +} + +# Trap per cleanup automatico +trap cleanup EXIT INT TERM + +# 1. Verifica prerequisiti +log_info "Checking prerequisites..." + +# Verifica Docker +if ! command -v docker &> /dev/null; then + log_error "Docker is not installed or not in PATH" + log_warning "Install Docker first: https://docs.docker.com/get-docker/" + exit 1 +fi + +# Verifica che Docker sia in esecuzione +if ! docker info >/dev/null 2>&1; then + log_error "Docker daemon is not running" + log_warning "Start Docker with: sudo systemctl start docker" + exit 1 +fi + +# Verifica Node.js +if ! command -v node &> /dev/null; then + log_error "Node.js is not installed or not in PATH" + exit 1 +fi + +log_success "All prerequisites are available" + +# 2. Build console and management controller +log_info "Building console and management controller..." +if ! build_console_and_controller; then + log_error "Build process failed" + exit 1 +fi + +# 3. Avvia PostgreSQL in Docker se non è già in esecuzione +log_info "Checking PostgreSQL container status..." + +if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_success "PostgreSQL container is already running" +elif docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + # Container esiste ma è fermato - riavvialo + log_info "Starting existing PostgreSQL container..." + docker start $POSTGRES_CONTAINER_NAME + if [ $? -eq 0 ]; then + log_success "PostgreSQL container restarted successfully" + else + log_error "Failed to restart PostgreSQL container" + exit 1 + fi +else + # Nessun container esistente - creane uno nuovo + log_info "Creating new PostgreSQL container..." + + # Avvia nuovo container PostgreSQL con volume persistente + docker run -d \ + --name $POSTGRES_CONTAINER_NAME \ + -e POSTGRES_DB=$DB_NAME \ + -e POSTGRES_USER=$DB_USER \ + -e POSTGRES_PASSWORD=$DB_PASSWORD \ + -p $DB_PORT:5432 \ + -v skupper-postgres-data:/var/lib/postgresql/data \ + postgres:15-alpine + + if [ $? -eq 0 ]; then + log_success "PostgreSQL container created successfully" + else + log_error "Failed to create PostgreSQL container" + exit 1 + fi +fi + +# 4. Attendi che PostgreSQL container sia pronto +log_info "Waiting for PostgreSQL container to be ready..." +sleep 5 + +if ! wait_for_postgres_container; then + log_error "PostgreSQL container failed to become ready" + log_info "Check container logs with: docker logs $POSTGRES_CONTAINER_NAME" + exit 1 +fi + +# 5. Inizializza il database usando Docker exec (se necessario) +log_info "Checking if database schema needs initialization..." + +# Usa docker exec per eseguire i comandi SQL +if docker exec $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME -c "SELECT 1 FROM Configuration LIMIT 1;" >/dev/null 2>&1; then + log_warning "Database already initialized, skipping setup" +else + log_info "Initializing database schema..." + + # Copia il file SQL nel container e eseguilo + docker cp "$PROJECT_DIR/scripts/db-setup.sql" $POSTGRES_CONTAINER_NAME:/tmp/db-setup.sql + + if docker exec $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME -f /tmp/db-setup.sql; then + log_success "Database schema initialized successfully" + # Rimuovi il file temporaneo + docker exec $POSTGRES_CONTAINER_NAME rm /tmp/db-setup.sql + else + log_error "Database initialization failed" + exit 1 + fi +fi + +# 6. Configura variabili d'ambiente per modalità standalone +log_info "Setting up environment variables..." +export SKX_STANDALONE_NAMESPACE=default +export PGUSER=$DB_USER +export PGHOST=$DB_HOST +export PGPASSWORD=$DB_PASSWORD +export PGDATABASE=$DB_NAME +export PGPORT=$DB_PORT +export SKX_CONTROLLER_NAME=standalone-controller +export NODE_ENV=development + +log_success "Environment variables configured" + +# 7. Avvia il management controller +log_info "Starting Skupper-X Management Controller with integrated console..." +echo "" +log_info "Environment configuration:" +echo " SKX_STANDALONE_NAMESPACE: $SKX_STANDALONE_NAMESPACE" +echo " PGHOST: $PGHOST" +echo " PGDATABASE: $PGDATABASE" +echo " SKX_CONTROLLER_NAME: $SKX_CONTROLLER_NAME" +echo "" + +log_success "🎯 Skupper-X Management Controller starting..." +log_info "API will be available at: http://localhost:8085/api/v1alpha1/" +log_info "Web Console will be available at: http://localhost:8085/" +log_info "Press Ctrl+C to stop all services" +echo "" + +# Avvia il controller dalla directory buildato (app/) invece del sorgente +cd "$MANAGEMENT_CONTROLLER_DIR/app" +node index.js & +CONTROLLER_PID=$! + +# Attendi che il controller si avvii o fallisca +sleep 5 + +if kill -0 $CONTROLLER_PID 2>/dev/null; then + log_success "Management Controller is running (PID: $CONTROLLER_PID)" + + # Testa l'API + sleep 3 + if curl -s http://localhost:8085/healthz >/dev/null 2>&1; then + log_success "API server is responding at http://localhost:8085" + else + log_warning "API server may still be starting up..." + fi + + # Mantieni lo script in esecuzione + log_info "Services are running. Use Ctrl+C to stop." + wait $CONTROLLER_PID +else + log_error "Management Controller failed to start" + exit 1 +fi From 2cb6d31275d0e6230efafb2bf35b8f7c5a50c6d6 Mon Sep 17 00:00:00 2001 From: bartoval Date: Sat, 31 May 2025 12:46:39 +0200 Subject: [PATCH 3/7] refactor: migrate to patternfly 6 and creates startup scripts --- components/console/.eslintrc.json | 18 +- components/console/package.json | 39 +- components/console/src/App.tsx | 6 +- components/console/src/config/colors.ts | 26 +- components/console/src/config/config.ts | 2 +- components/console/src/config/reactQuery.ts | 12 +- components/console/src/config/routes.ts | 3 +- .../components/EmptyData/EmptyData.spec.tsx | 30 - .../src/core/components/EmptyData/index.tsx | 7 +- .../core/components/Graph/Graph.constants.ts | 295 --- .../core/components/Graph/Graph.interfaces.ts | 105 - .../components/Graph/Legend/Shapes/Circle.tsx | 21 - .../Graph/Legend/Shapes/Diamond.tsx | 21 - .../Graph/Legend/Shapes/HorizontalLine.tsx | 29 - .../Graph/Legend/Shapes/Shapes.constants.ts | 5 - .../components/Graph/Legend/Shapes/Square.tsx | 14 - .../core/components/Graph/Legend/index.tsx | 79 - .../src/core/components/Graph/MenuControl.tsx | 122 - .../core/components/Graph/ReactAdaptor.tsx | 641 ----- .../src/core/components/Graph/SkGraph.css | 24 - .../components/Graph/services/customItems.ts | 298 --- .../core/components/Graph/services/index.ts | 156 -- .../__tests__/HighLightValueCell.spec.tsx | 45 - .../LinkCell/__tests__/LinkCell.spec.tsx | 47 - .../components/NavigationViewLink/index.tsx | 10 +- .../core/components/SkSearchFilter/index.tsx | 41 +- .../src/core/components/SkTable/index.tsx | 8 +- .../core/components/SkUpdateButton/index.tsx | 4 +- .../__tests__/ViewDetailCell.spec.tsx | 20 - .../core/components/ViewDetailsCell/index.tsx | 4 +- components/console/src/layout/Footer.tsx | 31 + components/console/src/layout/Header.tsx | 63 +- .../console/src/layout/MainContainer.tsx | 65 +- components/console/src/layout/SideBar.tsx | 1 - components/console/src/layout/Sidebar.css | 12 - .../src/pages/Backbones/Backbones.enum.ts | 2 + .../pages/Backbones/Components/Topology.tsx | 175 -- .../src/pages/Backbones/views/Backbone.tsx | 205 +- .../src/pages/Backbones/views/Backbones.tsx | 191 +- .../src/pages/Backbones/views/Invitations.tsx | 92 +- .../src/pages/Backbones/views/Vans.tsx | 168 +- .../console/src/pages/Vans/Vans.constants.ts | 6 + components/console/src/pages/Vans/routes.tsx | 12 + .../src/pages/shared/Errors/Console/index.tsx | 14 +- .../src/pages/shared/Errors/Http/index.tsx | 16 +- .../pages/shared/Errors/NotFound/index.tsx | 10 +- .../src/pages/shared/Loading/index.tsx | 8 +- components/console/src/routes.tsx | 4 +- components/console/tsconfig.json | 14 +- components/console/yarn.lock | 2137 ++++++++--------- 50 files changed, 1432 insertions(+), 3926 deletions(-) delete mode 100644 components/console/src/core/components/EmptyData/EmptyData.spec.tsx delete mode 100644 components/console/src/core/components/Graph/Graph.constants.ts delete mode 100644 components/console/src/core/components/Graph/Graph.interfaces.ts delete mode 100644 components/console/src/core/components/Graph/Legend/Shapes/Circle.tsx delete mode 100644 components/console/src/core/components/Graph/Legend/Shapes/Diamond.tsx delete mode 100644 components/console/src/core/components/Graph/Legend/Shapes/HorizontalLine.tsx delete mode 100644 components/console/src/core/components/Graph/Legend/Shapes/Shapes.constants.ts delete mode 100644 components/console/src/core/components/Graph/Legend/Shapes/Square.tsx delete mode 100644 components/console/src/core/components/Graph/Legend/index.tsx delete mode 100644 components/console/src/core/components/Graph/MenuControl.tsx delete mode 100644 components/console/src/core/components/Graph/ReactAdaptor.tsx delete mode 100644 components/console/src/core/components/Graph/SkGraph.css delete mode 100644 components/console/src/core/components/Graph/services/customItems.ts delete mode 100644 components/console/src/core/components/Graph/services/index.ts delete mode 100644 components/console/src/core/components/HighlightValueCell/__tests__/HighLightValueCell.spec.tsx delete mode 100644 components/console/src/core/components/LinkCell/__tests__/LinkCell.spec.tsx delete mode 100644 components/console/src/core/components/ViewDetailsCell/__tests__/ViewDetailCell.spec.tsx create mode 100644 components/console/src/layout/Footer.tsx delete mode 100644 components/console/src/layout/Sidebar.css delete mode 100644 components/console/src/pages/Backbones/Components/Topology.tsx create mode 100644 components/console/src/pages/Vans/Vans.constants.ts create mode 100644 components/console/src/pages/Vans/routes.tsx diff --git a/components/console/.eslintrc.json b/components/console/.eslintrc.json index ffe68e0..66604e8 100644 --- a/components/console/.eslintrc.json +++ b/components/console/.eslintrc.json @@ -28,18 +28,17 @@ "plugin:react/recommended", "plugin:import/errors", "plugin:import/warnings", + "plugin:@typescript-eslint/recommended", "prettier" ], "parser": "@typescript-eslint/parser", "parserOptions": { - "comment": true, "ecmaFeatures": { "jsx": true }, - "ecmaVersion": 12, - "extraFileExtensions": [".json"], + "ecmaVersion": 2021, "sourceType": "module", - "project": ["tsconfig.json", "cypress.config.ts"], + "project": ["tsconfig.json"], "tsconfigRootDir": "./" }, "plugins": ["react", "react-hooks", "@typescript-eslint"], @@ -54,9 +53,9 @@ "ignoreExternal": true } ], - "no-console": 1, - "semi": [1, "always"], - "eol-last": 2, + "no-console": "warn", + "semi": ["warn", "always"], + "eol-last": "error", "consistent-return": 0, "consistent-this": [1, "that"], "curly": [2, "all"], @@ -140,7 +139,7 @@ "react/no-unknown-property": "error", "react/jsx-no-useless-fragment": "error", "react/no-unescaped-entities": 0, - "react/prop-types": 0, + "react/prop-types": "off", "react/self-closing-comp": [ "error", { @@ -169,7 +168,6 @@ } ], "@typescript-eslint/no-explicit-any": "warn", - "@typescript-eslint/no-use-before-define": 0, - "@typescript-eslint/no-unused-vars": ["error"] + "@typescript-eslint/no-use-before-define": 0 } } diff --git a/components/console/package.json b/components/console/package.json index ea0e73a..abae748 100644 --- a/components/console/package.json +++ b/components/console/package.json @@ -34,26 +34,26 @@ "commit": "git-cz" }, "dependencies": { - "@antv/g6": "^4.8.24", - "@patternfly/patternfly": "^5.2.0", - "@patternfly/react-charts": "^7.2.0", - "@patternfly/react-code-editor": "^5.2.0", - "@patternfly/react-core": "^5.2.0", - "@patternfly/react-icons": "^5.2.0", - "@patternfly/react-table": "^5.2.0", - "@tanstack/react-query": "^5.18.1", - "axios": "^1.6.7", - "date-fns": "^3.3.1", - "framer-motion": "^11.0.3", - "node": "^21.7.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-error-boundary": "^4.0.12", - "react-router-dom": "^6.22.0" + "@antv/g6": "^5.0.48", + "@patternfly/patternfly": "^6.2.3", + "@patternfly/react-charts": "^8.2.2", + "@patternfly/react-code-editor": "^6.2.2", + "@patternfly/react-core": "^6.2.2", + "@patternfly/react-icons": "^6.2.2", + "@patternfly/react-table": "^6.2.2", + "@tanstack/react-query": "^5.79.0", + "axios": "^1.9.0", + "date-fns": "^4.1.0", + "framer-motion": "^12.15.0", + "node": "^22.16.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-error-boundary": "^6.0.0", + "react-router-dom": "^7.6.1" }, "devDependencies": { - "@commitlint/cli": "^18.6.0", - "@commitlint/config-conventional": "^18.6.0", + "@commitlint/cli": "^19.8.1", + "@commitlint/config-conventional": "^19.8.1", "@testing-library/dom": "^9.3.4", "@testing-library/jest-dom": "^6.4.2", "@testing-library/react": "^14.2.1", @@ -109,5 +109,6 @@ ">10%", "last 2 versions", "not ie <= 11" - ] + ], + "packageManager": "yarn@1.22.22+sha512.a6b2f7906b721bba3d67d4aff083df04dad64c399707841b7acf00f6b133b7ac24255f2652fa22ae3534329dc6180534e98d17432037ff6fd140556e2bb3137e" } diff --git a/components/console/src/App.tsx b/components/console/src/App.tsx index 831668e..8b2f18c 100644 --- a/components/console/src/App.tsx +++ b/components/console/src/App.tsx @@ -9,6 +9,7 @@ import SkUpdateDataButton from '@core/components/SkUpdateButton'; import { getThemePreference, reflectThemePreference } from '@core/utils/isDarkTheme'; import SkHeader from '@layout/Header'; import RouteContainer from '@layout/RouteContainer'; +import SkSidebar from '@layout/SideBar'; import ErrorConsole from '@pages/shared/Errors/Console'; import LoadingPage from '@pages/shared/Loading'; import { routes } from 'routes'; @@ -21,14 +22,15 @@ const App = function () { return ( } + masthead={} + sidebar={} breadcrumb={ - + diff --git a/components/console/src/config/colors.ts b/components/console/src/config/colors.ts index 8484606..21389ed 100644 --- a/components/console/src/config/colors.ts +++ b/components/console/src/config/colors.ts @@ -1,17 +1,17 @@ export enum Colors { - White = '--pf-v5-global--palette--white', - Black900 = '--pf-v5-global--palette--black-900', - Black600 = '--pf-v5-global--palette--black-600', - Black500 = '--pf-v5-global--palette--black-500', - Black400 = '--pf-v5-global--palette--black-400', - Black100 = '--pf-v5-global--palette--black-100', - Green500 = '--pf-v5-global--palette--green-500', - Blue400 = '--pf-v5-global--palette--blue-400', - Purple500 = '--pf-v5-global--palette--purple-500', - Cyan300 = '--pf-v5-global--palette--cyan-300', - Orange200 = '--pf-v5-global--palette--orange-200', - Yellow300 = '--pf-v5-global--palette--gold-300', - Red100 = '--pf-v5-global--palette--red-100' + White = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--white */, + Black900 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--black-900 */, + Black600 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--black-600 */, + Black500 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--black-500 */, + Black400 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--black-400 */, + Black100 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--black-100 */, + Green500 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--green-500 */, + Blue400 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--blue-400 */, + Purple500 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--purple-500 */, + Cyan300 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--cyan-300 */, + Orange200 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--orange-200 */, + Yellow300 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--gold-300 */, + Red100 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--red-100 */ } export enum VarColors { diff --git a/components/console/src/config/config.ts b/components/console/src/config/config.ts index f320cb3..82f4c05 100644 --- a/components/console/src/config/config.ts +++ b/components/console/src/config/config.ts @@ -27,7 +27,7 @@ export const ALERT_VISIBILITY_TIMEOUT = 5000; // Time in milliseconds to display export const waitForElementToBeRemovedTimeout = 10000; export const DARK_THEME_CLASS = 'pf-v5-theme-dark'; -export const DEFAULT_FONT_VAR = 'var(--pf-v5-global--FontFamily--text)'; +export const DEFAULT_FONT_VAR = "var(--pf-t--global--font--family--body)"; // number of nodes to start showing the aggregate nodes in the topology export const MAX_NODE_COUNT_WITHOUT_AGGREGATION = Number(process.env.MAX_NODE_COUNT_WITHOUT_AGGREGATION) || 26; diff --git a/components/console/src/config/reactQuery.ts b/components/console/src/config/reactQuery.ts index a672760..eabe337 100644 --- a/components/console/src/config/reactQuery.ts +++ b/components/console/src/config/reactQuery.ts @@ -1,7 +1,10 @@ -import { QueryObserverOptions } from '@tanstack/react-query'; +import { DefaultOptions } from '@tanstack/react-query'; interface QueryClientConfig { - defaultOptions: { queries: QueryObserverOptions }; + defaultOptions: { + queries: Partial; + suspense?: boolean; + }; } /** React query library config: contains configuration options for the React query library, used for fetching and caching data in the UI */ @@ -12,8 +15,9 @@ export const queryClientConfig: QueryClientConfig = { retryDelay: (attemptIndex: number) => Math.min(1000 * 2 ** attemptIndex, 30000), refetchOnWindowFocus: false, refetchIntervalInBackground: true, - suspense: false, throwOnError: true - } + }, + // If you need suspense, add it at the root level + suspense: false } }; diff --git a/components/console/src/config/routes.ts b/components/console/src/config/routes.ts index 14bc318..21b23b3 100644 --- a/components/console/src/config/routes.ts +++ b/components/console/src/config/routes.ts @@ -1,5 +1,6 @@ import { BackbonesPaths } from '@pages/Backbones/Backbones.constants'; +import { VansPaths } from '@pages/Vans/Vans.constants'; // Navigation config -export const ROUTES = [BackbonesPaths]; +export const ROUTES = [BackbonesPaths, VansPaths]; export const DEFAULT_ROUTE = ROUTES[0].path; diff --git a/components/console/src/core/components/EmptyData/EmptyData.spec.tsx b/components/console/src/core/components/EmptyData/EmptyData.spec.tsx deleted file mode 100644 index b94a31d..0000000 --- a/components/console/src/core/components/EmptyData/EmptyData.spec.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { render, screen } from '@testing-library/react'; - -import { EmptyDataLabels } from './EmptyData.enum'; - -import EmptyData from './index'; - -describe('EmptyData component', () => { - it('should render with default message', () => { - render(); - expect(screen.getByText(EmptyDataLabels.Default)).toBeInTheDocument(); - }); - - it('should render with custom message', () => { - render(); - expect(screen.getByText('Custom Message')).toBeInTheDocument(); - }); - - it('should render with description', () => { - render(); - expect(screen.getByText('This is a description')).toBeInTheDocument(); - }); - - it('should render with custom icon', () => { - const CustomIcon = function () { - return
Custom Icon
; - }; - render(); - expect(screen.getByText('Custom Icon')).toBeInTheDocument(); - }); -}); diff --git a/components/console/src/core/components/EmptyData/index.tsx b/components/console/src/core/components/EmptyData/index.tsx index 2d982ca..955fbdc 100644 --- a/components/console/src/core/components/EmptyData/index.tsx +++ b/components/console/src/core/components/EmptyData/index.tsx @@ -4,8 +4,6 @@ import { Bullseye, EmptyState, EmptyStateBody, - EmptyStateHeader, - EmptyStateIcon, EmptyStateVariant } from '@patternfly/react-core'; @@ -17,11 +15,10 @@ interface EmptyDataProps { icon?: ComponentType; } -const EmptyData: FC = function ({ message = EmptyDataLabels.Default, description, icon }) { +const EmptyData: FC = function ({ message = EmptyDataLabels.Default, description }) { return ( - - } /> + {description && {description}} diff --git a/components/console/src/core/components/Graph/Graph.constants.ts b/components/console/src/core/components/Graph/Graph.constants.ts deleted file mode 100644 index 4884808..0000000 --- a/components/console/src/core/components/Graph/Graph.constants.ts +++ /dev/null @@ -1,295 +0,0 @@ -import { ILabelConfig, LayoutConfig, ModelStyle, Modes, GraphOptions } from '@antv/g6-core'; - -import { HexColors } from '@config/colors'; - -export const GRAPH_BG_COLOR = HexColors.White; -const NODE_COLOR_DEFAULT = HexColors.White; -const NODE_BORDER_COLOR_DEFAULT = HexColors.Black300; -const NODE_COLOR_DEFAULT_LABEL = HexColors.Black900; -//const NODE_COLOR_DEFAULT_LABEL_BG = HexColors.White; -export const EDGE_COLOR_DEFAULT = HexColors.Black600; -export const EDGE_COLOR_ENDPOINT_SITE_CONNECTION_DEFAULT = HexColors.Blue400; -export const EDGE_COLOR_HOVER_DEFAULT = HexColors.Blue400; -export const EDGE_COLOR_DEFAULT_TEXT = HexColors.Black900; -const COMBO__COLOR_DEFAULT = HexColors.Black100; -const COMBO_BORDER_COLOR_DEFAULT = HexColors.White; -const COMBO_BORDER_COLOR_HOVER = HexColors.Black900; -const COMBO_COLOR_DEFAULT_LABEL = HexColors.White; -const COMBO_COLOR_DEFAULT_LABEL_BG = HexColors.Black900; - -export enum TopologyModeNames { - Default = 'default', - Performance = 'performance' -} - -export const NODE_SIZE = 36; -const ICON_SIZE = 15; -const LABEL_FONT_SIZE = 8; -// number of nodes to start showing less topology details for events like zooming in/out and dragging -export const NODE_COUNT_PERFORMANCE_THRESHOLD = 150; - -export const CUSTOM_ITEMS_NAMES = { - animatedDashEdge: 'line-dash', - siteEdge: 'site-edge', - loopEdge: 'loop', - nodeWithBadges: 'nCircle', - comboWithCustomLabel: 'cRect', - defaultNode: 'cRect' -}; - -export const BADGE_STYLE = { - containerBg: HexColors.Black500, - containerBorderColor: HexColors.White, - textColor: HexColors.White, - textFontSize: LABEL_FONT_SIZE - 1 -}; - -const INACTIVE_OPACITY_VALUE = 0.3; - -const DEFAULT_MODE: Modes = { - [TopologyModeNames.Default]: [ - { type: 'drag-node', onlyChangeComboSize: true }, - { - type: 'drag-combo', - enableDelegate: true, - activeState: 'actived', - onlyChangeComboSize: true, - shouldUpdate: () => true - }, - { type: 'drag-canvas' }, - { type: 'zoom-canvas' } - ], - [TopologyModeNames.Performance]: [ - { type: 'drag-node', onlyChangeComboSize: true, enableOptimize: true }, - { - type: 'drag-combo', - enableDelegate: true, - activeState: 'actived', - onlyChangeComboSize: true, - shouldUpdate: () => true, - enableOptimize: true - }, - { type: 'drag-canvas', enableOptimize: true }, - { type: 'zoom-canvas', enableOptimize: true, optimizeZoom: 0.1 } - ] -}; - -export const LAYOUT_TOPOLOGY_DEFAULT: LayoutConfig = { - type: 'force2', - nodeSize: NODE_SIZE, - nodeSpacing: NODE_SIZE, - preventOverlap: true, - clustering: true, - nodeClusterBy: 'cluster', - distanceThresholdMode: 'max', - clusterNodeStrength: 500000, - nodeStrength: 5000, - leafCluster: true, - gravity: 10000, - maxSpeed: 1000, - animate: false, - factor: 800 -}; - -export const LAYOUT_TOPOLOGY_SINGLE_NODE = { - type: 'dagre', - rankdir: 'BT' -}; - -export const DEFAULT_NODE_ICON = { - show: true, - width: ICON_SIZE, - height: ICON_SIZE -}; - -export const DEFAULT_NODE_CONFIG: Partial<{ - type: string; - size: number | number[]; - labelCfg: ILabelConfig; - color: string; -}> & - ModelStyle = { - type: CUSTOM_ITEMS_NAMES.nodeWithBadges, - size: [NODE_SIZE], - - icon: DEFAULT_NODE_ICON, - - style: { - fill: NODE_COLOR_DEFAULT, - stroke: NODE_BORDER_COLOR_DEFAULT, - lineWidth: 0.8 - }, - - labelCfg: { - position: 'bottom', - offset: 8, - style: { - fill: NODE_COLOR_DEFAULT_LABEL, - fontSize: LABEL_FONT_SIZE, - background: { - fill: 'transparent', - stroke: NODE_BORDER_COLOR_DEFAULT, - lineWidth: 0, - padding: [3, 4], - radius: 2 - } - } - } -}; - -export const DEFAULT_REMOTE_NODE_CONFIG: Partial<{ - type: string; - size: number | number[]; - color: string; -}> & - ModelStyle = { - ...DEFAULT_NODE_CONFIG, - type: 'circle', - size: [NODE_SIZE / 2], - - icon: { - show: false - }, - - style: { - fill: NODE_BORDER_COLOR_DEFAULT, - stroke: NODE_COLOR_DEFAULT - } -}; - -export const DEFAULT_EDGE_CONFIG: Partial<{ - type: string; - size: number | number[]; - color: string; - labelCfg: ILabelConfig; -}> & - ModelStyle = { - type: CUSTOM_ITEMS_NAMES.animatedDashEdge, - labelCfg: { - autoRotate: true, - style: { - fill: EDGE_COLOR_DEFAULT_TEXT, - stroke: GRAPH_BG_COLOR, - lineWidth: 5, - fontSize: LABEL_FONT_SIZE - } - }, - style: { - cursor: 'pointer', - opacity: 1, - lineWidth: 0.5, - lineDash: [0, 0, 0, 0], - lineAppendWidth: 20, - stroke: EDGE_COLOR_DEFAULT, - endArrow: { - path: 'M 0,0 L 8,4 L 8,-4 Z', - fill: EDGE_COLOR_DEFAULT - } - } -}; - -const DEFAULT_COMBO_CONFIG: ModelStyle & { - labelBgCfg: { - fill: string; - radius: number; - padding: number[]; - }; -} = { - type: CUSTOM_ITEMS_NAMES.comboWithCustomLabel, - padding: [15, 15, 30, 15], - style: { - cursor: 'pointer', - lineWidth: 4, - fill: COMBO__COLOR_DEFAULT, - stroke: COMBO_BORDER_COLOR_DEFAULT, - radius: 10 - }, - labelCfg: { - refY: 12, - position: 'bottom', - style: { - fill: COMBO_COLOR_DEFAULT_LABEL, - fontSize: LABEL_FONT_SIZE + 2 - } - }, - labelBgCfg: { - fill: COMBO_COLOR_DEFAULT_LABEL_BG, - radius: 2, - padding: [12, 10] - } -}; - -const DEFAULT_NODE_STATE_CONFIG = { - hover: { - shadowOffsetX: 0, - shadowOffsetY: 6, - shadowColor: HexColors.Black600, - shadowBlur: 14, - - [`${CUSTOM_ITEMS_NAMES.nodeWithBadges}-icon`]: { - cursor: 'default' - }, - 'diamond-icon': { - cursor: 'default' - } - }, - - 'selected-default': { - stroke: HexColors.Blue400, - strokeWidth: 1, - - 'text-shape': { - fill: HexColors.White - }, - - 'text-bg-shape': { - fill: HexColors.Blue400, - stroke: HexColors.Blue400 - } - }, - - hidden: { - opacity: INACTIVE_OPACITY_VALUE, - - 'text-shape': { - fillOpacity: INACTIVE_OPACITY_VALUE - }, - - 'text-bg-shape': { - opacity: INACTIVE_OPACITY_VALUE - }, - - 'circle-icon': { - opacity: INACTIVE_OPACITY_VALUE - }, - - [`${CUSTOM_ITEMS_NAMES.nodeWithBadges}-icon`]: { - opacity: INACTIVE_OPACITY_VALUE - }, - - [`${CUSTOM_ITEMS_NAMES.nodeWithBadges}-notification-container`]: { - opacity: INACTIVE_OPACITY_VALUE - }, - - 'diamond-icon': { - opacity: INACTIVE_OPACITY_VALUE - } - } -}; - -const DEFAULT_COMBO_STATE_CONFIG = { - hover: { - stroke: COMBO_BORDER_COLOR_HOVER - } -}; - -export const DEFAULT_GRAPH_CONFIG: Partial = { - modes: DEFAULT_MODE, - defaultNode: DEFAULT_NODE_CONFIG, - defaultCombo: DEFAULT_COMBO_CONFIG, - defaultEdge: DEFAULT_EDGE_CONFIG, - nodeStateStyles: DEFAULT_NODE_STATE_CONFIG, - comboStateStyles: DEFAULT_COMBO_STATE_CONFIG, - fitView: true, - fitViewPadding: 20 -}; diff --git a/components/console/src/core/components/Graph/Graph.interfaces.ts b/components/console/src/core/components/Graph/Graph.interfaces.ts deleted file mode 100644 index c87b7b1..0000000 --- a/components/console/src/core/components/Graph/Graph.interfaces.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { ComponentType, MutableRefObject } from 'react'; - -import { GraphData, LayoutConfig, ModelConfig, ModelStyle, ShapeStyle } from '@antv/g6'; - -import { HexColors } from '@config/colors'; - -export interface GraphNode { - id: string; - label: string; - comboId?: string; - comboName?: string; - groupId?: string; - groupName?: string; - groupCount?: number; - type?: string; - enableBadge1?: boolean; - notificationValue?: number; - icon?: { - show?: boolean; - img?: string; - width?: number; - height?: number; - }; - style?: Record; - x?: number | undefined; - y?: number | undefined; - fx?: number | undefined; - fy?: number | undefined; - persistPositionKey?: string; - data: Record; -} - -export interface GraphCombo { - id: string; - label: string; - style?: ModelStyle; -} - -export interface GraphEdge { - id: string; - source: string; - target: string; - sourceName?: string; - targetName?: string; - type?: string; - label?: string; - labelCfg?: Record; - style?: ShapeStyle; - metrics?: { - protocol: string | undefined; - bytes: number | undefined; - byteRate: number | undefined; - latency: number | undefined; - bytesReverse: number | undefined; - byteRateReverse: number | undefined; - latencyReverse: number | undefined; - }; -} - -export interface GraphReactAdaptorExposedMethods { - saveNodePositions?: Function; - closeContextMenu?: Function; -} - -export interface GraphReactAdaptorProps { - nodes: GraphNode[]; - edges: GraphEdge[]; - combos?: GraphCombo[]; - itemSelected?: string; - onClickCombo?: Function; - onClickNode?: Function; - onClickEdge?: Function; - onClickCanvas?: Function; - legendData?: GraphData; - ref?: MutableRefObject; - layout?: LayoutConfig; - moveToSelectedNode?: boolean; - ContextMenuComponent?: ComponentType<{ item: GraphNode; target: 'edge' | 'node' | undefined }>; -} -export interface LocalStorageDataSavedPayload { - x: number; - y: number; -} - -export interface LocalStorageDataSaved { - [key: string]: LocalStorageDataSavedPayload; -} - -export interface LocalStorageData extends LocalStorageDataSavedPayload { - id: string; -} - -export interface NodeWithBadgesProps extends ModelConfig { - notificationValue?: number; - notificationBgColor?: HexColors; - notificationColor?: HexColors; - notificationFontSize?: number; -} - -export interface ComboWithCustomLabel extends ModelConfig { - labelBgCfg?: { - fill?: string; - padding?: number[]; - }; -} diff --git a/components/console/src/core/components/Graph/Legend/Shapes/Circle.tsx b/components/console/src/core/components/Graph/Legend/Shapes/Circle.tsx deleted file mode 100644 index 6b4cd35..0000000 --- a/components/console/src/core/components/Graph/Legend/Shapes/Circle.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { LEGEND_DEFAULT_STROKE_COLOR } from './Shapes.constants'; - -const SvgCircle = function ({ dimension = 12, fillOpacity = 0 }: { dimension?: number; fillOpacity?: number }) { - const circleDimension = dimension; - const circleStroke = LEGEND_DEFAULT_STROKE_COLOR; - - return ( - - - - ); -}; - -export default SvgCircle; diff --git a/components/console/src/core/components/Graph/Legend/Shapes/Diamond.tsx b/components/console/src/core/components/Graph/Legend/Shapes/Diamond.tsx deleted file mode 100644 index 8a947a8..0000000 --- a/components/console/src/core/components/Graph/Legend/Shapes/Diamond.tsx +++ /dev/null @@ -1,21 +0,0 @@ -import { LEGEND_DEFAULT_BG_COLOR, LEGEND_DEFAULT_STROKE_COLOR } from './Shapes.constants'; - -const SvgDiamond = function ({ dimension = 12 }: { dimension?: number }) { - const diamondDimension = dimension; - const diamondColor = LEGEND_DEFAULT_BG_COLOR; - const diamondStroke = LEGEND_DEFAULT_STROKE_COLOR; - - return ( - - - - ); -}; - -export default SvgDiamond; diff --git a/components/console/src/core/components/Graph/Legend/Shapes/HorizontalLine.tsx b/components/console/src/core/components/Graph/Legend/Shapes/HorizontalLine.tsx deleted file mode 100644 index d885155..0000000 --- a/components/console/src/core/components/Graph/Legend/Shapes/HorizontalLine.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import { LINE_COLOR } from './Shapes.constants'; - -const SvgHorizontalLine = function ({ - color = LINE_COLOR, - dashed = false, - withConnector = false -}: { - color?: string; - dashed?: boolean; - withConnector?: boolean; -}) { - const lineWidth = 30; - const lineHeight = 12; - const circleRadius = 3; - - const dashArray = dashed ? `${lineHeight * 0.4} ${lineHeight * 0.4}` : undefined; - - return ( - - - - {withConnector && ( - - )} - - ); -}; - -export default SvgHorizontalLine; diff --git a/components/console/src/core/components/Graph/Legend/Shapes/Shapes.constants.ts b/components/console/src/core/components/Graph/Legend/Shapes/Shapes.constants.ts deleted file mode 100644 index 2ce3f77..0000000 --- a/components/console/src/core/components/Graph/Legend/Shapes/Shapes.constants.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { HexColors } from '@config/colors'; - -export const LEGEND_DEFAULT_BG_COLOR = HexColors.White; -export const LEGEND_DEFAULT_STROKE_COLOR = HexColors.Black500; -export const LINE_COLOR = HexColors.Black500; diff --git a/components/console/src/core/components/Graph/Legend/Shapes/Square.tsx b/components/console/src/core/components/Graph/Legend/Shapes/Square.tsx deleted file mode 100644 index 06d22fb..0000000 --- a/components/console/src/core/components/Graph/Legend/Shapes/Square.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { LEGEND_DEFAULT_STROKE_COLOR } from './Shapes.constants'; - -const SvgSquare = function () { - const squareSize = 12; - const squareStroke = LEGEND_DEFAULT_STROKE_COLOR; - - return ( - - - - ); -}; - -export default SvgSquare; diff --git a/components/console/src/core/components/Graph/Legend/index.tsx b/components/console/src/core/components/Graph/Legend/index.tsx deleted file mode 100644 index 760494c..0000000 --- a/components/console/src/core/components/Graph/Legend/index.tsx +++ /dev/null @@ -1,79 +0,0 @@ -import { Divider, Flex, FlexItem, Title } from '@patternfly/react-core'; - -import SvgCircle from './Shapes/Circle'; -import SvgDiamond from './Shapes/Diamond'; -import SvgHorizontalLine from './Shapes/HorizontalLine'; -import SvgSquare from './Shapes/Square'; - -enum Labels { - EntitiesTitle = ' Entities', - LinksTitle = ' Links', - Exposed = 'Process, component or site exposed', - NoExposed = 'Process/Component', - SiteGroup = 'Related site grouping', - Remote = 'Remote process/component', - DataLink = 'Data flow link', - ActiveDataLink = 'Active data link', - SiteLink = 'Site link connected' -} - -const ProcessLegend = function () { - return ( - <> - - {Labels.EntitiesTitle} - - - - - - - - - - - - - - - - - - - - - - - {Labels.Exposed} - {Labels.NoExposed} - {Labels.SiteGroup} - {Labels.Remote} - - - - - - {Labels.LinksTitle} - - - - - - - - - - - - - - - {Labels.DataLink} - {Labels.SiteLink} - - - - ); -}; - -export default ProcessLegend; diff --git a/components/console/src/core/components/Graph/MenuControl.tsx b/components/console/src/core/components/Graph/MenuControl.tsx deleted file mode 100644 index 4792f48..0000000 --- a/components/console/src/core/components/Graph/MenuControl.tsx +++ /dev/null @@ -1,122 +0,0 @@ -import { Graph } from '@antv/g6-pc'; -import { Button, Toolbar, ToolbarContent, ToolbarGroup, ToolbarItem, Tooltip } from '@patternfly/react-core'; -import { ExpandArrowsAltIcon, ExpandIcon, UndoIcon, SearchMinusIcon, SearchPlusIcon } from '@patternfly/react-icons'; - -import { GraphController } from './services'; - -type ZoomControlsProps = { - graphInstance: Graph; -}; - -const ZOOM_RATIO_OUT = 1.2; -const ZOOM_RATIO_IN = 0.8; - -const ZOOM_CONFIG = { - duration: 200, - easing: 'easeCubic' -}; - -const MenuControl = function ({ graphInstance }: ZoomControlsProps) { - const handleIncreaseZoom = () => { - handleZoom(ZOOM_RATIO_OUT); - }; - - const handleDecreaseZoom = () => { - handleZoom(ZOOM_RATIO_IN); - }; - - const handleZoom = (zoom: number) => { - const nodeCount = graphInstance.getNodes().length; - const centerPoint = graphInstance.getGraphCenterPoint(); - - graphInstance.zoom(zoom, centerPoint, !GraphController.isPerformanceThresholdExceeded(nodeCount), ZOOM_CONFIG); - }; - - const handleFitView = () => { - const nodeCount = graphInstance.getNodes().length; - - graphInstance.fitView(20, undefined, !GraphController.isPerformanceThresholdExceeded(nodeCount), ZOOM_CONFIG); - }; - - const handleCenter = () => { - graphInstance.fitCenter(false); - }; - - const handleCleanAllGraphConfigurations = () => { - GraphController.cleanAllLocalNodePositions(graphInstance.getNodes(), true); - GraphController.removeAllNodePositionsFromLocalStorage(); - - graphInstance.layout(); - setTimeout(handleFitView, 250); - }; - - return ( - - - - - - ); diff --git a/components/console/src/core/components/ViewDetailsCell/__tests__/ViewDetailCell.spec.tsx b/components/console/src/core/components/ViewDetailsCell/__tests__/ViewDetailCell.spec.tsx deleted file mode 100644 index 134fd65..0000000 --- a/components/console/src/core/components/ViewDetailsCell/__tests__/ViewDetailCell.spec.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import { render, fireEvent } from '@testing-library/react'; - -import ViewDetailCell from '../index'; - -describe('ViewDetailCell', () => { - it('should render a button with a search icon', () => { - const { getByLabelText } = render(); - const button = getByLabelText('Action'); - expect(button).toBeInTheDocument(); - }); - - it('should call onClick when button is clicked', () => { - const onClick = jest.fn(); - const { getByLabelText } = render(); - const button = getByLabelText('Action'); - - fireEvent.click(button); - expect(onClick).toHaveBeenCalledWith('test'); - }); -}); diff --git a/components/console/src/core/components/ViewDetailsCell/index.tsx b/components/console/src/core/components/ViewDetailsCell/index.tsx index d07c981..1603076 100644 --- a/components/console/src/core/components/ViewDetailsCell/index.tsx +++ b/components/console/src/core/components/ViewDetailsCell/index.tsx @@ -13,9 +13,7 @@ const ViewDetailCell = function ({ value, onClick }: ViewDetailCellProps) }, [value, onClick]); return ( - + - - - - - - - - - - - - - - - - - - - ); - } -); - -export default Topology; - -function convertSitesToNodes(sites: SiteResponse[]): GraphNode[] { - return sites.map(({ id, name, metadata, deploymentstate }) => { - const metaData = metadata ? JSON.parse(metadata) : {}; - const position = metaData?.position || {}; - - const label = name; - - return { - id, - label, - data: { deploymentstate }, - icon: { img: skupperIcon, width: 20, height: 20 }, - enableBadge1: true, - notificationBgColor: DeploymentStatusColorHexMap[deploymentstate], - ...position - }; - }); -} - -function convertRouterLinksToEdges(links: LinkResponse[]): GraphEdge[] { - return links.map(({ id, listeninginteriorsite, connectinginteriorsite, cost }) => ({ - id, - source: connectinginteriorsite, - target: listeninginteriorsite, - label: cost.toString(), - type: CUSTOM_ITEMS_NAMES.siteEdge - })); -} diff --git a/components/console/src/pages/Backbones/views/Backbone.tsx b/components/console/src/pages/Backbones/views/Backbone.tsx index b6c5ca2..2a94fab 100644 --- a/components/console/src/pages/Backbones/views/Backbone.tsx +++ b/components/console/src/pages/Backbones/views/Backbone.tsx @@ -1,34 +1,30 @@ import { useCallback, useRef, useState } from 'react'; import { - Alert, - Button, - Divider, - Icon, - Menu, - MenuContent, - MenuItem, - MenuList, - Modal, - ModalVariant, - OverflowMenu, - OverflowMenuContent, - OverflowMenuGroup, - OverflowMenuItem, - Stack, - StackItem, - Text, - TextContent, - Timestamp, - TimestampFormat, - Title, - ToggleGroup, - ToggleGroupItem, - Toolbar, - ToolbarContent, - ToolbarGroup, - ToolbarItem + Alert, + Button, + Divider, + Icon, + OverflowMenu, + OverflowMenuContent, + OverflowMenuGroup, + OverflowMenuItem, + Stack, + StackItem, + Timestamp, + TimestampFormat, + Title, + ToggleGroup, + ToggleGroupItem, + Toolbar, + ToolbarContent, + ToolbarGroup, + ToolbarItem } from '@patternfly/react-core'; +import { + Modal, + ModalVariant +} from '@patternfly/react-core/deprecated'; import { InProgressIcon, SyncAltIcon, TableIcon, TopologyIcon } from '@patternfly/react-icons'; import { useMutation, useSuspenseQueries } from '@tanstack/react-query'; import { useParams } from 'react-router-dom'; @@ -37,7 +33,6 @@ import { RESTApi } from '@API/REST.api'; import { VarColors } from '@config/colors'; import { ALERT_VISIBILITY_TIMEOUT, DEFAULT_PAGINATION_SIZE } from '@config/config'; import { getTestsIds } from '@config/testIds'; -import { GraphNode, GraphReactAdaptorExposedMethods } from '@core/components/Graph/Graph.interfaces'; import LinkCell from '@core/components/LinkCell'; import { LinkCellProps } from '@core/components/LinkCell/LinkCell.interfaces'; import SkTable from '@core/components/SkTable'; @@ -49,8 +44,6 @@ import { DeploymentStatusColorMap, linkColumns, siteColumns } from '../Backbones import { BackboneLabels, RoutesPaths, - ContextMenuLabels, - DeploymentStates, LinkLabels, QueriesBackbones, SiteLabels @@ -59,19 +52,17 @@ import DeployBootstrap from '../Components/DeployBootstrap'; import InitialDeploymentForm from '../Components/InitialDeploymentForm'; import LinkForm from '../Components/LinkForm'; import SiteForm from '../Components/SiteForm'; -import Topology from '../Components/Topology'; + const Backbone = function () { const { id: urlId } = useParams() as { id: string }; const { id: bid, name: bname } = getIdAndNameFromUrlParams(urlId); - const graphRef = useRef(); - const sidSelected = useRef(); const sitePositionToSave = useRef<{ x: number; y: number }>(); const [view, setView] = useState<'table' | 'topology'>('table'); - const [sid, setSid] = useState(); + const [isSiteOpen, setSiteOpen] = useState(false); const [siteValidated, setSiteValidated] = useState(); @@ -144,60 +135,23 @@ const Backbone = function () { setIsEditorOpen(false); }, []); - const handleOpenDetails = useCallback((id: string) => { - setSid(id); - - if (graphRef.current?.closeContextMenu) { - graphRef.current?.closeContextMenu(); - } - }, []); - - const handleGetAutomatic = useCallback((id: string) => { - sidSelected.current = id; - - setIsEditorOpen('automatic'); - - if (graphRef.current?.closeContextMenu) { - graphRef.current?.closeContextMenu(); - } - }, []); - - const handleGetBootstrap = useCallback((id: string) => { - sidSelected.current = id; - - setIsEditorOpen('bootstrap'); - - if (graphRef.current?.closeContextMenu) { - graphRef.current?.closeContextMenu(); - } - }, []); const handleSiteDelete = useCallback( (siteId: string) => { mutationDeleteSite.mutate(siteId); - if (graphRef.current?.closeContextMenu) { - graphRef.current?.closeContextMenu(); - } }, [mutationDeleteSite] ); const handleLinkDelete = useCallback( (siteId: string) => { - mutationDeleteLink.mutate(siteId); - - if (graphRef.current?.closeContextMenu) { - graphRef.current?.closeContextMenu(); - } + mutationDeleteLink.mutate(siteId) }, [mutationDeleteLink] ); - const handleRemoveSelected = () => { - sidSelected.current = undefined; - setSid(undefined); - }; + const handleSiteRefresh = useCallback(() => { setTimeout(() => { @@ -215,51 +169,6 @@ const Backbone = function () { handleCloseLinkModal(); }, [refetchLinks, handleCloseLinkModal]); - const ContextMenu = function ({ item, target }: { item: GraphNode; target: 'edge' | 'node' | undefined }) { - const NodeMenu = function () { - const { id, data } = item; - - return ( - - handleOpenDetails(id)}> - {ContextMenuLabels.ViewDetails} - - handleOpenLinkModal?.(id)}> - {ContextMenuLabels.AddLink} - - handleSiteDelete(id)}> - {ContextMenuLabels.DeleteSite} - - {data.deploymentstate === DeploymentStates.ReadyAutomatic && ( - handleGetAutomatic(id)}> - {ContextMenuLabels.GetReadyAutomaticConfig} - - )} - {data.deploymentstate === DeploymentStates.ReadyBootstrap && ( - handleGetBootstrap(id)}> - {ContextMenuLabels.GetReadyBootstrapConfig} - - )} - - ); - }; - - const LinkMenu = function () { - return ( - - handleLinkDelete(item.id)}> - {ContextMenuLabels.DeleteLink} - - - ); - }; - - return ( - - {target === 'node' ? : } - - ); - }; return ( - + - {view === 'topology' && ( - { - sitePositionToSave.current = { x, y }; - handleOpenSiteModal(); - }} - ContextMenuComponent={ContextMenu} - ref={graphRef} - onCloseDrawer={handleRemoveSelected} - /> - )} - {view === 'table' && ( @@ -320,7 +213,7 @@ const Backbone = function () { {BackboneLabels.Sites} - + @@ -340,29 +233,25 @@ const Backbone = function () { customCells={{ emptyCell: (props: LinkCellProps) => props.value || '-', deploymentStateCell: (props: LinkCellProps) => ( - - - {' '} - {props.data.deploymentstate} - - +
+ {' '} + {props.data.deploymentstate} +
), lifecycleCell: (props: LinkCellProps) => ( - - - - {props.data.lifecycle === 'ready' ? ( - - ) : ( - - )} - {' '} - {props.data.lifecycle} - - +
+ + {props.data.lifecycle === 'ready' ? ( + + ) : ( + + )} + {' '} + {props.data.lifecycle} +
), linkCell: (props: LinkCellProps) => LinkCell({ @@ -406,7 +295,7 @@ const Backbone = function () { {BackboneLabels.Links} - + diff --git a/components/console/src/pages/Backbones/views/Backbones.tsx b/components/console/src/pages/Backbones/views/Backbones.tsx index a6d8e3d..e408628 100644 --- a/components/console/src/pages/Backbones/views/Backbones.tsx +++ b/components/console/src/pages/Backbones/views/Backbones.tsx @@ -1,26 +1,22 @@ -import { KeyboardEvent, MouseEvent as ReactMouseEvent, useCallback, useState } from 'react'; +import { useCallback, useState } from 'react'; import { - Alert, - Button, - Icon, - Modal, - ModalVariant, - OverflowMenu, - OverflowMenuContent, - OverflowMenuGroup, - OverflowMenuItem, - Tabs, - Tab, - TabTitleText, - Text, - TextContent, - Toolbar, - ToolbarContent, - ToolbarGroup, - ToolbarItem, - Title + Alert, + Button, + Icon, + OverflowMenu, + OverflowMenuContent, + OverflowMenuGroup, + OverflowMenuItem, + Toolbar, + ToolbarContent, + ToolbarGroup, + ToolbarItem } from '@patternfly/react-core'; +import { + Modal, + ModalVariant +} from '@patternfly/react-core/deprecated'; import { CheckCircleIcon, InProgressIcon, SyncAltIcon } from '@patternfly/react-icons'; import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; @@ -33,7 +29,6 @@ import SkTable from '@core/components/SkTable'; import MainContainer from '@layout/MainContainer'; import { BackboneResponse, HTTPError } from 'API/REST.interfaces'; -import Vans from './Vans'; import { backboneColumns } from '../Backbones.constants'; import { BackboneLabels, RoutesPaths, QueriesBackbones } from '../Backbones.enum'; import BackboneForm from '../Components/BackboneForm'; @@ -41,17 +36,12 @@ import BackboneForm from '../Components/BackboneForm'; const Backbones = function () { const [isOpen, setOpen] = useState(false); const [validated, setValidated] = useState(); - const [activeTabKey, setActiveTabKey] = useState(0); const { data: backbones, refetch } = useSuspenseQuery({ queryKey: [QueriesBackbones.GetBackbones], queryFn: () => RESTApi.fetchBackbones() }); - const handleTabClick = (_: ReactMouseEvent | KeyboardEvent | MouseEvent, tabIndex: string | number) => { - setActiveTabKey(tabIndex); - }; - const mutationActivate = useMutation({ mutationFn: (id: string) => RESTApi.activateBackbone(id), onSuccess: () => { @@ -108,90 +98,79 @@ const Backbones = function () { title={BackboneLabels.Section} description={BackboneLabels.Description} mainContentChildren={ - - {BackboneLabels.ApplicationNetworks}}> - - - - {BackboneLabels.Backbones}}> - {validated && } + <> + {validated && } - - + + + - {BackboneLabels.Backbones} + - - - - - - - - - ) => ( - - - - {props.data.lifecycle === 'ready' ? ( - - ) : ( - - )} - {' '} - {props.data.lifecycle} - - + +
+
+ + ) => ( +
+ + {props.data.lifecycle === 'ready' ? ( + + ) : ( + + )} + {' '} + {props.data.lifecycle} +
+ ), + booleanCell: (props: LinkCellProps) => + props.data.multitenant === true ? ( + + + + ) : ( + '' ), - booleanCell: (props: LinkCellProps) => - props.data.multitenant === true ? ( - - - - ) : ( - '' - ), - linkCell: (props: LinkCellProps) => - LinkCell({ - ...props, - type: 'backbone', - link: `${RoutesPaths.App}/sites/${props.data.name}@${props.data.id}` - }), - actions: ({ data }: { data: BackboneResponse }) => ( - - - - - - - - - - - - - ) - }} - /> - - - - - + linkCell: (props: LinkCellProps) => + LinkCell({ + ...props, + type: 'backbone', + link: `${RoutesPaths.App}/sites/${props.data.name}@${props.data.id}` + }), + actions: ({ data }: { data: BackboneResponse }) => ( + + + + + + + + + + + + + ) + }} + /> + + + + } /> ); diff --git a/components/console/src/pages/Backbones/views/Invitations.tsx b/components/console/src/pages/Backbones/views/Invitations.tsx index 8d2fbbd..1d28592 100644 --- a/components/console/src/pages/Backbones/views/Invitations.tsx +++ b/components/console/src/pages/Backbones/views/Invitations.tsx @@ -1,28 +1,28 @@ import { FC, useCallback, useState } from 'react'; import { - Alert, - Button, - Icon, - Modal, - ModalVariant, - OverflowMenu, - OverflowMenuContent, - OverflowMenuGroup, - OverflowMenuItem, - PageSection, - Stack, - StackItem, - Text, - TextContent, - Timestamp, - TimestampFormat, - Title, - Toolbar, - ToolbarContent, - ToolbarGroup, - ToolbarItem + Alert, + Button, + Icon, + OverflowMenu, + OverflowMenuContent, + OverflowMenuGroup, + OverflowMenuItem, + PageSection, + Stack, + StackItem, + Timestamp, + TimestampFormat, + Title, + Toolbar, + ToolbarContent, + ToolbarGroup, + ToolbarItem, } from '@patternfly/react-core'; +import { + Modal, + ModalVariant +} from '@patternfly/react-core/deprecated'; import { InProgressIcon, SyncAltIcon } from '@patternfly/react-icons'; import { useMutation, useSuspenseQueries } from '@tanstack/react-query'; import { useParams } from 'react-router'; @@ -49,7 +49,7 @@ const InvitationContainer = function () { + } @@ -131,7 +131,7 @@ const Invitations: FC<{ vid: string }> = function ({ vid }) { {BackboneLabels.Invitations} - + @@ -149,18 +149,16 @@ const Invitations: FC<{ vid: string }> = function ({ vid }) { emptyCell: (props: LinkCellProps) => props.value || '-', lifecycleCell: (props: LinkCellProps) => ( - - - - {props.data.lifecycle === 'ready' ? ( - - ) : ( - - )} - {' '} - {props.data.lifecycle} - - + + + {props.data.lifecycle === 'ready' ? ( + + ) : ( + + )} + {' '} + {props.data.lifecycle} + ), actions: ({ data }: { data: InvitationResponse }) => ( @@ -211,18 +209,16 @@ const Invitations: FC<{ vid: string }> = function ({ vid }) { emptyCell: (props: LinkCellProps) => props.value || '-', lifecycleCell: (props: LinkCellProps) => ( - - - - {props.data.lifecycle === 'ready' ? ( - - ) : ( - - )} - {' '} - {props.data.lifecycle} - - + + + {props.data.lifecycle === 'ready' ? ( + + ) : ( + + )} + {' '} + {props.data.lifecycle} + ) }} /> @@ -234,7 +230,7 @@ const Invitations: FC<{ vid: string }> = function ({ vid }) { variant={ModalVariant.medium} onClose={handleCloseModal} > - + - - - - - {BackboneLabels.Vans} - - - - - - - - - - {vanValidated && } - ) => - LinkCell({ - ...props, - type: 'van', - link: `${RoutesPaths.App}/invitations/${props.data.name}@${props.data.id}` - }), - - emptyCell: (props: LinkCellProps) => props.value || '-', - - lifecycleCell: (props: LinkCellProps) => ( - - + + + + + + + + + + + + {vanValidated && } + + ) => + LinkCell({ + ...props, + type: 'van', + link: `${RoutesPaths.App}/invitations/${props.data.name}@${props.data.id}` + }), + + emptyCell: (props: LinkCellProps) => props.value || '-', + + lifecycleCell: (props: LinkCellProps) => ( +
{props.data.lifecycle === 'ready' ? ( @@ -121,39 +119,39 @@ const Vans = function () { )} {' '} {props.data.lifecycle} - - - ), - - deleteDelayCell: (props: LinkCellProps) => - props.value && Object.keys(props.data).length ? props.data.deletedelay.minutes : '-', - - actions: ({ data }: { data: VanResponse }) => ( - - - - - - - - - - ) - }} - /> - - - - - - +
+ ), + + deleteDelayCell: (props: LinkCellProps) => + props.value && Object.keys(props.data).length ? props.data.deletedelay.minutes : '-', + + actions: ({ data }: { data: VanResponse }) => ( + + + + + + + + + + ) + }} + /> + + + + + + } + /> ); }; diff --git a/components/console/src/pages/Vans/Vans.constants.ts b/components/console/src/pages/Vans/Vans.constants.ts new file mode 100644 index 0000000..c21f47d --- /dev/null +++ b/components/console/src/pages/Vans/Vans.constants.ts @@ -0,0 +1,6 @@ +import { VanLabels } from '@pages/Backbones/Backbones.enum'; + +export const VansPaths = { + path: '/vans', + name: VanLabels.Section +}; diff --git a/components/console/src/pages/Vans/routes.tsx b/components/console/src/pages/Vans/routes.tsx new file mode 100644 index 0000000..00b7439 --- /dev/null +++ b/components/console/src/pages/Vans/routes.tsx @@ -0,0 +1,12 @@ +import { lazy } from 'react'; + +import { VansPaths } from './Vans.constants'; + +const VansPage = lazy(() => import(/* webpackChunkName: "vans" */ '@pages/Backbones/views/Vans')); + +export const vansRoutes = [ + { + path: VansPaths.path, + element: + } +]; diff --git a/components/console/src/pages/shared/Errors/Console/index.tsx b/components/console/src/pages/shared/Errors/Console/index.tsx index 21e665e..b3f9f23 100644 --- a/components/console/src/pages/shared/Errors/Console/index.tsx +++ b/components/console/src/pages/shared/Errors/Console/index.tsx @@ -5,10 +5,8 @@ import { ClipboardCopyVariant, Divider, PageSection, - PageSectionVariants, - Text, - TextContent, - TextVariants, + Content, + ContentVariants, Title } from '@patternfly/react-core'; @@ -35,17 +33,17 @@ const ErrorConsole: FC = function ({ error, resetErrorBoundar // It handles app errors return ( - - + + {ConsoleErrorLabels.ErrorTitle} - {message} + {message} {error.stack || ''} - + ); }; diff --git a/components/console/src/pages/shared/Errors/Http/index.tsx b/components/console/src/pages/shared/Errors/Http/index.tsx index 32132f1..d9821be 100644 --- a/components/console/src/pages/shared/Errors/Http/index.tsx +++ b/components/console/src/pages/shared/Errors/Http/index.tsx @@ -6,10 +6,8 @@ import { List, ListItem, PageSection, - PageSectionVariants, - Text, - TextContent, - TextVariants, + Content, + ContentVariants, Title } from '@patternfly/react-core'; @@ -21,15 +19,15 @@ const ErrorHttp: FC<{ code?: string; message?: string; onReset?: MouseEventHandl onReset }) { return ( - - + + {message || HttpErrorLabels.ErrorTitle} {code || ''} - + To help us resolve the issue quickly, we recommend following these steps using the DevTool browser - + Open the DevTool browser (F12) @@ -50,7 +48,7 @@ const ErrorHttp: FC<{ code?: string; message?: string; onReset?: MouseEventHandl - + ); }; diff --git a/components/console/src/pages/shared/Errors/NotFound/index.tsx b/components/console/src/pages/shared/Errors/NotFound/index.tsx index 27a521b..060c167 100644 --- a/components/console/src/pages/shared/Errors/NotFound/index.tsx +++ b/components/console/src/pages/shared/Errors/NotFound/index.tsx @@ -1,14 +1,14 @@ -import { Bullseye, PageSection, PageSectionVariants, Text, TextContent, TextVariants } from '@patternfly/react-core'; +import { Bullseye, PageSection, Content, ContentVariants } from '@patternfly/react-core'; import { NotFoundLabels } from './NotFound.enum'; const NotFound = function () { return ( - + - - {NotFoundLabels.ErrorTitle} - + + {NotFoundLabels.ErrorTitle} + ); diff --git a/components/console/src/pages/shared/Loading/index.tsx b/components/console/src/pages/shared/Loading/index.tsx index 6ddfe11..8e52035 100644 --- a/components/console/src/pages/shared/Loading/index.tsx +++ b/components/console/src/pages/shared/Loading/index.tsx @@ -1,6 +1,6 @@ import { CSSProperties, FC } from 'react'; -import { Bullseye, Card, CardBody, CardHeader, PageSection, Text, TextContent } from '@patternfly/react-core'; +import { Bullseye, Card, CardBody, CardHeader, PageSection } from '@patternfly/react-core'; import { CogIcon } from '@patternfly/react-icons'; import { getTestsIds } from '@config/testIds'; @@ -19,9 +19,7 @@ const PleaseWait = function () { - - {LoadingLabels.LoadingMessage} - +

{LoadingLabels.LoadingMessage}

); @@ -43,7 +41,7 @@ interface LoadingPageProps { const LoadingPage: FC = function ({ isFLoating = false }) { return ( - + diff --git a/components/console/src/routes.tsx b/components/console/src/routes.tsx index a22e847..41f2f07 100644 --- a/components/console/src/routes.tsx +++ b/components/console/src/routes.tsx @@ -3,9 +3,11 @@ import { Navigate, RouteObject } from 'react-router-dom'; import { DEFAULT_ROUTE } from '@config/routes'; import { backboneRoutes } from '@pages/Backbones/routes'; import { errorsRoutes } from '@pages/shared/Errors/routes'; +import { vansRoutes } from '@pages/Vans/routes'; export const routes: RouteObject[] = [ { index: true, element: }, ...errorsRoutes, - ...backboneRoutes + ...backboneRoutes, + ...vansRoutes ]; diff --git a/components/console/tsconfig.json b/components/console/tsconfig.json index 228b677..c9d8e30 100644 --- a/components/console/tsconfig.json +++ b/components/console/tsconfig.json @@ -9,7 +9,7 @@ "typeRoots": ["node_modules/@types"], "baseUrl": "src", "sourceMap": true, - "allowJs": true, + "allowJs": false, "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, @@ -21,11 +21,13 @@ "strictNullChecks": true, "noImplicitReturns": true, "strictFunctionTypes": true, - "noUnusedParameters": false, - "noUnusedLocals": false, + "noUnusedParameters": true, + "noUnusedLocals": true, "strictPropertyInitialization": true }, - "include": ["src", "jest.config.ts", "mocks/*.ts"], - // cypress.config.ts -> https://github.com/cypress-io/cypress/issues/22059 - "exclude": ["node_modules", "build", "cypress.config.ts"] + "include": ["src/**/*", "jest.config.ts", "mocks/*.ts"], + "exclude": [ + "node_modules", + "build" + ] } diff --git a/components/console/yarn.lock b/components/console/yarn.lock index f7f0a64..cadbc50 100644 --- a/components/console/yarn.lock +++ b/components/console/yarn.lock @@ -20,13 +20,6 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@ant-design/colors@^4.0.5": - version "4.0.5" - resolved "https://registry.yarnpkg.com/@ant-design/colors/-/colors-4.0.5.tgz#d7d100d7545cca8f624954604a6892fc48ba5aae" - integrity sha512-3mnuX2prnWOWvpFTS2WH2LoouWlOgtnIpc6IarWN6GOzzLF8dW/U8UctuvIPhoboETehZfJ61XP+CGakBEPJ3Q== - dependencies: - tinycolor2 "^1.4.1" - "@antv/algorithm@^0.1.26": version "0.1.26" resolved "https://registry.yarnpkg.com/@antv/algorithm/-/algorithm-0.1.26.tgz#e3f5e7f1d8db5b415c3f31e32b119cbcafc8f5de" @@ -35,237 +28,238 @@ "@antv/util" "^2.0.13" tslib "^2.0.0" -"@antv/dom-util@^2.0.1", "@antv/dom-util@^2.0.2": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@antv/dom-util/-/dom-util-2.0.4.tgz#b09b56c56fec42896fc856edad56b595b47ab514" - integrity sha512-2shXUl504fKwt82T3GkuT4Uoc6p9qjCKnJ8gXGLSW4T1W37dqf9AV28aCfoVPHp2BUXpSsB+PAJX2rG/jLHsLQ== +"@antv/component@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@antv/component/-/component-2.1.3.tgz#26cad68ed8e4687ae6fb74267934a50bcbe3410f" + integrity sha512-TDePMyrx6rvOeUizcKwrNfSb4vL/hcIsIY01dTD1nXKpR3eDf/q558wN4zGH2NmgX/4TOes7UgSH4iCrpB0eMg== dependencies: - tslib "^2.0.3" + "@antv/g" "^6.1.11" + "@antv/scale" "^0.4.16" + "@antv/util" "^3.3.10" + svg-path-parser "^1.1.0" -"@antv/event-emitter@^0.1.1", "@antv/event-emitter@~0.1.0": +"@antv/event-emitter@^0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@antv/event-emitter/-/event-emitter-0.1.3.tgz#3e06323b9dcd55a3241ddc7c5458cfabd2095164" integrity sha512-4ddpsiHN9Pd4UIlWuKVK1C4IiZIdbwQvy9i7DUSI3xNJ89FPUFt8lxDYj8GzzfdllV0NkJTRxnG+FvLk0llidg== -"@antv/g-base@^0.5.1", "@antv/g-base@^0.5.12": - version "0.5.14" - resolved "https://registry.yarnpkg.com/@antv/g-base/-/g-base-0.5.14.tgz#101245d25b612e9a5767726600e033379c9cd895" - integrity sha512-Wyx+ddatDdQBjidLHXmV3NgKp1oiyNZNX9gGflaBFDfGgywnvs85bXnKswayFXsFBg5TQ6Goi8SnBufEqwemgg== - dependencies: - "@antv/event-emitter" "^0.1.1" - "@antv/g-math" "^0.1.9" - "@antv/matrix-util" "^3.1.0-beta.1" - "@antv/path-util" "~2.0.5" - "@antv/util" "~2.0.13" - "@types/d3-timer" "^2.0.0" - d3-ease "^1.0.5" - d3-interpolate "^3.0.1" - d3-timer "^1.0.9" - detect-browser "^5.1.0" - tslib "^2.0.3" - -"@antv/g-canvas@^0.5.2": - version "0.5.13" - resolved "https://registry.yarnpkg.com/@antv/g-canvas/-/g-canvas-0.5.13.tgz#d52a0044cea6a46e4410fba44910c1b149c45211" - integrity sha512-nu6wNeZhYomkEks2aniWlYML0ZGb9t5PGzjiOIp+B4z4HUEUvHOTdIPNfinzl5+4QC7fVZntsQKZK5dBFO5MDQ== - dependencies: - "@antv/g-base" "^0.5.12" - "@antv/g-math" "^0.1.9" - "@antv/matrix-util" "^3.1.0-beta.1" - "@antv/path-util" "~2.0.5" - "@antv/util" "~2.0.0" - gl-matrix "^3.0.0" - tslib "^2.0.3" - -"@antv/g-math@^0.1.1", "@antv/g-math@^0.1.9": - version "0.1.9" - resolved "https://registry.yarnpkg.com/@antv/g-math/-/g-math-0.1.9.tgz#1f981b9aebf5c024f284389aa3e5cba8cefa1f28" - integrity sha512-KHMSfPfZ5XHM1PZnG42Q2gxXfOitYveNTA7L61lR6mhZ8Y/aExsYmHqaKBsSarU0z+6WLrl9C07PQJZaw0uljQ== - dependencies: - "@antv/util" "~2.0.0" - gl-matrix "^3.0.0" - -"@antv/g-svg@^0.5.1", "@antv/g-svg@^0.5.2": - version "0.5.7" - resolved "https://registry.yarnpkg.com/@antv/g-svg/-/g-svg-0.5.7.tgz#d63db5f8590a5f3ceab097c183ec80ed143f0a50" - integrity sha512-jUbWoPgr4YNsOat2Y/rGAouNQYGpw4R0cvlN0YafwOyacFFYy2zC8RslNd6KkPhhR3XHNSqJOuCYZj/YmLUwYw== +"@antv/g-camera-api@2.0.38": + version "2.0.38" + resolved "https://registry.yarnpkg.com/@antv/g-camera-api/-/g-camera-api-2.0.38.tgz#8a2ddc59aae648fcf31a675287fbb7571bcde9d3" + integrity sha512-BgFkUMcTO06Oz37Z+hVqxATwdWFE5DfBgMKlFaMwKKF/8n+7eNhlif1KBfcf2rEfGijS0FD0ZGKCr9uJ06+GIg== dependencies: - "@antv/g-base" "^0.5.12" - "@antv/g-math" "^0.1.9" - "@antv/util" "~2.0.0" - detect-browser "^5.0.0" - tslib "^2.0.3" + "@antv/g-lite" "2.2.19" + "@antv/util" "^3.3.5" + "@babel/runtime" "^7.25.6" + gl-matrix "^3.4.3" + tslib "^2.5.3" + +"@antv/g-canvas@^2.0.43": + version "2.0.44" + resolved "https://registry.yarnpkg.com/@antv/g-canvas/-/g-canvas-2.0.44.tgz#6a34bce5ddc236a73189b2af8428bc9957965ef6" + integrity sha512-nsV+CErhptyAKQg+5g8RlW6N2oGTn53uUaNu/q6F41gyZm7oL1nHwxI12mbBCGMUlI0JVHsmEIOw5tJ3frkUFg== + dependencies: + "@antv/g-lite" "2.2.19" + "@antv/g-plugin-canvas-path-generator" "2.1.19" + "@antv/g-plugin-canvas-picker" "2.1.23" + "@antv/g-plugin-canvas-renderer" "2.2.23" + "@antv/g-plugin-dom-interaction" "2.1.24" + "@antv/g-plugin-html-renderer" "2.1.24" + "@antv/g-plugin-image-loader" "2.1.23" + "@antv/util" "^3.3.5" + "@babel/runtime" "^7.25.6" + tslib "^2.5.3" + +"@antv/g-dom-mutation-observer-api@2.0.35": + version "2.0.35" + resolved "https://registry.yarnpkg.com/@antv/g-dom-mutation-observer-api/-/g-dom-mutation-observer-api-2.0.35.tgz#57633a3a54ac091d64427e42eea8b43fa334b408" + integrity sha512-bAl3ViXDHvLEbGvGZwZBg4gpoNjUTwVQ3XTmRAkymkFGkUy+KV0ZwFdqEegP25TQGPl85er/hB6MCu6Yt58AJA== + dependencies: + "@antv/g-lite" "2.2.19" + "@babel/runtime" "^7.25.6" + +"@antv/g-lite@2.2.19": + version "2.2.19" + resolved "https://registry.yarnpkg.com/@antv/g-lite/-/g-lite-2.2.19.tgz#ef8f4fa4f0e1e95f7f27b2e341196ddc8a8794f8" + integrity sha512-QfxZsbLGTSGL18NgSOAVQURXC3xMXbmmS125EF7/vCzW2Lw2nF5I8k0KW4N09ty+/FtVpSESJX652g2phIvd5g== + dependencies: + "@antv/g-math" "3.0.1" + "@antv/util" "^3.3.5" + "@antv/vendor" "^1.0.3" + "@babel/runtime" "^7.25.6" + eventemitter3 "^5.0.1" + gl-matrix "^3.4.3" + rbush "^3.0.1" + tslib "^2.5.3" -"@antv/g-webgpu-core@^0.7.2": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@antv/g-webgpu-core/-/g-webgpu-core-0.7.2.tgz#65ef2a1253e319ffb2ed568d222b8313635d6677" - integrity sha512-xUMmop7f3Rs34zFYKXLqHhDR1CQTeDl/7vI7Sn3X/73BqJc3X3HIIRvm83Fg2CjVACaOzw4WeLRXNaOCp9fz9w== +"@antv/g-math@3.0.1": + version "3.0.1" + resolved "https://registry.yarnpkg.com/@antv/g-math/-/g-math-3.0.1.tgz#8c95b96c04a656345f8bfff9d100fa0b5708a2f0" + integrity sha512-FvkDBNRpj+HsLINunrL2PW0OlG368MlpHuihbxleuajGim5kra8tgISwCLmAf8Yz2b1CgZ9PvpohqiLzHS7HLg== dependencies: - eventemitter3 "^4.0.0" - gl-matrix "^3.1.0" - lodash "^4.17.15" - probe.gl "^3.1.1" + "@antv/util" "^3.3.5" + "@babel/runtime" "^7.25.6" + gl-matrix "^3.4.3" + tslib "^2.5.3" + +"@antv/g-plugin-canvas-path-generator@2.1.19": + version "2.1.19" + resolved "https://registry.yarnpkg.com/@antv/g-plugin-canvas-path-generator/-/g-plugin-canvas-path-generator-2.1.19.tgz#dc77fec5bee2e267d2b9383d2b29d2bee4d02080" + integrity sha512-+tc97NLvVYEFQnrLffmyxPpVXwUuTPbXBGy3aUTBYKd3YXhFBIKJYpQR39jsX2skgUvLh/67ZtA9QeUt6U41oQ== + dependencies: + "@antv/g-lite" "2.2.19" + "@antv/g-math" "3.0.1" + "@antv/util" "^3.3.5" + "@babel/runtime" "^7.25.6" + tslib "^2.5.3" + +"@antv/g-plugin-canvas-picker@2.1.23": + version "2.1.23" + resolved "https://registry.yarnpkg.com/@antv/g-plugin-canvas-picker/-/g-plugin-canvas-picker-2.1.23.tgz#75d9023787fc01af31f14f736d86c3b24a752ef0" + integrity sha512-ADA8Newb+w3wCVWLGWP9EqOb2HjAEOj992L2ywC6Wz3uPNp72dLK2YtKfqm6dApEh8htQ9u0QrnS1tGA3kgrcA== + dependencies: + "@antv/g-lite" "2.2.19" + "@antv/g-math" "3.0.1" + "@antv/g-plugin-canvas-path-generator" "2.1.19" + "@antv/g-plugin-canvas-renderer" "2.2.23" + "@antv/util" "^3.3.5" + "@babel/runtime" "^7.25.6" + gl-matrix "^3.4.3" + tslib "^2.5.3" + +"@antv/g-plugin-canvas-renderer@2.2.23": + version "2.2.23" + resolved "https://registry.yarnpkg.com/@antv/g-plugin-canvas-renderer/-/g-plugin-canvas-renderer-2.2.23.tgz#d91e89ae1b68185b394366702eecd95b7eee9da5" + integrity sha512-v/XDy0vSy4RvMUdI6fwB2UpdmbnJIf7ixBe9dFJMfH4Ue3I6EDRBRgFRGFIwcTo4EhTlUG1woX1mo4Nwc91Adw== + dependencies: + "@antv/g-lite" "2.2.19" + "@antv/g-math" "3.0.1" + "@antv/g-plugin-canvas-path-generator" "2.1.19" + "@antv/g-plugin-image-loader" "2.1.23" + "@antv/util" "^3.3.5" + "@babel/runtime" "^7.25.6" + gl-matrix "^3.4.3" + tslib "^2.5.3" + +"@antv/g-plugin-dom-interaction@2.1.24": + version "2.1.24" + resolved "https://registry.yarnpkg.com/@antv/g-plugin-dom-interaction/-/g-plugin-dom-interaction-2.1.24.tgz#5e2001d0451293573958763a37b4cc1a6d1ffd27" + integrity sha512-1IrsUp2k+4oi2brVNstgxoisdwcdwqSNdEYJBDtVP1Bv5KZabKSs9lxlkxVR0DTb8BJtWBi80gmKQFIJ8znofQ== + dependencies: + "@antv/g-lite" "2.2.19" + "@babel/runtime" "^7.25.6" + tslib "^2.5.3" + +"@antv/g-plugin-dragndrop@^2.0.35": + version "2.0.35" + resolved "https://registry.yarnpkg.com/@antv/g-plugin-dragndrop/-/g-plugin-dragndrop-2.0.35.tgz#a44ab89fbb7214e88dc6c25daf328fee69d24efb" + integrity sha512-1ZG+j91uEQAiFN0UqRkYCx3G8WWlKYoCXgTTx6m4YFJESJiab5M1C4OAi7zXclt1maOR154x3L/j3sRmBHFA+A== + dependencies: + "@antv/g-lite" "2.2.19" + "@antv/util" "^3.3.5" + "@babel/runtime" "^7.25.6" + tslib "^2.5.3" + +"@antv/g-plugin-html-renderer@2.1.24": + version "2.1.24" + resolved "https://registry.yarnpkg.com/@antv/g-plugin-html-renderer/-/g-plugin-html-renderer-2.1.24.tgz#c5f2e7c43b52f72a34d9542f9b190663c9b65f26" + integrity sha512-UPEitSu5F42kRgqy8Cr34aC6O4+0cCnC+avv0ZMXUFOf7AMhMnjQLlHHo+GDfM/0r6m//0ZCsqHpv8vB0A+sUA== + dependencies: + "@antv/g-lite" "2.2.19" + "@antv/util" "^3.3.5" + "@babel/runtime" "^7.25.6" + gl-matrix "^3.4.3" + tslib "^2.5.3" -"@antv/g-webgpu-engine@^0.7.2": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@antv/g-webgpu-engine/-/g-webgpu-engine-0.7.2.tgz#64631f24930f449ef41ffff6429d4fb9519eca23" - integrity sha512-lx8Y93IW2cnJvdoDRKyMmTdYqSC1pOmF0nyG3PGGyA0NI9vBYVgO0KTF6hkyWjdTWVq7XDZyf/h8CJridLh3lg== +"@antv/g-plugin-image-loader@2.1.23": + version "2.1.23" + resolved "https://registry.yarnpkg.com/@antv/g-plugin-image-loader/-/g-plugin-image-loader-2.1.23.tgz#1d3cdcc3efaab4adf16a15b4b77a72ea12472bae" + integrity sha512-LHTESl8BE6GO2EdaTehrCj2V82y4lQ13lFOvImQOI1JzZ/9PJ/vrStMzN1bg/CCqmJn07eVHlqxW9QJAQOOCzA== dependencies: - "@antv/g-webgpu-core" "^0.7.2" - gl-matrix "^3.1.0" - lodash "^4.17.15" - regl "^1.3.11" + "@antv/g-lite" "2.2.19" + "@antv/util" "^3.3.5" + "@babel/runtime" "^7.25.6" + gl-matrix "^3.4.3" + tslib "^2.5.3" -"@antv/g-webgpu@0.7.2": - version "0.7.2" - resolved "https://registry.yarnpkg.com/@antv/g-webgpu/-/g-webgpu-0.7.2.tgz#39ba2123816322fec9563236211ad8ab1e40924d" - integrity sha512-kw+oYGsdvj5qeUfy5DPb/jztZBV+2fmqBd3Vv8NlKatfBmv8AirYX/CCW74AUSdWm99rEiLyxFB1VdRZ6b/wnQ== +"@antv/g-web-animations-api@2.1.25": + version "2.1.25" + resolved "https://registry.yarnpkg.com/@antv/g-web-animations-api/-/g-web-animations-api-2.1.25.tgz#5044aa77a2eaa33c23351887e09781c13f3aa20c" + integrity sha512-xljNU+mDsdaDr+DwP77te2ZkNLcLiwuwppwXuRRpv/wVxUue726c/QbfYj/wMwJoBcOEtl/5hjAks/+gdvr3ag== dependencies: - "@antv/g-webgpu-core" "^0.7.2" - "@antv/g-webgpu-engine" "^0.7.2" - gl-matrix "^3.1.0" - gl-vec2 "^1.3.0" - lodash "^4.17.15" + "@antv/g-lite" "2.2.19" + "@antv/util" "^3.3.5" + "@babel/runtime" "^7.25.6" + tslib "^2.5.3" -"@antv/g6-core@0.8.24": - version "0.8.24" - resolved "https://registry.yarnpkg.com/@antv/g6-core/-/g6-core-0.8.24.tgz#a5291d53b8e33f6c895a2ed8553dd283a9788c73" - integrity sha512-rgI3dArAD8uoSz2+skS4ctN4x/Of33ivTIKaEYYvClxgkLZWVz9zvocy+5AWcVPBHZsAXkZcdh9zndIoWY/33A== +"@antv/g6@^5.0.48": + version "5.0.48" + resolved "https://registry.yarnpkg.com/@antv/g6/-/g6-5.0.48.tgz#3c991c092ae4b948160e9f0da02c1c7a993f74db" + integrity sha512-ngACp0NTJE1Dg03myB6Tqj0iVALiwEl83sul+xFqwASxjmw9dv3UeGa6tFGDp+4QvzXSh5GM8SlbTMTlfgEMnQ== dependencies: "@antv/algorithm" "^0.1.26" - "@antv/dom-util" "^2.0.1" - "@antv/event-emitter" "~0.1.0" - "@antv/g-base" "^0.5.1" - "@antv/g-math" "^0.1.1" - "@antv/matrix-util" "^3.1.0-beta.3" - "@antv/path-util" "^2.0.3" - "@antv/util" "~2.0.5" - ml-matrix "^6.5.0" - tslib "^2.6.2" - -"@antv/g6-element@0.8.24": - version "0.8.24" - resolved "https://registry.yarnpkg.com/@antv/g6-element/-/g6-element-0.8.24.tgz#5cb6eca25a48ed68b4376030c945b45a03730916" - integrity sha512-61FXkt9LY+6EOUtSam1iFTOW2AM59sPVcV1BuPj4dXiD0dluLE+R7d8B/94g1tKDw9tsjhfUQGC7hTXscJRJFw== - dependencies: - "@antv/g-base" "^0.5.1" - "@antv/g6-core" "0.8.24" - "@antv/util" "~2.0.5" - tslib "^2.6.2" - -"@antv/g6-pc@0.8.24": - version "0.8.24" - resolved "https://registry.yarnpkg.com/@antv/g6-pc/-/g6-pc-0.8.24.tgz#bc1ad15c7ad691b71d18f00768fdbe7e2bd869c6" - integrity sha512-nf0y1lrp8J5DotqRryXd2S/J30COW8spVcLF9gUqywGqQAHfE00Ywkqr+PZBnsfCZXsXCi9o0+CE9NrkWs4SBQ== - dependencies: - "@ant-design/colors" "^4.0.5" - "@antv/algorithm" "^0.1.26" - "@antv/dom-util" "^2.0.1" - "@antv/event-emitter" "~0.1.0" - "@antv/g-base" "^0.5.1" - "@antv/g-canvas" "^0.5.2" - "@antv/g-math" "^0.1.1" - "@antv/g-svg" "^0.5.1" - "@antv/g6-core" "0.8.24" - "@antv/g6-element" "0.8.24" - "@antv/g6-plugin" "0.8.24" - "@antv/hierarchy" "^0.6.10" - "@antv/layout" "^0.3.0" - "@antv/matrix-util" "^3.1.0-beta.3" - "@antv/path-util" "^2.0.3" - "@antv/util" "~2.0.5" - color "^3.1.3" - d3-force "^2.0.1" + "@antv/component" "^2.1.3" + "@antv/event-emitter" "^0.1.3" + "@antv/g" "^6.1.24" + "@antv/g-canvas" "^2.0.43" + "@antv/g-plugin-dragndrop" "^2.0.35" + "@antv/graphlib" "^2.0.4" + "@antv/hierarchy" "^0.6.14" + "@antv/layout" "1.2.14-beta.9" + "@antv/util" "^3.3.10" + bubblesets-js "^2.3.4" + +"@antv/g@^6.1.11", "@antv/g@^6.1.24": + version "6.1.25" + resolved "https://registry.yarnpkg.com/@antv/g/-/g-6.1.25.tgz#95d31c17156c622250274d5a2f937b979b5e3b31" + integrity sha512-qkXztWRVYQDl/x3tlA9Oww5DwaBCDDYXq6Wai9jfO8TZeIV3T8Dbw5eG/M115doyHX2vIVRkrE6+xiFe5weIHQ== + dependencies: + "@antv/g-camera-api" "2.0.38" + "@antv/g-dom-mutation-observer-api" "2.0.35" + "@antv/g-lite" "2.2.19" + "@antv/g-web-animations-api" "2.1.25" + "@babel/runtime" "^7.25.6" + +"@antv/graphlib@^2.0.0", "@antv/graphlib@^2.0.4": + version "2.0.4" + resolved "https://registry.yarnpkg.com/@antv/graphlib/-/graphlib-2.0.4.tgz#7cc4352c91125f1a3ec13852220286fe590568ee" + integrity sha512-zc/5oQlsdk42Z0ib1mGklwzhJ5vczLFiPa1v7DgJkTbgJ2YxRh9xdarf86zI49sKVJmgbweRpJs7Nu5bIiwv4w== + dependencies: + "@antv/event-emitter" "^0.1.3" + +"@antv/hierarchy@^0.6.14": + version "0.6.14" + resolved "https://registry.yarnpkg.com/@antv/hierarchy/-/hierarchy-0.6.14.tgz#4e8b4966c9c2a44aaa6f9da7008c4bd44d490385" + integrity sha512-V3uknf7bhynOqQDw2sg+9r9DwZ9pc6k/EcqyTFdfXB1+ydr7urisP0MipIuimucvQKN+Qkd+d6w601r1UIroqQ== + +"@antv/layout@1.2.14-beta.9": + version "1.2.14-beta.9" + resolved "https://registry.yarnpkg.com/@antv/layout/-/layout-1.2.14-beta.9.tgz#5c66a0f22158c545aabd1654a50bfc8c3bf93f98" + integrity sha512-wPlwBFMtq2lWZFc89/7Lzb8fjHnyKVZZ9zBb2h+zZIP0YWmVmHRE8+dqCiPKOyOGUXEdDtn813f1g107dCHZlg== + dependencies: + "@antv/event-emitter" "^0.1.3" + "@antv/graphlib" "^2.0.0" + "@antv/util" "^3.3.2" + "@naoak/workerize-transferable" "^0.1.0" + comlink "^4.4.1" + d3-force "^3.0.0" + d3-force-3d "^3.0.5" + d3-octree "^1.0.2" + d3-quadtree "^3.0.1" dagre "^0.8.5" - insert-css "^2.0.0" - ml-matrix "^6.5.0" - tslib "^2.6.2" - -"@antv/g6-plugin@0.8.24": - version "0.8.24" - resolved "https://registry.yarnpkg.com/@antv/g6-plugin/-/g6-plugin-0.8.24.tgz#f59a7eb6820ae6fb8767b4a8da12bcbd3a43bc44" - integrity sha512-ZIOnwLTC7SM2bFiJZ3vYFWnkyOCWKqnU96i/fBh1qAoY5slDS3hatenZWEXUtOcqaKw1h+5A5f72MRXqBBVn0g== - dependencies: - "@antv/dom-util" "^2.0.2" - "@antv/g-base" "^0.5.1" - "@antv/g-canvas" "^0.5.2" - "@antv/g-svg" "^0.5.2" - "@antv/g6-core" "0.8.24" - "@antv/g6-element" "0.8.24" - "@antv/matrix-util" "^3.1.0-beta.3" - "@antv/path-util" "^2.0.3" - "@antv/scale" "^0.3.4" - "@antv/util" "^2.0.9" - insert-css "^2.0.0" - -"@antv/g6@^4.8.24": - version "4.8.24" - resolved "https://registry.yarnpkg.com/@antv/g6/-/g6-4.8.24.tgz#803c7cbe3a345194d7fb0f8c68a5200d65f2c333" - integrity sha512-bgj7sZ+z45JmOngIpYpwmSIg7SboMLZBoAlX0+RoAETZB3/xvZO0MXT3lCSyAhIgm5Sb68pekKi7OStuo04NyQ== - dependencies: - "@antv/g6-pc" "0.8.24" - -"@antv/graphlib@^1.0.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@antv/graphlib/-/graphlib-1.2.0.tgz#c88f97d4b3456d261480a1207ffc4fbc5d7dcf0d" - integrity sha512-hhJOMThec51nU4Fe5p/viLlNIL71uDEgYFzKPajWjr2715SFG1HAgiP6AVylIeqBcAZ04u3Lw7usjl/TuI5RuQ== - -"@antv/hierarchy@^0.6.10": - version "0.6.11" - resolved "https://registry.yarnpkg.com/@antv/hierarchy/-/hierarchy-0.6.11.tgz#244d6820347170e0107f3611802d1e5bb089ca7a" - integrity sha512-RJVhEMCuu4vj+Dt25lXIiNdd7jaqm/fqWGYikiELha4S5tnzdJoTUaUvvpfWlxLx4B0RsS9XRwBs1bOKN71TKg== - dependencies: - "@antv/util" "^2.0.7" - -"@antv/layout@^0.3.0": - version "0.3.20" - resolved "https://registry.yarnpkg.com/@antv/layout/-/layout-0.3.20.tgz#d5dd2b651e1b71b5be5b5c07c3d41b2bebb7c50e" - integrity sha512-4Zo3xnYEx4lmFPLn6Mj3Ur856qCi1PxNFIMygaJ3PgPTqucCEYwljBJBTcf8FVB1ylE3o2+CIDDNU+zuNbXdEw== - dependencies: - "@antv/g-webgpu" "0.7.2" - "@antv/graphlib" "^1.0.0" - d3-force "^2.1.1" - d3-quadtree "^2.0.0" - dagre-compound "^0.0.11" - ml-matrix "^6.5.0" - -"@antv/matrix-util@^3.0.4": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@antv/matrix-util/-/matrix-util-3.0.4.tgz#ea13f158aa2fb4ba2fb8d6b6b561ec467ea3ac20" - integrity sha512-BAPyu6dUliHcQ7fm9hZSGKqkwcjEDVLVAstlHULLvcMZvANHeLXgHEgV7JqcAV/GIhIz8aZChIlzM1ZboiXpYQ== - dependencies: - "@antv/util" "^2.0.9" - gl-matrix "^3.3.0" - tslib "^2.0.3" - -"@antv/matrix-util@^3.1.0-beta.1", "@antv/matrix-util@^3.1.0-beta.3": - version "3.1.0-beta.3" - resolved "https://registry.yarnpkg.com/@antv/matrix-util/-/matrix-util-3.1.0-beta.3.tgz#e061de8fa7be04605a155c69cc5ce9082eedddee" - integrity sha512-W2R6Za3A6CmG51Y/4jZUM/tFgYSq7vTqJL1VD9dKrvwxS4sE0ZcXINtkp55CdyBwJ6Cwm8pfoRpnD4FnHahN0A== - dependencies: - "@antv/util" "^2.0.9" - gl-matrix "^3.4.3" - tslib "^2.0.3" - -"@antv/path-util@^2.0.3", "@antv/path-util@~2.0.5": - version "2.0.15" - resolved "https://registry.yarnpkg.com/@antv/path-util/-/path-util-2.0.15.tgz#a6f691dfc8b7bce5be7f0aabb5bd614964325631" - integrity sha512-R2VLZ5C8PLPtr3VciNyxtjKqJ0XlANzpFb5sE9GE61UQqSRuSVSzIakMxjEPrpqbgc+s+y8i+fmc89Snu7qbNw== - dependencies: - "@antv/matrix-util" "^3.0.4" - "@antv/util" "^2.0.9" - tslib "^2.0.3" + ml-matrix "^6.10.4" + tslib "^2.5.0" -"@antv/scale@^0.3.4": - version "0.3.18" - resolved "https://registry.yarnpkg.com/@antv/scale/-/scale-0.3.18.tgz#b911f431b3e0b9547b6a65f66d0d3fa295b5ef32" - integrity sha512-GHwE6Lo7S/Q5fgaLPaCsW+CH+3zl4aXpnN1skOiEY0Ue9/u+s2EySv6aDXYkAqs//i0uilMDD/0/4n8caX9U9w== +"@antv/scale@^0.4.16": + version "0.4.16" + resolved "https://registry.yarnpkg.com/@antv/scale/-/scale-0.4.16.tgz#60557470668ccfe5217e482a01f05c0cbb706b62" + integrity sha512-5wg/zB5kXHxpTV5OYwJD3ja6R8yTiqIOkjOhmpEJiowkzRlbEC/BOyMvNUq5fqFIHnMCE9woO7+c3zxEQCKPjw== dependencies: - "@antv/util" "~2.0.3" - fecha "~4.2.0" - tslib "^2.0.0" + "@antv/util" "^3.3.7" + color-string "^1.5.5" + fecha "^4.2.1" -"@antv/util@^2.0.13", "@antv/util@^2.0.7", "@antv/util@^2.0.9", "@antv/util@~2.0.0", "@antv/util@~2.0.13", "@antv/util@~2.0.3", "@antv/util@~2.0.5": +"@antv/util@^2.0.13": version "2.0.17" resolved "https://registry.yarnpkg.com/@antv/util/-/util-2.0.17.tgz#e8ef42aca7892815b229269f3dd10c6b3c7597a9" integrity sha512-o6I9hi5CIUvLGDhth0RxNSFDRwXeywmt6ExR4+RmVAzIi48ps6HUy+svxOCayvrPBN37uE6TAc2KDofRo0nK9Q== @@ -273,6 +267,62 @@ csstype "^3.0.8" tslib "^2.0.3" +"@antv/util@^3.3.10", "@antv/util@^3.3.2", "@antv/util@^3.3.5", "@antv/util@^3.3.7": + version "3.3.10" + resolved "https://registry.yarnpkg.com/@antv/util/-/util-3.3.10.tgz#6fb2560c0f42df61f824e1f995a1ed1bdb00eb9a" + integrity sha512-basGML3DFA3O87INnzvDStjzS+n0JLEhRnRsDzP9keiXz8gT1z/fTdmJAZFOzMMWxy+HKbi7NbSt0+8vz/OsBQ== + dependencies: + fast-deep-equal "^3.1.3" + gl-matrix "^3.3.0" + tslib "^2.3.1" + +"@antv/vendor@^1.0.3": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@antv/vendor/-/vendor-1.0.11.tgz#8a87aa964410d9fcc431a74c8757021a942252f2" + integrity sha512-LmhPEQ+aapk3barntaiIxJ5VHno/Tyab2JnfdcPzp5xONh/8VSfed4bo/9xKo5HcUAEydko38vYLfj6lJliLiw== + dependencies: + "@types/d3-array" "^3.2.1" + "@types/d3-color" "^3.1.3" + "@types/d3-dispatch" "^3.0.6" + "@types/d3-dsv" "^3.0.7" + "@types/d3-ease" "^3.0.2" + "@types/d3-fetch" "^3.0.7" + "@types/d3-force" "^3.0.10" + "@types/d3-format" "^3.0.4" + "@types/d3-geo" "^3.1.0" + "@types/d3-hierarchy" "^3.1.7" + "@types/d3-interpolate" "^3.0.4" + "@types/d3-path" "^3.1.0" + "@types/d3-quadtree" "^3.0.6" + "@types/d3-random" "^3.0.3" + "@types/d3-scale" "^4.0.9" + "@types/d3-scale-chromatic" "^3.1.0" + "@types/d3-shape" "^3.1.7" + "@types/d3-time" "^3.0.4" + "@types/d3-timer" "^3.0.2" + d3-array "^3.2.4" + d3-color "^3.1.0" + d3-dispatch "^3.0.1" + d3-dsv "^3.0.1" + d3-ease "^3.0.1" + d3-fetch "^3.0.1" + d3-force "^3.0.0" + d3-force-3d "^3.0.5" + d3-format "^3.1.0" + d3-geo "^3.1.1" + d3-geo-projection "^4.0.0" + d3-hierarchy "^3.1.2" + d3-interpolate "^3.0.1" + d3-path "^3.1.0" + d3-quadtree "^3.0.1" + d3-random "^3.0.1" + d3-regression "^1.3.10" + d3-scale "^4.0.2" + d3-scale-chromatic "^3.1.0" + d3-shape "^3.2.0" + d3-time "^3.1.0" + d3-timer "^3.0.1" + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6", "@babel/code-frame@^7.21.4": version "7.21.4" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.21.4.tgz#d0fa9e4413aca81f2b23b9442797bda1826edb39" @@ -523,13 +573,18 @@ dependencies: "@babel/helper-plugin-utils" "^7.20.2" -"@babel/runtime@^7.0.0", "@babel/runtime@^7.12.5": +"@babel/runtime@^7.12.5": version "7.21.0" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.0.tgz#5b55c9d394e5fcf304909a8b00c07dc217b56673" integrity sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw== dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.25.6": + version "7.27.4" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.4.tgz#a91ec580e6c00c67118127777c316dfd5a5a6abf" + integrity sha512-t3yaEOuGu9NlIZ+hIeGbBjFtZT7j2cb2tg0fuaJKeGotchRjjLfrBA9Kwf8quhpP1EUuxModQg04q/mBwyg8uA== + "@babel/runtime@^7.9.2": version "7.22.15" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.15.tgz#38f46494ccf6cf020bd4eed7124b425e83e523b8" @@ -576,27 +631,25 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@commitlint/cli@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-18.6.0.tgz#f065e0514f3870b6dc9a3c608a78820806b46527" - integrity sha512-FiH23cr9QG8VdfbmvJJZmdfHGVMCouOOAzoXZ3Cd7czGC52RbycwNt8YCI7SA69pAl+t30vh8LMaO/N+kcel6w== - dependencies: - "@commitlint/format" "^18.6.0" - "@commitlint/lint" "^18.6.0" - "@commitlint/load" "^18.6.0" - "@commitlint/read" "^18.6.0" - "@commitlint/types" "^18.6.0" - execa "^5.0.0" - lodash.isfunction "^3.0.9" - resolve-from "5.0.0" - resolve-global "1.0.0" +"@commitlint/cli@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-19.8.1.tgz#85f7d9f331344e1f0a2b9d8b24fd3695466e1158" + integrity sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA== + dependencies: + "@commitlint/format" "^19.8.1" + "@commitlint/lint" "^19.8.1" + "@commitlint/load" "^19.8.1" + "@commitlint/read" "^19.8.1" + "@commitlint/types" "^19.8.1" + tinyexec "^1.0.0" yargs "^17.0.0" -"@commitlint/config-conventional@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-18.6.0.tgz#88da3e34e2bfcd8a5d46bcc472553e7f63f35323" - integrity sha512-CDCOf2eJz9D/TL44IBks0stM9TmdLCNE2B48owIU3YCadwzts/bobXPScagIgPQF6hhKYMEdj5zpUDlmbwuqwQ== +"@commitlint/config-conventional@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-conventional/-/config-conventional-19.8.1.tgz#eab42df58cda44f18410ae0cbd6785ece00f214b" + integrity sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ== dependencies: + "@commitlint/types" "^19.8.1" conventional-changelog-conventionalcommits "^7.0.2" "@commitlint/config-validator@^17.4.4": @@ -607,20 +660,20 @@ "@commitlint/types" "^17.4.4" ajv "^8.11.0" -"@commitlint/config-validator@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-18.6.0.tgz#ea1e04e92829dd7b90cea444f245b0bdefa0a586" - integrity sha512-Ptfa865arNozlkjxrYG3qt6wT9AlhNUHeuDyKEZiTL/l0ftncFhK/KN0t/EAMV2tec+0Mwxo0FmhbESj/bI+1g== +"@commitlint/config-validator@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-19.8.1.tgz#29e9bb1360fa41b9439b23d8e25deaaf097306b5" + integrity sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ== dependencies: - "@commitlint/types" "^18.6.0" + "@commitlint/types" "^19.8.1" ajv "^8.11.0" -"@commitlint/ensure@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-18.6.0.tgz#3f3dc09d99016eaab0da9423123effd820d11931" - integrity sha512-xY07NmOBJ7JuhX3tic021PaeLepZARIQyqpAQoNQZoml1keBFfB6MbA7XlWZv0ebbarUFE4yhKxOPw+WFv7/qw== +"@commitlint/ensure@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-19.8.1.tgz#938c54d6f586bda600b5c8e8e842edb281546e14" + integrity sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw== dependencies: - "@commitlint/types" "^18.6.0" + "@commitlint/types" "^19.8.1" lodash.camelcase "^4.3.0" lodash.kebabcase "^4.1.1" lodash.snakecase "^4.1.1" @@ -632,36 +685,36 @@ resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz#4518e77958893d0a5835babe65bf87e2638f6939" integrity sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA== -"@commitlint/execute-rule@^18.4.4": - version "18.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-18.4.4.tgz#ade986742c1944c8162a54288747e54a8c6146b5" - integrity sha512-a37Nd3bDQydtg9PCLLWM9ZC+GO7X5i4zJvrggJv5jBhaHsXeQ9ZWdO6ODYR+f0LxBXXNYK3geYXJrCWUCP8JEg== +"@commitlint/execute-rule@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-19.8.1.tgz#53000363b737773e2d25e97c20f15eaa78742067" + integrity sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA== -"@commitlint/format@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-18.6.0.tgz#e13ef8419cd8eb37be5825a2e84e73cabbfb56ad" - integrity sha512-8UNWfs2slPPSQiiVpLGJTnPHv7Jkd5KYxfbNXbmLL583bjom4RrylvyrCVnmZReA8nNad7pPXq6mDH4FNVj6xg== +"@commitlint/format@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-19.8.1.tgz#3e09b1291b3e29092d7a86f0afbbcfc0d99d3ad4" + integrity sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw== dependencies: - "@commitlint/types" "^18.6.0" - chalk "^4.1.0" + "@commitlint/types" "^19.8.1" + chalk "^5.3.0" -"@commitlint/is-ignored@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-18.6.0.tgz#d15ab04f547f7554cc3377d50f8e19178502b8af" - integrity sha512-Xjx/ZyyJ4FdLuz0FcOvqiqSFgiO2yYj3QN9XlvyrxqbXTxPVC7QFEXJYBVPulUSN/gR7WXH1Udw+HYYfD17xog== +"@commitlint/is-ignored@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-19.8.1.tgz#fed0851360ea2d21799eaf8ec9ef6d98c15536e3" + integrity sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg== dependencies: - "@commitlint/types" "^18.6.0" - semver "7.5.4" + "@commitlint/types" "^19.8.1" + semver "^7.6.0" -"@commitlint/lint@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-18.6.0.tgz#f54c856840a6238e0c2972588c2dc986317f1b7b" - integrity sha512-ycbuDWfyykPmslgiHzhz8dL6F0BJYltXLVfc+M49z0c+FNITM0v+r0Vd2+Tdtq06VTc894p2+YSmZhulY8Jn3Q== +"@commitlint/lint@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-19.8.1.tgz#c21bf9000ca54e41c5b0139c98aaf12473c03bb0" + integrity sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw== dependencies: - "@commitlint/is-ignored" "^18.6.0" - "@commitlint/parse" "^18.6.0" - "@commitlint/rules" "^18.6.0" - "@commitlint/types" "^18.6.0" + "@commitlint/is-ignored" "^19.8.1" + "@commitlint/parse" "^19.8.1" + "@commitlint/rules" "^19.8.1" + "@commitlint/types" "^19.8.1" "@commitlint/load@>6.1.1": version "17.5.0" @@ -683,46 +736,46 @@ ts-node "^10.8.1" typescript "^4.6.4 || ^5.0.0" -"@commitlint/load@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-18.6.0.tgz#98108294b9383aa2905781b192215df4718babb7" - integrity sha512-RRssj7TmzT0bowoEKlgwg8uQ7ORXWkw7lYLsZZBMi9aInsJuGNLNWcMxJxRZbwxG3jkCidGUg85WmqJvRjsaDA== - dependencies: - "@commitlint/config-validator" "^18.6.0" - "@commitlint/execute-rule" "^18.4.4" - "@commitlint/resolve-extends" "^18.6.0" - "@commitlint/types" "^18.6.0" - chalk "^4.1.0" - cosmiconfig "^8.3.6" - cosmiconfig-typescript-loader "^5.0.0" +"@commitlint/load@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-19.8.1.tgz#b997b1f65a961bf0a47189f15f6dc8786ceb4576" + integrity sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A== + dependencies: + "@commitlint/config-validator" "^19.8.1" + "@commitlint/execute-rule" "^19.8.1" + "@commitlint/resolve-extends" "^19.8.1" + "@commitlint/types" "^19.8.1" + chalk "^5.3.0" + cosmiconfig "^9.0.0" + cosmiconfig-typescript-loader "^6.1.0" lodash.isplainobject "^4.0.6" lodash.merge "^4.6.2" lodash.uniq "^4.5.0" - resolve-from "^5.0.0" -"@commitlint/message@^18.4.4": - version "18.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-18.4.4.tgz#811682a0d147a24e5c467acdb52071434df2b9f5" - integrity sha512-lHF95mMDYgAI1LBXveJUyg4eLaMXyOqJccCK3v55ZOEUsMPrDi8upqDjd/NmzWmESYihaOMBTAnxm+6oD1WoDQ== +"@commitlint/message@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-19.8.1.tgz#d5d0d87837483d9f9b4559ffa06e1aaa26d266d6" + integrity sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg== -"@commitlint/parse@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-18.6.0.tgz#ae19ff8ceb0c8ffab131158829b06b505b9921fd" - integrity sha512-Y/G++GJpATFw54O0jikc/h2ibyGHgghtPnwsOk3O/aU092ydJ5XEHYcd7xGNQYuLweLzQis2uEwRNk9AVIPbQQ== +"@commitlint/parse@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-19.8.1.tgz#73125d04f07f11477cf563cbfe0cc9f6dc85a747" + integrity sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw== dependencies: - "@commitlint/types" "^18.6.0" + "@commitlint/types" "^19.8.1" conventional-changelog-angular "^7.0.0" conventional-commits-parser "^5.0.0" -"@commitlint/read@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-18.6.0.tgz#324ea1fa625f88427780df23fffe4a92d383d665" - integrity sha512-w39ji8VfWhPKRquPhRHB3Yd8XIHwaNHgOh28YI1QEmZ59qVpuVUQo6h/NsVb+uoC6LbXZiofTZv2iFR084jKEA== +"@commitlint/read@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-19.8.1.tgz#812930fd0f616e796e122751cb983346e5454ec8" + integrity sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ== dependencies: - "@commitlint/top-level" "^18.4.4" - "@commitlint/types" "^18.6.0" - git-raw-commits "^2.0.11" - minimist "^1.2.6" + "@commitlint/top-level" "^19.8.1" + "@commitlint/types" "^19.8.1" + git-raw-commits "^4.0.0" + minimist "^1.2.8" + tinyexec "^1.0.0" "@commitlint/resolve-extends@^17.4.4": version "17.4.4" @@ -736,40 +789,39 @@ resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/resolve-extends@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-18.6.0.tgz#db55be2b32e12593bc98dc44c6d9a9d90941bab4" - integrity sha512-k2Xp+Fxeggki2i90vGrbiLDMefPius3zGSTFFlRAPKce/SWLbZtI+uqE9Mne23mHO5lmcSV8z5m6ziiJwGpOcg== +"@commitlint/resolve-extends@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-19.8.1.tgz#a44bb4c22e3e7d407cc9a3758fcf58f5c360b694" + integrity sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg== dependencies: - "@commitlint/config-validator" "^18.6.0" - "@commitlint/types" "^18.6.0" - import-fresh "^3.0.0" + "@commitlint/config-validator" "^19.8.1" + "@commitlint/types" "^19.8.1" + global-directory "^4.0.1" + import-meta-resolve "^4.0.0" lodash.mergewith "^4.6.2" resolve-from "^5.0.0" - resolve-global "^1.0.0" -"@commitlint/rules@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-18.6.0.tgz#6d933e2de5639b75b4946120b3880e72e66a6051" - integrity sha512-pTalvCEvuCWrBWZA/YqO/3B3nZnY3Ncc+TmQsRajBdC1tkQIm5Iovdo4Ec7f2Dw1tVvpYMUUNAgcWqsY0WckWg== +"@commitlint/rules@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-19.8.1.tgz#1cea53d5bf970ce56dc105e1da5e6655a2fe7a5f" + integrity sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw== dependencies: - "@commitlint/ensure" "^18.6.0" - "@commitlint/message" "^18.4.4" - "@commitlint/to-lines" "^18.4.4" - "@commitlint/types" "^18.6.0" - execa "^5.0.0" + "@commitlint/ensure" "^19.8.1" + "@commitlint/message" "^19.8.1" + "@commitlint/to-lines" "^19.8.1" + "@commitlint/types" "^19.8.1" -"@commitlint/to-lines@^18.4.4": - version "18.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-18.4.4.tgz#546cf8d985459f3526359b6a63d7a5b421e1ed60" - integrity sha512-mwe2Roa59NCz/krniAdCygFabg7+fQCkIhXqBHw00XQ8Y7lw4poZLLxeGI3p3bLpcEOXdqIDrEGLwHmG5lBdwQ== +"@commitlint/to-lines@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-19.8.1.tgz#c1a28a84542c7ba321c1c11178b83ae024257b47" + integrity sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg== -"@commitlint/top-level@^18.4.4": - version "18.4.4" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-18.4.4.tgz#df69ffa49fdc4541d1f05e814352d575fb0f3b0d" - integrity sha512-PBwW1drgeavl9CadB7IPRUk6rkUP/O8jEkxjlC+ofuh3pw0bzJdAT+Kw7M1Yc9KtTb9xTaqUB8uvRtaybHa/tQ== +"@commitlint/top-level@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-19.8.1.tgz#2c942189d83a29b21ff7ba6e91607301efdf5916" + integrity sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw== dependencies: - find-up "^5.0.0" + find-up "^7.0.0" "@commitlint/types@^17.4.4": version "17.4.4" @@ -778,12 +830,13 @@ dependencies: chalk "^4.1.0" -"@commitlint/types@^18.6.0": - version "18.6.0" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-18.6.0.tgz#3d3493cb5910f60f3749a8eb56aca47dc2e1b662" - integrity sha512-oavoKLML/eJa2rJeyYSbyGAYzTxQ6voG5oeX3OrxpfrkRWhJfm4ACnhoRf5tgiybx2MZ+EVFqC1Lw3W8/uwpZA== +"@commitlint/types@^19.8.1": + version "19.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-19.8.1.tgz#7971fbd56b0cfb31692a4e1941b74ac8217c44e5" + integrity sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw== dependencies: - chalk "^4.1.0" + "@types/conventional-commits-parser" "^5.0.0" + chalk "^5.3.0" "@cspotcode/source-map-support@^0.8.0": version "0.8.1" @@ -797,18 +850,6 @@ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== -"@emotion/is-prop-valid@^0.8.2": - version "0.8.8" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" - integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== - dependencies: - "@emotion/memoize" "0.7.4" - -"@emotion/memoize@0.7.4": - version "0.7.4" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" - integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== - "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" @@ -1210,6 +1251,11 @@ dependencies: "@monaco-editor/loader" "^1.4.0" +"@naoak/workerize-transferable@^0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@naoak/workerize-transferable/-/workerize-transferable-0.1.0.tgz#864cc8241b977bffd8661c0be1441da9b4bfb633" + integrity sha512-fDLfuP71IPNP5+zSfxFb52OHgtjZvauRJWbVnpzQ7G7BjcbLjTny0OW1d3ZO806XKpLWNKmeeW3MhE0sy8iwYQ== + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -1231,122 +1277,78 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@patternfly/patternfly@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@patternfly/patternfly/-/patternfly-5.2.0.tgz#896c46426e950e954f4baa05d2b7c142cf700936" - integrity sha512-phdsXcCRO+JICFXIKtORxSbOWoBr9zRCgtFTKTJ8hAIzm6wEUCdcHZrvsd+SXNR3q/4b/+KlmHUC4Q4KGUiuYw== +"@patternfly/patternfly@^6.2.3": + version "6.2.3" + resolved "https://registry.yarnpkg.com/@patternfly/patternfly/-/patternfly-6.2.3.tgz#cf7678e442aa31101befe389651bca4256fd1c7f" + integrity sha512-FR027W7JygcQpvlRU/Iom936Vm0apzfi2o5lvtlcWW6IaeZCCTtTaDxehoYuELHlemzkLziQAgu6LuCJEVayjw== -"@patternfly/react-charts@^7.2.0": - version "7.2.0" - resolved "https://registry.yarnpkg.com/@patternfly/react-charts/-/react-charts-7.2.0.tgz#cff55c5e2659ae665d4532b330053651ef9c5c53" - integrity sha512-IDg5KfF4VK/4C8qXfnFz9Tsq041RFJlHOGAH5Blb2ZTzTXp7ssZtuPxZvqqKxnIfAoMO+sy9DM8+vgvYPeH0aw== +"@patternfly/react-charts@^8.2.2": + version "8.2.2" + resolved "https://registry.yarnpkg.com/@patternfly/react-charts/-/react-charts-8.2.2.tgz#5aa320ed889ebd005b160e32c5450f0ae27676f5" + integrity sha512-p9mCCfW2WbuyZkMR1hcpRpv6U76IQ09CXiZfI8Pegpxw5yLnyjBeVZTwawdfXGYHAl4imvBzh8UuFbRaCR6pHA== dependencies: - "@patternfly/react-styles" "^5.2.0" - "@patternfly/react-tokens" "^5.2.0" - hoist-non-react-statics "^3.3.0" + "@patternfly/react-styles" "^6.2.2" + "@patternfly/react-tokens" "^6.2.2" + hoist-non-react-statics "^3.3.2" lodash "^4.17.21" - tslib "^2.5.0" - victory-area "^36.8.1" - victory-axis "^36.8.1" - victory-bar "^36.8.1" - victory-box-plot "^36.8.1" - victory-chart "^36.8.1" - victory-core "^36.8.1" - victory-create-container "^36.8.1" - victory-cursor-container "^36.8.1" - victory-group "^36.8.1" - victory-legend "^36.8.1" - victory-line "^36.8.1" - victory-pie "^36.8.1" - victory-scatter "^36.8.1" - victory-stack "^36.8.1" - victory-tooltip "^36.8.1" - victory-voronoi-container "^36.8.1" - victory-zoom-container "^36.8.1" - -"@patternfly/react-code-editor@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@patternfly/react-code-editor/-/react-code-editor-5.2.0.tgz#f328cd96838452cdfb6df5bf230dc9bdcc309e0e" - integrity sha512-+VDGxNPJvKq3zDvCWZZYHx6wzle1yZ0WILQMZ9+HZyxzmjJmFJWv39VEwicDGrbPg8k+JfSwCL/PC6DAwx9pDA== + tslib "^2.8.1" + +"@patternfly/react-code-editor@^6.2.2": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@patternfly/react-code-editor/-/react-code-editor-6.2.2.tgz#a2b76931fcb06e748d0ed70fa870c854538ed82d" + integrity sha512-KPnkNP769afD2rvoNQtgCx+SYscamM5QSRmw2FJ9QPHVMksarwTsMvrdMxvu+n6Dhs/T40vQLU5UR7X2yPrURg== dependencies: "@monaco-editor/react" "^4.6.0" - "@patternfly/react-core" "^5.2.0" - "@patternfly/react-icons" "^5.2.0" - "@patternfly/react-styles" "^5.2.0" - react-dropzone "14.2.3" - tslib "^2.5.0" + "@patternfly/react-core" "^6.2.2" + "@patternfly/react-icons" "^6.2.2" + "@patternfly/react-styles" "^6.2.2" + react-dropzone "14.3.5" + tslib "^2.8.1" -"@patternfly/react-core@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@patternfly/react-core/-/react-core-5.2.0.tgz#85abcce50e5e6aa08c5f4a377422374b987faf40" - integrity sha512-AUd7jccCgE2ZRwVtpEbJNF2Sq1A//ZhRaEQ/QHZiiq8mQRQM0Bkpnx0HdefToZT+TgUIjmPW4AXO3ooRJmt26w== - dependencies: - "@patternfly/react-icons" "^5.2.0" - "@patternfly/react-styles" "^5.2.0" - "@patternfly/react-tokens" "^5.2.0" - focus-trap "7.5.2" - react-dropzone "^14.2.3" - tslib "^2.5.0" +"@patternfly/react-core@^6.2.2": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@patternfly/react-core/-/react-core-6.2.2.tgz#8965a727b64506366bdf4682bf86b9c2c7fc0fb3" + integrity sha512-JUrZ57JQ4bkmed1kxaciXb0ZpIVYyCHc2HjtzoKQ5UNRlx204zR2isATSHjdw2GFcWvwpkC5/fU2BR+oT3opbg== + dependencies: + "@patternfly/react-icons" "^6.2.2" + "@patternfly/react-styles" "^6.2.2" + "@patternfly/react-tokens" "^6.2.2" + focus-trap "7.6.4" + react-dropzone "^14.3.5" + tslib "^2.8.1" -"@patternfly/react-icons@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@patternfly/react-icons/-/react-icons-5.2.0.tgz#65080fdbf5b4ea375f59f5ff64dc981372db006c" - integrity sha512-vklAF2unvtK0trwx9Kk8nf4Xa2+nie4zxaIaQdnjIL7kX6a5SdsewDjlavOC3cRxnibZLQ5HQtpDZ4EmuXm8DQ== +"@patternfly/react-icons@^6.2.2": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@patternfly/react-icons/-/react-icons-6.2.2.tgz#6b19359df7618ea4ec6aa6da3af2a9a287666f23" + integrity sha512-XkBwzuV/uiolX+T6QgB3RIqphM1m+vAZjAe3McYtyY22j1rsOdlWDE4RtRrJ1q7EoIZwyZHj0h8T9vMfUsLn4Q== -"@patternfly/react-styles@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@patternfly/react-styles/-/react-styles-5.2.0.tgz#5e2ffd1270f252844acddb1b45b4e70fefbc72c6" - integrity sha512-u8in9RSU8YzcT0npgVeiIHi1Bdp7UdER9azWGi7vlJWooRI1hgQjIDpm22wopGFg0h8VOqhfIFWIyvqxuzhW6A== +"@patternfly/react-styles@^6.2.2": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@patternfly/react-styles/-/react-styles-6.2.2.tgz#ff6d31266ba03df9be8095f189d1399a8cc3b66d" + integrity sha512-rncRDq66H8VnLyb9DrHHlZtPddlpNL9+W0XuQC0L7F6p78hOwSZmoGTW2Vq8/wJplDj8h/61qRpfRF9VEYPW0g== -"@patternfly/react-table@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@patternfly/react-table/-/react-table-5.2.0.tgz#b2fdaa5ca4ed647503e4eae71165a16823f802de" - integrity sha512-Pd+llSuAU9i1dvteQL1keEXmsQv6d8x4+F2arqGQS1umeOR3lvvycyFac1OboJ4oV2rAX97GVmtZdoJjaqxdhg== - dependencies: - "@patternfly/react-core" "^5.2.0" - "@patternfly/react-icons" "^5.2.0" - "@patternfly/react-styles" "^5.2.0" - "@patternfly/react-tokens" "^5.2.0" - lodash "^4.17.19" - tslib "^2.5.0" +"@patternfly/react-table@^6.2.2": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@patternfly/react-table/-/react-table-6.2.2.tgz#9ca4f1b4e5558cafd712c66a599b097a475acb30" + integrity sha512-7CxVKhnpA+f8dLJ0hVvzZOe4Djx/nE+w70ipeAHf4Yi5JwfDWmbK97YvjYPfamp/bsXTLtPcK2n4AoY5DQX6Pg== + dependencies: + "@patternfly/react-core" "^6.2.2" + "@patternfly/react-icons" "^6.2.2" + "@patternfly/react-styles" "^6.2.2" + "@patternfly/react-tokens" "^6.2.2" + lodash "^4.17.21" + tslib "^2.8.1" -"@patternfly/react-tokens@^5.2.0": - version "5.2.0" - resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-5.2.0.tgz#525aa82c9b280eca32cc48987fd70e3da1e08422" - integrity sha512-ZsrLpStHJQfvUJLIXT+cObJbA3jM4r9iWwULLva0s7DzznXJ6iIACQQfgwDtcSVyM95z5S1a/LHPj/wYgaqUIg== +"@patternfly/react-tokens@^6.2.2": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-6.2.2.tgz#4ab12cf77fab60a730f52aed2433dbf892d47509" + integrity sha512-2GRWDPBTrcTlGNFc5NPJjrjEVU90RpgcGX/CIe2MplLgM32tpVIkeUtqIoJPLRk5GrbhyFuHJYRU+O93gU4o3Q== "@polka/url@^1.0.0-next.20": version "1.0.0-next.21" resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== -"@probe.gl/env@3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@probe.gl/env/-/env-3.6.0.tgz#33343fd9041a14d21374c1911826d4a2f9d9a35d" - integrity sha512-4tTZYUg/8BICC3Yyb9rOeoKeijKbZHRXBEKObrfPmX4sQmYB15ZOUpoVBhAyJkOYVAM8EkPci6Uw5dLCwx2BEQ== - dependencies: - "@babel/runtime" "^7.0.0" - -"@probe.gl/log@3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@probe.gl/log/-/log-3.6.0.tgz#c645bfd22b4769dc65161caa17f13bd2b231e413" - integrity sha512-hjpyenpEvOdowgZ1qMeCJxfRD4JkKdlXz0RC14m42Un62NtOT+GpWyKA4LssT0+xyLULCByRAtG2fzZorpIAcA== - dependencies: - "@babel/runtime" "^7.0.0" - "@probe.gl/env" "3.6.0" - -"@probe.gl/stats@3.6.0": - version "3.6.0" - resolved "https://registry.yarnpkg.com/@probe.gl/stats/-/stats-3.6.0.tgz#a1bb12860fa6f40b9c028f9eb575d7ada0b4dbdd" - integrity sha512-JdALQXB44OP4kUBN/UrQgzbJe4qokbVF4Y8lkIA8iVCFnjVowWIgkD/z/0QO65yELT54tTrtepw1jScjKB+rhQ== - dependencies: - "@babel/runtime" "^7.0.0" - -"@remix-run/router@1.15.0": - version "1.15.0" - resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.15.0.tgz#461a952c2872dd82c8b2e9b74c4dfaff569123e2" - integrity sha512-HOil5aFtme37dVQTB6M34G95kPM3MMuqSmIRVCC52eKV+Y/tGSqw9P3rWhlAx6A+mz+MoX+XxsGsNJbaI5qCgQ== - "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" @@ -1393,17 +1395,17 @@ dependencies: "@sinonjs/commons" "^2.0.0" -"@tanstack/query-core@5.18.1": - version "5.18.1" - resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.18.1.tgz#b653ee354b7f4712d53565ccc5c6d8fb83ec866c" - integrity sha512-fYhrG7bHgSNbnkIJF2R4VUXb4lF7EBiQjKkDc5wOlB7usdQOIN4LxxHpDxyE3qjqIst1WBGvDtL48T0sHJGKCw== +"@tanstack/query-core@5.79.0": + version "5.79.0" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.79.0.tgz#947e13c409555a8ca0a17abdf3dff9eb77af45e6" + integrity sha512-s+epTqqLM0/TbJzMAK7OEhZIzh63P9sWz5HEFc5XHL4FvKQXQkcjI8F3nee+H/xVVn7mrP610nVXwOytTSYd0w== -"@tanstack/react-query@^5.18.1": - version "5.18.1" - resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.18.1.tgz#fd4e7b87260e82c5277355ad64f0e431a9302e02" - integrity sha512-PdI07BbsahZ+04PxSuDQsQvBWe008eWFk/YYWzt8fvzt2sALUM0TpAJa/DFpqa7+SSo7j1EQR6Jx6znXNHyaXw== +"@tanstack/react-query@^5.79.0": + version "5.79.0" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.79.0.tgz#91a41d92dcd92b2cd544bafdcc2c2bd7d06396c6" + integrity sha512-DjC4JIYZnYzxaTzbg3osOU63VNLP67dOrWet2cZvXgmgwAXNxfS52AMq86M5++ILuzW+BqTUEVMTjhrZ7/XBuA== dependencies: - "@tanstack/query-core" "5.18.1" + "@tanstack/query-core" "5.79.0" "@testing-library/dom@^9.0.0": version "9.2.0" @@ -1569,25 +1571,76 @@ dependencies: "@types/node" "*" -"@types/d3-array@^3.0.3": - version "3.0.4" - resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.0.4.tgz#44eebe40be57476cad6a0cd6a85b0f57d54185a2" - integrity sha512-nwvEkG9vYOc0Ic7G7kwgviY4AQlTfYGIZ0fqB7CQHXGyYM6nO7kJh5EguSNA3jfh4rq7Sb7eMVq8isuvg2/miQ== +"@types/conventional-commits-parser@^5.0.0": + version "5.0.1" + resolved "https://registry.yarnpkg.com/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.1.tgz#8cb81cf170853496cbc501a3b32dcf5e46ffb61a" + integrity sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ== + dependencies: + "@types/node" "*" + +"@types/d3-array@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" + integrity sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg== "@types/d3-color@*": version "3.1.0" resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.0.tgz#6594da178ded6c7c3842f3cc0ac84b156f12f2d4" integrity sha512-HKuicPHJuvPgCD+np6Se9MQvS6OCbJmOjGvylzMJRlDwUXjKTTXs6Pwgk79O09Vj/ho3u1ofXnhFOaEWWPrlwA== -"@types/d3-ease@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.0.tgz#c29926f8b596f9dadaeca062a32a45365681eae0" - integrity sha512-aMo4eaAOijJjA6uU+GIeW018dvy9+oH5Y2VPPzjjfxevvGQ/oRDs+tfYC9b50Q4BygRR8yE2QCLsrT0WtAVseA== +"@types/d3-color@^3.1.3": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== -"@types/d3-interpolate@^3.0.1": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.1.tgz#e7d17fa4a5830ad56fe22ce3b4fac8541a9572dc" - integrity sha512-jx5leotSeac3jr0RePOH1KdR9rISG91QIE4Q2PYTu4OymLTZfA3SrnURSLzKH48HmXVUru50b8nje4E79oQSQw== +"@types/d3-dispatch@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-dispatch/-/d3-dispatch-3.0.6.tgz#096efdf55eb97480e3f5621ff9a8da552f0961e7" + integrity sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ== + +"@types/d3-dsv@*", "@types/d3-dsv@^3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.7.tgz#0a351f996dc99b37f4fa58b492c2d1c04e3dac17" + integrity sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g== + +"@types/d3-ease@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-ease/-/d3-ease-3.0.2.tgz#e28db1bfbfa617076f7770dd1d9a48eaa3b6c51b" + integrity sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA== + +"@types/d3-fetch@^3.0.7": + version "3.0.7" + resolved "https://registry.yarnpkg.com/@types/d3-fetch/-/d3-fetch-3.0.7.tgz#c04a2b4f23181aa376f30af0283dbc7b3b569980" + integrity sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA== + dependencies: + "@types/d3-dsv" "*" + +"@types/d3-force@^3.0.10": + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/d3-force/-/d3-force-3.0.10.tgz#6dc8fc6e1f35704f3b057090beeeb7ac674bff1a" + integrity sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw== + +"@types/d3-format@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-format/-/d3-format-3.0.4.tgz#b1e4465644ddb3fdf3a263febb240a6cd616de90" + integrity sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g== + +"@types/d3-geo@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-geo/-/d3-geo-3.1.0.tgz#b9e56a079449174f0a2c8684a9a4df3f60522440" + integrity sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ== + dependencies: + "@types/geojson" "*" + +"@types/d3-hierarchy@^3.1.7": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-hierarchy/-/d3-hierarchy-3.1.7.tgz#6023fb3b2d463229f2d680f9ac4b47466f71f17b" + integrity sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg== + +"@types/d3-interpolate@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz#412b90e84870285f2ff8a846c6eb60344f12a41c" + integrity sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA== dependencies: "@types/d3-color" "*" @@ -1596,34 +1649,54 @@ resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.0.0.tgz#939e3a784ae4f80b1fde8098b91af1776ff1312b" integrity sha512-0g/A+mZXgFkQxN3HniRDbXMN79K3CdTpLsevj+PXiTcb2hVyvkZUBg37StmgCQkaD84cUJ4uaDAWq7UJOQy2Tg== -"@types/d3-scale@^4.0.2": - version "4.0.3" - resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.3.tgz#7a5780e934e52b6f63ad9c24b105e33dd58102b5" - integrity sha512-PATBiMCpvHJSMtZAMEhc2WyL+hnzarKzI6wAHYjhsonjWJYGq5BXTzQjv4l8m2jO183/4wZ90rKvSeT7o72xNQ== +"@types/d3-path@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@types/d3-path/-/d3-path-3.1.1.tgz#f632b380c3aca1dba8e34aa049bcd6a4af23df8a" + integrity sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg== + +"@types/d3-quadtree@^3.0.6": + version "3.0.6" + resolved "https://registry.yarnpkg.com/@types/d3-quadtree/-/d3-quadtree-3.0.6.tgz#d4740b0fe35b1c58b66e1488f4e7ed02952f570f" + integrity sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg== + +"@types/d3-random@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/d3-random/-/d3-random-3.0.3.tgz#ed995c71ecb15e0cd31e22d9d5d23942e3300cfb" + integrity sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ== + +"@types/d3-scale-chromatic@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@types/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#dc6d4f9a98376f18ea50bad6c39537f1b5463c39" + integrity sha512-iWMJgwkK7yTRmWqRB5plb1kadXyQ5Sj8V/zYlFGMUBbIPKQScw+Dku9cAAMgJG+z5GYDoMjWGLVOvjghDEFnKQ== + +"@types/d3-scale@^4.0.9": + version "4.0.9" + resolved "https://registry.yarnpkg.com/@types/d3-scale/-/d3-scale-4.0.9.tgz#57a2f707242e6fe1de81ad7bfcccaaf606179afb" + integrity sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw== dependencies: "@types/d3-time" "*" -"@types/d3-shape@^3.1.0": - version "3.1.1" - resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.1.tgz#15cc497751dac31192d7aef4e67a8d2c62354b95" - integrity sha512-6Uh86YFF7LGg4PQkuO2oG6EMBRLuW9cbavUW46zkIO5kuS2PfTqo2o9SkgtQzguBHbLgNnU90UNsITpsX1My+A== +"@types/d3-shape@^3.1.7": + version "3.1.7" + resolved "https://registry.yarnpkg.com/@types/d3-shape/-/d3-shape-3.1.7.tgz#2b7b423dc2dfe69c8c93596e673e37443348c555" + integrity sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg== dependencies: "@types/d3-path" "*" -"@types/d3-time@*", "@types/d3-time@^3.0.0": +"@types/d3-time@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.0.tgz#e1ac0f3e9e195135361fa1a1d62f795d87e6e819" integrity sha512-sZLCdHvBUcNby1cB6Fd3ZBrABbjz3v1Vm90nysCQ6Vt7vd6e/h9Lt7SiJUoEX0l4Dzc7P5llKyhqSi1ycSf1Hg== -"@types/d3-timer@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-2.0.1.tgz#ffb6620d290624f3726aa362c0c8a4b44c8d7200" - integrity sha512-TF8aoF5cHcLO7W7403blM7L1T+6NF3XMyN3fxyUolq2uOcFeicG/khQg/dGxiCJWoAcmYulYN7LYSRKO54IXaA== +"@types/d3-time@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/d3-time/-/d3-time-3.0.4.tgz#8472feecd639691450dd8000eb33edd444e1323f" + integrity sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g== -"@types/d3-timer@^3.0.0": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.0.tgz#e2505f1c21ec08bda8915238e397fb71d2fc54ce" - integrity sha512-HNB/9GHqu7Fo8AQiugyJbv6ZxYz58wef0esl4Mv828w1ZKpAshw/uFWVDUcIB9KKFeFKoxS3cHY07FFgtTRZ1g== +"@types/d3-timer@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@types/d3-timer/-/d3-timer-3.0.2.tgz#70bbda77dc23aa727413e22e214afa3f0e852f70" + integrity sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw== "@types/eslint-scope@^3.7.3": version "3.7.4" @@ -1670,6 +1743,11 @@ "@types/qs" "*" "@types/serve-static" "*" +"@types/geojson@*": + version "7946.0.16" + resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-7946.0.16.tgz#8ebe53d69efada7044454e3305c19017d97ced2a" + integrity sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg== + "@types/graceful-fs@^4.1.3": version "4.1.6" resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.6.tgz#e14b2576a1c25026b7f02ede1de3b84c3a1efeae" @@ -1745,21 +1823,11 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10" integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== -"@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== - "@types/node@*": version "18.15.11" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f" integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q== -"@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== - "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -2457,11 +2525,6 @@ arraybuffer.prototype.slice@^1.0.2: is-array-buffer "^3.0.2" is-shared-array-buffer "^1.0.2" -arrify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== - asynciterator.prototype@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" @@ -2479,10 +2542,10 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -attr-accept@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.2.tgz#646613809660110749e92f2c10833b70968d929b" - integrity sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg== +attr-accept@^2.2.4: + version "2.2.5" + resolved "https://registry.yarnpkg.com/attr-accept/-/attr-accept-2.2.5.tgz#d7061d958e6d4f97bf8665c68b75851a0713ab5e" + integrity sha512-0bDNnY/u6pPwHDMoF0FieU354oBi0a8rD9FcsLwzcGWbc8KS8KPIi7y+s13OlVY+gMWc/9xEMUgNE6Qm8ZllYQ== available-typed-arrays@^1.0.5: version "1.0.5" @@ -2498,12 +2561,12 @@ axios@^1.6.1: form-data "^4.0.0" proxy-from-env "^1.1.0" -axios@^1.6.7: - version "1.6.7" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" - integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== +axios@^1.9.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.9.0.tgz#25534e3b72b54540077d33046f77e3b8d7081901" + integrity sha512-re4CqKTJaURpzbLHtIi6XpDv20/CnpXOtjRY5/CU32L8gU8ek9UIivcfvSWvmKEngmVbrUtPpdDwWDWL7DNHvg== dependencies: - follow-redirects "^1.15.4" + follow-redirects "^1.15.6" form-data "^4.0.0" proxy-from-env "^1.1.0" @@ -2700,6 +2763,11 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +bubblesets-js@^2.3.4: + version "2.3.4" + resolved "https://registry.yarnpkg.com/bubblesets-js/-/bubblesets-js-2.3.4.tgz#8e1230b29c309e3327a05630fe02df3d96596ab6" + integrity sha512-DyMjHmpkS2+xcFNtyN00apJYL3ESdp9fTrkDr5+9Qg/GPqFmcWgGsK1akZnttE1XFxJ/VMy4DNNGMGYtmFp1Sg== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" @@ -2758,15 +2826,6 @@ camel-case@^4.1.2: pascal-case "^3.1.2" tslib "^2.0.3" -camelcase-keys@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" - integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== - dependencies: - camelcase "^5.3.1" - map-obj "^4.0.0" - quick-lru "^4.0.1" - camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" @@ -2822,6 +2881,11 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.3.0: + version "5.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.4.1.tgz#1b48bf0963ec158dce2aacf69c093ae2dd2092d8" + integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -2934,7 +2998,7 @@ collect-v8-coverage@^1.0.0: resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -color-convert@^1.9.0, color-convert@^1.9.3: +color-convert@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== @@ -2958,7 +3022,7 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^1.6.0: +color-string@^1.5.5: version "1.9.1" resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== @@ -2966,14 +3030,6 @@ color-string@^1.6.0: color-name "^1.0.0" simple-swizzle "^0.2.2" -color@^3.1.3: - version "3.2.1" - resolved "https://registry.yarnpkg.com/color/-/color-3.2.1.tgz#3544dc198caf4490c3ecc9a790b54fe9ff45e164" - integrity sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA== - dependencies: - color-convert "^1.9.3" - color-string "^1.6.0" - colord@^2.9.1: version "2.9.3" resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" @@ -2991,6 +3047,16 @@ combined-stream@^1.0.8: dependencies: delayed-stream "~1.0.0" +comlink@^4.4.1: + version "4.4.2" + resolved "https://registry.yarnpkg.com/comlink/-/comlink-4.4.2.tgz#cbbcd82742fbebc06489c28a183eedc5c60a2bca" + integrity sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g== + +commander@7, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + commander@^10.0.1: version "10.0.1" resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" @@ -3006,11 +3072,6 @@ commander@^6.2.1: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - commander@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" @@ -3135,6 +3196,11 @@ cookie@0.5.0: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== +cookie@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-1.0.2.tgz#27360701532116bd3f1f9416929d176afe1e4610" + integrity sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA== + copy-webpack-plugin@^12.0.2: version "12.0.2" resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-12.0.2.tgz#935e57b8e6183c82f95bd937df658a59f6a2da28" @@ -3157,12 +3223,12 @@ cosmiconfig-typescript-loader@^4.0.0: resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz#c4259ce474c9df0f32274ed162c0447c951ef073" integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== -cosmiconfig-typescript-loader@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz#0d3becfe022a871f7275ceb2397d692e06045dc8" - integrity sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA== +cosmiconfig-typescript-loader@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-6.1.0.tgz#7f644503e1c2bff90aed2d29a637008f279646bb" + integrity sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g== dependencies: - jiti "^1.19.1" + jiti "^2.4.1" cosmiconfig@^7.0.1: version "7.1.0" @@ -3185,15 +3251,15 @@ cosmiconfig@^8.0.0: parse-json "^5.0.0" path-type "^4.0.0" -cosmiconfig@^8.3.6: - version "8.3.6" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== dependencies: + env-paths "^2.2.1" import-fresh "^3.3.0" js-yaml "^4.1.0" parse-json "^5.2.0" - path-type "^4.0.0" create-jest@^29.7.0: version "29.7.0" @@ -3402,63 +3468,141 @@ cz-git@^1.8.0: resolved "https://registry.yarnpkg.com/cz-git/-/cz-git-1.8.0.tgz#d8566ae4b8848f04b7368e4a24dc0a465fc98dcd" integrity sha512-XL5nXiqbW10YswQqWODrbwyWhydw3mLhP8OBrXyl8u4sIjTf/6mhGsizd6FA2VgPc4tZaNGguFoUyDj7vIBouw== -"d3-array@2 - 3", "d3-array@2.10.0 - 3", d3-array@^3.1.6: +"d3-array@1 - 3", "d3-array@2.5.0 - 3", d3-array@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.4.tgz#15fec33b237f97ac5d7c986dc77da273a8ed0bb5" + integrity sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg== + dependencies: + internmap "1 - 2" + +"d3-array@2 - 3", "d3-array@2.10.0 - 3": version "3.2.3" resolved "https://registry.yarnpkg.com/d3-array/-/d3-array-3.2.3.tgz#39f1f4954e4a09ff69ac597c2d61906b04e84740" integrity sha512-JRHwbQQ84XuAESWhvIPaUV4/1UYTBOLiOPGWqgFDHZS1D5QN9c57FbH3QpEnQMYiOXNzKUQyGTZf+EVO7RT5TQ== dependencies: internmap "1 - 2" -"d3-color@1 - 3": +d3-binarytree@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/d3-binarytree/-/d3-binarytree-1.0.2.tgz#ed43ebc13c70fbabfdd62df17480bc5a425753cc" + integrity sha512-cElUNH+sHu95L04m92pG73t2MEJXKu+GeKUN1TJkFsu93E5W8E9Sc3kHEGJKgenGvj19m6upSn2EunvMgMD2Yw== + +"d3-color@1 - 3", d3-color@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA== -"d3-dispatch@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-2.0.0.tgz#8a18e16f76dd3fcaef42163c97b926aa9b55e7cf" - integrity sha512-S/m2VsXI7gAti2pBoLClFFTMOO1HTtT0j99AuXLoGFKO6deHDdnv6ZGTxSTTUTgO1zVcv82fCOtDjYK4EECmWA== +"d3-dispatch@1 - 3", d3-dispatch@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dispatch/-/d3-dispatch-3.0.1.tgz#5fc75284e9c2375c36c839411a0cf550cbfc4d5e" + integrity sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg== -d3-ease@^1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-1.0.7.tgz#9a834890ef8b8ae8c558b2fe55bd57f5993b85e2" - integrity sha512-lx14ZPYkhNx0s/2HX5sLFUI3mbasHjSSpwO/KaaNACweVwxUruKyWVcb293wMv1RqTPZyZ8kSZ2NogUZNcLOFQ== +"d3-dsv@1 - 3", d3-dsv@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-dsv/-/d3-dsv-3.0.1.tgz#c63af978f4d6a0d084a52a673922be2160789b73" + integrity sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q== + dependencies: + commander "7" + iconv-lite "0.6" + rw "1" d3-ease@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-ease/-/d3-ease-3.0.1.tgz#9658ac38a2140d59d346160f1f6c30fda0bd12f4" integrity sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w== -d3-force@^2.0.1, d3-force@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-2.1.1.tgz#f20ccbf1e6c9e80add1926f09b51f686a8bc0937" - integrity sha512-nAuHEzBqMvpFVMf9OX75d00OxvOXdxY+xECIXjW6Gv8BRrXu6gAWbv/9XKrvfJ5i5DCokDW7RYE50LRoK092ew== +d3-fetch@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-fetch/-/d3-fetch-3.0.1.tgz#83141bff9856a0edb5e38de89cdcfe63d0a60a22" + integrity sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw== + dependencies: + d3-dsv "1 - 3" + +d3-force-3d@^3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/d3-force-3d/-/d3-force-3d-3.0.6.tgz#7ea4c26d7937b82993bd9444f570ed52f661d4aa" + integrity sha512-4tsKHUPLOVkyfEffZo1v6sFHvGFwAIIjt/W8IThbp08DYAsXZck+2pSHEG5W1+gQgEvFLdZkYvmJAbRM2EzMnA== dependencies: - d3-dispatch "1 - 2" - d3-quadtree "1 - 2" - d3-timer "1 - 2" + d3-binarytree "1" + d3-dispatch "1 - 3" + d3-octree "1" + d3-quadtree "1 - 3" + d3-timer "1 - 3" -"d3-format@1 - 3": +d3-force@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/d3-force/-/d3-force-3.0.0.tgz#3e2ba1a61e70888fe3d9194e30d6d14eece155c4" + integrity sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg== + dependencies: + d3-dispatch "1 - 3" + d3-quadtree "1 - 3" + d3-timer "1 - 3" + +"d3-format@1 - 3", d3-format@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/d3-format/-/d3-format-3.1.0.tgz#9260e23a28ea5cb109e93b21a06e24e2ebd55641" integrity sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA== -"d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: +d3-geo-projection@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz#dc229e5ead78d31869a4e87cf1f45bd2716c48ca" + integrity sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg== + dependencies: + commander "7" + d3-array "1 - 3" + d3-geo "1.12.0 - 3" + +"d3-geo@1.12.0 - 3", d3-geo@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/d3-geo/-/d3-geo-3.1.1.tgz#6027cf51246f9b2ebd64f99e01dc7c3364033a4d" + integrity sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q== + dependencies: + d3-array "2.5.0 - 3" + +d3-hierarchy@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz#b01cd42c1eed3d46db77a5966cf726f8c09160c6" + integrity sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA== + +"d3-interpolate@1 - 3", "d3-interpolate@1.2.0 - 3", d3-interpolate@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-interpolate/-/d3-interpolate-3.0.1.tgz#3c47aa5b32c5b3dfb56ef3fd4342078a632b400d" integrity sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g== dependencies: d3-color "1 - 3" +d3-octree@1, d3-octree@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/d3-octree/-/d3-octree-1.1.0.tgz#f07e353b76df872644e7130ab1a74c5ef2f4287e" + integrity sha512-F8gPlqpP+HwRPMO/8uOu5wjH110+6q4cgJvgJT6vlpy3BEaDIKlTZrgHKZSp/i1InRpVfh4puY/kvL6MxK930A== + d3-path@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/d3-path/-/d3-path-3.1.0.tgz#22df939032fb5a71ae8b1800d61ddb7851c42526" integrity sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ== -"d3-quadtree@1 - 2", d3-quadtree@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-2.0.0.tgz#edbad045cef88701f6fee3aee8e93fb332d30f9d" - integrity sha512-b0Ed2t1UUalJpc3qXzKi+cPGxeXRr4KU9YSlocN74aTzp6R/Ud43t79yLLqxHRWZfsvWXmbDWPpoENK1K539xw== +"d3-quadtree@1 - 3", d3-quadtree@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-quadtree/-/d3-quadtree-3.0.1.tgz#6dca3e8be2b393c9a9d514dabbd80a92deef1a4f" + integrity sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw== + +d3-random@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/d3-random/-/d3-random-3.0.1.tgz#d4926378d333d9c0bfd1e6fa0194d30aebaa20f4" + integrity sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ== + +d3-regression@^1.3.10: + version "1.3.10" + resolved "https://registry.yarnpkg.com/d3-regression/-/d3-regression-1.3.10.tgz#d1a411ab45044d9e8d5b8aec05f2e598e1a621c9" + integrity sha512-PF8GWEL70cHHWpx2jUQXc68r1pyPHIA+St16muk/XRokETzlegj5LriNKg7o4LR0TySug4nHYPJNNRz/W+/Niw== + +d3-scale-chromatic@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz#34c39da298b23c20e02f1a4b239bd0f22e7f1314" + integrity sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ== + dependencies: + d3-color "1 - 3" + d3-interpolate "1 - 3" d3-scale@^4.0.2: version "4.0.2" @@ -3471,7 +3615,7 @@ d3-scale@^4.0.2: d3-time "2.1.1 - 3" d3-time-format "2 - 4" -d3-shape@^3.1.0: +d3-shape@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/d3-shape/-/d3-shape-3.2.0.tgz#a1a839cbd9ba45f28674c69d7f855bcf91dfc6a5" integrity sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA== @@ -3485,33 +3629,18 @@ d3-shape@^3.1.0: dependencies: d3-time "1 - 3" -"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.0.0: +"d3-time@1 - 3", "d3-time@2.1.1 - 3", d3-time@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/d3-time/-/d3-time-3.1.0.tgz#9310db56e992e3c0175e1ef385e545e48a9bb5c7" integrity sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q== dependencies: d3-array "2 - 3" -"d3-timer@1 - 2": - version "2.0.0" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-2.0.0.tgz#055edb1d170cfe31ab2da8968deee940b56623e6" - integrity sha512-TO4VLh0/420Y/9dO3+f9abDEFYeCUr2WZRlxJvbp4HPTQcSylXNiL6yZa9FIUvV1yRiFufl1bszTCLDqv9PWNA== - -d3-timer@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-1.0.10.tgz#dfe76b8a91748831b13b6d9c793ffbd508dd9de5" - integrity sha512-B1JDm0XDaQC+uvo4DT79H0XmBskgS3l6Ve+1SBCfxgmtIb1AVrPIoqd+nPSv+loMX8szQ0sVUhGngL7D5QPiXw== - -d3-timer@^3.0.1: +"d3-timer@1 - 3", d3-timer@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/d3-timer/-/d3-timer-3.0.1.tgz#6284d2a2708285b1abb7e201eda4380af35e63b0" integrity sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA== -dagre-compound@^0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/dagre-compound/-/dagre-compound-0.0.11.tgz#8d3d1004d756f420582d29f28c92045375018987" - integrity sha512-UrSgRP9LtOZCYb9e5doolZXpc7xayyszgyOs7uakTK4n4KsLegLVTRRtq01GpQd/iZjYw5fWMapx9ed+c80MAQ== - dagre@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/dagre/-/dagre-0.8.5.tgz#ba30b0055dac12b6c1fcc247817442777d06afee" @@ -3520,10 +3649,10 @@ dagre@^0.8.5: graphlib "^2.1.8" lodash "^4.17.15" -dargs@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" - integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== +dargs@^8.0.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/dargs/-/dargs-8.1.0.tgz#a34859ea509cbce45485e5aa356fef70bfcc7272" + integrity sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw== data-urls@^3.0.2: version "3.0.2" @@ -3534,10 +3663,10 @@ data-urls@^3.0.2: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" -date-fns@^3.3.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-3.3.1.tgz#7581daca0892d139736697717a168afbb908cfed" - integrity sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw== +date-fns@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-4.1.0.tgz#64b3d83fff5aa80438f5b1a633c2e83b8a1c2d14" + integrity sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg== debounce@^1.2.1: version "1.2.1" @@ -3565,19 +3694,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -decamelize-keys@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/decamelize-keys/-/decamelize-keys-1.1.1.tgz#04a2d523b2f18d80d0158a43b895d56dff8d19d8" - integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== - dependencies: - decamelize "^1.1.0" - map-obj "^1.0.0" - -decamelize@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== - decimal.js@^10.4.2: version "10.4.3" resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23" @@ -3662,18 +3778,6 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -delaunator@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-4.0.1.tgz#3d779687f57919a7a418f8ab947d3bddb6846957" - integrity sha512-WNPWi1IRKZfCt/qIDMfERkDp93+iZEmOxN2yy4Jg+Xhv8SLk2UTqqbe1sfiipn0and9QrE914/ihdx82Y/Giag== - -delaunay-find@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/delaunay-find/-/delaunay-find-0.0.6.tgz#2ed017a79410013717fa7d9422e082c2502d4ae3" - integrity sha512-1+almjfrnR7ZamBk0q3Nhg6lqSe6Le4vL0WJDSMx4IDbQwTpUTXPjxC00lqLBT8MYsJpPCbI16sIkw9cPsbi7Q== - dependencies: - delaunator "^4.0.0" - delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -3694,11 +3798,6 @@ destroy@1.2.0: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -detect-browser@^5.0.0, detect-browser@^5.1.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/detect-browser/-/detect-browser-5.3.0.tgz#9705ef2bddf46072d0f7265a1fe300e36fe7ceca" - integrity sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w== - detect-file@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" @@ -3927,6 +4026,11 @@ entities@^4.4.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174" integrity sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA== +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + envinfo@^7.7.3: version "7.8.1" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" @@ -4415,6 +4519,11 @@ eventemitter3@^4.0.0: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + events@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" @@ -4583,7 +4692,7 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -fecha@~4.2.0: +fecha@^4.2.1: version "4.2.3" resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.3.tgz#4d9ccdbc61e8629b259fdca67e65891448d569fd" integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== @@ -4602,12 +4711,12 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-selector@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-0.6.0.tgz#fa0a8d9007b829504db4d07dd4de0310b65287dc" - integrity sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw== +file-selector@^2.1.0: + version "2.1.2" + resolved "https://registry.yarnpkg.com/file-selector/-/file-selector-2.1.2.tgz#fe7c7ee9e550952dfbc863d73b14dc740d7de8b4" + integrity sha512-QgXo+mXTe8ljeqUFaX3QVHc5osSItJ/Km+xpocx0aSqWGMSCf6qYs/VnzZgS864Pjn5iceMRFigeAV7AfTlaig== dependencies: - tslib "^2.4.0" + tslib "^2.7.0" fill-range@^7.0.1: version "7.0.1" @@ -4658,6 +4767,15 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-up@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-7.0.0.tgz#e8dec1455f74f78d888ad65bf7ca13dd2b4e66fb" + integrity sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g== + dependencies: + locate-path "^7.2.0" + path-exists "^5.0.0" + unicorn-magic "^0.1.0" + findup-sync@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0" @@ -4686,10 +4804,10 @@ flatted@^3.1.0: resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== -focus-trap@7.5.2: - version "7.5.2" - resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.5.2.tgz#e5ee678d10a18651f2591ffb66c949fb098d57cf" - integrity sha512-p6vGNNWLDGwJCiEjkSK6oERj/hEyI9ITsSwIUICBoKLlWiTWXJRfQibCwcoi50rTZdbi87qDtUlMCmQwsGSgPw== +focus-trap@7.6.4: + version "7.6.4" + resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-7.6.4.tgz#455ec5c51fee5ae99604ca15142409ffbbf84db9" + integrity sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw== dependencies: tabbable "^6.2.0" @@ -4698,10 +4816,10 @@ follow-redirects@^1.0.0, follow-redirects@^1.15.0: resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.2.tgz#b460864144ba63f2681096f274c4e57026da2c13" integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== -follow-redirects@^1.15.4: - version "1.15.4" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" - integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== +follow-redirects@^1.15.6: + version "1.15.9" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1" + integrity sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ== for-each@^0.3.3: version "0.3.3" @@ -4724,14 +4842,14 @@ forwarded@0.2.0: resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -framer-motion@^11.0.3: - version "11.0.3" - resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-11.0.3.tgz#b2a87e7ae166a9e27da33da9cfb50a0db5f94fa7" - integrity sha512-6x2poQpIWBdbZwLd73w6cKZ1I9IEPIU94C6/Swp1Zt3LJ+sB5bPe1E2wC6EH5hSISXNkMJ4afH7AdwS7MrtkWw== +framer-motion@^12.15.0: + version "12.15.0" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-12.15.0.tgz#6892283fc7967b071f537d6d160ab49e3d5e73ae" + integrity sha512-XKg/LnKExdLGugZrDILV7jZjI599785lDIJZLxMiiIFidCsy0a4R2ZEf+Izm67zyOuJgQYTHOmodi7igQsw3vg== dependencies: + motion-dom "^12.15.0" + motion-utils "^12.12.1" tslib "^2.4.0" - optionalDependencies: - "@emotion/is-prop-valid" "^0.8.2" fresh@0.5.2: version "0.5.2" @@ -4865,27 +4983,20 @@ get-tsconfig@^4.5.0: resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.5.0.tgz#6d52d1c7b299bd3ee9cd7638561653399ac77b0f" integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ== -git-raw-commits@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" - integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== +git-raw-commits@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-4.0.0.tgz#b212fd2bff9726d27c1283a1157e829490593285" + integrity sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== dependencies: - dargs "^7.0.0" - lodash "^4.17.15" - meow "^8.0.0" - split2 "^3.0.0" - through2 "^4.0.0" + dargs "^8.0.0" + meow "^12.0.1" + split2 "^4.0.0" -gl-matrix@^3.0.0, gl-matrix@^3.1.0, gl-matrix@^3.3.0, gl-matrix@^3.4.3: +gl-matrix@^3.3.0, gl-matrix@^3.4.3: version "3.4.3" resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-3.4.3.tgz#fc1191e8320009fd4d20e9339595c6041ddc22c9" integrity sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA== -gl-vec2@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/gl-vec2/-/gl-vec2-1.3.0.tgz#83d472ed46034de8e09cbc857123fb6c81c51199" - integrity sha512-YiqaAuNsheWmUV0Sa8k94kBB0D6RWjwZztyO+trEYS8KzJ6OQB/4686gdrf59wld4hHFIvaxynO3nRxpk1Ij/A== - glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" @@ -4917,6 +5028,13 @@ glob@7.2.3, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" +global-directory@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/global-directory/-/global-directory-4.0.1.tgz#4d7ac7cfd2cb73f304c53b8810891748df5e361e" + integrity sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== + dependencies: + ini "4.1.1" + global-dirs@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" @@ -5023,11 +5141,6 @@ handle-thing@^2.0.0: resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz#857f79ce359580c340d43081cc648970d0bb234e" integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== -hard-rejection@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/hard-rejection/-/hard-rejection-2.1.0.tgz#1c6eda5c1685c63942766d79bb40ae773cecd883" - integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== - has-bigints@^1.0.1, has-bigints@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.2.tgz#0871bd3e3d51626f6ca0966668ba35d5602d6eaa" @@ -5086,7 +5199,7 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -5100,18 +5213,6 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== - -hosted-git-info@^4.0.1: - version "4.1.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-4.1.0.tgz#827b82867e9ff1c8d0c4d9d53880397d2c86d224" - integrity sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== - dependencies: - lru-cache "^6.0.0" - hpack.js@^2.1.6: version "2.1.6" resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" @@ -5258,7 +5359,7 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.6.3: +iconv-lite@0.6, iconv-lite@0.6.3: version "0.6.3" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -5296,6 +5397,11 @@ import-local@^3.0.2: pkg-dir "^4.2.0" resolve-cwd "^3.0.0" +import-meta-resolve@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#f9db8bead9fafa61adb811db77a2bf22c5399706" + integrity sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw== + imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -5329,6 +5435,11 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +ini@4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.1.tgz#d95b3d843b1e906e56d6747d5447904ff50ce7a1" + integrity sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== + ini@^1.3.4: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" @@ -5355,11 +5466,6 @@ inquirer@8.2.5: through "^2.3.6" wrap-ansi "^7.0.0" -insert-css@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/insert-css/-/insert-css-2.0.0.tgz#eb5d1097b7542f4c79ea3060d3aee07d053880f4" - integrity sha512-xGq5ISgcUP5cvGkS2MMFLtPDBtrtQPSFfC6gA6U8wHKqfjTIMZLZNxOItQnoSjdOzlXOLU/yD32RKC4SvjNbtA== - internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.5.tgz#f2a2ee21f668f8627a4667f309dc0f4fb6674986" @@ -5394,6 +5500,11 @@ is-any-array@^2.0.0: resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.0.tgz#e71bc13741537c06afac03c07885967ef56d8742" integrity sha512-WdPV58rT3aOWXvvyuBydnCq4S2BM1Yz8shKxlEpk/6x+GX202XRvXOycEFtNgnHVLoc46hpexPFx8Pz1/sMS0w== +is-any-array@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-any-array/-/is-any-array-2.0.1.tgz#9233242a9c098220290aa2ec28f82ca7fa79899e" + integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== + is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" @@ -5455,7 +5566,7 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== -is-core-module@^2.11.0, is-core-module@^2.5.0, is-core-module@^2.9.0: +is-core-module@^2.11.0, is-core-module@^2.9.0: version "2.11.0" resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== @@ -5561,11 +5672,6 @@ is-path-inside@^3.0.3: resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== -is-plain-obj@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" - integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== - is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7" @@ -6171,10 +6277,10 @@ jest@^29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" -jiti@^1.19.1: - version "1.21.0" - resolved "https://registry.yarnpkg.com/jiti/-/jiti-1.21.0.tgz#7c97f8fe045724e136a397f7340475244156105d" - integrity sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q== +jiti@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/jiti/-/jiti-2.4.2.tgz#d19b7732ebb6116b06e2038da74a55366faef560" + integrity sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== joi@^17.11.0: version "17.11.0" @@ -6264,11 +6370,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== -json-stringify-safe@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== - json5@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" @@ -6303,7 +6404,7 @@ jsonparse@^1.2.0: array-includes "^3.1.5" object.assign "^4.1.3" -kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -6376,16 +6477,18 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +locate-path@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + lodash.camelcase@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== -lodash.isfunction@^3.0.9: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" - integrity sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw== - lodash.isplainobject@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" @@ -6436,7 +6539,7 @@ lodash.upperfirst@^4.3.1: resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" integrity sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== -lodash@4.17.21, lodash@^4.0.0, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: +lodash@4.17.21, lodash@^4.0.0, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6506,16 +6609,6 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== - -map-obj@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-4.3.0.tgz#9304f906e93faae70880da102a9f1df0ea8bb05a" - integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== - map-stream@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" @@ -6548,23 +6641,6 @@ meow@^12.0.1: resolved "https://registry.yarnpkg.com/meow/-/meow-12.1.1.tgz#e558dddbab12477b69b2e9a2728c327f191bace6" integrity sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== -meow@^8.0.0: - version "8.1.2" - resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" - integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== - dependencies: - "@types/minimist" "^1.2.0" - camelcase-keys "^6.2.2" - decamelize-keys "^1.1.0" - hard-rejection "^2.1.0" - minimist-options "4.1.0" - normalize-package-data "^3.0.0" - read-pkg-up "^7.0.1" - redent "^3.0.0" - trim-newlines "^3.0.0" - type-fest "^0.18.0" - yargs-parser "^20.2.3" - merge-descriptors@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" @@ -6652,15 +6728,6 @@ minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" -minimist-options@4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-4.1.0.tgz#c0655713c53a8a2ebd77ffa247d342c40f010619" - integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== - dependencies: - arrify "^1.0.1" - is-plain-obj "^1.1.0" - kind-of "^6.0.3" - minimist@1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" @@ -6709,14 +6776,26 @@ ml-array-rescale@^1.3.7: ml-array-max "^1.2.4" ml-array-min "^1.2.3" -ml-matrix@^6.5.0: - version "6.10.4" - resolved "https://registry.yarnpkg.com/ml-matrix/-/ml-matrix-6.10.4.tgz#babee344b20062d9c123aa801c2e5d0d0c7477f6" - integrity sha512-rUyEhfNPzqFsltYwvjNeYQXlYEaVea3KgzcJKJteQUj2WVAGFx9fLNRjtMR9mg2B6bd5buxlmkZmxM4hmO+SKg== +ml-matrix@^6.10.4: + version "6.12.1" + resolved "https://registry.yarnpkg.com/ml-matrix/-/ml-matrix-6.12.1.tgz#8fc99365f7294d27076f0ce405b589e1c04ca1b0" + integrity sha512-TJ+8eOFdp+INvzR4zAuwBQJznDUfktMtOB6g/hUcGh3rcyjxbz4Te57Pgri8Q9bhSQ7Zys4IYOGhFdnlgeB6Lw== dependencies: - is-any-array "^2.0.0" + is-any-array "^2.0.1" ml-array-rescale "^1.3.7" +motion-dom@^12.15.0: + version "12.15.0" + resolved "https://registry.yarnpkg.com/motion-dom/-/motion-dom-12.15.0.tgz#eca7c9d8c28976b8c920f175f92d5288f5a17785" + integrity sha512-D2ldJgor+2vdcrDtKJw48k3OddXiZN1dDLLWrS8kiHzQdYVruh0IoTwbJBslrnTXIPgFED7PBN2Zbwl7rNqnhA== + dependencies: + motion-utils "^12.12.1" + +motion-utils@^12.12.1: + version "12.12.1" + resolved "https://registry.yarnpkg.com/motion-utils/-/motion-utils-12.12.1.tgz#63e28751325cb9d1cd684f3c273a570022b0010e" + integrity sha512-f9qiqUHm7hWSLlNW8gS9pisnsN7CRFRD58vNjptKdsqFLpkVnX00TNeD6Q0d27V9KzT7ySFyK1TZ/DShfVOv6w== + mrmime@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" @@ -6808,33 +6887,13 @@ node-releases@^2.0.8: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.10.tgz#c311ebae3b6a148c89b1813fd7c4d3c024ef537f" integrity sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w== -node@^21.7.1: - version "21.7.1" - resolved "https://registry.yarnpkg.com/node/-/node-21.7.1.tgz#da9dcf9ca544f3c86b7a9a019272c9bd7cd9a7b5" - integrity sha512-j6NFfbKy3DBuaJh2X8lRZmS59oLr2XRtt0rTa9VsFj3ZcGbeK7xp40gZaI92AqNuRv1aL5dRueNqL6YuZFcjJg== +node@^22.16.0: + version "22.16.0" + resolved "https://registry.yarnpkg.com/node/-/node-22.16.0.tgz#2ef9624df30ea9670d28e8b83c4ed584291cfaa0" + integrity sha512-rJlZ29rJLShrkDJrvLUfuxMJT5in2o1C0PhOPjZI9yHnctqk9m85sSyoAdhkN98Xb14NeobmCiIKFWqT2E1+bA== dependencies: node-bin-setup "^1.0.0" -normalize-package-data@^2.5.0: - version "2.5.0" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-package-data@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-3.0.3.tgz#dbcc3e2da59509a0983422884cd172eefdfa525e" - integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== - dependencies: - hosted-git-info "^4.0.1" - is-core-module "^2.5.0" - semver "^7.3.4" - validate-npm-package-license "^3.0.1" - normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" @@ -7063,6 +7122,13 @@ p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" @@ -7077,6 +7143,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-retry@^4.5.0: version "4.6.2" resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16" @@ -7150,6 +7223,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -7520,16 +7598,6 @@ pretty-format@^29.0.0, pretty-format@^29.7.0: ansi-styles "^5.0.0" react-is "^18.0.0" -probe.gl@^3.1.1: - version "3.6.0" - resolved "https://registry.yarnpkg.com/probe.gl/-/probe.gl-3.6.0.tgz#e816234412b27a70b9be029cb82c8cf96cd72659" - integrity sha512-19JydJWI7+DtR4feV+pu4Mn1I5TAc0xojuxVgZdXIyfmTLfUaFnk4OloWK1bKbPtkgGKLr2lnbnCXmpZEcEp9g== - dependencies: - "@babel/runtime" "^7.0.0" - "@probe.gl/env" "3.6.0" - "@probe.gl/log" "3.6.0" - "@probe.gl/stats" "3.6.0" - process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -7604,10 +7672,10 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -quick-lru@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f" - integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== +quickselect@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-2.0.0.tgz#f19680a486a5eefb581303e023e98faaf25dd018" + integrity sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw== randombytes@^2.1.0: version "2.1.0" @@ -7631,34 +7699,45 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" -react-dom@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" - integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== +rbush@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/rbush/-/rbush-3.0.1.tgz#5fafa8a79b3b9afdfe5008403a720cc1de882ecf" + integrity sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w== + dependencies: + quickselect "^2.0.0" + +react-dom@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4" + integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== dependencies: loose-envify "^1.1.0" - scheduler "^0.23.0" + scheduler "^0.23.2" -react-dropzone@14.2.3, react-dropzone@^14.2.3: - version "14.2.3" - resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-14.2.3.tgz#0acab68308fda2d54d1273a1e626264e13d4e84b" - integrity sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug== +react-dropzone@14.3.5: + version "14.3.5" + resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-14.3.5.tgz#1a8bd312c8a353ec78ef402842ccb3589c225add" + integrity sha512-9nDUaEEpqZLOz5v5SUcFA0CjM4vq8YbqO0WRls+EYT7+DvxUdzDPKNCPLqGfj3YL9MsniCLCD4RFA6M95V6KMQ== dependencies: - attr-accept "^2.2.2" - file-selector "^0.6.0" + attr-accept "^2.2.4" + file-selector "^2.1.0" prop-types "^15.8.1" -react-error-boundary@^4.0.12: - version "4.0.12" - resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-4.0.12.tgz#59f8f1dbc53bbbb34fc384c8db7cf4082cb63e2c" - integrity sha512-kJdxdEYlb7CPC1A0SeUY38cHpjuu6UkvzKiAmqmOFL21VRfMhOcWxTCBgLVCO0VEMh9JhFNcVaXlV4/BTpiwOA== +react-dropzone@^14.3.5: + version "14.3.8" + resolved "https://registry.yarnpkg.com/react-dropzone/-/react-dropzone-14.3.8.tgz#a7eab118f8a452fe3f8b162d64454e81ba830582" + integrity sha512-sBgODnq+lcA4P296DY4wacOZz3JFpD99fp+hb//iBO2HHnyeZU3FwWyXJ6salNpqQdsZrgMrotuko/BdJMV8Ug== dependencies: - "@babel/runtime" "^7.12.5" + attr-accept "^2.2.4" + file-selector "^2.1.0" + prop-types "^15.8.1" -react-fast-compare@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.1.tgz#53933d9e14f364281d6cba24bfed7a4afb808b5f" - integrity sha512-xTYf9zFim2pEif/Fw16dBiXpe0hoy5PxcD8+OwBnTtNLfIm3g6WxhKNurY+6OmdH1u6Ta/W/Vl6vjbYP1MFnDg== +react-error-boundary@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/react-error-boundary/-/react-error-boundary-6.0.0.tgz#a9e552146958fa77d873b587aa6a5e97544ee954" + integrity sha512-gdlJjD7NWr0IfkPlaREN2d9uUZUlksrfOx7SX62VRerwXbMY6ftGCIZua1VG1aXFNOimhISsTq+Owp725b9SiA== + dependencies: + "@babel/runtime" "^7.12.5" react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" @@ -7675,56 +7754,28 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-router-dom@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-6.22.0.tgz#177c8bd27146decbb991eafb5df159f7a9f70035" - integrity sha512-z2w+M4tH5wlcLmH3BMMOMdrtrJ9T3oJJNsAlBJbwk+8Syxd5WFJ7J5dxMEW0/GEXD1BBis4uXRrNIz3mORr0ag== +react-router-dom@^7.6.1: + version "7.6.1" + resolved "https://registry.yarnpkg.com/react-router-dom/-/react-router-dom-7.6.1.tgz#263c9102e96b58d336258a51d68080b40c28f526" + integrity sha512-vxU7ei//UfPYQ3iZvHuO1D/5fX3/JOqhNTbRR+WjSBWxf9bIvpWK+ftjmdfJHzPOuMQKe2fiEdG+dZX6E8uUpA== dependencies: - "@remix-run/router" "1.15.0" - react-router "6.22.0" + react-router "7.6.1" -react-router@6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/react-router/-/react-router-6.22.0.tgz#a22b44851a79dafc6b944cb418db3e80622b9be1" - integrity sha512-q2yemJeg6gw/YixRlRnVx6IRJWZD6fonnfZhN1JIOhV2iJCPeRNSH3V1ISwHf+JWcESzLC3BOLD1T07tmO5dmg== +react-router@7.6.1: + version "7.6.1" + resolved "https://registry.yarnpkg.com/react-router/-/react-router-7.6.1.tgz#a54f9b980b94594bcb4b7f26611612a9f6e17461" + integrity sha512-hPJXXxHJZEsPFNVbtATH7+MMX43UDeOauz+EAU4cgqTn7ojdI9qQORqS8Z0qmDlL1TclO/6jLRYUEtbWidtdHQ== dependencies: - "@remix-run/router" "1.15.0" + cookie "^1.0.1" + set-cookie-parser "^2.6.0" -react@^18.2.0: - version "18.2.0" - resolved "https://registry.yarnpkg.com/react/-/react-18.2.0.tgz#555bd98592883255fa00de14f1151a917b5d77d5" - integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== +react@^18.3.1: + version "18.3.1" + resolved "https://registry.yarnpkg.com/react/-/react-18.3.1.tgz#49ab892009c53933625bd16b2533fc754cab2891" + integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== dependencies: loose-envify "^1.1.0" -read-pkg-up@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" - integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== - dependencies: - find-up "^4.1.0" - read-pkg "^5.2.0" - type-fest "^0.8.1" - -read-pkg@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" - integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== - dependencies: - "@types/normalize-package-data" "^2.4.0" - normalize-package-data "^2.5.0" - parse-json "^5.0.0" - type-fest "^0.6.0" - -readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.6, readable-stream@^3.4.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - readable-stream@^2.0.1: version "2.3.8" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" @@ -7738,6 +7789,15 @@ readable-stream@^2.0.1: string_decoder "~1.1.1" util-deprecate "~1.0.1" +readable-stream@^3.0.6, readable-stream@^3.4.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + readdirp@~3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" @@ -7809,11 +7869,6 @@ regexp.prototype.flags@^1.5.1: define-properties "^1.2.0" set-function-name "^2.0.0" -regl@^1.3.11: - version "1.7.0" - resolved "https://registry.yarnpkg.com/regl/-/regl-1.7.0.tgz#0d185431044a356bf80e9b775b11b935ef2746d3" - integrity sha512-bEAtp/qrtKucxXSJkD4ebopFZYP0q1+3Vb2WECWv/T8yQEgKxDxJ7ztO285tAMaYZVR6mM1GgI6CCn8FROtL1w== - relateurl@^0.2.7: version "0.2.7" resolved "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz#54dbf377e51440aca90a4cd274600d3ff2d888a9" @@ -7860,17 +7915,17 @@ resolve-dir@^1.0.0, resolve-dir@^1.0.1: expand-tilde "^2.0.0" global-modules "^1.0.0" -resolve-from@5.0.0, resolve-from@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" - integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== -resolve-global@1.0.0, resolve-global@^1.0.0: +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-global@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/resolve-global/-/resolve-global-1.0.0.tgz#a2a79df4af2ca3f49bf77ef9ddacd322dad19255" integrity sha512-zFa12V4OLtT5XUX/Q4VLvTfBf+Ok0SPc1FNGM/z9ctUdiU618qwKpWnd0CHs3+RqROfyEg/DhuHbMWYqcgljEw== @@ -7882,7 +7937,7 @@ resolve.exports@^2.0.0: resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800" integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== -resolve@^1.10.0, resolve@^1.20.0: +resolve@^1.20.0: version "1.22.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.2.tgz#0ed0943d4e301867955766c9f3e1ae6d01c6845f" integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== @@ -7951,6 +8006,11 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rw@1: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" + integrity sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ== + rxjs@^7.5.5: version "7.8.0" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" @@ -8016,10 +8076,10 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe" - integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== +scheduler@^0.23.2: + version "0.23.2" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.2.tgz#414ba64a3b282892e944cf2108ecc078d115cdc3" + integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== dependencies: loose-envify "^1.1.0" @@ -8073,18 +8133,6 @@ selfsigned@^2.1.1: dependencies: node-forge "^1" -"semver@2 || 3 || 4 || 5": - version "5.7.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== - -semver@7.5.4, semver@^7.5.4: - version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - semver@^6.0.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" @@ -8109,6 +8157,18 @@ semver@^7.5.3: dependencies: lru-cache "^6.0.0" +semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.6.0: + version "7.7.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.2.tgz#67d99fdcd35cec21e6f8b87a7fd515a33f982b58" + integrity sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -8165,6 +8225,11 @@ serve-static@1.15.0: parseurl "~1.3.3" send "0.18.0" +set-cookie-parser@^2.6.0: + version "2.7.1" + resolved "https://registry.yarnpkg.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz#3016f150072202dfbe90fadee053573cc89d2943" + integrity sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ== + set-function-length@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" @@ -8303,32 +8368,6 @@ source-map@^0.7.4: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656" integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== -spdx-correct@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" - integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - -spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== - -spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - -spdx-license-ids@^3.0.0: - version "3.0.13" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz#7189a474c46f8d47c7b0da4b987bb45e908bd2d5" - integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== - spdy-transport@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" @@ -8352,13 +8391,6 @@ spdy@^4.0.2: select-hose "^2.0.0" spdy-transport "^3.0.0" -split2@^3.0.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" - integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== - dependencies: - readable-stream "^3.0.0" - split2@^4.0.0: version "4.2.0" resolved "https://registry.yarnpkg.com/split2/-/split2-4.2.0.tgz#c9c5920904d148bab0b9f67145f245a86aadbfa4" @@ -8598,6 +8630,11 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +svg-path-parser@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/svg-path-parser/-/svg-path-parser-1.1.0.tgz#e16b4b39df0d2b0d39e8347db79fdda1453a6046" + integrity sha512-jGCUqcQyXpfe38R7RFfhrMyfXcBmpMNJI/B+4CE9/Unkh98UporAc461GTthv+TVDuZXsBx7/WiwJb1Oh4tt4A== + svgo@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.2.0.tgz#7a5dff2938d8c6096e00295c2390e8e652fa805d" @@ -8676,13 +8713,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== -through2@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764" - integrity sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw== - dependencies: - readable-stream "3" - through@2, "through@>=2.2.7 <3", through@^2.3.6, through@~2.3, through@~2.3.1: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -8693,10 +8723,10 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== -tinycolor2@^1.4.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.6.0.tgz#f98007460169b0263b97072c5ae92484ce02d09e" - integrity sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw== +tinyexec@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tinyexec/-/tinyexec-1.0.1.tgz#70c31ab7abbb4aea0a24f55d120e5990bfa1e0b1" + integrity sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw== tmp@^0.0.33: version "0.0.33" @@ -8749,11 +8779,6 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" -trim-newlines@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" - integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== - "true-myth@^4.1.0": version "4.1.1" resolved "https://registry.yarnpkg.com/true-myth/-/true-myth-4.1.1.tgz#ff4ac9d5130276e34aa338757e2416ec19248ba2" @@ -8885,10 +8910,10 @@ tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== -tslib@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" - integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.3.1, tslib@^2.5.3, tslib@^2.7.0, tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== tsutils@^3.21.0: version "3.21.0" @@ -8916,11 +8941,6 @@ type-detect@4.0.8: resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.18.0: - version "0.18.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.18.1.tgz#db4bc151a4a2cf4eebf9add5db75508db6cc841f" - integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== - type-fest@^0.20.2: version "0.20.2" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" @@ -8931,16 +8951,6 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" - integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -9101,252 +9111,11 @@ v8-to-istanbul@^9.0.1: "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" -validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== -victory-area@^36.8.1: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-area/-/victory-area-36.8.6.tgz#c9b86ac3217c1d918f5b9c5f1aec5e3207988cdb" - integrity sha512-EmFB0SQwR5EY5/WFdEJBEYKLlJOq/0qnr2Cm9gJmqyHX+pmG24Q+llx6f8xEO53oH3jkOtUyggxlA0psLmYOIQ== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - victory-vendor "^36.8.6" - -victory-axis@^36.8.1, victory-axis@^36.8.6: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-axis/-/victory-axis-36.8.6.tgz#9ba2cf92db22019b4bfa9fe014ffc705e6d388f1" - integrity sha512-JH/PxxL4dg6nv3sUNA0dcXWTviR0MsXQDtg4KeNX7ShGM0mO28g0lmfoWQZpOJplmslnt9J3bU7Qu4P7/GSrdQ== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - -victory-bar@^36.8.1: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-bar/-/victory-bar-36.8.6.tgz#a35c8095eedf3b1bbcd49d787d28ee9e1e690a8a" - integrity sha512-5Lq0kQe2ItCoO1AjML+vdYb0kLKvS8rgp/0BOTqgJ5qc+UEZkQDyzGsKD9bcKb/JnLd4GR41NqR1MMnFAQp2Tg== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - victory-vendor "^36.8.6" - -victory-box-plot@^36.8.1: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-box-plot/-/victory-box-plot-36.8.6.tgz#8d08dbe7c6981387814998198d3ff9119bd1fe27" - integrity sha512-ntNwm2LUn9LIuK4Ti2sSMq7dhQ28nmFLyquQlKFucKjI/Zd85A4SbLcEdxOH3M+SzE+tbT1lZQ16sSvw0uOPyA== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - victory-vendor "^36.8.6" - -victory-brush-container@^36.8.6: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-brush-container/-/victory-brush-container-36.8.6.tgz#4f05cba7b544da2a3a5fed6b8d8e98dacdb29bf0" - integrity sha512-9fY/zHY2I9V9v9x4r+WQel5O8eHgQWQvKOvo8neFH+T6v2ehZDwEh6bd78QLugmEQRMScBkbPciVCF6Uj8RZ3Q== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - react-fast-compare "^3.2.0" - victory-core "^36.8.6" - -victory-chart@^36.8.1: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-chart/-/victory-chart-36.8.6.tgz#3a2b584e51b52c1539d2c72ebc4a8a256ddb9355" - integrity sha512-uo/8vZ34iUTY42CFO912TcRR//Q/ttP/4GGIcta9owRecetp46sApG3ChuvFSd6kRE5L78A7G6OSakGm5m8fLQ== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - react-fast-compare "^3.2.0" - victory-axis "^36.8.6" - victory-core "^36.8.6" - victory-polar-axis "^36.8.6" - victory-shared-events "^36.8.6" - -victory-core@^36.8.1, victory-core@^36.8.6: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-core/-/victory-core-36.8.6.tgz#72ffef52bc58f6ec0a648714ad09e816cb9a8b05" - integrity sha512-fT8SYy4wmtNTloV3npRC9pwEG8UkFF48ZmNGKywykpRuJXHVgV1GXeFEDH8/Ra0qHACVciR9Tcjk6X89GTRw4A== - dependencies: - lodash "^4.17.21" - prop-types "^15.8.1" - react-fast-compare "^3.2.0" - victory-vendor "^36.8.6" - -victory-create-container@^36.8.1: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-create-container/-/victory-create-container-36.8.6.tgz#4dc0334bd95a39f7fc76abb827f1f3f70f863488" - integrity sha512-ckQzNXg12TdmlTDFOoleV66XEP7c5NA/LLs9/cQaIEQPQnWe8PAGMvcFLG9Wvtz1mfGWFVgmzWqtlmjnHYmN6w== - dependencies: - lodash "^4.17.19" - victory-brush-container "^36.8.6" - victory-core "^36.8.6" - victory-cursor-container "^36.8.6" - victory-selection-container "^36.8.6" - victory-voronoi-container "^36.8.6" - victory-zoom-container "^36.8.6" - -victory-cursor-container@^36.8.1, victory-cursor-container@^36.8.6: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-cursor-container/-/victory-cursor-container-36.8.6.tgz#544fd3d7ee0888565de806db64c6619c943e262f" - integrity sha512-7z/BL7Yx18zXL7KEZta1ciLqg0aMxqaGHVBRr+DJDHJR3u+3NlNXsQVsdb2p3fZI52jZBBGwdvTbh8UiokMB2w== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - -victory-group@^36.8.1: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-group/-/victory-group-36.8.6.tgz#44b6bed7acd9f5112dafef8f1aed20101a700339" - integrity sha512-cKsLnPpDhb89GiJMNWG2ZgtlRPVU+n+NAzaBCWyZ31z8qq/j4i8FiIXi6lmvB0jE0QsVF2GHpYGL9Mmx+T44cQ== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - react-fast-compare "^3.2.0" - victory-core "^36.8.6" - victory-shared-events "^36.8.6" - -victory-legend@^36.8.1: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-legend/-/victory-legend-36.8.6.tgz#2ea44a77ab97873ea26008e64a99b69753f3741e" - integrity sha512-v4Gwan/7cv/UY5/1GhXLlwfkwaM/jqj8/IskeikQl0KIfZGpKBDaXx8lb2WQKEPP5edFrSQS4siEp5aY+E5urg== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - -victory-line@^36.8.1: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-line/-/victory-line-36.8.6.tgz#b05754860124e754ad69d8141cf60f3d66333345" - integrity sha512-3b2DPpSUr2UtTJXs147pHrWVdYtdyY8UIAo4qsBL1DLd+CnzyC/8JI9XxRUCCo0e1+u1MydjdboUtIYVm11b2Q== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - victory-vendor "^36.8.6" - -victory-pie@^36.8.1: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-pie/-/victory-pie-36.8.6.tgz#78bb1aab348885f8408194b7a920e8c408ff2b75" - integrity sha512-o8ZQZlkfMJiRalYwa4tMjBFmjHcQEWxR2O+Ak2p36QTPomIZ/6itQ+gHErvdO9BU/JdBJOJW/4iNJxGoEIrETA== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - victory-vendor "^36.8.6" - -victory-polar-axis@^36.8.6: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-polar-axis/-/victory-polar-axis-36.8.6.tgz#46b7b45c2a994db94a42027cb4d37b8b4a45775d" - integrity sha512-R+AVlPWttVvyaGOHb3o5ZhKRefz05MWPa9t1+J6YnpBZv9+RgNCxVlA2XyL2OtYYek3Jt/6DpsRUM65k7Df+8Q== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - -victory-scatter@^36.8.1: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-scatter/-/victory-scatter-36.8.6.tgz#897e207780ee5bd1797a2193e9c5c9ac64e618d2" - integrity sha512-aeVVlSsOUZJ2GsHNi0ioS9M4JolQGIJ0Uiwk0Bp0Tmhl0CgauV5P+91KDRDgcqMXrB+cmkUvT6GGOnpb+zQ45A== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - -victory-selection-container@^36.8.6: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-selection-container/-/victory-selection-container-36.8.6.tgz#30b384d22eb83cfbc5b4a58d2a0dc9e94586883a" - integrity sha512-Rm//Ap62uoNcDlgfzMC1oNC34w6SkIldOxHUWwiRuc3eUDdvtgczQua73GHucGOdvPkRbfW1L24raHj9+yDpLg== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - -victory-shared-events@^36.8.6: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-shared-events/-/victory-shared-events-36.8.6.tgz#9f8931b47d0a3cd2d79b5448ded257b0e75adcc5" - integrity sha512-to1BEqgEFbkPXhCdPH4zhwYkB6H76hLVzbWZCYnP0UiK3v7ZzCwPhZKjansCVBaMCzN6Tz4mV023XIYNs06Elg== - dependencies: - json-stringify-safe "^5.0.1" - lodash "^4.17.19" - prop-types "^15.8.1" - react-fast-compare "^3.2.0" - victory-core "^36.8.6" - -victory-stack@^36.8.1: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-stack/-/victory-stack-36.8.6.tgz#a94b3e33432cf2996325149c94efb6dfbdc489c4" - integrity sha512-VyfWfNP1wA8ZYhO/AesBQwmeWCGKBQgC5H8y5/jLpSDVFPiKURTxm01jq44ov9f6Nop+verRrKA59GJMbGrZmQ== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - react-fast-compare "^3.2.0" - victory-core "^36.8.6" - victory-shared-events "^36.8.6" - -victory-tooltip@^36.8.1, victory-tooltip@^36.8.6: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-tooltip/-/victory-tooltip-36.8.6.tgz#bf2643ee169603d4623b475456a19ec8714dc54a" - integrity sha512-B5cTz7LkT9emuXPTzv7mXSXlSNp8ATRogBTfwUfIGmTfLGvP5SQza+StRNXgBdKD352/Az/GIWW7aqzbpk6yEA== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - -victory-vendor@^36.8.6: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-vendor/-/victory-vendor-36.8.6.tgz#44a150779119ebcd19120f30fc1f891341ca803f" - integrity sha512-PH8Wj9b0xIZ4AVfyn0c1SJrOhtxDJ5PNxj1ZDABPg1Gw1vJr1mJVqESPhvsFj7mXLQohVdiKqp4kWZkXlPcRcA== - 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" - -victory-voronoi-container@^36.8.1, victory-voronoi-container@^36.8.6: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-voronoi-container/-/victory-voronoi-container-36.8.6.tgz#e2f607f816fc60ed7f7353b81b47163aa8a4e6cf" - integrity sha512-bhikEGWJnLVTRP/jkAwC1U7dre52pdF3LgSAF4aZudTgPy4o66vVoIrdBJhG5yY9QSXou/sPRJt6p/xtZ6vRag== - dependencies: - delaunay-find "0.0.6" - lodash "^4.17.19" - prop-types "^15.8.1" - react-fast-compare "^3.2.0" - victory-core "^36.8.6" - victory-tooltip "^36.8.6" - -victory-zoom-container@^36.8.1, victory-zoom-container@^36.8.6: - version "36.8.6" - resolved "https://registry.yarnpkg.com/victory-zoom-container/-/victory-zoom-container-36.8.6.tgz#a8bfb275360301e84820b1a12273e30b02806974" - integrity sha512-tsXUNk/DwRZ7Dk2uf+z1N1eOZ/zLbZCR8aDyYgzDP74ne53/bkBxnwgSLBtN1KvB+PRN0sP0W0+Y+12/kA/fzg== - dependencies: - lodash "^4.17.19" - prop-types "^15.8.1" - victory-core "^36.8.6" - w3c-xmlserializer@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" @@ -9729,11 +9498,6 @@ yaml@^1.10.0: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^20.2.3: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - yargs-parser@^21.0.1, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" @@ -9761,3 +9525,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.1.tgz#36d7c4739f775b3cbc28e6136e21aa057adec418" + integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg== From 0072fff206fc312a538a6185d66392918a38dc89 Mon Sep 17 00:00:00 2001 From: bartoval Date: Sat, 31 May 2025 12:47:19 +0200 Subject: [PATCH 4/7] creates startup scripts --- components/console/.eslintrc.json | 1 - components/console/src/App.tsx | 2 +- components/console/src/config/colors.ts | 26 +- components/console/src/config/config.ts | 2 +- components/console/src/config/reactQuery.ts | 2 +- .../src/core/components/EmptyData/index.tsx | 7 +- .../core/components/SkSearchFilter/index.tsx | 1 - .../core/components/SkUpdateButton/index.tsx | 4 +- components/console/src/layout/Footer.tsx | 4 +- components/console/src/layout/Header.tsx | 5 +- .../console/src/layout/MainContainer.tsx | 2 +- components/console/src/layout/SideBar.tsx | 1 - .../src/pages/Backbones/views/Backbone.tsx | 10 +- .../src/pages/Backbones/views/Backbones.tsx | 29 +- .../src/pages/Backbones/views/Invitations.tsx | 41 +-- .../src/pages/Backbones/views/Vans.tsx | 31 +- .../src/pages/shared/Errors/Console/index.tsx | 2 +- .../src/pages/shared/Errors/Http/index.tsx | 13 +- .../pages/shared/Errors/NotFound/index.tsx | 2 +- setup-database.sh | 332 ++++++++++++++++++ start-console-dev.sh | 54 +++ start-dev-mode.sh | 198 +++++++++++ start-skupper-standalone.sh | 279 +++++++++++++++ 23 files changed, 941 insertions(+), 107 deletions(-) create mode 100644 setup-database.sh create mode 100644 start-console-dev.sh create mode 100644 start-dev-mode.sh create mode 100644 start-skupper-standalone.sh diff --git a/components/console/.eslintrc.json b/components/console/.eslintrc.json index 66604e8..0acf0f2 100644 --- a/components/console/.eslintrc.json +++ b/components/console/.eslintrc.json @@ -28,7 +28,6 @@ "plugin:react/recommended", "plugin:import/errors", "plugin:import/warnings", - "plugin:@typescript-eslint/recommended", "prettier" ], "parser": "@typescript-eslint/parser", diff --git a/components/console/src/App.tsx b/components/console/src/App.tsx index 8b2f18c..17c1355 100644 --- a/components/console/src/App.tsx +++ b/components/console/src/App.tsx @@ -30,7 +30,7 @@ const App = function () { - + diff --git a/components/console/src/config/colors.ts b/components/console/src/config/colors.ts index 21389ed..9a05a21 100644 --- a/components/console/src/config/colors.ts +++ b/components/console/src/config/colors.ts @@ -1,17 +1,17 @@ export enum Colors { - White = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--white */, - Black900 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--black-900 */, - Black600 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--black-600 */, - Black500 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--black-500 */, - Black400 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--black-400 */, - Black100 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--black-100 */, - Green500 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--green-500 */, - Blue400 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--blue-400 */, - Purple500 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--purple-500 */, - Cyan300 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--cyan-300 */, - Orange200 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--orange-200 */, - Yellow300 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--gold-300 */, - Red100 = "--pf-t--temp--dev--tbd"/* CODEMODS: original v5 color was --pf-v5-global--palette--red-100 */ + White = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--white */, + Black900 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--black-900 */, + Black600 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--black-600 */, + Black500 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--black-500 */, + Black400 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--black-400 */, + Black100 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--black-100 */, + Green500 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--green-500 */, + Blue400 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--blue-400 */, + Purple500 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--purple-500 */, + Cyan300 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--cyan-300 */, + Orange200 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--orange-200 */, + Yellow300 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--gold-300 */, + Red100 = '--pf-t--temp--dev--tbd' /* CODEMODS: original v5 color was --pf-v5-global--palette--red-100 */ } export enum VarColors { diff --git a/components/console/src/config/config.ts b/components/console/src/config/config.ts index 82f4c05..99b4ab2 100644 --- a/components/console/src/config/config.ts +++ b/components/console/src/config/config.ts @@ -27,7 +27,7 @@ export const ALERT_VISIBILITY_TIMEOUT = 5000; // Time in milliseconds to display export const waitForElementToBeRemovedTimeout = 10000; export const DARK_THEME_CLASS = 'pf-v5-theme-dark'; -export const DEFAULT_FONT_VAR = "var(--pf-t--global--font--family--body)"; +export const DEFAULT_FONT_VAR = 'var(--pf-t--global--font--family--body)'; // number of nodes to start showing the aggregate nodes in the topology export const MAX_NODE_COUNT_WITHOUT_AGGREGATION = Number(process.env.MAX_NODE_COUNT_WITHOUT_AGGREGATION) || 26; diff --git a/components/console/src/config/reactQuery.ts b/components/console/src/config/reactQuery.ts index eabe337..166aa37 100644 --- a/components/console/src/config/reactQuery.ts +++ b/components/console/src/config/reactQuery.ts @@ -1,4 +1,4 @@ -import { DefaultOptions } from '@tanstack/react-query'; +import { DefaultOptions } from '@tanstack/react-query'; interface QueryClientConfig { defaultOptions: { diff --git a/components/console/src/core/components/EmptyData/index.tsx b/components/console/src/core/components/EmptyData/index.tsx index 955fbdc..cda9a2f 100644 --- a/components/console/src/core/components/EmptyData/index.tsx +++ b/components/console/src/core/components/EmptyData/index.tsx @@ -1,11 +1,6 @@ import { ComponentType, FC } from 'react'; -import { - Bullseye, - EmptyState, - EmptyStateBody, - EmptyStateVariant -} from '@patternfly/react-core'; +import { Bullseye, EmptyState, EmptyStateBody, EmptyStateVariant } from '@patternfly/react-core'; import { EmptyDataLabels } from './EmptyData.enum'; diff --git a/components/console/src/core/components/SkSearchFilter/index.tsx b/components/console/src/core/components/SkSearchFilter/index.tsx index 8c9838d..3c9d6c9 100644 --- a/components/console/src/core/components/SkSearchFilter/index.tsx +++ b/components/console/src/core/components/SkSearchFilter/index.tsx @@ -15,7 +15,6 @@ import { ToolbarFilter, Button } from '@patternfly/react-core'; - import { FilterIcon } from '@patternfly/react-icons'; import useDebounce from 'hooks/useDebounce'; diff --git a/components/console/src/core/components/SkUpdateButton/index.tsx b/components/console/src/core/components/SkUpdateButton/index.tsx index 98191f6..e5249d3 100644 --- a/components/console/src/core/components/SkUpdateButton/index.tsx +++ b/components/console/src/core/components/SkUpdateButton/index.tsx @@ -119,9 +119,7 @@ const SkUpdateDataButton: FC = function ({ data-testid="update-data-click" onClick={() => revalidateLiveQueries()} style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0 }} - > - - + /> ); }; diff --git a/components/console/src/layout/Footer.tsx b/components/console/src/layout/Footer.tsx index 4ff7515..9f894ad 100644 --- a/components/console/src/layout/Footer.tsx +++ b/components/console/src/layout/Footer.tsx @@ -21,9 +21,7 @@ const Footer: FC = function ({ className = '' }) { justifyContent: 'center' }} > -

- copyright © Skupper-X -

+

copyright © Skupper-X

); }; diff --git a/components/console/src/layout/Header.tsx b/components/console/src/layout/Header.tsx index 45d7dcd..a58e669 100644 --- a/components/console/src/layout/Header.tsx +++ b/components/console/src/layout/Header.tsx @@ -4,7 +4,8 @@ import { MastheadLogo, MastheadContent, MastheadMain, - MastheadToggle, MastheadBrand, + MastheadToggle, + MastheadBrand, PageToggleButton, Toolbar, ToolbarContent, @@ -39,7 +40,7 @@ const SkHeader = function () { - + {/* Add any future header actions here */} diff --git a/components/console/src/layout/MainContainer.tsx b/components/console/src/layout/MainContainer.tsx index c5dea8e..cf695f9 100644 --- a/components/console/src/layout/MainContainer.tsx +++ b/components/console/src/layout/MainContainer.tsx @@ -10,8 +10,8 @@ import { import LoadingPage from '@pages/shared/Loading'; -import TransitionPage from '../core/components/TransitionPages/Fade'; import Footer from './Footer'; +import TransitionPage from '../core/components/TransitionPages/Fade'; import '@patternfly/patternfly/patternfly-addons.css'; diff --git a/components/console/src/layout/SideBar.tsx b/components/console/src/layout/SideBar.tsx index 1deede5..cfa87a1 100644 --- a/components/console/src/layout/SideBar.tsx +++ b/components/console/src/layout/SideBar.tsx @@ -2,7 +2,6 @@ import { PageSidebar, PageSidebarBody } from '@patternfly/react-core'; import NavBar from '@core/components/NavBar'; - const SkSidebar = function () { return ( diff --git a/components/console/src/pages/Backbones/views/Backbone.tsx b/components/console/src/pages/Backbones/views/Backbone.tsx index 2a94fab..e826be3 100644 --- a/components/console/src/pages/Backbones/views/Backbone.tsx +++ b/components/console/src/pages/Backbones/views/Backbone.tsx @@ -146,13 +146,12 @@ const Backbone = function () { const handleLinkDelete = useCallback( (siteId: string) => { - mutationDeleteLink.mutate(siteId) + mutationDeleteLink.mutate(siteId); }, [mutationDeleteLink] ); - const handleSiteRefresh = useCallback(() => { setTimeout(() => { refetchSites(); @@ -268,9 +267,10 @@ const Backbone = function () { timeFormat={TimestampFormat.medium} /> ); - } else { - return '-'; - } + } + +return '-'; + }, actions: ({ data }: { data: SiteResponse }) => ( diff --git a/components/console/src/pages/Backbones/views/Backbones.tsx b/components/console/src/pages/Backbones/views/Backbones.tsx index e408628..63a1636 100644 --- a/components/console/src/pages/Backbones/views/Backbones.tsx +++ b/components/console/src/pages/Backbones/views/Backbones.tsx @@ -1,22 +1,19 @@ import { useCallback, useState } from 'react'; import { - Alert, - Button, - Icon, - OverflowMenu, - OverflowMenuContent, - OverflowMenuGroup, - OverflowMenuItem, - Toolbar, - ToolbarContent, - ToolbarGroup, - ToolbarItem + Alert, + Button, + Icon, + OverflowMenu, + OverflowMenuContent, + OverflowMenuGroup, + OverflowMenuItem, + Toolbar, + ToolbarContent, + ToolbarGroup, + ToolbarItem } from '@patternfly/react-core'; -import { - Modal, - ModalVariant -} from '@patternfly/react-core/deprecated'; +import { Modal, ModalVariant } from '@patternfly/react-core/deprecated'; import { CheckCircleIcon, InProgressIcon, SyncAltIcon } from '@patternfly/react-icons'; import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; @@ -103,7 +100,7 @@ const Backbones = function () { - + diff --git a/components/console/src/pages/Backbones/views/Invitations.tsx b/components/console/src/pages/Backbones/views/Invitations.tsx index 1d28592..8291681 100644 --- a/components/console/src/pages/Backbones/views/Invitations.tsx +++ b/components/console/src/pages/Backbones/views/Invitations.tsx @@ -1,28 +1,25 @@ import { FC, useCallback, useState } from 'react'; import { - Alert, - Button, - Icon, - OverflowMenu, - OverflowMenuContent, - OverflowMenuGroup, - OverflowMenuItem, - PageSection, - Stack, - StackItem, - Timestamp, - TimestampFormat, - Title, - Toolbar, - ToolbarContent, - ToolbarGroup, - ToolbarItem, + Alert, + Button, + Icon, + OverflowMenu, + OverflowMenuContent, + OverflowMenuGroup, + OverflowMenuItem, + PageSection, + Stack, + StackItem, + Timestamp, + TimestampFormat, + Title, + Toolbar, + ToolbarContent, + ToolbarGroup, + ToolbarItem } from '@patternfly/react-core'; -import { - Modal, - ModalVariant -} from '@patternfly/react-core/deprecated'; +import { Modal, ModalVariant } from '@patternfly/react-core/deprecated'; import { InProgressIcon, SyncAltIcon } from '@patternfly/react-icons'; import { useMutation, useSuspenseQueries } from '@tanstack/react-query'; import { useParams } from 'react-router'; @@ -131,7 +128,7 @@ const Invitations: FC<{ vid: string }> = function ({ vid }) { {BackboneLabels.Invitations} - + diff --git a/components/console/src/pages/Backbones/views/Vans.tsx b/components/console/src/pages/Backbones/views/Vans.tsx index 58e7e5c..0fba071 100644 --- a/components/console/src/pages/Backbones/views/Vans.tsx +++ b/components/console/src/pages/Backbones/views/Vans.tsx @@ -1,22 +1,19 @@ import { useCallback, useState } from 'react'; import { - Alert, - Button, - Icon, - OverflowMenu, - OverflowMenuContent, - OverflowMenuGroup, - OverflowMenuItem, - Toolbar, - ToolbarContent, - ToolbarGroup, - ToolbarItem + Alert, + Button, + Icon, + OverflowMenu, + OverflowMenuContent, + OverflowMenuGroup, + OverflowMenuItem, + Toolbar, + ToolbarContent, + ToolbarGroup, + ToolbarItem } from '@patternfly/react-core'; -import { - Modal, - ModalVariant -} from '@patternfly/react-core/deprecated'; +import { Modal, ModalVariant } from '@patternfly/react-core/deprecated'; import { InProgressIcon, SyncAltIcon } from '@patternfly/react-icons'; import { useMutation, useSuspenseQuery } from '@tanstack/react-query'; @@ -84,7 +81,7 @@ const Vans = function () { <> - + @@ -93,7 +90,7 @@ const Vans = function () { {vanValidated && } - + = function ({ error, resetErrorBoundar // It handles app errors return ( - + {ConsoleErrorLabels.ErrorTitle} {message} diff --git a/components/console/src/pages/shared/Errors/Http/index.tsx b/components/console/src/pages/shared/Errors/Http/index.tsx index d9821be..85b6b4e 100644 --- a/components/console/src/pages/shared/Errors/Http/index.tsx +++ b/components/console/src/pages/shared/Errors/Http/index.tsx @@ -1,15 +1,6 @@ import { FC, MouseEventHandler } from 'react'; -import { - Button, - Divider, - List, - ListItem, - PageSection, - Content, - ContentVariants, - Title -} from '@patternfly/react-core'; +import { Button, Divider, List, ListItem, PageSection, Content, ContentVariants, Title } from '@patternfly/react-core'; import { HttpErrorLabels } from './Http.enum'; @@ -19,7 +10,7 @@ const ErrorHttp: FC<{ code?: string; message?: string; onReset?: MouseEventHandl onReset }) { return ( - + {message || HttpErrorLabels.ErrorTitle} {code || ''} diff --git a/components/console/src/pages/shared/Errors/NotFound/index.tsx b/components/console/src/pages/shared/Errors/NotFound/index.tsx index 060c167..b42e706 100644 --- a/components/console/src/pages/shared/Errors/NotFound/index.tsx +++ b/components/console/src/pages/shared/Errors/NotFound/index.tsx @@ -4,7 +4,7 @@ import { NotFoundLabels } from './NotFound.enum'; const NotFound = function () { return ( - + {NotFoundLabels.ErrorTitle} diff --git a/setup-database.sh b/setup-database.sh new file mode 100644 index 0000000..7c231ef --- /dev/null +++ b/setup-database.sh @@ -0,0 +1,332 @@ +#!/bin/bash + +# Script per installare e configurare solo il database PostgreSQL per Skupper-X +# Può essere usato indipendentemente dagli altri servizi + +set -e # Exit on any error + +echo "🗄️ Setting up PostgreSQL Database for Skupper-X" +echo "================================================" + +# Colori per output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Directory di progetto +PROJECT_DIR="/home/vabar/Projects/skupper-X" + +# Configurazione database (da postgres-config.yaml) +DB_NAME="studiodb" +DB_USER="access" +DB_PASSWORD="password" +DB_HOST="localhost" +DB_PORT="5432" +POSTGRES_CONTAINER_NAME="skupper-postgres" +POSTGRES_VOLUME_NAME="skupper-postgres-data" + +# Funzione per logging colorato +log_info() { + echo -e "${BLUE}ℹ️ $1${NC}" +} + +log_success() { + echo -e "${GREEN}✅ $1${NC}" +} + +log_warning() { + echo -e "${YELLOW}⚠️ $1${NC}" +} + +log_error() { + echo -e "${RED}❌ $1${NC}" +} + +# Funzione per controllare se PostgreSQL container è pronto +wait_for_postgres_container() { + log_info "Waiting for PostgreSQL container to be ready..." + local max_attempts=30 + local attempt=1 + + while [ $attempt -le $max_attempts ]; do + if docker exec $POSTGRES_CONTAINER_NAME pg_isready -U $DB_USER >/dev/null 2>&1; then + log_success "PostgreSQL container is ready!" + return 0 + fi + + echo -n "." + sleep 1 + attempt=$((attempt + 1)) + done + + log_error "PostgreSQL container failed to become ready" + return 1 +} + +# Funzione per mostrare lo stato del database +show_database_status() { + log_info "Database Status:" + echo " Container Name: $POSTGRES_CONTAINER_NAME" + echo " Database Name: $DB_NAME" + echo " User: $DB_USER" + echo " Host: $DB_HOST" + echo " Port: $DB_PORT" + echo " Volume: $POSTGRES_VOLUME_NAME" + echo "" + + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_success "✅ PostgreSQL container is running" + elif docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_warning "⚠️ PostgreSQL container exists but is stopped" + else + log_info "ℹ️ PostgreSQL container does not exist" + fi + + if docker volume ls | grep -q "$POSTGRES_VOLUME_NAME"; then + log_success "✅ PostgreSQL data volume exists" + else + log_info "ℹ️ PostgreSQL data volume does not exist" + fi +} + +# Funzione per rimuovere completamente il database +remove_database() { + log_warning "This will PERMANENTLY DELETE all database data!" + echo -n "Are you sure? Type 'yes' to confirm: " + read confirmation + + if [ "$confirmation" = "yes" ]; then + log_info "Removing PostgreSQL container and data..." + + # Stop and remove container + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + docker stop $POSTGRES_CONTAINER_NAME + fi + + if docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + docker rm $POSTGRES_CONTAINER_NAME + fi + + # Remove volume + if docker volume ls | grep -q "$POSTGRES_VOLUME_NAME"; then + docker volume rm $POSTGRES_VOLUME_NAME + fi + + log_success "Database completely removed" + else + log_info "Database removal cancelled" + fi +} + +# Parse command line arguments +case "${1:-setup}" in + setup|install) + ACTION="setup" + ;; + status) + ACTION="status" + ;; + start) + ACTION="start" + ;; + stop) + ACTION="stop" + ;; + restart) + ACTION="restart" + ;; + remove|delete) + ACTION="remove" + ;; + logs) + ACTION="logs" + ;; + psql|connect) + ACTION="connect" + ;; + *) + echo "Usage: $0 [setup|status|start|stop|restart|remove|logs|connect]" + echo "" + echo "Commands:" + echo " setup - Install and configure PostgreSQL (default)" + echo " status - Show database status" + echo " start - Start PostgreSQL container" + echo " stop - Stop PostgreSQL container" + echo " restart - Restart PostgreSQL container" + echo " remove - Completely remove database and data" + echo " logs - Show PostgreSQL logs" + echo " connect - Connect to database with psql" + exit 1 + ;; +esac + +# 1. Verifica prerequisiti +if [ "$ACTION" != "status" ]; then + log_info "Checking prerequisites..." + + # Verifica Docker + if ! command -v docker &> /dev/null; then + log_error "Docker is not installed or not in PATH" + log_warning "Install Docker first: https://docs.docker.com/get-docker/" + exit 1 + fi + + # Verifica che Docker sia in esecuzione + if ! docker info >/dev/null 2>&1; then + log_error "Docker daemon is not running" + log_warning "Start Docker with: sudo systemctl start docker" + exit 1 + fi + + log_success "Prerequisites check passed" +fi + +# Esegui l'azione richiesta +case "$ACTION" in + setup) + show_database_status + echo "" + + # Assicurati che il container sia in esecuzione + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_success "PostgreSQL container is already running" + elif docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + # Container esiste ma è fermato - riavvialo + log_info "Starting existing PostgreSQL container..." + docker start $POSTGRES_CONTAINER_NAME + if [ $? -eq 0 ]; then + log_success "PostgreSQL container started successfully" + else + log_error "Failed to start PostgreSQL container" + exit 1 + fi + else + # Nessun container esistente - creane uno nuovo e avvialo + log_info "Creating and starting new PostgreSQL container..." + + # Crea e avvia nuovo container PostgreSQL con volume persistente + docker run -d \ + --name $POSTGRES_CONTAINER_NAME \ + -e POSTGRES_DB=$DB_NAME \ + -e POSTGRES_USER=$DB_USER \ + -e POSTGRES_PASSWORD=$DB_PASSWORD \ + -p $DB_PORT:5432 \ + -v $POSTGRES_VOLUME_NAME:/var/lib/postgresql/data \ + postgres:15-alpine + + if [ $? -eq 0 ]; then + log_success "PostgreSQL container created and started successfully" + else + log_error "Failed to create PostgreSQL container" + exit 1 + fi + fi + + # Attendi che PostgreSQL sia pronto + sleep 5 + if ! wait_for_postgres_container; then + log_error "PostgreSQL container failed to become ready" + log_info "Check container logs with: $0 logs" + exit 1 + fi + + # Inizializza il database se necessario + log_info "Checking if database schema needs initialization..." + + if docker exec $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME -c "SELECT 1 FROM Configuration LIMIT 1;" >/dev/null 2>&1; then + log_warning "Database already initialized, skipping schema setup" + else + log_info "Initializing database schema..." + + # Copia il file SQL nel container e eseguilo + docker cp "$PROJECT_DIR/scripts/db-setup.sql" $POSTGRES_CONTAINER_NAME:/tmp/db-setup.sql + + if docker exec $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME -f /tmp/db-setup.sql; then + log_success "Database schema initialized successfully" + # Rimuovi il file temporaneo + docker exec $POSTGRES_CONTAINER_NAME rm /tmp/db-setup.sql + else + log_error "Database initialization failed" + exit 1 + fi + fi + + echo "" + log_success "🎉 PostgreSQL setup completed successfully!" + echo "" + log_info "Connection details:" + echo " Host: $DB_HOST" + echo " Port: $DB_PORT" + echo " Database: $DB_NAME" + echo " User: $DB_USER" + echo " Password: $DB_PASSWORD" + echo "" + log_info "Environment variables for applications:" + echo " export PGHOST=$DB_HOST" + echo " export PGPORT=$DB_PORT" + echo " export PGDATABASE=$DB_NAME" + echo " export PGUSER=$DB_USER" + echo " export PGPASSWORD=$DB_PASSWORD" + ;; + + status) + show_database_status + ;; + + start) + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_warning "PostgreSQL container is already running" + elif docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_info "Starting PostgreSQL container..." + docker start $POSTGRES_CONTAINER_NAME + log_success "PostgreSQL container started" + else + log_error "PostgreSQL container does not exist. Run '$0 setup' first." + exit 1 + fi + ;; + + stop) + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_info "Stopping PostgreSQL container..." + docker stop $POSTGRES_CONTAINER_NAME + log_success "PostgreSQL container stopped" + else + log_warning "PostgreSQL container is not running" + fi + ;; + + restart) + log_info "Restarting PostgreSQL container..." + docker restart $POSTGRES_CONTAINER_NAME 2>/dev/null || { + log_error "PostgreSQL container does not exist. Run '$0 setup' first." + exit 1 + } + log_success "PostgreSQL container restarted" + ;; + + remove) + remove_database + ;; + + logs) + if docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + docker logs -f $POSTGRES_CONTAINER_NAME + else + log_error "PostgreSQL container does not exist" + exit 1 + fi + ;; + + connect) + if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_info "Connecting to PostgreSQL database..." + docker exec -it $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME + else + log_error "PostgreSQL container is not running. Start it with '$0 start'" + exit 1 + fi + ;; +esac diff --git a/start-console-dev.sh b/start-console-dev.sh new file mode 100644 index 0000000..2d203ab --- /dev/null +++ b/start-console-dev.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +# Script per avviare solo il frontend console in modalità sviluppo +# Assume che il backend sia già in esecuzione su porta 8085 + +set -e + +echo "🎨 Starting Frontend Console in Development Mode" +echo "================================================" + +# Colori per output +GREEN='\033[0;32m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +CONSOLE_DIR="/home/vabar/Projects/skupper-X/components/console" + +log_info() { + echo -e "${BLUE}ℹ️ $1${NC}" +} + +log_success() { + echo -e "${GREEN}✅ $1${NC}" +} + +# Verifica che il backend sia in esecuzione +log_info "Checking if backend is running on port 8085..." +if ! curl -s http://localhost:8085/healthz >/dev/null 2>&1; then + echo "❌ Backend is not responding on port 8085" + echo "ℹ️ Start the backend first with:" + echo " cd /home/vabar/Projects/skupper-X" + echo " ./start-skupper-standalone.sh" + echo "" + echo "Or use the full development script:" + echo " ./start-dev-mode.sh" + exit 1 +fi + +log_success "Backend is responding" + +cd "$CONSOLE_DIR" + +# Verifica dipendenze +if [ ! -d "node_modules" ]; then + log_info "Installing dependencies..." + yarn install +fi + +log_info "Starting development server..." +log_success "🎯 Console will be available at: http://localhost:3000" +log_info "API calls will be proxied to backend at: http://localhost:8085" +echo "" + +yarn start diff --git a/start-dev-mode.sh b/start-dev-mode.sh new file mode 100644 index 0000000..f8b9949 --- /dev/null +++ b/start-dev-mode.sh @@ -0,0 +1,198 @@ +#!/bin/bash + +# Script per avviare Skupper-X in modalità sviluppo +# Backend su porta 8085, Frontend su porta 3000 + +set -e + +echo "🚀 Starting Skupper-X in Development Mode" +echo "========================================" + +# Colori per output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Directory di progetto +PROJECT_DIR="/home/vabar/Projects/skupper-X" +MANAGEMENT_CONTROLLER_DIR="$PROJECT_DIR/components/management-controller" +CONSOLE_DIR="$PROJECT_DIR/components/console" + +# Configurazione database +DB_NAME="studiodb" +DB_USER="access" +DB_PASSWORD="password" +DB_HOST="localhost" +DB_PORT="5432" +POSTGRES_CONTAINER_NAME="skupper-postgres" + +# PIDs dei processi +BACKEND_PID="" +FRONTEND_PID="" + +# Funzione per logging colorato +log_info() { + echo -e "${BLUE}ℹ️ $1${NC}" +} + +log_success() { + echo -e "${GREEN}✅ $1${NC}" +} + +log_warning() { + echo -e "${YELLOW}⚠️ $1${NC}" +} + +log_error() { + echo -e "${RED}❌ $1${NC}" +} + +# Funzione per cleanup +cleanup() { + log_warning "Shutting down development services..." + + if [ ! -z "$FRONTEND_PID" ]; then + log_info "Stopping Frontend Development Server..." + kill $FRONTEND_PID 2>/dev/null || true + fi + + if [ ! -z "$BACKEND_PID" ]; then + log_info "Stopping Management Controller..." + kill $BACKEND_PID 2>/dev/null || true + fi + + log_info "PostgreSQL container remains running to preserve data" + log_success "Development environment cleanup completed" +} + +# Trap per cleanup automatico +trap cleanup EXIT INT TERM + +# 1. Verifica prerequisiti +log_info "Checking prerequisites..." + +# Verifica Node.js e yarn +if ! command -v node &> /dev/null; then + log_error "Node.js is not installed" + exit 1 +fi + +if ! command -v yarn &> /dev/null; then + log_error "Yarn is not installed" + exit 1 +fi + +# Verifica Docker e PostgreSQL +if ! command -v docker &> /dev/null; then + log_error "Docker is not installed" + exit 1 +fi + +if ! docker info >/dev/null 2>&1; then + log_error "Docker daemon is not running" + exit 1 +fi + +log_success "All prerequisites are available" + +# 2. Controlla PostgreSQL +log_info "Checking PostgreSQL container..." + +if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_success "PostgreSQL container is running" +elif docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_info "Starting PostgreSQL container..." + docker start $POSTGRES_CONTAINER_NAME + sleep 3 +else + log_info "Creating PostgreSQL container..." + docker run -d \ + --name $POSTGRES_CONTAINER_NAME \ + -e POSTGRES_DB=$DB_NAME \ + -e POSTGRES_USER=$DB_USER \ + -e POSTGRES_PASSWORD=$DB_PASSWORD \ + -p $DB_PORT:5432 \ + -v skupper-postgres-data:/var/lib/postgresql/data \ + postgres:15-alpine + + log_info "Waiting for PostgreSQL to be ready..." + sleep 8 + + # Inizializza database se necessario + if ! docker exec $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME -c "SELECT 1 FROM Configuration LIMIT 1;" >/dev/null 2>&1; then + log_info "Initializing database schema..." + docker cp "$PROJECT_DIR/scripts/db-setup.sql" $POSTGRES_CONTAINER_NAME:/tmp/db-setup.sql + docker exec $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME -f /tmp/db-setup.sql + docker exec $POSTGRES_CONTAINER_NAME rm /tmp/db-setup.sql + log_success "Database initialized" + fi +fi + +# 3. Prepara environment variables per il backend +export SKX_STANDALONE_NAMESPACE=default +export PGUSER=$DB_USER +export PGHOST=$DB_HOST +export PGPASSWORD=$DB_PASSWORD +export PGDATABASE=$DB_NAME +export PGPORT=$DB_PORT +export SKX_CONTROLLER_NAME=dev-controller +export NODE_ENV=development + +# 4. Avvia il Management Controller (Backend) +log_info "Starting Management Controller (Backend) on port 8085..." +cd "$MANAGEMENT_CONTROLLER_DIR" +node index.js & +BACKEND_PID=$! + +# Attendi che il backend si avvii +sleep 5 + +if ! kill -0 $BACKEND_PID 2>/dev/null; then + log_error "Management Controller failed to start" + exit 1 +fi + +# Testa l'API +sleep 2 +if curl -s http://localhost:8085/healthz >/dev/null 2>&1; then + log_success "Backend API is responding at http://localhost:8085" +else + log_warning "Backend API may still be starting..." +fi + +# 5. Installa dipendenze della console se necessario +log_info "Checking console dependencies..." +cd "$CONSOLE_DIR" +if [ ! -d "node_modules" ]; then + log_info "Installing console dependencies..." + yarn install +fi + +# 6. Avvia il Development Server della Console (Frontend) +log_info "Starting Console Development Server (Frontend) on port 3000..." +yarn start & +FRONTEND_PID=$! + +# Attendi che il frontend si avvii +sleep 5 + +if ! kill -0 $FRONTEND_PID 2>/dev/null; then + log_error "Frontend Development Server failed to start" + exit 1 +fi + +log_success "🎯 Development Environment Ready!" +echo "" +log_info "Services running:" +echo " 🔗 Frontend Console: http://localhost:3000" +echo " 🔗 Backend API: http://localhost:8085" +echo " 🔗 Health Check: http://localhost:8085/healthz" +echo "" +log_info "Frontend calls to /api/* and /compose/* will be proxied to the backend" +log_info "Press Ctrl+C to stop all services" +echo "" + +# Mantieni lo script in esecuzione +wait diff --git a/start-skupper-standalone.sh b/start-skupper-standalone.sh new file mode 100644 index 0000000..e191881 --- /dev/null +++ b/start-skupper-standalone.sh @@ -0,0 +1,279 @@ +#!/bin/bash + +# Script completo per avviare Skupper-X in modalità standalone +# Usa PostgreSQL con Docker + +set -e # Exit on any error + +echo "🚀 Starting Skupper-X in Standalone Mode (Docker PostgreSQL)" +echo "============================================================" + +# Colori per output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +BLUE='\033[0;34m' +NC='\033[0m' # No Color + +# Directory di progetto +PROJECT_DIR="/home/vabar/Projects/skupper-X" +MANAGEMENT_CONTROLLER_DIR="$PROJECT_DIR/components/management-controller" +CONSOLE_DIR="$PROJECT_DIR/components/console" + +# Configurazione database (da postgres-config.yaml) +DB_NAME="studiodb" +DB_USER="access" +DB_PASSWORD="password" +DB_HOST="localhost" +DB_PORT="5432" +POSTGRES_CONTAINER_NAME="skupper-postgres" + +# Funzione per logging colorato +log_info() { + echo -e "${BLUE}ℹ️ $1${NC}" +} + +log_success() { + echo -e "${GREEN}✅ $1${NC}" +} + +log_warning() { + echo -e "${YELLOW}⚠️ $1${NC}" +} + +log_error() { + echo -e "${RED}❌ $1${NC}" +} + +# Funzione per controllare se PostgreSQL container è pronto +wait_for_postgres_container() { + log_info "Waiting for PostgreSQL container to be ready..." + local max_attempts=30 + local attempt=1 + + while [ $attempt -le $max_attempts ]; do + if docker exec $POSTGRES_CONTAINER_NAME pg_isready -U $DB_USER >/dev/null 2>&1; then + log_success "PostgreSQL container is ready!" + return 0 + fi + + echo -n "." + sleep 1 + attempt=$((attempt + 1)) + done + + log_error "PostgreSQL container failed to become ready" + return 1 +} + +# Funzione per buildare la console e il management controller +build_console_and_controller() { + log_info "Building console and management controller..." + + # Check if yarn is available + if ! command -v yarn &> /dev/null; then + log_error "Yarn is not installed or not in PATH" + log_warning "Install yarn first: npm install -g yarn" + return 1 + fi + + # Build console + log_info "Building console (React app)..." + cd "$CONSOLE_DIR" + if ! yarn install >/dev/null 2>&1; then + log_error "Failed to install console dependencies" + return 1 + fi + + if ! yarn build >/dev/null 2>&1; then + log_error "Failed to build console" + return 1 + fi + log_success "Console built successfully" + + # Build management controller (includes console integration) + log_info "Building management controller with integrated console..." + cd "$MANAGEMENT_CONTROLLER_DIR" + if ! node build.js; then + log_error "Failed to build management controller" + return 1 + fi + log_success "Management controller built successfully" + + return 0 +} + +# Funzione per pulire i processi in uscita +cleanup() { + log_warning "Shutting down services..." + if [ ! -z "$CONTROLLER_PID" ]; then + log_info "Stopping Management Controller..." + kill $CONTROLLER_PID 2>/dev/null || true + fi + + # ✅ NON fermiamo il container PostgreSQL - rimane in esecuzione per preservare i dati + log_info "PostgreSQL container remains running to preserve data" + log_info "To stop PostgreSQL manually: docker stop $POSTGRES_CONTAINER_NAME" + + log_success "Cleanup completed" +} + +# Trap per cleanup automatico +trap cleanup EXIT INT TERM + +# 1. Verifica prerequisiti +log_info "Checking prerequisites..." + +# Verifica Docker +if ! command -v docker &> /dev/null; then + log_error "Docker is not installed or not in PATH" + log_warning "Install Docker first: https://docs.docker.com/get-docker/" + exit 1 +fi + +# Verifica che Docker sia in esecuzione +if ! docker info >/dev/null 2>&1; then + log_error "Docker daemon is not running" + log_warning "Start Docker with: sudo systemctl start docker" + exit 1 +fi + +# Verifica Node.js +if ! command -v node &> /dev/null; then + log_error "Node.js is not installed or not in PATH" + exit 1 +fi + +log_success "All prerequisites are available" + +# 2. Build console and management controller +log_info "Building console and management controller..." +if ! build_console_and_controller; then + log_error "Build process failed" + exit 1 +fi + +# 3. Avvia PostgreSQL in Docker se non è già in esecuzione +log_info "Checking PostgreSQL container status..." + +if docker ps | grep -q "$POSTGRES_CONTAINER_NAME"; then + log_success "PostgreSQL container is already running" +elif docker ps -a | grep -q "$POSTGRES_CONTAINER_NAME"; then + # Container esiste ma è fermato - riavvialo + log_info "Starting existing PostgreSQL container..." + docker start $POSTGRES_CONTAINER_NAME + if [ $? -eq 0 ]; then + log_success "PostgreSQL container restarted successfully" + else + log_error "Failed to restart PostgreSQL container" + exit 1 + fi +else + # Nessun container esistente - creane uno nuovo + log_info "Creating new PostgreSQL container..." + + # Avvia nuovo container PostgreSQL con volume persistente + docker run -d \ + --name $POSTGRES_CONTAINER_NAME \ + -e POSTGRES_DB=$DB_NAME \ + -e POSTGRES_USER=$DB_USER \ + -e POSTGRES_PASSWORD=$DB_PASSWORD \ + -p $DB_PORT:5432 \ + -v skupper-postgres-data:/var/lib/postgresql/data \ + postgres:15-alpine + + if [ $? -eq 0 ]; then + log_success "PostgreSQL container created successfully" + else + log_error "Failed to create PostgreSQL container" + exit 1 + fi +fi + +# 4. Attendi che PostgreSQL container sia pronto +log_info "Waiting for PostgreSQL container to be ready..." +sleep 5 + +if ! wait_for_postgres_container; then + log_error "PostgreSQL container failed to become ready" + log_info "Check container logs with: docker logs $POSTGRES_CONTAINER_NAME" + exit 1 +fi + +# 5. Inizializza il database usando Docker exec (se necessario) +log_info "Checking if database schema needs initialization..." + +# Usa docker exec per eseguire i comandi SQL +if docker exec $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME -c "SELECT 1 FROM Configuration LIMIT 1;" >/dev/null 2>&1; then + log_warning "Database already initialized, skipping setup" +else + log_info "Initializing database schema..." + + # Copia il file SQL nel container e eseguilo + docker cp "$PROJECT_DIR/scripts/db-setup.sql" $POSTGRES_CONTAINER_NAME:/tmp/db-setup.sql + + if docker exec $POSTGRES_CONTAINER_NAME psql -U $DB_USER -d $DB_NAME -f /tmp/db-setup.sql; then + log_success "Database schema initialized successfully" + # Rimuovi il file temporaneo + docker exec $POSTGRES_CONTAINER_NAME rm /tmp/db-setup.sql + else + log_error "Database initialization failed" + exit 1 + fi +fi + +# 6. Configura variabili d'ambiente per modalità standalone +log_info "Setting up environment variables..." +export SKX_STANDALONE_NAMESPACE=default +export PGUSER=$DB_USER +export PGHOST=$DB_HOST +export PGPASSWORD=$DB_PASSWORD +export PGDATABASE=$DB_NAME +export PGPORT=$DB_PORT +export SKX_CONTROLLER_NAME=standalone-controller +export NODE_ENV=development + +log_success "Environment variables configured" + +# 7. Avvia il management controller +log_info "Starting Skupper-X Management Controller with integrated console..." +echo "" +log_info "Environment configuration:" +echo " SKX_STANDALONE_NAMESPACE: $SKX_STANDALONE_NAMESPACE" +echo " PGHOST: $PGHOST" +echo " PGDATABASE: $PGDATABASE" +echo " SKX_CONTROLLER_NAME: $SKX_CONTROLLER_NAME" +echo "" + +log_success "🎯 Skupper-X Management Controller starting..." +log_info "API will be available at: http://localhost:8085/api/v1alpha1/" +log_info "Web Console will be available at: http://localhost:8085/" +log_info "Press Ctrl+C to stop all services" +echo "" + +# Avvia il controller dalla directory buildato (app/) invece del sorgente +cd "$MANAGEMENT_CONTROLLER_DIR/app" +node index.js & +CONTROLLER_PID=$! + +# Attendi che il controller si avvii o fallisca +sleep 5 + +if kill -0 $CONTROLLER_PID 2>/dev/null; then + log_success "Management Controller is running (PID: $CONTROLLER_PID)" + + # Testa l'API + sleep 3 + if curl -s http://localhost:8085/healthz >/dev/null 2>&1; then + log_success "API server is responding at http://localhost:8085" + else + log_warning "API server may still be starting up..." + fi + + # Mantieni lo script in esecuzione + log_info "Services are running. Use Ctrl+C to stop." + wait $CONTROLLER_PID +else + log_error "Management Controller failed to start" + exit 1 +fi From d837a4905211f068de8af88b6645f26ffa326df3 Mon Sep 17 00:00:00 2001 From: bartoval Date: Sat, 31 May 2025 18:40:43 +0200 Subject: [PATCH 5/7] refactor backbone --- components/console/.eslintrc.json | 4 +- components/console/package.json | 1 + components/console/src/API/REST.api.ts | 290 ++- components/console/src/API/REST.enum.ts | 28 - components/console/src/API/REST.interfaces.ts | 202 +- components/console/src/API/REST.paths.ts | 80 +- components/console/src/API/REST.utils.ts | 3 +- components/console/src/API/apiMiddleware.ts | 3 +- components/console/src/App.css | 9 +- components/console/src/App.tsx | 23 +- .../src/config/advancedBreadcrumbConfig.ts | 71 + .../console/src/config/breadcrumbConfig.ts | 39 + components/console/src/config/colors.ts | 112 +- .../config/comprehensiveBreadcrumbConfig.ts | 95 + components/console/src/config/config.ts | 6 +- .../src/config/routeTreeBreadcrumbConfig.ts | 88 + components/console/src/config/routes.ts | 4 +- .../core/components/DurationCell/index.tsx | 3 +- .../src/core/components/EmptyData/index.tsx | 5 +- .../components/HighlightValueCell/index.tsx | 5 +- .../src/core/components/LinkCell/index.tsx | 3 +- .../src/core/components/NavBar/index.tsx | 2 +- .../components/ResourceIcon/ResourceIcon.css | 56 +- .../core/components/ResourceIcon/index.tsx | 42 +- .../core/components/SkBreadcrumb/index.tsx | 26 +- .../src/core/components/SkIsLoading/index.tsx | 2 +- .../core/components/SkSearchFilter/index.tsx | 35 +- .../components/SkTable/SkTable.interfaces.ts | 2 + .../src/core/components/SkTable/index.tsx | 7 +- .../core/components/SkUpdateButton/index.tsx | 5 +- .../console/src/core/components/Wrapper.tsx | 2 +- .../src/core/utils/isDarkTheme.spec.ts | 82 - .../console/src/core/utils/isDarkTheme.ts | 25 - components/console/src/index.tsx | 4 +- components/console/src/layout/Footer.tsx | 1 - components/console/src/layout/Header.tsx | 2 +- .../console/src/layout/MainContainer.tsx | 75 +- components/console/src/layout/SideBar.tsx | 2 +- .../pages/Backbones/Backbones.constants.ts | 66 +- .../src/pages/Backbones/Backbones.enum.ts | 11 +- .../Backbones/Components/AccessPointForm.tsx | 116 ++ .../Backbones/Components/BackboneForm.tsx | 5 +- .../Backbones/Components/DeployBootstrap.tsx | 9 +- .../Backbones/Components/IncomingLinks.tsx | 7 +- .../Components/InitialDeploymentForm.tsx | 5 +- .../Backbones/Components/InvitationForm.tsx | 9 +- .../Components/InvitationYamlForm.tsx | 3 +- .../pages/Backbones/Components/LinkForm.tsx | 74 +- .../Backbones/Components/SiteDetailPanel.tsx | 403 ++++ .../pages/Backbones/Components/SiteForm.tsx | 169 +- .../pages/Backbones/Components/VanForm.tsx | 9 +- .../src/pages/Backbones/views/Backbone.tsx | 520 +++-- .../src/pages/Backbones/views/Backbones.tsx | 322 +-- .../src/pages/Backbones/views/Invitations.tsx | 35 +- .../src/pages/Backbones/views/Site.tsx | 8 +- .../src/pages/Backbones/views/Vans.tsx | 33 +- .../console/src/pages/Vans/Vans.constants.ts | 2 +- components/console/src/pages/Vans/routes.tsx | 2 +- .../src/pages/shared/Loading/index.tsx | 5 +- components/console/src/routes.tsx | 10 +- components/console/tsconfig.json | 6 +- components/console/tsconfig.paths.json | 14 - components/console/webpack.common.js | 5 +- components/console/webpack.dev.js | 4 +- components/console/webpack.prod.js | 9 +- components/console/yarn.lock | 13 +- .../management-controller/src/api-admin.js | 1842 +++++++++-------- setup-database.sh | 0 start-console-dev.sh | 0 start-dev-mode.sh | 0 start-skupper-standalone.sh | 0 yarn.lock | 4 + 72 files changed, 3193 insertions(+), 1971 deletions(-) delete mode 100644 components/console/src/API/REST.enum.ts create mode 100644 components/console/src/config/advancedBreadcrumbConfig.ts create mode 100644 components/console/src/config/breadcrumbConfig.ts create mode 100644 components/console/src/config/comprehensiveBreadcrumbConfig.ts create mode 100644 components/console/src/config/routeTreeBreadcrumbConfig.ts delete mode 100644 components/console/src/core/utils/isDarkTheme.spec.ts delete mode 100644 components/console/src/core/utils/isDarkTheme.ts create mode 100644 components/console/src/pages/Backbones/Components/AccessPointForm.tsx create mode 100644 components/console/src/pages/Backbones/Components/SiteDetailPanel.tsx delete mode 100644 components/console/tsconfig.paths.json mode change 100644 => 100755 setup-database.sh mode change 100644 => 100755 start-console-dev.sh mode change 100644 => 100755 start-dev-mode.sh mode change 100644 => 100755 start-skupper-standalone.sh create mode 100644 yarn.lock diff --git a/components/console/.eslintrc.json b/components/console/.eslintrc.json index 0acf0f2..57c2d24 100644 --- a/components/console/.eslintrc.json +++ b/components/console/.eslintrc.json @@ -36,9 +36,7 @@ "jsx": true }, "ecmaVersion": 2021, - "sourceType": "module", - "project": ["tsconfig.json"], - "tsconfigRootDir": "./" + "sourceType": "module" }, "plugins": ["react", "react-hooks", "@typescript-eslint"], "rules": { diff --git a/components/console/package.json b/components/console/package.json index abae748..3640453 100644 --- a/components/console/package.json +++ b/components/console/package.json @@ -41,6 +41,7 @@ "@patternfly/react-core": "^6.2.2", "@patternfly/react-icons": "^6.2.2", "@patternfly/react-table": "^6.2.2", + "@patternfly/react-tokens": "^6.2.2", "@tanstack/react-query": "^5.79.0", "axios": "^1.9.0", "date-fns": "^4.1.0", diff --git a/components/console/src/API/REST.api.ts b/components/console/src/API/REST.api.ts index 268cfa7..6b03405 100644 --- a/components/console/src/API/REST.api.ts +++ b/components/console/src/API/REST.api.ts @@ -1,31 +1,60 @@ import { axiosFetch } from './apiMiddleware'; import { - SiteResponse, + BackboneSiteResponse, RequestOptions, BackboneResponse, BackboneRequest, - SiteRequest, + BackboneSiteRequest, LinkResponse, LinkRequest, - VanResponse, - VanRequest, + ApplicationNetworkResponse, + ApplicationNetworkRequest, InvitationResponse, InvitationRequest, - MemberResponse + MemberSiteResponse, + AccessPointResponse, + AccessPointRequest, + TlsCertificateResponse, + TargetPlatformResponse } from './REST.interfaces'; import { getBackbonesPATH, getBackbonePATH, - getInteriorSitesPATH, - getLinkPATH, + getBackboneActivatePATH, + getBackboneSitePATH, + getBackboneSitesPATH, + getBackboneLinkPATH, + getBackboneLinksForBackbonePATH, + getBackboneLinksForSitePATH, + getCreateLinkPATH, getVanPATH, - getInvitationPath, - getMemberPath, - getVansPATH + getVansPATH, + getVansForBackbonePATH, + getCreateVanPATH, + getEvictVanPATH, + getInvitationPATH, + getInvitationsPATH, + getInvitationYamlPATH, + getInvitationsForVanPATH, + getCreateInvitationPATH, + getExpireInvitationPATH, + getMemberPATH, + getMembersForVanPATH, + getEvictMemberPATH, + getAccessPointPATH, + getAccessPointsForSitePATH, + getAccessPointsForBackbonePATH, + getClaimAccessPATH, + getMemberAccessPATH, + getTlsCertificatePATH, + getTargetPlatformsPATH, + getSiteDeploymentPATH, + getIngressPATH } from './REST.paths'; import { mapOptionsToQueryParams } from './REST.utils'; export const RESTApi = { + // BACKBONE APIs fetchBackbones: async (options?: RequestOptions): Promise => { const data = await axiosFetch(getBackbonesPATH(), { params: options ? mapOptionsToQueryParams(options) : null @@ -43,28 +72,35 @@ export const RESTApi = { return id; }, + searchBackbone: async (bid: string): Promise => { + const data = await axiosFetch(getBackbonePATH(bid)); + + return data; + }, + deleteBackbone: async (bid: string): Promise => { - await axiosFetch(`${getBackbonePATH(bid)}`, { + await axiosFetch(getBackbonePATH(bid), { method: 'DELETE' }); }, activateBackbone: async (bid: string): Promise => { - await axiosFetch(`${getBackbonePATH(bid)}/activate`, { + await axiosFetch(getBackboneActivatePATH(bid), { method: 'PUT' }); }, - fetchSites: async (bid: string, options?: RequestOptions): Promise => { - const data = await axiosFetch(`${getBackbonePATH(bid)}/sites`, { + // BACKBONE SITE APIs + fetchSites: async (bid: string, options?: RequestOptions): Promise => { + const data = await axiosFetch(getBackboneSitesPATH(bid), { params: options ? mapOptionsToQueryParams(options) : null }); return data; }, - createSite: async (bid: string, data: SiteRequest): Promise => { - const { id } = await axiosFetch<{ id: string }>(`${getBackbonePATH(bid)}/sites`, { + createSite: async (bid: string, data: BackboneSiteRequest): Promise => { + const { id } = await axiosFetch<{ id: string }>(getBackboneSitesPATH(bid), { method: 'POST', data }); @@ -72,120 +108,246 @@ export const RESTApi = { return id; }, - deleteSite: async (id: string): Promise => { - await axiosFetch(getInteriorSitesPATH(id), { + searchSite: async (sid: string): Promise => { + const data = await axiosFetch(getBackboneSitePATH(sid)); + + return data; + }, + + updateSite: async (sid: string, data: Partial): Promise => { + await axiosFetch(getBackboneSitePATH(sid), { + method: 'PUT', + data + }); + }, + + deleteSite: async (sid: string): Promise => { + await axiosFetch(getBackboneSitePATH(sid), { method: 'DELETE' }); }, - searchSite: async (id: string): Promise => axiosFetch(`${getInteriorSitesPATH(id)}`), + // ACCESS POINT APIs + fetchAccessPointsForSite: async (sid: string, options?: RequestOptions): Promise => { + const data = await axiosFetch(getAccessPointsForSitePATH(sid), { + params: options ? mapOptionsToQueryParams(options) : null + }); + + return data; + }, - // LINKS APIs - fetchLinks: async (bid: string, options?: RequestOptions): Promise => { - const data = await axiosFetch(`${getBackbonePATH(bid)}/links`, { + fetchAccessPointsForBackbone: async (bid: string, options?: RequestOptions): Promise => { + const data = await axiosFetch(getAccessPointsForBackbonePATH(bid), { params: options ? mapOptionsToQueryParams(options) : null }); return data; }, - createLink: async (bid: string, data?: LinkRequest): Promise => { - await axiosFetch(`${getBackbonePATH(bid)}/links`, { + createAccessPoint: async (sid: string, data: AccessPointRequest): Promise => { + const { id } = await axiosFetch<{ id: string }>(getAccessPointsForSitePATH(sid), { method: 'POST', data }); + + return id; }, - deleteLink: async (id: string): Promise => { - await axiosFetch(getLinkPATH(id), { + searchAccessPoint: async (apid: string): Promise => { + const data = await axiosFetch(getAccessPointPATH(apid)); + + return data; + }, + + deleteAccessPoint: async (apid: string): Promise => { + await axiosFetch(getAccessPointPATH(apid), { method: 'DELETE' }); }, - fetchInitialDeployment: async (id: string): Promise => axiosFetch(`${getInteriorSitesPATH(id)}/kube`), + // BACKBONE LINK APIs + fetchLinksForBackbone: async (bid: string, options?: RequestOptions): Promise => { + const data = await axiosFetch(getBackboneLinksForBackbonePATH(bid), { + params: options ? mapOptionsToQueryParams(options) : null + }); + + return data; + }, + + fetchLinksForSite: async (sid: string, options?: RequestOptions): Promise => { + const data = await axiosFetch(getBackboneLinksForSitePATH(sid), { + params: options ? mapOptionsToQueryParams(options) : null + }); - fetchIngress: async (sid: string, data: string): Promise => { - await axiosFetch(`${getInteriorSitesPATH(sid)}/ingress`, { - headers: { - 'Content-Type': 'application/json' - }, + return data; + }, + + createLink: async (apid: string, data: LinkRequest): Promise => { + const { id } = await axiosFetch<{ id: string }>(getCreateLinkPATH(apid), { method: 'POST', data }); + + return id; + }, + + updateLink: async (lid: string, data: Partial): Promise => { + await axiosFetch(getBackboneLinkPATH(lid), { + method: 'PUT', + data + }); }, - fetchIncomingLinks: async (id: string): Promise => - axiosFetch(`${getInteriorSitesPATH(id)}/links/incoming/kube`), + deleteLink: async (lid: string): Promise => { + await axiosFetch(getBackboneLinkPATH(lid), { + method: 'DELETE' + }); + }, - fetchVans: async (): Promise => axiosFetch(`${getVansPATH()}`), + // VAN (APPLICATION NETWORK) APIs + fetchVans: async (): Promise => { + const data = await axiosFetch(getVansPATH()); + + return data; + }, - createVan: async (bid: string, data?: VanRequest): Promise => { - await axiosFetch(`${getBackbonePATH(bid)}/vans`, { + fetchVansForBackbone: async (bid: string): Promise => { + const data = await axiosFetch(getVansForBackbonePATH(bid)); + + return data; + }, + + createVan: async (bid: string, data: ApplicationNetworkRequest): Promise => { + const { id } = await axiosFetch<{ id: string }>(getCreateVanPATH(bid), { method: 'POST', - data: { - name: data?.name - } + data }); + + return id; }, - searchVan: async (vid: string): Promise => { - const data = await axiosFetch(`${getVanPATH(vid)}`, { - method: 'GET' - }); + searchVan: async (vid: string): Promise => { + const data = await axiosFetch(getVanPATH(vid)); return data; }, deleteVan: async (vid: string): Promise => { - await axiosFetch(`${getVanPATH(vid)}`, { + await axiosFetch(getVanPATH(vid), { method: 'DELETE' }); }, - fetchInvitations: async (vid: string): Promise => - axiosFetch(`${getVanPATH(vid)}/invitations`), + evictVan: async (vid: string): Promise => { + await axiosFetch(getEvictVanPATH(vid), { + method: 'PUT' + }); + }, + + // INVITATION APIs + fetchInvitations: async (vid: string): Promise => { + const data = await axiosFetch(getInvitationsForVanPATH(vid)); + + return data; + }, + + fetchAllInvitations: async (): Promise => { + const data = await axiosFetch(getInvitationsPATH()); + + return data; + }, - createInvitation: async (vid: string, data?: InvitationRequest): Promise => { - await axiosFetch(`${getVanPATH(vid)}/invitations`, { + createInvitation: async (vid: string, data: InvitationRequest): Promise => { + const { id } = await axiosFetch<{ id: string }>(getCreateInvitationPATH(vid), { method: 'POST', data }); + + return id; }, searchInvitation: async (iid: string): Promise => { - const data = await axiosFetch(`${getInvitationPath(iid)}`, { - method: 'GET' - }); + const data = await axiosFetch(getInvitationPATH(iid)); return data; }, - searchInvitationYAML: async (id: string): Promise => axiosFetch(`${getInvitationPath(id)}/kube`), + searchInvitationYAML: async (iid: string): Promise => { + const data = await axiosFetch(getInvitationYamlPATH(iid)); - deleteInvitation: async (vid: string): Promise => { - await axiosFetch(`${getInvitationPath(vid)}`, { + return data; + }, + + deleteInvitation: async (iid: string): Promise => { + await axiosFetch(getInvitationPATH(iid), { method: 'DELETE' }); }, - fetchMembers: async (vid: string): Promise => - axiosFetch(`${getVanPATH(vid)}/members`), + expireInvitation: async (iid: string): Promise => { + await axiosFetch(getExpireInvitationPATH(iid), { + method: 'PUT' + }); + }, - searchMember: async (mid: string): Promise => axiosFetch(`${getMemberPath(mid)}`), + // MEMBER APIs + fetchMembers: async (vid: string): Promise => { + const data = await axiosFetch(getMembersForVanPATH(vid)); - fetchAccessClaims: async (bid: string): Promise<{ id: string; name: string }[]> => { - const data = await axiosFetch<{ id: string; name: string }[]>(`${getBackbonePATH(bid)}/access/claim`, { - method: 'GET' + return data; + }, + + searchMember: async (mid: string): Promise => { + const data = await axiosFetch(getMemberPATH(mid)); + + return data; + }, + + evictMember: async (mid: string): Promise => { + await axiosFetch(getEvictMemberPATH(mid), { + method: 'PUT' }); + }, + + // ACCESS CLAIM/MEMBER APIs + fetchAccessClaims: async (bid: string): Promise<{ id: string; name: string }[]> => { + const data = await axiosFetch<{ id: string; name: string }[]>(getClaimAccessPATH(bid)); return data; }, fetchAccessMember: async (bid: string): Promise<{ id: string; name: string }[]> => { - const data = await axiosFetch<{ id: string; name: string }[]>(`${getBackbonePATH(bid)}/access/member`, { - method: 'GET' - }); + const data = await axiosFetch<{ id: string; name: string }[]>(getMemberAccessPATH(bid)); + + return data; + }, + + // TLS CERTIFICATE APIs + fetchTlsCertificate: async (cid: string): Promise => { + const data = await axiosFetch(getTlsCertificatePATH(cid)); return data; + }, + + // TARGET PLATFORM APIs + fetchTargetPlatforms: async (): Promise => { + const data = await axiosFetch(getTargetPlatformsPATH()); + + return data; + }, + + // DEPLOYMENT APIs + fetchSiteDeployment: async (sid: string, target: 'sk2' | 'kube'): Promise => { + const data = await axiosFetch(getSiteDeploymentPATH(sid, target)); + + return data; + }, + + // INGRESS APIs + createIngress: async (sid: string, data: any): Promise => { + await axiosFetch(getIngressPATH(sid), { + method: 'POST', + data + }); } }; diff --git a/components/console/src/API/REST.enum.ts b/components/console/src/API/REST.enum.ts deleted file mode 100644 index cbc1e34..0000000 --- a/components/console/src/API/REST.enum.ts +++ /dev/null @@ -1,28 +0,0 @@ -export enum SortDirection { - ASC = 'asc', - DESC = 'desc' -} - -export enum AvailableProtocols { - Tcp = 'tcp', - Http = 'http1', - Http2 = 'http2', - AllHttp = 'http.*' -} - -export enum TcpStatus { - Active = 'active', - Terminated = 'terminated' -} - -export enum FlowDirection { - Outgoing = 'outgoing', - Incoming = 'incoming' -} - -export enum Quantiles { - Median = 0.5, - Ninety = 0.9, - NinetyFive = 0.95, - NinetyNine = 0.99 -} diff --git a/components/console/src/API/REST.interfaces.ts b/components/console/src/API/REST.interfaces.ts index 08befd3..ec8de05 100644 --- a/components/console/src/API/REST.interfaces.ts +++ b/components/console/src/API/REST.interfaces.ts @@ -1,21 +1,18 @@ import { AxiosError, AxiosRequestConfig } from 'axios'; -import { DeploymentStates } from '@pages/Backbones/Backbones.enum'; - -import { FlowDirection, SortDirection } from './REST.enum'; +import { DeploymentStates } from '../pages/Backbones/Backbones.enum'; export type FetchWithOptions = AxiosRequestConfig; -export type FlowDirections = FlowDirection.Outgoing | FlowDirection.Incoming; -export interface RequestOptions extends Record { +export interface RequestOptions extends Record { filter?: string; offset?: number; limit?: number; - sortDirection?: SortDirection; + sortDirection?: 'asc' | 'desc'; sortName?: string; timeRangeStart?: number; timeRangeEnd?: number; - timeRangeOperation?: number; // 0: intersect , 1: contains, 2: within + timeRangeOperation?: number; } export interface QueryParams { @@ -34,8 +31,8 @@ export interface HTTPError extends AxiosError { } export type ResponseWrapper = { - results: T; // Type based on the Response interface - status: string; // this field is for debug scope. Empty value => OK. In case we have some internal BE error that is not a http status this field is not empty. For example a value can be `Malformed sortBy query` + results: T; + status: string; count: number; timeRangeCount: number; totalCount: number; @@ -54,62 +51,65 @@ export interface BackboneResponse { failure: string | null; } -export interface SiteRequest { +export interface BackboneSiteRequest { name: string; - claim?: 'true' | 'false'; - peer?: 'true' | 'false'; - member?: 'true' | 'false'; - manage?: 'true' | 'false'; + platform: string; metadata?: string; } -export interface SiteResponse { +export interface BackboneSiteResponse { id: string; name: string; - failure: string | null; - firstactivetime: string | null; - lastheartbeat: string | null; lifecycle: string; + failure: string | null; metadata?: string; deploymentstate: DeploymentStates; + targetplatform: string; + platformlong: string; + firstactivetime: string | null; + lastheartbeat: string | null; + tlsexpiration?: string | null; + tlsrenewal?: string | null; } export interface LinkRequest { - listeningsite: string; connectingsite: string; - cost?: string; + cost?: number; } export interface LinkResponse { id: string; - listeninginteriorsite: string; + accesspoint: string; connectinginteriorsite: string; cost: number; } -export interface VanRequest { - bid: string; +export interface ApplicationNetworkRequest { name: string; + starttime?: string; + endtime?: string; + deletedelay?: string; } -export interface VanResponse { + +export interface ApplicationNetworkResponse { id: string; name: string; - backbone: string; - backbonename: string; + backbone?: string; + backbonename?: string; lifecycle: 'partial' | 'new' | 'ready'; failure: string | null; starttime: string | null; endtime: string | null; - deletedelay: { minutes: number }; + deletedelay: string | null; } export interface InvitationRequest { name: string; claimaccess: string; - primaryaccess: string; + memberaccess: string; secondaryaccess?: string; joindeadline?: string; - siteclass?: string; + memberclass?: string; instancelimit?: number; interactive?: boolean; } @@ -124,14 +124,154 @@ export interface InvitationResponse { instancelimit: number | null; instancecount: number; interactive: boolean; + vanname?: string; } -export interface MemberResponse { +export interface MemberSiteResponse { id: string; name: string; lifecycle: 'partial' | 'new' | 'ready'; failure: string | null; lastheartbeat: string | null; - siteclass: string | null; firstactivetime: string | null; + memberof: string; + invitation: string; + invitationname?: string; + vanname?: string; +} + +export interface AccessPointRequest { + name?: string; + kind: 'claim' | 'peer' | 'member' | 'manage'; + bindhost?: string; +} + +export interface AccessPointResponse { + id: string; + name: string; + lifecycle: string; + failure: string | null; + hostname: string | null; + port: number | null; + kind: 'claim' | 'peer' | 'member' | 'manage'; + bindhost: string | null; + interiorsite: string; + sitename?: string; +} + +export interface TargetPlatformResponse { + shortname: string; + longname: string; +} + +export interface IngressRequest { + [apid: string]: { + host: string; + port: number; + }; +} + +export interface IngressResponse { + processed: number; +} + +export interface ClaimAccessPointResponse { + id: string; + name: string; +} + +export interface ApplicationRequest { + name: string; + rootblock: string; +} + +export interface ApplicationResponse { + id: string; + name: string; + lifecycle: string; + buildlog?: string; +} + +export interface LibraryBlockResponse { + id: string; + name: string; +} + +export interface DeploymentRequest { + app: string; + van: string; +} + +export interface DeploymentResponse { + id: string; +} + +export interface TlsCertificateResponse { + id: string; + isca: boolean; + objectname: string; + signedby: string | null; + expiration: string | null; + renewaltime: string | null; + rotationordinal: number; + supercedes: string | null; +} + +export interface CertificateRequestResponse { + id: string; + requesttype: 'mgmtController' | 'backboneCA' | 'interiorRouter' | 'accessPoint' | 'vanCA' | 'memberClaim' | 'vanSite'; + issuer: string | null; + lifecycle: 'new' | 'cm_cert_created' | 'ready'; + failure: string | null; + hostname: string | null; + createdtime: string; + requesttime: string; + durationhours: number; + managementcontroller: string | null; + backbone: string | null; + interiorsite: string | null; + accesspoint: string | null; + applicationnetwork: string | null; + invitation: string | null; + site: string | null; +} + +export interface ManagementControllerResponse { + id: string; + name: string; + lifecycle: 'partial' | 'new' | 'ready'; + failure: string | null; + certificate: string | null; +} + +export interface ComposeBlockResponse { + id: string; + name: string; + lifecycle: string; + failure: string | null; +} + +export interface BootstrapResponse { + yamldata: string; +} + +export interface SiteDeploymentConfigResponse { + yamldata: string; +} + +export interface TlsCertificateRequest { + requesttype: 'mgmtController' | 'backboneCA' | 'interiorRouter' | 'accessPoint' | 'vanCA' | 'memberClaim' | 'vanSite'; + durationhours?: number; + hostname?: string; +} + +export interface HeartbeatRequest { + lastheartbeat: string; + firstactivetime?: string; +} + +export interface ErrorResponse { + error: string; + message: string; + httpStatus?: number; } diff --git a/components/console/src/API/REST.paths.ts b/components/console/src/API/REST.paths.ts index 250cb58..e960ace 100644 --- a/components/console/src/API/REST.paths.ts +++ b/components/console/src/API/REST.paths.ts @@ -1,27 +1,73 @@ -import { COLLECTOR_URL } from '@config/config'; +import { COLLECTOR_URL } from '../config/config'; -const BACKBONES_PATH = `${COLLECTOR_URL}/backbones/`; -export const getBackbonesPATH = () => BACKBONES_PATH; +// Note: COLLECTOR_URL already includes /api/v1alpha1 -const BACKBONE_PATH = `${COLLECTOR_URL}/backbone/`; -export const getBackbonePATH = (id: string) => `${BACKBONE_PATH}${id}`; +// Backbone paths +const BACKBONES_PATH = `${COLLECTOR_URL}/backbones`; +export const getBackbonesPATH = () => BACKBONES_PATH; +export const getBackbonePATH = (id: string) => `${BACKBONES_PATH}/${id}`; +export const getBackboneActivatePATH = (id: string) => `${BACKBONES_PATH}/${id}/activate`; -const INTERIOR_SITES_PATH = `${COLLECTOR_URL}/backbonesite/`; -export const getInteriorSitesPATH = (id: string) => `${INTERIOR_SITES_PATH}${id}`; +// Backbone Sites paths +const BACKBONE_SITES_PATH = `${COLLECTOR_URL}/backbonesites`; +export const getBackboneSitesPATH = (backboneId: string) => `${BACKBONES_PATH}/${backboneId}/sites`; +export const getBackboneSitePATH = (id: string) => `${BACKBONE_SITES_PATH}/${id}`; -const LINK_PATH = `${COLLECTOR_URL}/backbonelink/`; -export const getLinkPATH = (id: string) => `${LINK_PATH}${id}`; +// Access Points paths +const ACCESS_POINTS_PATH = `${COLLECTOR_URL}/accesspoints`; +export const getAccessPointPATH = (id: string) => `${ACCESS_POINTS_PATH}/${id}`; +export const getAccessPointsForSitePATH = (siteId: string) => `${BACKBONE_SITES_PATH}/${siteId}/accesspoints`; +export const getAccessPointsForBackbonePATH = (backboneId: string) => `${BACKBONES_PATH}/${backboneId}/accesspoints`; -const HOSTNAMES_PATH = `${COLLECTOR_URL}/hostnames`; -export const getHostnamesPATH = () => HOSTNAMES_PATH; +// Backbone Links paths +const BACKBONE_LINKS_PATH = `${COLLECTOR_URL}/backbonelinks`; +export const getBackboneLinkPATH = (id: string) => `${BACKBONE_LINKS_PATH}/${id}`; +export const getBackboneLinksForBackbonePATH = (backboneId: string) => `${BACKBONES_PATH}/${backboneId}/links`; +export const getBackboneLinksForSitePATH = (siteId: string) => `${BACKBONE_SITES_PATH}/${siteId}/links`; +export const getCreateLinkPATH = (accessPointId: string) => `${ACCESS_POINTS_PATH}/${accessPointId}/links`; +// VAN (Application Networks) paths const VANS_PATH = `${COLLECTOR_URL}/vans`; -const VAN_PATH = `${COLLECTOR_URL}/van/`; export const getVansPATH = () => VANS_PATH; -export const getVanPATH = (id: string) => `${VAN_PATH}${id}`; +export const getVanPATH = (id: string) => `${VANS_PATH}/${id}`; +export const getVansForBackbonePATH = (backboneId: string) => `${BACKBONES_PATH}/${backboneId}/vans`; +export const getCreateVanPATH = (backboneId: string) => `${BACKBONES_PATH}/${backboneId}/vans`; +export const getEvictVanPATH = (id: string) => `${VANS_PATH}/${id}/evict`; + +// Invitation paths +const INVITATIONS_PATH = `${COLLECTOR_URL}/invitations`; +export const getInvitationsPATH = () => INVITATIONS_PATH; +export const getInvitationPATH = (id: string) => `${INVITATIONS_PATH}/${id}`; +export const getInvitationYamlPATH = (id: string) => `${INVITATIONS_PATH}/${id}/kube`; +export const getInvitationsForVanPATH = (vanId: string) => `${VANS_PATH}/${vanId}/invitations`; +export const getCreateInvitationPATH = (vanId: string) => `${VANS_PATH}/${vanId}/invitations`; +export const getExpireInvitationPATH = (id: string) => `${INVITATIONS_PATH}/${id}/expire`; + +// Member paths +const MEMBERS_PATH = `${COLLECTOR_URL}/members`; +export const getMemberPATH = (id: string) => `${MEMBERS_PATH}/${id}`; +export const getMembersForVanPATH = (vanId: string) => `${VANS_PATH}/${vanId}/members`; +export const getEvictMemberPATH = (id: string) => `${MEMBERS_PATH}/${id}/evict`; + +// Access and Member Claim paths +export const getClaimAccessPATH = (backboneId: string) => `${BACKBONES_PATH}/${backboneId}/access/claim`; +export const getMemberAccessPATH = (backboneId: string) => `${BACKBONES_PATH}/${backboneId}/access/member`; + +// TLS Certificate paths +const TLS_CERTIFICATES_PATH = `${COLLECTOR_URL}/tls-certificates`; +export const getTlsCertificatePATH = (id: string) => `${TLS_CERTIFICATES_PATH}/${id}`; + +// Target Platform paths +const TARGET_PLATFORMS_PATH = `${COLLECTOR_URL}/targetplatforms`; +export const getTargetPlatformsPATH = () => TARGET_PLATFORMS_PATH; + +// Site Deployment paths +export const getSiteDeploymentPATH = (siteId: string, target: 'sk2' | 'kube') => + `${COLLECTOR_URL}/backbonesite/${siteId}/${target}`; -const INVITATION_PATH = `${COLLECTOR_URL}/invitation/`; -export const getInvitationPath = (id: string) => `${INVITATION_PATH}${id}`; +// Access Point Deployment paths +export const getAccessPointDeploymentPATH = (siteId: string, target: 'sk2' | 'kube') => + `${COLLECTOR_URL}/backbonesite/${siteId}/accesspoints/${target}`; -const MEMBER_PATH = `${COLLECTOR_URL}/member/`; -export const getMemberPath = (id: string) => `${MEMBER_PATH}${id}`; +// Ingress paths +export const getIngressPATH = (siteId: string) => `${COLLECTOR_URL}/backbonesite/${siteId}/ingress`; diff --git a/components/console/src/API/REST.utils.ts b/components/console/src/API/REST.utils.ts index be6a04a..b66e775 100644 --- a/components/console/src/API/REST.utils.ts +++ b/components/console/src/API/REST.utils.ts @@ -1,4 +1,3 @@ -import { SortDirection } from './REST.enum'; import { QueryParams, RequestOptions } from './REST.interfaces'; /** @@ -27,7 +26,7 @@ export function mapOptionsToQueryParams({ limit, timeRangeEnd, timeRangeStart, - sortBy: sortName ? `${sortName}.${sortDirection || SortDirection.ASC}` : null, + sortBy: sortName ? `${sortName}.${sortDirection || 'asc'}` : null, ...queryParams }; } diff --git a/components/console/src/API/apiMiddleware.ts b/components/console/src/API/apiMiddleware.ts index 4132d86..a3ad92e 100644 --- a/components/console/src/API/apiMiddleware.ts +++ b/components/console/src/API/apiMiddleware.ts @@ -1,8 +1,7 @@ import axios, { AxiosError } from 'axios'; -import { MSG_TIMEOUT_ERROR } from '@config/config'; - import { FetchWithOptions, HTTPError } from './REST.interfaces'; +import { MSG_TIMEOUT_ERROR } from '../config/config'; function handleStatusError(e: AxiosError<{ message?: string }>) { const error: HTTPError = { ...e }; diff --git a/components/console/src/App.css b/components/console/src/App.css index 383d092..788ed3f 100644 --- a/components/console/src/App.css +++ b/components/console/src/App.css @@ -13,10 +13,15 @@ html { } .color-box { - display: inline-block; + display: inline-flex; + align-items: center; + justify-content: center; height: 18px; width: 18px; border: var(--pf-v5-global--BorderWidth--sm) solid var(--pf-v5-global--BorderColor--200); - border-radius: var(--pf-v5-global--BorderRadius--lg); + border-radius: 50%; vertical-align: middle; + background: currentColor; + /* Optionally, add a subtle box-shadow for better visibility */ + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04); } diff --git a/components/console/src/App.tsx b/components/console/src/App.tsx index 17c1355..3511d1f 100644 --- a/components/console/src/App.tsx +++ b/components/console/src/App.tsx @@ -4,22 +4,19 @@ import { Page, Toolbar, ToolbarContent, ToolbarGroup, ToolbarItem } from '@patte import { QueryErrorResetBoundary } from '@tanstack/react-query'; import { ErrorBoundary } from 'react-error-boundary'; -import SkBreadcrumb from '@core/components/SkBreadcrumb'; -import SkUpdateDataButton from '@core/components/SkUpdateButton'; -import { getThemePreference, reflectThemePreference } from '@core/utils/isDarkTheme'; -import SkHeader from '@layout/Header'; -import RouteContainer from '@layout/RouteContainer'; -import SkSidebar from '@layout/SideBar'; -import ErrorConsole from '@pages/shared/Errors/Console'; -import LoadingPage from '@pages/shared/Loading'; -import { routes } from 'routes'; - import '@patternfly/react-core/dist/styles/base.css'; import './App.css'; +import SkBreadcrumb from './core/components/SkBreadcrumb'; +import SkUpdateDataButton from './core/components/SkUpdateButton'; +import Footer from './layout/Footer'; +import SkHeader from './layout/Header'; +import RouteContainer from './layout/RouteContainer'; +import SkSidebar from './layout/SideBar'; +import ErrorConsole from './pages/shared/Errors/Console'; +import LoadingPage from './pages/shared/Loading'; +import { routes } from './routes'; const App = function () { - reflectThemePreference(getThemePreference()); - return ( } @@ -36,6 +33,7 @@ const App = function () { } + isContentFilled isManagedSidebar isBreadcrumbGrouped additionalGroupedContent={ @@ -44,6 +42,7 @@ const App = function () { }> {routes} +