diff --git a/docs/.vitepress/components/ConfigEditor.vue b/docs/.vitepress/components/ConfigEditor.vue index 9c64a2db..cf53b4f0 100644 --- a/docs/.vitepress/components/ConfigEditor.vue +++ b/docs/.vitepress/components/ConfigEditor.vue @@ -128,36 +128,85 @@ const config = reactive({ allowRegistration: true, autoIncrementAssetId: true, checkGithubRelease: true, + + // Storage Configuration + storageType: "local", // local, s3, gcs, azure storageConfig: { - homeboxStorage: { + // Local storage settings + local: { type: "volume", // "volume" or "directory" directory: "./homebox-data", volumeName: "homebox-data", + path: "/data", // Custom path for local storage }, - postgresStorage: { - type: "volume", - directory: "./postgres-data", - volumeName: "postgres-data", + + // S3 storage settings + s3: { + bucket: "", + region: "", + endpoint: "", // For S3-compatible storage + awsAccessKeyId: "", + awsSecretAccessKey: "", + awsSessionToken: "", // Optional for temporary credentials + prefixPath: "", // Storage prefix path + awsSdk: "v2", // AWS SDK version + disableSSL: false, + s3ForcePathStyle: false, + sseType: "", // Server-side encryption type + kmsKeyId: "", // KMS key ID for encryption + fips: false, + dualstack: false, + accelerate: false, + isCompatible: false, // Whether using S3-compatible storage + compatibleService: "", // minio, cloudflare-r2, backblaze-b2, custom }, - traefikStorage: { - type: "volume", - directory: "./traefik-data", - volumeName: "traefik-data", + + // Google Cloud Storage settings + gcs: { + bucket: "", + projectId: "", + credentialsPath: "/app/gcs-credentials.json", // Path to service account key + prefixPath: "", // Storage prefix path }, - nginxStorage: { - type: "volume", - directory: "./nginx-data", - volumeName: "nginx-data", + + // Azure Blob Storage settings + azure: { + container: "", + storageAccount: "", + storageKey: "", + sasToken: "", // Optional SAS token + useEmulator: false, + emulatorEndpoint: "localhost:10001", // For local emulator + prefixPath: "", // Storage prefix path }, - caddyStorage: { - type: "volume", - directory: "./caddy-data", - volumeName: "caddy-data", - }, - cloudflaredStorage: { - type: "volume", - directory: "./cloudflared-data", - volumeName: "cloudflared-data", + + // Container storage volumes (for non-local storage types) + containerStorage: { + postgresStorage: { + type: "volume", + directory: "./postgres-data", + volumeName: "postgres-data", + }, + traefikStorage: { + type: "volume", + directory: "./traefik-data", + volumeName: "traefik-data", + }, + nginxStorage: { + type: "volume", + directory: "./nginx-data", + volumeName: "nginx-data", + }, + caddyStorage: { + type: "volume", + directory: "./caddy-data", + volumeName: "caddy-data", + }, + cloudflaredStorage: { + type: "volume", + directory: "./cloudflared-data", + volumeName: "cloudflared-data", + }, }, }, }) diff --git a/docs/.vitepress/components/StorageConfig.vue b/docs/.vitepress/components/StorageConfig.vue index 18b37a42..ce41273d 100644 --- a/docs/.vitepress/components/StorageConfig.vue +++ b/docs/.vitepress/components/StorageConfig.vue @@ -1,76 +1,552 @@ \ No newline at end of file diff --git a/docs/.vitepress/components/dockerComposeGenerator.ts b/docs/.vitepress/components/dockerComposeGenerator.ts index 72ee64ec..39985114 100644 --- a/docs/.vitepress/components/dockerComposeGenerator.ts +++ b/docs/.vitepress/components/dockerComposeGenerator.ts @@ -1,369 +1,440 @@ -import type { AppConfig, DockerServices } from "./types" // Assuming types are in a separate file +export function generateDockerCompose(config: any): string { + const services: any = {} + const volumes: any = {} + const networks: any = { + homebox: { + driver: 'bridge' + } + } -export function generateDockerCompose(config: AppConfig): string { - const services: DockerServices = { - homebox: { - image: config.rootless - ? "ghcr.io/sysadminsmedia/homebox:latest-rootless" - : "ghcr.io/sysadminsmedia/homebox:latest", - container_name: "homebox", - restart: "always", - environment: [ + // Generate Homebox service + services.homebox = generateHomeboxService(config) + + // Add database service if PostgreSQL is selected + if (config.databaseType === 'postgres') { + services.postgres = generatePostgresService(config) + if (config.storageConfig.containerStorage.postgresStorage.type === 'volume') { + volumes[config.storageConfig.containerStorage.postgresStorage.volumeName] = null + } + } + + // Ensure homebox-data volume exists if SQLite is selected + if (config.databaseType === 'sqlite') { + volumes['homebox-data'] = null + } + + // Add reverse proxy services based on HTTPS option + switch (config.httpsOption) { + case 'traefik': + services.traefik = generateTraefikService(config) + if (config.storageConfig.containerStorage.traefikStorage.type === 'volume') { + volumes[config.storageConfig.containerStorage.traefikStorage.volumeName] = null + } + break + case 'nginx': + services.nginx = generateNginxService(config) + if (config.storageConfig.containerStorage.nginxStorage.type === 'volume') { + volumes[config.storageConfig.containerStorage.nginxStorage.volumeName] = null + } + break + case 'caddy': + services.caddy = generateCaddyService(config) + if (config.storageConfig.containerStorage.caddyStorage.type === 'volume') { + volumes[config.storageConfig.containerStorage.caddyStorage.volumeName] = null + } + break + case 'cloudflared': + services.cloudflared = generateCloudflaredService(config) + if (config.storageConfig.containerStorage.cloudflaredStorage.type === 'volume') { + volumes[config.storageConfig.containerStorage.cloudflaredStorage.volumeName] = null + } + break + } + + // Add Homebox storage volume only for local storage + if (config.storageType === 'local' && config.storageConfig.local.type === 'volume') { + volumes[config.storageConfig.local.volumeName] = null + } + + const compose = { + version: '3.8', + services, + ...(Object.keys(volumes).length > 0 && {volumes}), + networks + } + + return `# Generated Homebox Docker Compose Config Generator 1.0 Beta +# Storage Type: ${config.storageType.toUpperCase()} +# Generated on: ${new Date().toISOString()} +${yaml.stringify(compose)}` +} + +function generateHomeboxService(config: any): any { + const service: any = { + image: config.rootless ? config.image.replace(':latest', ':latest-rootless') : config.image, + container_name: 'homebox', + restart: 'unless-stopped', + environment: generateEnvironmentVariables(config), + networks: ['homebox'] + } + + // Add ports for direct access (when no reverse proxy is used) + if (config.httpsOption === 'none') { + service.ports = [`${config.port}:7745`] + } + + // Configure storage based on storage type + if (config.storageType === 'local') { + service.volumes = generateLocalStorageVolumes(config) + } else { + // For cloud storage, we might still need some local volumes for certain files + service.volumes = generateCloudStorageVolumes(config) + } + + // Always mount homebox-data at /data if SQLite is used + if (config.databaseType === 'sqlite') { + if (!service.volumes) service.volumes = [] + // Only add if not already present + if (!service.volumes.some(v => v.startsWith('homebox-data:'))) { + service.volumes.push('homebox-data:/data') + } + } + + return service +} + +function generateEnvironmentVariables(config: any): string[] { + const env: string[] = [ `HBOX_LOG_LEVEL=${config.logLevel}`, `HBOX_LOG_FORMAT=${config.logFormat}`, - `HBOX_WEB_MAX_FILE_UPLOAD=${config.maxFileUpload}`, - `HBOX_OPTIONS_ALLOW_ANALYTICS=${config.allowAnalytics}`, - `HBOX_OPTIONS_ALLOW_REGISTRATION=${config.allowRegistration}`, - `HBOX_OPTIONS_AUTO_INCREMENT_ASSET_ID=${config.autoIncrementAssetId}`, - `HBOX_OPTIONS_CHECK_GITHUB_RELEASE=${config.checkGithubRelease}`, - ], - volumes: [], - }, - } + `HBOX_MAX_UPLOAD_SIZE=${config.maxFileUpload}`, + `HBOX_AUTO_INCREMENT_ASSET_ID=${config.autoIncrementAssetId}`, + `HBOX_WEB_PORT=7745` + ] - // Configure homebox volumes based on storage type - if (config.storageConfig.homeboxStorage.type === "volume") { - services.homebox.volumes.push( - `${config.storageConfig.homeboxStorage.volumeName}:/data/`, - ) - } else { - services.homebox.volumes.push( - `${config.storageConfig.homeboxStorage.directory}:/data/`, - ) - } - - // Configure ports based on HTTPS option - if (config.httpsOption === "none") { - services.homebox.ports = [`${config.port}:7745`] - } else { - // For HTTPS options, the proxy will handle the ports - services.homebox.expose = ["7745"] - } - - // Add database configuration if PostgreSQL is selected - if (config.databaseType === "postgres") { - // Ensure environment array exists before pushing - if (!services.homebox.environment) { - services.homebox.environment = [] - } - services.homebox.environment.push( - "HBOX_DATABASE_DRIVER=postgres", - `HBOX_DATABASE_HOST=${config.postgresConfig.host}`, - `HBOX_DATABASE_PORT=${config.postgresConfig.port}`, - `HBOX_DATABASE_USERNAME=${config.postgresConfig.username}`, - `HBOX_DATABASE_PASSWORD=${config.postgresConfig.password}`, - `HBOX_DATABASE_DATABASE=${config.postgresConfig.database}`, - ) - - // Add PostgreSQL service - services["postgres"] = { - image: "postgres:14", - container_name: "homebox-postgres", - restart: "always", - environment: [ - `POSTGRES_USER=${config.postgresConfig.username}`, - `POSTGRES_PASSWORD=${config.postgresConfig.password}`, - `POSTGRES_DB=${config.postgresConfig.database}`, - ], - volumes: [], + // Database configuration + if (config.databaseType === 'postgres') { + env.push( + `HBOX_DATABASE_DRIVER=postgres`, + `HBOX_DATABASE_HOST=${config.postgresConfig.host}`, + `HBOX_DATABASE_PORT=${config.postgresConfig.port}`, + `HBOX_DATABASE_NAME=${config.postgresConfig.database}`, + `HBOX_DATABASE_USER=${config.postgresConfig.username}`, + `HBOX_DATABASE_PASS=${config.postgresConfig.password}` + ) } - // Configure postgres volumes based on storage type - if (config.storageConfig.postgresStorage.type === "volume") { - services.postgres.volumes.push( - `${config.storageConfig.postgresStorage.volumeName}:/var/lib/postgresql/data`, - ) + // Registration settings + if (!config.allowRegistration) { + env.push('HBOX_OPTIONS_ALLOW_REGISTRATION=false') + } + + // Analytics settings + if (!config.allowAnalytics) { + env.push('HBOX_OPTIONS_ALLOW_ANALYTICS=false') + } + + // GitHub release check + if (!config.checkGithubRelease) { + env.push('HBOX_OPTIONS_CHECK_GITHUB_RELEASE=false') + } + + // Storage configuration + env.push(...generateStorageEnvironmentVariables(config)) + + return env +} + +function generateStorageEnvironmentVariables(config: any): string[] { + const env: string[] = [] + + switch (config.storageType) { + case 'local': + const storagePath = config.storageConfig.local.path || '/data' + env.push(`HBOX_STORAGE_CONN_STRING=file://${storagePath}`) + if (config.storageConfig.local.prefixPath) { + env.push(`HBOX_STORAGE_PREFIX_PATH=${config.storageConfig.local.prefixPath}`) + } + break + + case 's3': + const s3Config = config.storageConfig.s3 + let connectionString = `s3://${s3Config.bucket}?awssdk=${s3Config.awsSdk}` + + if (s3Config.region && !s3Config.isCompatible) { + connectionString += `®ion=${s3Config.region}` + } + + if (s3Config.endpoint) { + connectionString += `&endpoint=${s3Config.endpoint}` + } + + if (s3Config.disableSSL) { + connectionString += '&disableSSL=true' + } + + if (s3Config.s3ForcePathStyle) { + connectionString += '&s3ForcePathStyle=true' + } + + if (s3Config.sseType) { + connectionString += `&sseType=${s3Config.sseType}` + } + + if (s3Config.kmsKeyId) { + connectionString += `&kmskeyid=${s3Config.kmsKeyId}` + } + + if (s3Config.fips) { + connectionString += '&fips=true' + } + + if (s3Config.dualstack) { + connectionString += '&dualstack=true' + } + + if (s3Config.accelerate) { + connectionString += '&accelerate=true' + } + + env.push(`HBOX_STORAGE_CONN_STRING=${connectionString}`) + + if (s3Config.prefixPath) { + env.push(`HBOX_STORAGE_PREFIX_PATH=${s3Config.prefixPath}`) + } + + // AWS credentials + env.push(`AWS_ACCESS_KEY_ID=${s3Config.awsAccessKeyId}`) + env.push(`AWS_SECRET_ACCESS_KEY=${s3Config.awsSecretAccessKey}`) + + if (s3Config.awsSessionToken) { + env.push(`AWS_SESSION_TOKEN=${s3Config.awsSessionToken}`) + } + break + + case 'gcs': + const gcsConfig = config.storageConfig.gcs + env.push(`HBOX_STORAGE_CONN_STRING=gcs://${gcsConfig.bucket}`) + + if (gcsConfig.prefixPath) { + env.push(`HBOX_STORAGE_PREFIX_PATH=${gcsConfig.prefixPath}`) + } + + env.push(`GOOGLE_APPLICATION_CREDENTIALS=${gcsConfig.credentialsPath}`) + break + + case 'azure': + const azureConfig = config.storageConfig.azure + let azureConnectionString = `azblob://${azureConfig.container}` + + if (azureConfig.useEmulator) { + azureConnectionString += `?protocol=http&domain=${azureConfig.emulatorEndpoint}` + } + + env.push(`HBOX_STORAGE_CONN_STRING=${azureConnectionString}`) + + if (azureConfig.prefixPath) { + env.push(`HBOX_STORAGE_PREFIX_PATH=${azureConfig.prefixPath}`) + } + + if (!azureConfig.useEmulator) { + env.push(`AZURE_STORAGE_ACCOUNT=${azureConfig.storageAccount}`) + + if (azureConfig.sasToken) { + env.push(`AZURE_STORAGE_SAS_TOKEN=${azureConfig.sasToken}`) + } else { + env.push(`AZURE_STORAGE_KEY=${azureConfig.storageKey}`) + } + } + break + } + + return env +} + +function generateLocalStorageVolumes(config: any): string[] { + const volumes: string[] = [] + + if (config.storageConfig.local.type === 'volume') { + const mountPath = config.storageConfig.local.path || '/data' + volumes.push(`${config.storageConfig.local.volumeName}:${mountPath}`) } else { - services.postgres.volumes.push( - `${config.storageConfig.postgresStorage.directory}:/var/lib/postgresql/data`, - ) + const mountPath = config.storageConfig.local.path || '/data' + volumes.push(`${config.storageConfig.local.directory}:${mountPath}`) } - } - // Add HTTPS configuration based on selected option - switch (config.httpsOption) { - case "traefik": - addTraefikConfig(services, config) - break - case "nginx": - addNginxConfig(services, config) - break - case "caddy": - addCaddyConfig(services, config) - break - case "cloudflared": - addCloudflaredConfig(services, config) - break - } - - // Format the Docker Compose YAML - let dockerCompose = "# generated by homebox config generator v0.0.1\n\nservices:\n" - - // Add services - Object.entries(services).forEach(([serviceName, serviceConfig]) => { - dockerCompose += ` ${serviceName}:\n` - Object.entries(serviceConfig).forEach(([key, value]) => { - if (Array.isArray(value)) { - dockerCompose += ` ${key}:\n` - value.forEach((item: string) => { - // Added type assertion for item - dockerCompose += ` - ${item}\n` - }) - } else if (value !== undefined) { - // Check for undefined before adding - dockerCompose += ` ${key}: ${value}\n` - } - }) - }) - - // Add volumes section if needed - const volumeNames: string[] = [] - - // Only add volumes that are configured as Docker volumes, not directories - if (config.storageConfig.homeboxStorage.type === "volume") { - volumeNames.push(config.storageConfig.homeboxStorage.volumeName) - } - - if ( - config.databaseType === "postgres" && - config.storageConfig.postgresStorage.type === "volume" - ) { - volumeNames.push(config.storageConfig.postgresStorage.volumeName) - } - - // Add HTTPS-related volumes - if ( - config.httpsOption === "traefik" && - config.storageConfig.traefikStorage.type === "volume" - ) { - volumeNames.push(config.storageConfig.traefikStorage.volumeName) - } - - if ( - config.httpsOption === "nginx" && - config.storageConfig.nginxStorage.type === "volume" - ) { - volumeNames.push(config.storageConfig.nginxStorage.volumeName) - } - - if ( - config.httpsOption === "caddy" && - config.storageConfig.caddyStorage.type === "volume" - ) { - volumeNames.push(config.storageConfig.caddyStorage.volumeName) - } - - if ( - config.httpsOption === "cloudflared" && - config.storageConfig.cloudflaredStorage.type === "volume" - ) { - volumeNames.push(config.storageConfig.cloudflaredStorage.volumeName) - } - - if (volumeNames.length > 0) { - dockerCompose += "\nvolumes:\n" - volumeNames.forEach((volumeName: string) => { - dockerCompose += ` ${volumeName}:\n driver: local\n` - }) - } - - return dockerCompose + return volumes } -function addTraefikConfig(services: DockerServices, config: AppConfig): void { - // Add Traefik labels to Homebox - services.homebox.labels = [ - "traefik.enable=true", - `traefik.http.routers.homebox.rule=Host(\`${config.traefikConfig.domain}\`)`, - "traefik.http.routers.homebox.entrypoints=websecure", - "traefik.http.routers.homebox.tls.certresolver=letsencrypt", - "traefik.http.services.homebox.loadbalancer.server.port=7745", - ] +function generateCloudStorageVolumes(config: any): string[] { + const volumes: string[] = [] - // Add Traefik service - services["traefik"] = { - image: "traefik:v2.10", - container_name: "homebox-traefik", - restart: "always", - ports: ["80:80", "443:443"], - command: [ - "--api.insecure=false", - "--providers.docker=true", - "--providers.docker.exposedbydefault=false", - "--entrypoints.web.address=:80", - "--entrypoints.web.http.redirections.entrypoint.to=websecure", - "--entrypoints.web.http.redirections.entrypoint.scheme=https", - "--entrypoints.websecure.address=:443", - "--certificatesresolvers.letsencrypt.acme.tlschallenge=true", - `--certificatesresolvers.letsencrypt.acme.email=${config.traefikConfig.email}`, - "--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json", - ], - volumes: ["/var/run/docker.sock:/var/run/docker.sock:ro"], - } - - // Configure traefik volumes based on storage type - if (config.storageConfig.traefikStorage.type === "volume") { - services.traefik.volumes.push( - `${config.storageConfig.traefikStorage.volumeName}:/letsencrypt`, - ) - } else { - services.traefik.volumes.push( - `${config.storageConfig.traefikStorage.directory}:/letsencrypt`, - ) - } -} - -function addNginxConfig(services: DockerServices, config: AppConfig): void { - // Add Nginx service - services["nginx"] = { - image: "nginx:latest", - container_name: "homebox-nginx", - restart: "always", - ports: [`${config.nginxConfig.port}:443`, "80:80"], - volumes: [], - depends_on: ["homebox"], - } - - // Configure nginx volumes based on storage type - if (config.storageConfig.nginxStorage.type === "volume") { - services.nginx.volumes.push( - `${config.storageConfig.nginxStorage.volumeName}/conf.d:/etc/nginx/conf.d`, - ) - services.nginx.volumes.push( - `${config.storageConfig.nginxStorage.volumeName}/ssl:/etc/nginx/ssl`, - ) - } else { - services.nginx.volumes.push( - `${config.storageConfig.nginxStorage.directory}/conf.d:/etc/nginx/conf.d`, - ) - services.nginx.volumes.push( - `${config.storageConfig.nginxStorage.directory}/ssl:/etc/nginx/ssl`, - ) - } - - // Add default Nginx configuration path (assuming the file exists) - const nginxConfVolume = - config.storageConfig.nginxStorage.type === "volume" - ? `${config.storageConfig.nginxStorage.volumeName}/conf.d/default.conf:/etc/nginx/conf.d/default.conf` - : `${config.storageConfig.nginxStorage.directory}/conf.d/default.conf:/etc/nginx/conf.d/default.conf` - - services.nginx.volumes.push(nginxConfVolume) - - // Add comments via environment variables (Docker Compose doesn't support comments directly in YAML this way) - services.nginx.environment = [ - "# You need to create SSL certificates and place them in the SSL directory", - `# Certificate path: ${config.nginxConfig.sslCertPath}`, - `# Key path: ${config.nginxConfig.sslKeyPath}`, - "# Then create a default.conf file in the conf.d directory with the following content:", - "# server {", - "# listen 80;", - `# server_name ${config.nginxConfig.domain};`, - "# return 301 https://$host$request_uri;", - "# }", - "# server {", - "# listen 443 ssl;", - `# server_name ${config.nginxConfig.domain};`, - `# ssl_certificate ${config.nginxConfig.sslCertPath};`, - `# ssl_certificate_key ${config.nginxConfig.sslKeyPath};`, - "# location / {", - "# proxy_pass http://homebox:7745;", - "# proxy_set_header Host $host;", - "# proxy_set_header X-Real-IP $remote_addr;", - "# }", - "# }", - ] -} - -function addCaddyConfig(services: DockerServices, config: AppConfig): void { - // Add Caddy service - services["caddy"] = { - image: "caddy:latest", - container_name: "homebox-caddy", - restart: "always", - ports: ["80:80", "443:443"], - volumes: [], - depends_on: ["homebox"], - } - - // Configure caddy volumes based on storage type - if (config.storageConfig.caddyStorage.type === "volume") { - services.caddy.volumes.push( - `${config.storageConfig.caddyStorage.volumeName}/data:/data`, - ) - services.caddy.volumes.push( - `${config.storageConfig.caddyStorage.volumeName}/config:/config`, - ) - services.caddy.volumes.push( - `${config.storageConfig.caddyStorage.volumeName}/Caddyfile:/etc/caddy/Caddyfile`, - ) - } else { - services.caddy.volumes.push( - `${config.storageConfig.caddyStorage.directory}/data:/data`, - ) - services.caddy.volumes.push( - `${config.storageConfig.caddyStorage.directory}/config:/config`, - ) - services.caddy.volumes.push( - `${config.storageConfig.caddyStorage.directory}/Caddyfile:/etc/caddy/Caddyfile`, - ) - } - - // Add environment variables for Caddy comments and potential ACME config - services.caddy.environment = [ - `# Create a Caddyfile in ${config.storageConfig.caddyStorage.type === "volume" ? config.storageConfig.caddyStorage.volumeName : config.storageConfig.caddyStorage.directory} with the following content:`, - `# ${config.caddyConfig.domain} {`, - "# reverse_proxy homebox:7745", - "# }", - ] - - // Add email if provided for ACME - if (config.caddyConfig.email) { - // Ensure environment array exists - if (!services.caddy.environment) { - services.caddy.environment = [] + // For cloud storage, we might still need local volumes for certain files like GCS credentials + if (config.storageType === 'gcs') { + volumes.push('/path/to/gcs-credentials.json:/app/gcs-credentials.json:ro') } - services.caddy.environment.push(`ACME_AGREE=true`) // Note: Caddy v2 doesn't use ACME_AGREE env var, email is set in Caddyfile - services.caddy.environment.push(`EMAIL=${config.caddyConfig.email}`) // This might be useful for scripting but Caddy reads email from Caddyfile - services.caddy.environment.push( - `# Add 'email ${config.caddyConfig.email}' to your Caddyfile for automatic HTTPS`, - ) - } + + return volumes } -function addCloudflaredConfig( - services: DockerServices, - config: AppConfig, -): void { - // Add Cloudflared service - services["cloudflared"] = { - image: "cloudflare/cloudflared:latest", - container_name: "homebox-cloudflared", - restart: "always", - command: ["tunnel", "--no-autoupdate", "run"], - volumes: [], - environment: [`TUNNEL_TOKEN=${config.cloudflaredConfig.token}`], - depends_on: ["homebox"], - } +function generatePostgresService(config: any): any { + const service: any = { + image: 'postgres:17-alpine', + container_name: 'homebox_postgres', + restart: 'unless-stopped', + environment: [ + `POSTGRES_USER=${config.postgresConfig.username}`, + `POSTGRES_PASSWORD=${config.postgresConfig.password}`, + `POSTGRES_DB=${config.postgresConfig.database}` + ], + networks: ['homebox'] + } - // Configure cloudflared volumes based on storage type - if (config.storageConfig.cloudflaredStorage.type === "volume") { - services.cloudflared.volumes.push( - `${config.storageConfig.cloudflaredStorage.volumeName}:/etc/cloudflared`, - ) - } else { - services.cloudflared.volumes.push( - `${config.storageConfig.cloudflaredStorage.directory}:/etc/cloudflared`, - ) - } + if (config.storageConfig.containerStorage.postgresStorage.type === 'volume') { + service.volumes = [`${config.storageConfig.containerStorage.postgresStorage.volumeName}:/var/lib/postgresql/data`] + } else { + service.volumes = [`${config.storageConfig.containerStorage.postgresStorage.directory}:/var/lib/postgresql/data`] + } - // Add comments via environment variables - // Ensure environment array exists - if (!services.cloudflared.environment) { - services.cloudflared.environment = [] - } - services.cloudflared.environment.push( - "# Create a tunnel in the Cloudflare Zero Trust dashboard", - `# Configure DNS for ${config.cloudflaredConfig.domain} to point to your tunnel`, - "# Add a public hostname in the tunnel configuration pointing to http://homebox:7745", - ) + return service +} + +function generateTraefikService(config: any): any { + const service: any = { + image: 'traefik:v3.0', + container_name: 'traefik', + restart: 'unless-stopped', + command: [ + '--api.dashboard=true', + '--providers.docker=true', + '--providers.docker.exposedbydefault=false', + '--entrypoints.web.address=:80', + '--entrypoints.websecure.address=:443', + '--certificatesresolvers.letsencrypt.acme.tlschallenge=true', + `--certificatesresolvers.letsencrypt.acme.email=${config.traefikConfig.email}`, + '--certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json' + ], + ports: ['80:80', '443:443'], + networks: ['homebox'], + labels: [ + 'traefik.enable=true', + 'traefik.http.routers.traefik.rule=Host(`traefik.${config.traefikConfig.domain}`)', + 'traefik.http.routers.traefik.entrypoints=websecure', + 'traefik.http.routers.traefik.tls.certresolver=letsencrypt', + 'traefik.http.routers.traefik.service=api@internal' + ] + } + + if (config.storageConfig.containerStorage.traefikStorage.type === 'volume') { + service.volumes = [ + '/var/run/docker.sock:/var/run/docker.sock:ro', + `${config.storageConfig.containerStorage.traefikStorage.volumeName}:/letsencrypt` + ] + } else { + service.volumes = [ + '/var/run/docker.sock:/var/run/docker.sock:ro', + `${config.storageConfig.containerStorage.traefikStorage.directory}:/letsencrypt` + ] + } + + return service +} + +function generateNginxService(config: any): any { + // This would generate an Nginx service with SSL configuration + // Implementation would depend on specific Nginx configuration needs + return { + image: 'nginx:alpine', + container_name: 'nginx', + restart: 'unless-stopped', + ports: [`${config.nginxConfig.port}:443`, '80:80'], + networks: ['homebox'] + } +} + +function generateCaddyService(config: any): any { + return { + image: 'caddy:alpine', + container_name: 'caddy', + restart: 'unless-stopped', + ports: ['80:80', '443:443'], + networks: ['homebox'] + } +} + +function generateCloudflaredService(config: any): any { + return { + image: 'cloudflare/cloudflared:latest', + container_name: 'cloudflared', + restart: 'unless-stopped', + command: `tunnel --no-autoupdate run --token ${config.cloudflaredConfig.token}`, + networks: ['homebox'] + } +} + +// Simple YAML stringifier (basic implementation + +const yaml = { + stringify(obj: any, indent = 0, parentKey = "", isTopLevel = true): string { + const spaces = ' '.repeat(indent) + const nextSpaces = ' '.repeat(indent + 1) + if (obj === null || obj === undefined) { + return 'null' + } + if (typeof obj === 'string') { + if (parentKey === 'environment') { + // Should not be used, handled by stringifyEnv + return obj + } + if (obj.includes(':') || obj.includes('#') || obj.includes('\n') || /^[0-9]/.test(obj) || obj.includes('${')) { + return `"${obj.replace(/"/g, '\\"')}"` + } + return obj + } + if (typeof obj === 'number' || typeof obj === 'boolean') { + return String(obj) + } + if (Array.isArray(obj)) { + if (obj.length === 0) return '[]' + if (parentKey === 'environment') { + return yaml.stringifyEnv(obj, indent) + } + // For arrays under object keys, indent dashes at the same level as the parent key's value (spaces) + return '\n' + obj.map(item => `${spaces}- ${this.stringify(item, indent + 1, '', false).replace(/^\s+/, '')}`).join('\n') + } + if (typeof obj === 'object') { + const keys = Object.keys(obj) + if (keys.length === 0) return '{}' + return (isTopLevel ? '' : '\n') + keys.map(key => { + const value = this.stringify(obj[key], indent + 1, key, false) + // If value is an array, ensure correct indentation + if (Array.isArray(obj[key])) { + // Place key at current indent, then array items at next indent + return `${isTopLevel ? '' : spaces}${key}:${value}` + } + if (value.startsWith('\n')) { + return `${isTopLevel ? '' : spaces}${key}:${value}` + } + return `${isTopLevel ? '' : spaces}${key}: ${value}` + }).join('\n') + } + return String(obj) + }, + + stringifyEnv(envArr: string[], indent = 0): string { + const spaces = ' '.repeat(indent) + return '\n' + envArr.map(env => { + const eqIdx = env.indexOf('=') + if (eqIdx !== -1) { + const key = env.slice(0, eqIdx + 1) + let value = env.slice(eqIdx + 1) + // Only quote the value if it contains special YAML characters + if (value.match(/[:#\n]|^\d|\${/)) { + value = `"${value.replace(/"/g, '\\"')}"` + } + return `${spaces}- ${key}${value}` + } + return `${spaces}- ${env}` + }).join('\n') + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8a2ed0a3..7aa5d48c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -10,7 +10,7 @@ importers: devDependencies: vitepress: specifier: ^1.6.3 - version: 1.6.3(@algolia/client-search@5.23.4)(@types/node@20.11.24)(postcss@8.5.3)(search-insights@2.14.0)(terser@5.28.1) + version: 1.6.3(@algolia/client-search@5.30.0)(@types/node@20.11.24)(postcss@8.5.6)(search-insights@2.14.0)(terser@5.28.1) packages: @@ -34,73 +34,73 @@ packages: '@algolia/client-search': '>= 4.9.1 < 6' algoliasearch: '>= 4.9.1 < 6' - '@algolia/client-abtesting@5.23.4': - resolution: {integrity: sha512-WIMT2Kxy+FFWXWQxIU8QgbTioL+SGE24zhpj0kipG4uQbzXwONaWt7ffaYLjfge3gcGSgJVv+1VlahVckafluQ==} + '@algolia/client-abtesting@5.30.0': + resolution: {integrity: sha512-Q3OQXYlTNqVUN/V1qXX8VIzQbLjP3yrRBO9m6NRe1CBALmoGHh9JrYosEGvfior28+DjqqU3Q+nzCSuf/bX0Gw==} engines: {node: '>= 14.0.0'} - '@algolia/client-analytics@5.23.4': - resolution: {integrity: sha512-4B9gChENsQA9kFmFlb+x3YhBz2Gx3vSsm81FHI1yJ3fn2zlxREHmfrjyqYoMunsU7BybT/o5Nb7ccCbm/vfseA==} + '@algolia/client-analytics@5.30.0': + resolution: {integrity: sha512-/b+SAfHjYjx/ZVeVReCKTTnFAiZWOyvYLrkYpeNMraMT6akYRR8eC1AvFcvR60GLG/jytxcJAp42G8nN5SdcLg==} engines: {node: '>= 14.0.0'} - '@algolia/client-common@5.23.4': - resolution: {integrity: sha512-bsj0lwU2ytiWLtl7sPunr+oLe+0YJql9FozJln5BnIiqfKOaseSDdV42060vUy+D4373f2XBI009K/rm2IXYMA==} + '@algolia/client-common@5.30.0': + resolution: {integrity: sha512-tbUgvkp2d20mHPbM0+NPbLg6SzkUh0lADUUjzNCF+HiPkjFRaIW3NGMlESKw5ia4Oz6ZvFzyREquUX6rdkdJcQ==} engines: {node: '>= 14.0.0'} - '@algolia/client-insights@5.23.4': - resolution: {integrity: sha512-XSCtAYvJ/hnfDHfRVMbBH0dayR+2ofVZy3jf5qyifjguC6rwxDsSdQvXpT0QFVyG+h8UPGtDhMPoUIng4wIcZA==} + '@algolia/client-insights@5.30.0': + resolution: {integrity: sha512-caXuZqJK761m32KoEAEkjkE2WF/zYg1McuGesWXiLSgfxwZZIAf+DljpiSToBUXhoPesvjcLtINyYUzbkwE0iw==} engines: {node: '>= 14.0.0'} - '@algolia/client-personalization@5.23.4': - resolution: {integrity: sha512-l/0QvqgRFFOf7BnKSJ3myd1WbDr86ftVaa3PQwlsNh7IpIHmvVcT83Bi5zlORozVGMwaKfyPZo6O48PZELsOeA==} + '@algolia/client-personalization@5.30.0': + resolution: {integrity: sha512-7K6P7TRBHLX1zTmwKDrIeBSgUidmbj6u3UW/AfroLRDGf9oZFytPKU49wg28lz/yulPuHY0nZqiwbyAxq9V17w==} engines: {node: '>= 14.0.0'} - '@algolia/client-query-suggestions@5.23.4': - resolution: {integrity: sha512-TB0htrDgVacVGtPDyENoM6VIeYqR+pMsDovW94dfi2JoaRxfqu/tYmLpvgWcOknP6wLbr8bA+G7t/NiGksNAwQ==} + '@algolia/client-query-suggestions@5.30.0': + resolution: {integrity: sha512-WMjWuBjYxJheRt7Ec5BFr33k3cV0mq2WzmH9aBf5W4TT8kUp34x91VRsYVaWOBRlxIXI8o/WbhleqSngiuqjLA==} engines: {node: '>= 14.0.0'} - '@algolia/client-search@5.23.4': - resolution: {integrity: sha512-uBGo6KwUP6z+u6HZWRui8UJClS7fgUIAiYd1prUqCbkzDiCngTOzxaJbEvrdkK0hGCQtnPDiuNhC5MhtVNN4Eg==} + '@algolia/client-search@5.30.0': + resolution: {integrity: sha512-puc1/LREfSqzgmrOFMY5L/aWmhYOlJ0TTpa245C0ZNMKEkdOkcimFbXTXQ8lZhzh+rlyFgR7cQGNtXJ5H0XgZg==} engines: {node: '>= 14.0.0'} - '@algolia/ingestion@1.23.4': - resolution: {integrity: sha512-Si6rFuGnSeEUPU9QchYvbknvEIyCRK7nkeaPVQdZpABU7m4V/tsiWdHmjVodtx3h20VZivJdHeQO9XbHxBOcCw==} + '@algolia/ingestion@1.30.0': + resolution: {integrity: sha512-NfqiIKVgGKTLr6T9F81oqB39pPiEtILTy0z8ujxPKg2rCvI/qQeDqDWFBmQPElCfUTU6kk67QAgMkQ7T6fE+gg==} engines: {node: '>= 14.0.0'} - '@algolia/monitoring@1.23.4': - resolution: {integrity: sha512-EXGoVVTshraqPJgr5cMd1fq7Jm71Ew6MpGCEaxI5PErBpJAmKdtjRIzs6JOGKHRaWLi+jdbJPYc2y8RN4qcx5Q==} + '@algolia/monitoring@1.30.0': + resolution: {integrity: sha512-/eeM3aqLKro5KBZw0W30iIA6afkGa+bcpvEM0NDa92m5t3vil4LOmJI9FkgzfmSkF4368z/SZMOTPShYcaVXjA==} engines: {node: '>= 14.0.0'} - '@algolia/recommend@5.23.4': - resolution: {integrity: sha512-1t6glwKVCkjvBNlng2itTf8fwaLSqkL4JaMENgR3WTGR8mmW2akocUy/ZYSQcG4TcR7qu4zW2UMGAwLoWoflgQ==} + '@algolia/recommend@5.30.0': + resolution: {integrity: sha512-iWeAUWqw+xT+2IyUyTqnHCK+cyCKYV5+B6PXKdagc9GJJn6IaPs8vovwoC0Za5vKCje/aXQ24a2Z1pKpc/tdHg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-browser-xhr@5.23.4': - resolution: {integrity: sha512-UUuizcgc5+VSY8hqzDFVdJ3Wcto03lpbFRGPgW12pHTlUQHUTADtIpIhkLLOZRCjXmCVhtr97Z+eR6LcRYXa3Q==} + '@algolia/requester-browser-xhr@5.30.0': + resolution: {integrity: sha512-alo3ly0tdNLjfMSPz9dmNwYUFHx7guaz5dTGlIzVGnOiwLgIoM6NgA+MJLMcH6e1S7OpmE2AxOy78svlhst2tQ==} engines: {node: '>= 14.0.0'} - '@algolia/requester-fetch@5.23.4': - resolution: {integrity: sha512-UhDg6elsek6NnV5z4VG1qMwR6vbp+rTMBEnl/v4hUyXQazU+CNdYkl++cpdmLwGI/7nXc28xtZiL90Es3I7viQ==} + '@algolia/requester-fetch@5.30.0': + resolution: {integrity: sha512-WOnTYUIY2InllHBy6HHMpGIOo7Or4xhYUx/jkoSK/kPIa1BRoFEHqa8v4pbKHtoG7oLvM2UAsylSnjVpIhGZXg==} engines: {node: '>= 14.0.0'} - '@algolia/requester-node-http@5.23.4': - resolution: {integrity: sha512-jXGzGBRUS0oywQwnaCA6mMDJO7LoC3dYSLsyNfIqxDR4SNGLhtg3je0Y31lc24OA4nYyKAYgVLtjfrpcpsWShg==} + '@algolia/requester-node-http@5.30.0': + resolution: {integrity: sha512-uSTUh9fxeHde1c7KhvZKUrivk90sdiDftC+rSKNFKKEU9TiIKAGA7B2oKC+AoMCqMymot1vW9SGbeESQPTZd0w==} engines: {node: '>= 14.0.0'} - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} engines: {node: '>=6.9.0'} - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + '@babel/helper-validator-identifier@7.27.1': + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} engines: {node: '>=6.9.0'} - '@babel/parser@7.27.0': - resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==} + '@babel/parser@7.28.0': + resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} engines: {node: '>=6.0.0'} hasBin: true - '@babel/types@7.27.0': - resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==} + '@babel/types@7.28.0': + resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} engines: {node: '>=6.9.0'} '@docsearch/css@3.8.2': @@ -264,130 +264,125 @@ packages: cpu: [x64] os: [win32] - '@iconify-json/simple-icons@1.2.32': - resolution: {integrity: sha512-gxgLq0raip7SJaeJ0302vwhsqupQttS21B93Ci1kA/++B+hIgGw71HzTOWQoUhwjlrdWcoVUxSvpPJoMs7oURg==} + '@iconify-json/simple-icons@1.2.41': + resolution: {integrity: sha512-4tt29cKzNsxvt6rjAOVhEgpZV0L8jleTDTMdtvIJjF14Afp9aH8peuwGYyX35l6idfFwuzbvjSVfVyVjJtfmYA==} '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} + '@jridgewell/gen-mapping@0.3.12': + resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} '@jridgewell/resolve-uri@3.1.2': resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + '@jridgewell/source-map@0.3.10': + resolution: {integrity: sha512-0pPkgz9dY+bijgistcTTJ5mR+ocqRXLuhXHYdzoMmmoJ2C9S46RCm2GMUbatPEUK9Yjy26IrAy8D/M00lLkv+Q==} - '@jridgewell/source-map@0.3.6': - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + '@jridgewell/sourcemap-codec@1.5.4': + resolution: {integrity: sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==} - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/trace-mapping@0.3.29': + resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@rollup/rollup-android-arm-eabi@4.40.0': - resolution: {integrity: sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==} + '@rollup/rollup-android-arm-eabi@4.44.2': + resolution: {integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.40.0': - resolution: {integrity: sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==} + '@rollup/rollup-android-arm64@4.44.2': + resolution: {integrity: sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.40.0': - resolution: {integrity: sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==} + '@rollup/rollup-darwin-arm64@4.44.2': + resolution: {integrity: sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.40.0': - resolution: {integrity: sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==} + '@rollup/rollup-darwin-x64@4.44.2': + resolution: {integrity: sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.40.0': - resolution: {integrity: sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==} + '@rollup/rollup-freebsd-arm64@4.44.2': + resolution: {integrity: sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.40.0': - resolution: {integrity: sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==} + '@rollup/rollup-freebsd-x64@4.44.2': + resolution: {integrity: sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': - resolution: {integrity: sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==} + '@rollup/rollup-linux-arm-gnueabihf@4.44.2': + resolution: {integrity: sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.40.0': - resolution: {integrity: sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==} + '@rollup/rollup-linux-arm-musleabihf@4.44.2': + resolution: {integrity: sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.40.0': - resolution: {integrity: sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==} + '@rollup/rollup-linux-arm64-gnu@4.44.2': + resolution: {integrity: sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.40.0': - resolution: {integrity: sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==} + '@rollup/rollup-linux-arm64-musl@4.44.2': + resolution: {integrity: sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': - resolution: {integrity: sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==} + '@rollup/rollup-linux-loongarch64-gnu@4.44.2': + resolution: {integrity: sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': - resolution: {integrity: sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': + resolution: {integrity: sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.40.0': - resolution: {integrity: sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==} + '@rollup/rollup-linux-riscv64-gnu@4.44.2': + resolution: {integrity: sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.40.0': - resolution: {integrity: sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==} + '@rollup/rollup-linux-riscv64-musl@4.44.2': + resolution: {integrity: sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.40.0': - resolution: {integrity: sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==} + '@rollup/rollup-linux-s390x-gnu@4.44.2': + resolution: {integrity: sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.40.0': - resolution: {integrity: sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==} + '@rollup/rollup-linux-x64-gnu@4.44.2': + resolution: {integrity: sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.40.0': - resolution: {integrity: sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==} + '@rollup/rollup-linux-x64-musl@4.44.2': + resolution: {integrity: sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.40.0': - resolution: {integrity: sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==} + '@rollup/rollup-win32-arm64-msvc@4.44.2': + resolution: {integrity: sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.40.0': - resolution: {integrity: sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==} + '@rollup/rollup-win32-ia32-msvc@4.44.2': + resolution: {integrity: sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.40.0': - resolution: {integrity: sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==} + '@rollup/rollup-win32-x64-msvc@4.44.2': + resolution: {integrity: sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==} cpu: [x64] os: [win32] @@ -415,8 +410,8 @@ packages: '@shikijs/vscode-textmate@10.0.2': resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - '@types/estree@1.0.7': - resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} '@types/hast@3.0.4': resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} @@ -445,50 +440,50 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitejs/plugin-vue@5.2.3': - resolution: {integrity: sha512-IYSLEQj4LgZZuoVpdSUCw3dIynTWQgPlaRP6iAvMle4My0HdYwr5g5wQAfwOeHQBmYwEkqF70nRpSilr6PoUDg==} + '@vitejs/plugin-vue@5.2.4': + resolution: {integrity: sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==} engines: {node: ^18.0.0 || >=20.0.0} peerDependencies: vite: ^5.0.0 || ^6.0.0 vue: ^3.2.25 - '@vue/compiler-core@3.5.13': - resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==} + '@vue/compiler-core@3.5.17': + resolution: {integrity: sha512-Xe+AittLbAyV0pabcN7cP7/BenRBNcteM4aSDCtRvGw0d9OL+HG1u/XHLY/kt1q4fyMeZYXyIYrsHuPSiDPosA==} - '@vue/compiler-dom@3.5.13': - resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==} + '@vue/compiler-dom@3.5.17': + resolution: {integrity: sha512-+2UgfLKoaNLhgfhV5Ihnk6wB4ljyW1/7wUIog2puUqajiC29Lp5R/IKDdkebh9jTbTogTbsgB+OY9cEWzG95JQ==} - '@vue/compiler-sfc@3.5.13': - resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==} + '@vue/compiler-sfc@3.5.17': + resolution: {integrity: sha512-rQQxbRJMgTqwRugtjw0cnyQv9cP4/4BxWfTdRBkqsTfLOHWykLzbOc3C4GGzAmdMDxhzU/1Ija5bTjMVrddqww==} - '@vue/compiler-ssr@3.5.13': - resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==} + '@vue/compiler-ssr@3.5.17': + resolution: {integrity: sha512-hkDbA0Q20ZzGgpj5uZjb9rBzQtIHLS78mMilwrlpWk2Ep37DYntUz0PonQ6kr113vfOEdM+zTBuJDaceNIW0tQ==} - '@vue/devtools-api@7.7.5': - resolution: {integrity: sha512-HYV3tJGARROq5nlVMJh5KKHk7GU8Au3IrrmNNqr978m0edxgpHgYPDoNUGrvEgIbObz09SQezFR3A1EVmB5WZg==} + '@vue/devtools-api@7.7.7': + resolution: {integrity: sha512-lwOnNBH2e7x1fIIbVT7yF5D+YWhqELm55/4ZKf45R9T8r9dE2AIOy8HKjfqzGsoTHFbWbr337O4E0A0QADnjBg==} - '@vue/devtools-kit@7.7.5': - resolution: {integrity: sha512-S9VAVJYVAe4RPx2JZb9ZTEi0lqTySz2CBeF0wHT5D3dkTLnT9yMMGegKNl4b2EIELwLSkcI9bl2qp0/jW+upqA==} + '@vue/devtools-kit@7.7.7': + resolution: {integrity: sha512-wgoZtxcTta65cnZ1Q6MbAfePVFxfM+gq0saaeytoph7nEa7yMXoi6sCPy4ufO111B9msnw0VOWjPEFCXuAKRHA==} - '@vue/devtools-shared@7.7.5': - resolution: {integrity: sha512-QBjG72RfpM0DKtpns2RZOxBltO226kOAls9e4Lri6YxS2gWTgL0H+wj1R2K76lxxIeOrqo4+2Ty6RQnzv+WSTQ==} + '@vue/devtools-shared@7.7.7': + resolution: {integrity: sha512-+udSj47aRl5aKb0memBvcUG9koarqnxNM5yjuREvqwK6T3ap4mn3Zqqc17QrBFTqSMjr3HK1cvStEZpMDpfdyw==} - '@vue/reactivity@3.5.13': - resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==} + '@vue/reactivity@3.5.17': + resolution: {integrity: sha512-l/rmw2STIscWi7SNJp708FK4Kofs97zc/5aEPQh4bOsReD/8ICuBcEmS7KGwDj5ODQLYWVN2lNibKJL1z5b+Lw==} - '@vue/runtime-core@3.5.13': - resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==} + '@vue/runtime-core@3.5.17': + resolution: {integrity: sha512-QQLXa20dHg1R0ri4bjKeGFKEkJA7MMBxrKo2G+gJikmumRS7PTD4BOU9FKrDQWMKowz7frJJGqBffYMgQYS96Q==} - '@vue/runtime-dom@3.5.13': - resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==} + '@vue/runtime-dom@3.5.17': + resolution: {integrity: sha512-8El0M60TcwZ1QMz4/os2MdlQECgGoVHPuLnQBU3m9h3gdNRW9xRmI8iLS4t/22OQlOE6aJvNNlBiCzPHur4H9g==} - '@vue/server-renderer@3.5.13': - resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==} + '@vue/server-renderer@3.5.17': + resolution: {integrity: sha512-BOHhm8HalujY6lmC3DbqF6uXN/K00uWiEeF22LfEsm9Q93XeJ/plHTepGwf6tqFcF7GA5oGSSAAUock3VvzaCA==} peerDependencies: - vue: 3.5.13 + vue: 3.5.17 - '@vue/shared@3.5.13': - resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==} + '@vue/shared@3.5.17': + resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} '@vueuse/core@12.8.2': resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} @@ -540,17 +535,17 @@ packages: '@vueuse/shared@12.8.2': resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} - acorn@8.14.1: - resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} engines: {node: '>=0.4.0'} hasBin: true - algoliasearch@5.23.4: - resolution: {integrity: sha512-QzAKFHl3fm53s44VHrTdEo0TkpL3XVUYQpnZy1r6/EHvMAyIg+O4hwprzlsNmcCHTNyVcF2S13DAUn7XhkC6qg==} + algoliasearch@5.30.0: + resolution: {integrity: sha512-ILSdPX4je0n5WUKD34TMe57/eqiXUzCIjAsdtLQYhomqOjTtFUg1s6dE7kUegc4Mc43Xr7IXYlMutU9HPiYfdw==} engines: {node: '>= 14.0.0'} - birpc@2.3.0: - resolution: {integrity: sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==} + birpc@2.4.0: + resolution: {integrity: sha512-5IdNxTyhXHv2UlgnPHQ0h+5ypVmkrYHzL8QT+DwFZ//2N/oNV8Ch+BCRmTJ3x6/z9Axo/cXYBc9eprsUVK/Jsg==} buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -599,8 +594,8 @@ packages: estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} - focus-trap@7.6.4: - resolution: {integrity: sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==} + focus-trap@7.6.5: + resolution: {integrity: sha512-7Ke1jyybbbPZyZXFxEftUtxFGLMpE2n6A+z//m4CRDlj0hW+o3iYSmh8nFlYMurOiJVDmJRilUQtJr08KfIxlg==} fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} @@ -667,15 +662,15 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - preact@10.26.5: - resolution: {integrity: sha512-fmpDkgfGU6JYux9teDWLhj9mKN55tyepwYbxHgQuIxbWQzgFg5vk7Mrrtfx7xRxq798ynkY4DDDxZr235Kk+4w==} + preact@10.26.9: + resolution: {integrity: sha512-SSjF9vcnF27mJK1XyFMNJzFd5u3pQiATFqoaDy03XuN00u4ziveVVEGt5RKJrDR8MHE/wJo9Nnad56RLzS2RMA==} - property-information@7.0.0: - resolution: {integrity: sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==} + property-information@7.1.0: + resolution: {integrity: sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==} regex-recursion@6.0.2: resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==} @@ -689,8 +684,8 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.40.0: - resolution: {integrity: sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==} + rollup@4.44.2: + resolution: {integrity: sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -760,8 +755,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@5.4.18: - resolution: {integrity: sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==} + vite@5.4.19: + resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -803,8 +798,8 @@ packages: postcss: optional: true - vue@3.5.13: - resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==} + vue@3.5.17: + resolution: {integrity: sha512-LbHV3xPN9BeljML+Xctq4lbz2lVHCR6DtbpTf5XIO6gugpXUN49j2QQPcMj086r9+AkJ0FfUT8xjulKKBkkr9g==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -816,130 +811,130 @@ packages: snapshots: - '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)(search-insights@2.14.0)': + '@algolia/autocomplete-core@1.17.7(@algolia/client-search@5.30.0)(algoliasearch@5.30.0)(search-insights@2.14.0)': dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)(search-insights@2.14.0) - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4) + '@algolia/autocomplete-plugin-algolia-insights': 1.17.7(@algolia/client-search@5.30.0)(algoliasearch@5.30.0)(search-insights@2.14.0) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.30.0)(algoliasearch@5.30.0) transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - search-insights - '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)(search-insights@2.14.0)': + '@algolia/autocomplete-plugin-algolia-insights@1.17.7(@algolia/client-search@5.30.0)(algoliasearch@5.30.0)(search-insights@2.14.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4) + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.30.0)(algoliasearch@5.30.0) search-insights: 2.14.0 transitivePeerDependencies: - '@algolia/client-search' - algoliasearch - '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)': + '@algolia/autocomplete-preset-algolia@1.17.7(@algolia/client-search@5.30.0)(algoliasearch@5.30.0)': dependencies: - '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4) - '@algolia/client-search': 5.23.4 - algoliasearch: 5.23.4 + '@algolia/autocomplete-shared': 1.17.7(@algolia/client-search@5.30.0)(algoliasearch@5.30.0) + '@algolia/client-search': 5.30.0 + algoliasearch: 5.30.0 - '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)': + '@algolia/autocomplete-shared@1.17.7(@algolia/client-search@5.30.0)(algoliasearch@5.30.0)': dependencies: - '@algolia/client-search': 5.23.4 - algoliasearch: 5.23.4 + '@algolia/client-search': 5.30.0 + algoliasearch: 5.30.0 - '@algolia/client-abtesting@5.23.4': + '@algolia/client-abtesting@5.30.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.30.0 + '@algolia/requester-browser-xhr': 5.30.0 + '@algolia/requester-fetch': 5.30.0 + '@algolia/requester-node-http': 5.30.0 - '@algolia/client-analytics@5.23.4': + '@algolia/client-analytics@5.30.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.30.0 + '@algolia/requester-browser-xhr': 5.30.0 + '@algolia/requester-fetch': 5.30.0 + '@algolia/requester-node-http': 5.30.0 - '@algolia/client-common@5.23.4': {} + '@algolia/client-common@5.30.0': {} - '@algolia/client-insights@5.23.4': + '@algolia/client-insights@5.30.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.30.0 + '@algolia/requester-browser-xhr': 5.30.0 + '@algolia/requester-fetch': 5.30.0 + '@algolia/requester-node-http': 5.30.0 - '@algolia/client-personalization@5.23.4': + '@algolia/client-personalization@5.30.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.30.0 + '@algolia/requester-browser-xhr': 5.30.0 + '@algolia/requester-fetch': 5.30.0 + '@algolia/requester-node-http': 5.30.0 - '@algolia/client-query-suggestions@5.23.4': + '@algolia/client-query-suggestions@5.30.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.30.0 + '@algolia/requester-browser-xhr': 5.30.0 + '@algolia/requester-fetch': 5.30.0 + '@algolia/requester-node-http': 5.30.0 - '@algolia/client-search@5.23.4': + '@algolia/client-search@5.30.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.30.0 + '@algolia/requester-browser-xhr': 5.30.0 + '@algolia/requester-fetch': 5.30.0 + '@algolia/requester-node-http': 5.30.0 - '@algolia/ingestion@1.23.4': + '@algolia/ingestion@1.30.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.30.0 + '@algolia/requester-browser-xhr': 5.30.0 + '@algolia/requester-fetch': 5.30.0 + '@algolia/requester-node-http': 5.30.0 - '@algolia/monitoring@1.23.4': + '@algolia/monitoring@1.30.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.30.0 + '@algolia/requester-browser-xhr': 5.30.0 + '@algolia/requester-fetch': 5.30.0 + '@algolia/requester-node-http': 5.30.0 - '@algolia/recommend@5.23.4': + '@algolia/recommend@5.30.0': dependencies: - '@algolia/client-common': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-common': 5.30.0 + '@algolia/requester-browser-xhr': 5.30.0 + '@algolia/requester-fetch': 5.30.0 + '@algolia/requester-node-http': 5.30.0 - '@algolia/requester-browser-xhr@5.23.4': + '@algolia/requester-browser-xhr@5.30.0': dependencies: - '@algolia/client-common': 5.23.4 + '@algolia/client-common': 5.30.0 - '@algolia/requester-fetch@5.23.4': + '@algolia/requester-fetch@5.30.0': dependencies: - '@algolia/client-common': 5.23.4 + '@algolia/client-common': 5.30.0 - '@algolia/requester-node-http@5.23.4': + '@algolia/requester-node-http@5.30.0': dependencies: - '@algolia/client-common': 5.23.4 + '@algolia/client-common': 5.30.0 - '@babel/helper-string-parser@7.25.9': {} + '@babel/helper-string-parser@7.27.1': {} - '@babel/helper-validator-identifier@7.25.9': {} + '@babel/helper-validator-identifier@7.27.1': {} - '@babel/parser@7.27.0': + '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.27.0 + '@babel/types': 7.28.0 - '@babel/types@7.27.0': + '@babel/types@7.28.0': dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 '@docsearch/css@3.8.2': {} - '@docsearch/js@3.8.2(@algolia/client-search@5.23.4)(search-insights@2.14.0)': + '@docsearch/js@3.8.2(@algolia/client-search@5.30.0)(search-insights@2.14.0)': dependencies: - '@docsearch/react': 3.8.2(@algolia/client-search@5.23.4)(search-insights@2.14.0) - preact: 10.26.5 + '@docsearch/react': 3.8.2(@algolia/client-search@5.30.0)(search-insights@2.14.0) + preact: 10.26.9 transitivePeerDependencies: - '@algolia/client-search' - '@types/react' @@ -947,12 +942,12 @@ snapshots: - react-dom - search-insights - '@docsearch/react@3.8.2(@algolia/client-search@5.23.4)(search-insights@2.14.0)': + '@docsearch/react@3.8.2(@algolia/client-search@5.30.0)(search-insights@2.14.0)': dependencies: - '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4)(search-insights@2.14.0) - '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.23.4)(algoliasearch@5.23.4) + '@algolia/autocomplete-core': 1.17.7(@algolia/client-search@5.30.0)(algoliasearch@5.30.0)(search-insights@2.14.0) + '@algolia/autocomplete-preset-algolia': 1.17.7(@algolia/client-search@5.30.0)(algoliasearch@5.30.0) '@docsearch/css': 3.8.2 - algoliasearch: 5.23.4 + algoliasearch: 5.30.0 optionalDependencies: search-insights: 2.14.0 transitivePeerDependencies: @@ -1027,97 +1022,93 @@ snapshots: '@esbuild/win32-x64@0.21.5': optional: true - '@iconify-json/simple-icons@1.2.32': + '@iconify-json/simple-icons@1.2.41': dependencies: '@iconify/types': 2.0.0 '@iconify/types@2.0.0': {} - '@jridgewell/gen-mapping@0.3.8': + '@jridgewell/gen-mapping@0.3.12': dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/sourcemap-codec': 1.5.4 + '@jridgewell/trace-mapping': 0.3.29 optional: true '@jridgewell/resolve-uri@3.1.2': optional: true - '@jridgewell/set-array@1.2.1': - optional: true - - '@jridgewell/source-map@0.3.6': + '@jridgewell/source-map@0.3.10': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.12 + '@jridgewell/trace-mapping': 0.3.29 optional: true - '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.4': {} - '@jridgewell/trace-mapping@0.3.25': + '@jridgewell/trace-mapping@0.3.29': dependencies: '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 optional: true - '@rollup/rollup-android-arm-eabi@4.40.0': + '@rollup/rollup-android-arm-eabi@4.44.2': optional: true - '@rollup/rollup-android-arm64@4.40.0': + '@rollup/rollup-android-arm64@4.44.2': optional: true - '@rollup/rollup-darwin-arm64@4.40.0': + '@rollup/rollup-darwin-arm64@4.44.2': optional: true - '@rollup/rollup-darwin-x64@4.40.0': + '@rollup/rollup-darwin-x64@4.44.2': optional: true - '@rollup/rollup-freebsd-arm64@4.40.0': + '@rollup/rollup-freebsd-arm64@4.44.2': optional: true - '@rollup/rollup-freebsd-x64@4.40.0': + '@rollup/rollup-freebsd-x64@4.44.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.40.0': + '@rollup/rollup-linux-arm-gnueabihf@4.44.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.40.0': + '@rollup/rollup-linux-arm-musleabihf@4.44.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.40.0': + '@rollup/rollup-linux-arm64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.40.0': + '@rollup/rollup-linux-arm64-musl@4.44.2': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.40.0': + '@rollup/rollup-linux-loongarch64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.40.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.40.0': + '@rollup/rollup-linux-riscv64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.40.0': + '@rollup/rollup-linux-riscv64-musl@4.44.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.40.0': + '@rollup/rollup-linux-s390x-gnu@4.44.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.40.0': + '@rollup/rollup-linux-x64-gnu@4.44.2': optional: true - '@rollup/rollup-linux-x64-musl@4.40.0': + '@rollup/rollup-linux-x64-musl@4.44.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.40.0': + '@rollup/rollup-win32-arm64-msvc@4.44.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.40.0': + '@rollup/rollup-win32-ia32-msvc@4.44.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.40.0': + '@rollup/rollup-win32-x64-msvc@4.44.2': optional: true '@shikijs/core@2.5.0': @@ -1160,7 +1151,7 @@ snapshots: '@shikijs/vscode-textmate@10.0.2': {} - '@types/estree@1.0.7': {} + '@types/estree@1.0.8': {} '@types/hast@3.0.4': dependencies: @@ -1190,99 +1181,99 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitejs/plugin-vue@5.2.3(vite@5.4.18(@types/node@20.11.24)(terser@5.28.1))(vue@3.5.13)': + '@vitejs/plugin-vue@5.2.4(vite@5.4.19(@types/node@20.11.24)(terser@5.28.1))(vue@3.5.17)': dependencies: - vite: 5.4.18(@types/node@20.11.24)(terser@5.28.1) - vue: 3.5.13 + vite: 5.4.19(@types/node@20.11.24)(terser@5.28.1) + vue: 3.5.17 - '@vue/compiler-core@3.5.13': + '@vue/compiler-core@3.5.17': dependencies: - '@babel/parser': 7.27.0 - '@vue/shared': 3.5.13 + '@babel/parser': 7.28.0 + '@vue/shared': 3.5.17 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.5.13': + '@vue/compiler-dom@3.5.17': dependencies: - '@vue/compiler-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-core': 3.5.17 + '@vue/shared': 3.5.17 - '@vue/compiler-sfc@3.5.13': + '@vue/compiler-sfc@3.5.17': dependencies: - '@babel/parser': 7.27.0 - '@vue/compiler-core': 3.5.13 - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 + '@babel/parser': 7.28.0 + '@vue/compiler-core': 3.5.17 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-ssr': 3.5.17 + '@vue/shared': 3.5.17 estree-walker: 2.0.2 magic-string: 0.30.17 - postcss: 8.5.3 + postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.5.13': + '@vue/compiler-ssr@3.5.17': dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.17 + '@vue/shared': 3.5.17 - '@vue/devtools-api@7.7.5': + '@vue/devtools-api@7.7.7': dependencies: - '@vue/devtools-kit': 7.7.5 + '@vue/devtools-kit': 7.7.7 - '@vue/devtools-kit@7.7.5': + '@vue/devtools-kit@7.7.7': dependencies: - '@vue/devtools-shared': 7.7.5 - birpc: 2.3.0 + '@vue/devtools-shared': 7.7.7 + birpc: 2.4.0 hookable: 5.5.3 mitt: 3.0.1 perfect-debounce: 1.0.0 speakingurl: 14.0.1 superjson: 2.2.2 - '@vue/devtools-shared@7.7.5': + '@vue/devtools-shared@7.7.7': dependencies: rfdc: 1.4.1 - '@vue/reactivity@3.5.13': + '@vue/reactivity@3.5.17': dependencies: - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.17 - '@vue/runtime-core@3.5.13': + '@vue/runtime-core@3.5.17': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.17 + '@vue/shared': 3.5.17 - '@vue/runtime-dom@3.5.13': + '@vue/runtime-dom@3.5.17': dependencies: - '@vue/reactivity': 3.5.13 - '@vue/runtime-core': 3.5.13 - '@vue/shared': 3.5.13 + '@vue/reactivity': 3.5.17 + '@vue/runtime-core': 3.5.17 + '@vue/shared': 3.5.17 csstype: 3.1.3 - '@vue/server-renderer@3.5.13(vue@3.5.13)': + '@vue/server-renderer@3.5.17(vue@3.5.17)': dependencies: - '@vue/compiler-ssr': 3.5.13 - '@vue/shared': 3.5.13 - vue: 3.5.13 + '@vue/compiler-ssr': 3.5.17 + '@vue/shared': 3.5.17 + vue: 3.5.17 - '@vue/shared@3.5.13': {} + '@vue/shared@3.5.17': {} '@vueuse/core@12.8.2': dependencies: '@types/web-bluetooth': 0.0.21 '@vueuse/metadata': 12.8.2 '@vueuse/shared': 12.8.2 - vue: 3.5.13 + vue: 3.5.17 transitivePeerDependencies: - typescript - '@vueuse/integrations@12.8.2(focus-trap@7.6.4)': + '@vueuse/integrations@12.8.2(focus-trap@7.6.5)': dependencies: '@vueuse/core': 12.8.2 '@vueuse/shared': 12.8.2 - vue: 3.5.13 + vue: 3.5.17 optionalDependencies: - focus-trap: 7.6.4 + focus-trap: 7.6.5 transitivePeerDependencies: - typescript @@ -1290,30 +1281,30 @@ snapshots: '@vueuse/shared@12.8.2': dependencies: - vue: 3.5.13 + vue: 3.5.17 transitivePeerDependencies: - typescript - acorn@8.14.1: + acorn@8.15.0: optional: true - algoliasearch@5.23.4: + algoliasearch@5.30.0: dependencies: - '@algolia/client-abtesting': 5.23.4 - '@algolia/client-analytics': 5.23.4 - '@algolia/client-common': 5.23.4 - '@algolia/client-insights': 5.23.4 - '@algolia/client-personalization': 5.23.4 - '@algolia/client-query-suggestions': 5.23.4 - '@algolia/client-search': 5.23.4 - '@algolia/ingestion': 1.23.4 - '@algolia/monitoring': 1.23.4 - '@algolia/recommend': 5.23.4 - '@algolia/requester-browser-xhr': 5.23.4 - '@algolia/requester-fetch': 5.23.4 - '@algolia/requester-node-http': 5.23.4 + '@algolia/client-abtesting': 5.30.0 + '@algolia/client-analytics': 5.30.0 + '@algolia/client-common': 5.30.0 + '@algolia/client-insights': 5.30.0 + '@algolia/client-personalization': 5.30.0 + '@algolia/client-query-suggestions': 5.30.0 + '@algolia/client-search': 5.30.0 + '@algolia/ingestion': 1.30.0 + '@algolia/monitoring': 1.30.0 + '@algolia/recommend': 5.30.0 + '@algolia/requester-browser-xhr': 5.30.0 + '@algolia/requester-fetch': 5.30.0 + '@algolia/requester-node-http': 5.30.0 - birpc@2.3.0: {} + birpc@2.4.0: {} buffer-from@1.1.2: optional: true @@ -1373,7 +1364,7 @@ snapshots: estree-walker@2.0.2: {} - focus-trap@7.6.4: + focus-trap@7.6.5: dependencies: tabbable: 6.2.0 @@ -1389,7 +1380,7 @@ snapshots: hast-util-whitespace: 3.0.0 html-void-elements: 3.0.0 mdast-util-to-hast: 13.2.0 - property-information: 7.0.0 + property-information: 7.1.0 space-separated-tokens: 2.0.2 stringify-entities: 4.0.4 zwitch: 2.0.4 @@ -1406,7 +1397,7 @@ snapshots: magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/sourcemap-codec': 1.5.4 mark.js@8.11.1: {} @@ -1455,15 +1446,15 @@ snapshots: picocolors@1.1.1: {} - postcss@8.5.3: + postcss@8.5.6: dependencies: nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 - preact@10.26.5: {} + preact@10.26.9: {} - property-information@7.0.0: {} + property-information@7.1.0: {} regex-recursion@6.0.2: dependencies: @@ -1477,30 +1468,30 @@ snapshots: rfdc@1.4.1: {} - rollup@4.40.0: + rollup@4.44.2: dependencies: - '@types/estree': 1.0.7 + '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.40.0 - '@rollup/rollup-android-arm64': 4.40.0 - '@rollup/rollup-darwin-arm64': 4.40.0 - '@rollup/rollup-darwin-x64': 4.40.0 - '@rollup/rollup-freebsd-arm64': 4.40.0 - '@rollup/rollup-freebsd-x64': 4.40.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.40.0 - '@rollup/rollup-linux-arm-musleabihf': 4.40.0 - '@rollup/rollup-linux-arm64-gnu': 4.40.0 - '@rollup/rollup-linux-arm64-musl': 4.40.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.40.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-gnu': 4.40.0 - '@rollup/rollup-linux-riscv64-musl': 4.40.0 - '@rollup/rollup-linux-s390x-gnu': 4.40.0 - '@rollup/rollup-linux-x64-gnu': 4.40.0 - '@rollup/rollup-linux-x64-musl': 4.40.0 - '@rollup/rollup-win32-arm64-msvc': 4.40.0 - '@rollup/rollup-win32-ia32-msvc': 4.40.0 - '@rollup/rollup-win32-x64-msvc': 4.40.0 + '@rollup/rollup-android-arm-eabi': 4.44.2 + '@rollup/rollup-android-arm64': 4.44.2 + '@rollup/rollup-darwin-arm64': 4.44.2 + '@rollup/rollup-darwin-x64': 4.44.2 + '@rollup/rollup-freebsd-arm64': 4.44.2 + '@rollup/rollup-freebsd-x64': 4.44.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.44.2 + '@rollup/rollup-linux-arm-musleabihf': 4.44.2 + '@rollup/rollup-linux-arm64-gnu': 4.44.2 + '@rollup/rollup-linux-arm64-musl': 4.44.2 + '@rollup/rollup-linux-loongarch64-gnu': 4.44.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.44.2 + '@rollup/rollup-linux-riscv64-gnu': 4.44.2 + '@rollup/rollup-linux-riscv64-musl': 4.44.2 + '@rollup/rollup-linux-s390x-gnu': 4.44.2 + '@rollup/rollup-linux-x64-gnu': 4.44.2 + '@rollup/rollup-linux-x64-musl': 4.44.2 + '@rollup/rollup-win32-arm64-msvc': 4.44.2 + '@rollup/rollup-win32-ia32-msvc': 4.44.2 + '@rollup/rollup-win32-x64-msvc': 4.44.2 fsevents: 2.3.3 search-insights@2.14.0: {} @@ -1544,8 +1535,8 @@ snapshots: terser@5.28.1: dependencies: - '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + '@jridgewell/source-map': 0.3.10 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 optional: true @@ -1588,38 +1579,38 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite@5.4.18(@types/node@20.11.24)(terser@5.28.1): + vite@5.4.19(@types/node@20.11.24)(terser@5.28.1): dependencies: esbuild: 0.21.5 - postcss: 8.5.3 - rollup: 4.40.0 + postcss: 8.5.6 + rollup: 4.44.2 optionalDependencies: '@types/node': 20.11.24 fsevents: 2.3.3 terser: 5.28.1 - vitepress@1.6.3(@algolia/client-search@5.23.4)(@types/node@20.11.24)(postcss@8.5.3)(search-insights@2.14.0)(terser@5.28.1): + vitepress@1.6.3(@algolia/client-search@5.30.0)(@types/node@20.11.24)(postcss@8.5.6)(search-insights@2.14.0)(terser@5.28.1): dependencies: '@docsearch/css': 3.8.2 - '@docsearch/js': 3.8.2(@algolia/client-search@5.23.4)(search-insights@2.14.0) - '@iconify-json/simple-icons': 1.2.32 + '@docsearch/js': 3.8.2(@algolia/client-search@5.30.0)(search-insights@2.14.0) + '@iconify-json/simple-icons': 1.2.41 '@shikijs/core': 2.5.0 '@shikijs/transformers': 2.5.0 '@shikijs/types': 2.5.0 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.2.3(vite@5.4.18(@types/node@20.11.24)(terser@5.28.1))(vue@3.5.13) - '@vue/devtools-api': 7.7.5 - '@vue/shared': 3.5.13 + '@vitejs/plugin-vue': 5.2.4(vite@5.4.19(@types/node@20.11.24)(terser@5.28.1))(vue@3.5.17) + '@vue/devtools-api': 7.7.7 + '@vue/shared': 3.5.17 '@vueuse/core': 12.8.2 - '@vueuse/integrations': 12.8.2(focus-trap@7.6.4) - focus-trap: 7.6.4 + '@vueuse/integrations': 12.8.2(focus-trap@7.6.5) + focus-trap: 7.6.5 mark.js: 8.11.1 minisearch: 7.1.2 shiki: 2.5.0 - vite: 5.4.18(@types/node@20.11.24)(terser@5.28.1) - vue: 3.5.13 + vite: 5.4.19(@types/node@20.11.24)(terser@5.28.1) + vue: 3.5.17 optionalDependencies: - postcss: 8.5.3 + postcss: 8.5.6 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -1647,12 +1638,12 @@ snapshots: - typescript - universal-cookie - vue@3.5.13: + vue@3.5.17: dependencies: - '@vue/compiler-dom': 3.5.13 - '@vue/compiler-sfc': 3.5.13 - '@vue/runtime-dom': 3.5.13 - '@vue/server-renderer': 3.5.13(vue@3.5.13) - '@vue/shared': 3.5.13 + '@vue/compiler-dom': 3.5.17 + '@vue/compiler-sfc': 3.5.17 + '@vue/runtime-dom': 3.5.17 + '@vue/server-renderer': 3.5.17(vue@3.5.17) + '@vue/shared': 3.5.17 zwitch@2.0.4: {}