diff --git a/go.mod b/go.mod index a7f82fd..8be3182 100644 --- a/go.mod +++ b/go.mod @@ -6,46 +6,46 @@ require ( connectrpc.com/connect v1.18.1 connectrpc.com/grpchealth v1.3.0 connectrpc.com/grpcreflect v1.3.0 - github.com/aws/aws-sdk-go-v2 v1.32.7 - github.com/aws/aws-sdk-go-v2/config v1.28.7 - github.com/aws/aws-sdk-go-v2/service/s3 v1.71.1 + github.com/aws/aws-sdk-go-v2 v1.36.2 + github.com/aws/aws-sdk-go-v2/config v1.29.7 + github.com/aws/aws-sdk-go-v2/service/s3 v1.77.1 github.com/caarlos0/env/v11 v11.3.1 github.com/cloudflare/cloudflare-go v0.115.0 github.com/docker/docker v27.4.1+incompatible github.com/domodwyer/mailyak/v3 v3.6.2 github.com/golang-jwt/jwt/v5 v5.2.1 github.com/google/uuid v1.6.0 - github.com/joeig/go-powerdns/v3 v3.14.1 + github.com/joeig/go-powerdns/v3 v3.14.3 github.com/lmittmann/tint v1.0.7 github.com/pressly/goose/v3 v3.24.1 - github.com/traefik/paerser v0.2.1 + github.com/traefik/paerser v0.2.2 github.com/traefik/traefik/v3 v3.3.3 - golang.org/x/crypto v0.33.0 - golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac + golang.org/x/crypto v0.35.0 + golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa golang.org/x/net v0.35.0 google.golang.org/protobuf v1.36.5 - modernc.org/sqlite v1.34.5 + modernc.org/sqlite v1.35.0 sigs.k8s.io/yaml v1.4.0 ) require ( github.com/Microsoft/go-winio v0.6.2 // indirect github.com/aws/aws-sdk-go v1.55.6 // indirect - github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.48 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 // indirect - github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect - github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 // indirect - github.com/aws/smithy-go v1.22.1 // indirect + github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.60 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.29 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.33 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.33 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect + github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.33 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.6.1 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.14 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.14 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.16 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.15 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.15 // indirect + github.com/aws/smithy-go v1.22.3 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/docker/go-connections v0.5.0 // indirect @@ -53,8 +53,8 @@ require ( github.com/dustin/go-humanize v1.0.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.8.0 // indirect - github.com/go-acme/lego/v4 v4.21.0 // indirect - github.com/go-jose/go-jose/v4 v4.0.4 // indirect + github.com/go-acme/lego/v4 v4.22.2 // indirect + github.com/go-jose/go-jose/v4 v4.0.5 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.2 // indirect @@ -102,8 +102,8 @@ require ( golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.10.0 // indirect golang.org/x/tools v0.30.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20250224174004-546df14abb99 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250224174004-546df14abb99 // indirect google.golang.org/grpc v1.70.0 // indirect gotest.tools/v3 v3.5.1 // indirect modernc.org/libc v1.61.13 // indirect diff --git a/go.sum b/go.sum index a6a63d6..5c57564 100644 --- a/go.sum +++ b/go.sum @@ -12,42 +12,42 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.32.7 h1:ky5o35oENWi0JYWUZkB7WYvVPP+bcRF5/Iq7JWSb5Rw= -github.com/aws/aws-sdk-go-v2 v1.32.7/go.mod h1:P5WJBrYqqbWVaOxgH0X/FYYD47/nooaPOZPlQdmiN2U= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7 h1:lL7IfaFzngfx0ZwUGOZdsFFnQ5uLvR0hWqqhyE7Q9M8= -github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.7/go.mod h1:QraP0UcVlQJsmHfioCrveWOC1nbiWUl3ej08h4mXWoc= -github.com/aws/aws-sdk-go-v2/config v1.28.7 h1:GduUnoTXlhkgnxTD93g1nv4tVPILbdNQOzav+Wpg7AE= -github.com/aws/aws-sdk-go-v2/config v1.28.7/go.mod h1:vZGX6GVkIE8uECSUHB6MWAUsd4ZcG2Yq/dMa4refR3M= -github.com/aws/aws-sdk-go-v2/credentials v1.17.48 h1:IYdLD1qTJ0zanRavulofmqut4afs45mOWEI+MzZtTfQ= -github.com/aws/aws-sdk-go-v2/credentials v1.17.48/go.mod h1:tOscxHN3CGmuX9idQ3+qbkzrjVIx32lqDSU1/0d/qXs= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22 h1:kqOrpojG71DxJm/KDPO+Z/y1phm1JlC8/iT+5XRmAn8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.22/go.mod h1:NtSFajXVVL8TA2QNngagVZmUtXciyrHOt7xgz4faS/M= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26 h1:I/5wmGMffY4happ8NOCuIUEWGUvvFp5NSeQcXl9RHcI= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.26/go.mod h1:FR8f4turZtNy6baO0KJ5FJUmXH/cSkI9fOngs0yl6mA= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26 h1:zXFLuEuMMUOvEARXFUVJdfqZ4bvvSgdGRq/ATcrQxzM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.26/go.mod h1:3o2Wpy0bogG1kyOPrgkXA8pgIfEEv0+m19O9D5+W8y8= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= -github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26 h1:GeNJsIFHB+WW5ap2Tec4K6dzcVTsRbsT1Lra46Hv9ME= -github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.26/go.mod h1:zfgMpwHDXX2WGoG84xG2H+ZlPTkJUU4YUvx2svLQYWo= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1 h1:iXtILhvDxB6kPvEXgsDhGaZCSC6LQET5ZHSdJozeI0Y= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.1/go.mod h1:9nu0fVANtYiAePIBh2/pFUSwtJ402hLnp854CNoDOeE= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.7 h1:tB4tNw83KcajNAzaIMhkhVI2Nt8fAZd5A5ro113FEMY= -github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.4.7/go.mod h1:lvpyBGkZ3tZ9iSsUIcC2EWp+0ywa7aK3BLT+FwZi+mQ= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7 h1:8eUsivBQzZHqe/3FE+cqwfH+0p5Jo8PFM/QYQSmeZ+M= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.7/go.mod h1:kLPQvGUmxn/fqiCrDeohwG33bq2pQpGeY62yRO6Nrh0= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.7 h1:Hi0KGbrnr57bEHWM0bJ1QcBzxLrL/k2DHvGYhb8+W1w= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.7/go.mod h1:wKNgWgExdjjrm4qvfbTorkvocEstaoDl4WCvGfeCy9c= -github.com/aws/aws-sdk-go-v2/service/s3 v1.71.1 h1:aOVVZJgWbaH+EJYPvEgkNhCEbXXvH7+oML36oaPK3zE= -github.com/aws/aws-sdk-go-v2/service/s3 v1.71.1/go.mod h1:r+xl5yzMk9083rMR+sJ5TYj9Tihvf/l1oxzZXDgGj2Q= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.8 h1:CvuUmnXI7ebaUAhbJcDy9YQx8wHR69eZ9I7q5hszt/g= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.8/go.mod h1:XDeGv1opzwm8ubxddF0cgqkZWsyOtw4lr6dxwmb6YQg= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7 h1:F2rBfNAL5UyswqoeWv9zs74N/NanhK16ydHW1pahX6E= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.7/go.mod h1:JfyQ0g2JG8+Krq0EuZNnRwX0mU0HrwY/tG6JNfcqh4k= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.3 h1:Xgv/hyNgvLda/M9l9qxXc4UFSgppnRczLxlMs5Ae/QY= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.3/go.mod h1:5Gn+d+VaaRgsjewpMvGazt0WfcFO+Md4wLOuBfGR9Bc= -github.com/aws/smithy-go v1.22.1 h1:/HPHZQ0g7f4eUeK6HKglFz8uwVfZKgoI25rb/J+dnro= -github.com/aws/smithy-go v1.22.1/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aws/aws-sdk-go-v2 v1.36.2 h1:Ub6I4lq/71+tPb/atswvToaLGVMxKZvjYDVOWEExOcU= +github.com/aws/aws-sdk-go-v2 v1.36.2/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10 h1:zAybnyUQXIZ5mok5Jqwlf58/TFE7uvd3IAsa1aF9cXs= +github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.10/go.mod h1:qqvMj6gHLR/EXWZw4ZbqlPbQUyenf4h82UQUlKc+l14= +github.com/aws/aws-sdk-go-v2/config v1.29.7 h1:71nqi6gUbAUiEQkypHQcNVSFJVUFANpSeUNShiwWX2M= +github.com/aws/aws-sdk-go-v2/config v1.29.7/go.mod h1:yqJQ3nh2HWw/uxd56bicyvmDW4KSc+4wN6lL8pYjynU= +github.com/aws/aws-sdk-go-v2/credentials v1.17.60 h1:1dq+ELaT5ogfmqtV1eocq8SpOK1NRsuUfmhQtD/XAh4= +github.com/aws/aws-sdk-go-v2/credentials v1.17.60/go.mod h1:HDes+fn/xo9VeszXqjBVkxOo/aUy8Mc6QqKvZk32GlE= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.29 h1:JO8pydejFKmGcUNiiwt75dzLHRWthkwApIvPoyUtXEg= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.29/go.mod h1:adxZ9i9DRmB8zAT0pO0yGnsmu0geomp5a3uq5XpgOJ8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.33 h1:knLyPMw3r3JsU8MFHWctE4/e2qWbPaxDYLlohPvnY8c= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.33/go.mod h1:EBp2HQ3f+XCB+5J+IoEbGhoV7CpJbnrsd4asNXmTL0A= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.33 h1:K0+Ne08zqti8J9jwENxZ5NoUyBnaFDTu3apwQJWrwwA= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.33/go.mod h1:K97stwwzaWzmqxO8yLGHhClbVW1tC6VT1pDLk1pGrq4= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.33 h1:/frG8aV09yhCVSOEC2pzktflJJO48NwY3xntHBwxHiA= +github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.33/go.mod h1:8vwASlAcV366M+qxZnjNzCjeastk1Rt1bpSRaGZanGU= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.6.1 h1:7SuukGpyIgF5EiAbf1dZRxP+xSnY1WjiHBjL08fjJeE= +github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.6.1/go.mod h1:k+Vce/8R28tSozjdWphkrNhK8zLmdS9RgiDNZl6p8Rw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.14 h1:2scbY6//jy/s8+5vGrk7l1+UtHl0h9A4MjOO2k/TM2E= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.14/go.mod h1:bRpZPHZpSe5YRHmPfK3h1M7UBFCn2szHzyx0rw04zro= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.14 h1:fgdkfsxTehqPcIQa24G/Omwv9RocTq2UcONNX/OnrZI= +github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.14/go.mod h1:wMxQ3OE8fiM8z2YRAeb2J8DLTTWMvRyYYuQOs26AbTQ= +github.com/aws/aws-sdk-go-v2/service/s3 v1.77.1 h1:5bI9tJL2Z0FGFtp/LPDv0eyliFBHCn7LAhqpQuL+7kk= +github.com/aws/aws-sdk-go-v2/service/s3 v1.77.1/go.mod h1:njj3tSJONkfdLt4y6X8pyqeM6sJLNZxmzctKKV+n1GM= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.16 h1:YV6xIKDJp6U7YB2bxfud9IENO1LRpGhe2Tv/OKtPrOQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.16/go.mod h1:DvbmMKgtpA6OihFJK13gHMZOZrCHttz8wPHGKXqU+3o= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.15 h1:kMyK3aKotq1aTBsj1eS8ERJLjqYRRRcsmP33ozlCvlk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.15/go.mod h1:5uPZU7vSNzb8Y0dm75xTikinegPYK3uJmIHQZFq5Aqo= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.15 h1:ht1jVmeeo2anR7zDiYJLSnRYnO/9NILXXu42FP3rJg0= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.15/go.mod h1:xWZ5cOiFe3czngChE4LhCBqUxNwgfwndEF7XlYP/yD8= +github.com/aws/smithy-go v1.22.3 h1:Z//5NuZCSW6R4PhQ93hShNbyBbn8BWCmCVCt+Q8Io5k= +github.com/aws/smithy-go v1.22.3/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5mCA= github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -75,10 +75,10 @@ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2 github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= -github.com/go-acme/lego/v4 v4.21.0 h1:arEW+8o5p7VI8Bk1kr/PDlgD1DrxtTH1gJ4b7mehL8o= -github.com/go-acme/lego/v4 v4.21.0/go.mod h1:HrSWzm3Ckj45Ie3i+p1zKVobbQoMOaGu9m4up0dUeDI= -github.com/go-jose/go-jose/v4 v4.0.4 h1:VsjPI33J0SB9vQM6PLmNjoHqMQNGPiZ0rHL7Ni7Q6/E= -github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= +github.com/go-acme/lego/v4 v4.22.2 h1:ck+HllWrV/rZGeYohsKQ5iKNnU/WAZxwOdiu6cxky+0= +github.com/go-acme/lego/v4 v4.22.2/go.mod h1:E2FndyI3Ekv0usNJt46mFb9LVpV/XBYT+4E3tz02Tzo= +github.com/go-jose/go-jose/v4 v4.0.5 h1:M6T8+mKZl/+fNNuFHvGIzDz7BTLQPIounk/b9dw3AaE= +github.com/go-jose/go-jose/v4 v4.0.5/go.mod h1:s3P1lRrkT8igV8D9OjyL4WRyHvjB6a4JSllnOrmmBOA= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= @@ -123,8 +123,8 @@ github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInw github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= -github.com/joeig/go-powerdns/v3 v3.14.1 h1:ff+ClS/yM5ZBigh5oe4m0T/Na2k0k+JNpyuby0LkGCc= -github.com/joeig/go-powerdns/v3 v3.14.1/go.mod h1:hA54LX2p4A/Jp1Kgdhd7Lh3jAU0u7wV1mk1JbGywt60= +github.com/joeig/go-powerdns/v3 v3.14.3 h1:z55hTGtBe7mEaKG1B/xtMHagqWPpxH+z4VVf8u9+NTc= +github.com/joeig/go-powerdns/v3 v3.14.3/go.mod h1:hA54LX2p4A/Jp1Kgdhd7Lh3jAU0u7wV1mk1JbGywt60= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -183,8 +183,8 @@ github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/traefik/paerser v0.2.1 h1:LFgeak1NmjEHF53c9ENdXdL1UMkF/lD5t+7Evsz4hH4= -github.com/traefik/paerser v0.2.1/go.mod h1:7BBDd4FANoVgaTZG+yh26jI6CA2nds7D/4VTEdIsh24= +github.com/traefik/paerser v0.2.2 h1:cpzW/ZrQrBh3mdwD/jnp6aXASiUFKOVr6ldP+keJTcQ= +github.com/traefik/paerser v0.2.2/go.mod h1:7BBDd4FANoVgaTZG+yh26jI6CA2nds7D/4VTEdIsh24= github.com/traefik/traefik/v3 v3.3.3 h1:Yfxwl+LIG9Dotgyy1uxKcA7ZhaDbnHj8iZpAuDXe1Qg= github.com/traefik/traefik/v3 v3.3.3/go.mod h1:3ls9bNiJkBTReV+Ais3qmR3sjQNEKbosK86rg//yNAQ= github.com/unrolled/render v1.7.0 h1:1yke01/tZiZpiXfUG+zqB+6fq3G4I+KDmnh0EhPq7So= @@ -230,10 +230,10 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= -golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= -golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac h1:l5+whBCLH3iH2ZNHYLbAe58bo7yrN4mVcnkHDYz5vvs= -golang.org/x/exp v0.0.0-20250210185358-939b2ce775ac/go.mod h1:hH+7mtFmImwwcMvScyxUhjuVHR3HGaDPMn9rMSUUbxo= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa h1:t2QcU6V556bFjYgu4L6C+6VrCPyJZ+eyRsABUPs1mz4= +golang.org/x/exp v0.0.0-20250218142911-aa4b98e5adaa/go.mod h1:BHOTPb3L19zxehTsLoJXVaTktb06DFgmdW6Wb9s8jqk= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM= @@ -277,10 +277,10 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b h1:i+d0RZa8Hs2L/MuaOQYI+krthcxdEbEM2N+Tf3kJ4zk= -google.golang.org/genproto/googleapis/api v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b h1:FQtJ1MxbXoIIrZHZ33M+w5+dAP9o86rgpjoKr/ZmT7k= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= +google.golang.org/genproto/googleapis/api v0.0.0-20250224174004-546df14abb99 h1:ilJhrCga0AptpJZXmUYG4MCrx/zf3l1okuYz7YK9PPw= +google.golang.org/genproto/googleapis/api v0.0.0-20250224174004-546df14abb99/go.mod h1:Xsh8gBVxGCcbV8ZeTB9wI5XPyZ5RvC6V3CTeeplHbiA= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250224174004-546df14abb99 h1:ZSlhAUqC4r8TPzqLXQ0m3upBNZeF+Y8jQ3c4CR3Ujms= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250224174004-546df14abb99/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= @@ -310,8 +310,8 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns= modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= -modernc.org/sqlite v1.34.5 h1:Bb6SR13/fjp15jt70CL4f18JIN7p7dnMExd+UFnF15g= -modernc.org/sqlite v1.34.5/go.mod h1:YLuNmX9NKs8wRNK2ko1LW1NGYcc9FkBO69JOt1AR9JE= +modernc.org/sqlite v1.35.0 h1:yQps4fegMnZFdphtzlfQTCNBWtS0CZv48pRpW3RFHRw= +modernc.org/sqlite v1.35.0/go.mod h1:9cr2sicr7jIaWTBKQmAxQLfBv9LL0su4ZTEV+utt3ic= modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0= modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A= modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y= diff --git a/internal/api/handler/auth.go b/internal/api/handler/auth.go index e232be0..a0bab09 100644 --- a/internal/api/handler/auth.go +++ b/internal/api/handler/auth.go @@ -19,23 +19,28 @@ import ( func Login(a *config.App) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { q := a.Conn.GetQuery() - var user db.User - if err := json.NewDecoder(r.Body).Decode(&user); err != nil { + var request db.User + if err := json.NewDecoder(r.Body).Decode(&request); err != nil { http.Error(w, "Failed to decode credentials", http.StatusBadRequest) return } - if user.Username == "" || user.Password == "" { + if request.Username == "" || request.Password == "" { http.Error(w, "Username or password cannot be empty", http.StatusBadRequest) return } - dbUser, err := q.GetUserByUsername(r.Context(), user.Username) + user, err := q.GetUserByUsername(r.Context(), request.Username) if err != nil { http.Error(w, "User not found", http.StatusNotFound) return } - if err = bcrypt.CompareHashAndPassword([]byte(dbUser.Password), []byte(user.Password)); err != nil { + userPassword, err := q.GetUserPassword(r.Context(), user.ID) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + if err = bcrypt.CompareHashAndPassword([]byte(userPassword), []byte(request.Password)); err != nil { http.Error(w, "Invalid username or password "+err.Error(), http.StatusUnauthorized) return } @@ -45,19 +50,23 @@ func Login(a *config.App) http.HandlerFunc { expirationTime = time.Now().Add(7 * 24 * time.Hour) } - token, err := util.EncodeUserJWT(user.Username, a.Config.Secret, expirationTime) + token, err := util.EncodeUserJWT(request.Username, a.Config.Secret, expirationTime) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } - if err := q.UpdateUserLastLogin(r.Context(), dbUser.ID); err != nil { + if err := q.UpdateUserLastLogin(r.Context(), user.ID); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } + response := map[string]any{ + "token": token, + "user": user, + } w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(map[string]string{"token": token}); err != nil { + if err := json.NewEncoder(w).Encode(response); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } @@ -95,8 +104,9 @@ func VerifyJWT(a *config.App) http.HandlerFunc { return } + response := map[string]any{"user": user} w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(user); err != nil { + if err := json.NewEncoder(w).Encode(response); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } @@ -150,8 +160,12 @@ func VerifyOTP(a *config.App) http.HandlerFunc { return } + response := map[string]any{ + "token": token, + "user": user, + } w.Header().Set("Content-Type", "application/json") - if err := json.NewEncoder(w).Encode(map[string]string{"token": token}); err != nil { + if err := json.NewEncoder(w).Encode(response); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } @@ -214,7 +228,7 @@ func SendResetEmail(a *config.App) http.HandlerFunc { config.From = setting.Value } } - data := map[string]interface{}{ + data := map[string]any{ "Token": token, "Date": expiresAt.Format(time.RFC3339), } diff --git a/internal/api/handler/users.go b/internal/api/handler/users.go index c8e61ac..cda4b86 100644 --- a/internal/api/handler/users.go +++ b/internal/api/handler/users.go @@ -75,22 +75,7 @@ func UpdateUser(a *config.App) http.HandlerFunc { http.Error(w, err.Error(), http.StatusInternalServerError) return } - dbUser, err := q.GetUser(r.Context(), user.ID) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - if user.Password == "" { - user.Password = dbUser.Password - } else { - hashedPassword, err := util.HashPassword(user.Password) - if err != nil { - http.Error(w, err.Error(), http.StatusInternalServerError) - return - } - user.Password = hashedPassword - } if err := q.UpdateUser(r.Context(), user); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return diff --git a/internal/api/handler/utilities.go b/internal/api/handler/utilities.go index f4a6a04..9f6d129 100644 --- a/internal/api/handler/utilities.go +++ b/internal/api/handler/utilities.go @@ -4,10 +4,11 @@ import ( "encoding/json" "net/http" + "github.com/MizuchiLabs/mantrae/internal/util" "github.com/MizuchiLabs/mantrae/pkg/build" ) -// GetVersion returns the current version of Mantrae as a plain text response. +// GetVersion returns the current version of Mantrae as a plain text response func GetVersion(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") data := map[string]string{"version": build.Version} @@ -17,52 +18,16 @@ func GetVersion(w http.ResponseWriter, r *http.Request) { } } -// GetPublicIP attempts to resolve the public IP address of a Traefik instance by its profile ID. -// func GetPublicIP(w http.ResponseWriter, r *http.Request) { -// id, err := strconv.ParseInt(r.PathValue("id"), 10, 64) -// if err != nil { -// http.Error(w, fmt.Sprintf("Parse error: %s", err.Error()), http.StatusNotFound) -// return -// } - -// profile, err := db.Query.GetProfileByID(context.Background(), id) -// if err != nil { -// http.Error(w, fmt.Sprintf("Profile not found: %s", err.Error()), http.StatusNotFound) -// return -// } - -// // Parse the URL -// u, err := url.Parse(profile.Url) -// if err != nil { -// http.Error(w, fmt.Sprintf("Invalid URL: %s", err.Error()), http.StatusBadRequest) -// return -// } - -// // Check if it's an IP address -// if net.ParseIP(u.Hostname()) != nil { -// if !net.ParseIP(u.Hostname()).IsLoopback() { -// writeJSON(w, map[string]string{"ip": u.Hostname()}) -// return -// } -// } - -// // If it's a valid hostname, resolve to IP -// ips, err := net.LookupHost(u.Hostname()) -// if err == nil && len(ips) > 0 { -// if !net.ParseIP(ips[0]).IsLoopback() { -// writeJSON(w, map[string]string{"ip": ips[0]}) -// return -// } -// } - -// ip, err := util.GetPublicIP() -// if err != nil { -// http.Error( -// w, -// fmt.Sprintf("Failed to get public IP: %s", err.Error()), -// http.StatusInternalServerError, -// ) -// return -// } -// writeJSON(w, map[string]string{"ip": ip}) -// } +// GetPublicIP attempts to resolve the public IP address of the current machine +func GetPublicIP(w http.ResponseWriter, r *http.Request) { + machineIPs, err := util.GetPublicIPsCached() + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(machineIPs); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } +} diff --git a/internal/api/middlewares/auth.go b/internal/api/middlewares/auth.go index 19a4cda..4848163 100644 --- a/internal/api/middlewares/auth.go +++ b/internal/api/middlewares/auth.go @@ -33,7 +33,14 @@ func (h *MiddlewareHandler) BasicAuth(next http.Handler) http.Handler { return } - if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)); err != nil { + userPassword, err := q.GetUserPassword(r.Context(), user.ID) + if err != nil { + w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"`) + http.Error(w, "Unauthorized", http.StatusUnauthorized) + return + } + + if err := bcrypt.CompareHashAndPassword([]byte(userPassword), []byte(password)); err != nil { w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"`) http.Error(w, "Unauthorized", http.StatusUnauthorized) return diff --git a/internal/api/server/routes.go b/internal/api/server/routes.go index 536a903..e64543f 100644 --- a/internal/api/server/routes.go +++ b/internal/api/server/routes.go @@ -121,8 +121,8 @@ func (s *Server) routes() { register("DELETE", "/backups/{filename}", jwtChain, handler.DeleteBackup(s.app.BM)) register("POST", "/dynamic/restore/{id}", jwtChain, handler.RestoreDynamicConfig(s.app.BM)) - // IP - // register("GET", "/ip/{id}", jwtChain, GetPublicIP) + // Current IP + register("GET", "/ip", jwtChain, handler.GetPublicIP) // Traefik register("GET", "/traefik/{id}/{source}", jwtChain, handler.GetTraefikConfig(s.app)) diff --git a/internal/config/setup.go b/internal/config/setup.go index a94cbf4..2634917 100644 --- a/internal/config/setup.go +++ b/internal/config/setup.go @@ -107,10 +107,10 @@ func (a *App) setDefaultAdminUser(ctx context.Context) error { // Try to get existing admin user q := a.Conn.GetQuery() - user, err := q.GetUserByUsername(ctx, a.Config.Admin.Username) + user, err := q.GetUser(ctx, 1) // If user doesn't exist, create new admin if err != nil { - if err := q.CreateUser(ctx, db.CreateUserParams{ + if err = q.CreateUser(ctx, db.CreateUserParams{ Username: a.Config.Admin.Username, Email: &a.Config.Admin.Email, Password: hash, @@ -124,27 +124,38 @@ func (a *App) setDefaultAdminUser(ctx context.Context) error { return nil } - // Skip if password is correct - passwordErr := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password)) - if passwordErr == nil { - return nil - } - - // Update existing admin if credentials changed or password provided - if user.Username != a.Config.Admin.Username || - a.Config.Admin.Password != "" { - - if err := q.UpdateUser(ctx, db.UpdateUserParams{ + // Update admin info on change + if user.Username != a.Config.Admin.Username || *user.Email != a.Config.Admin.Email { + if err = q.UpdateUser(ctx, db.UpdateUserParams{ ID: user.ID, Username: a.Config.Admin.Username, Email: &a.Config.Admin.Email, - Password: hash, IsAdmin: true, }); err != nil { return fmt.Errorf("failed to update default admin user: %w", err) } slog.Info("Updated admin user", "username", a.Config.Admin.Username) } + + userPassword, err := q.GetUserPassword(ctx, user.ID) + if err != nil { + return fmt.Errorf("failed to get user password: %w", err) + } + // Skip if password is correct + passwordErr := bcrypt.CompareHashAndPassword([]byte(userPassword), []byte(password)) + if passwordErr == nil { + return nil + } else { + // Update password on change + if err = q.UpdateUserPassword(ctx, db.UpdateUserPasswordParams{ + ID: user.ID, + Password: hash, + }); err != nil { + return fmt.Errorf("failed to update default admin user password: %w", err) + } + slog.Info("Updated password of", "user", user.Username) + } + return nil } @@ -193,8 +204,8 @@ func (a *App) setDefaultProfile(ctx context.Context) error { } if profile.Url == a.Config.Traefik.URL && - profile.Username == &a.Config.Traefik.Username && - profile.Password == &a.Config.Traefik.Password && + *profile.Username == a.Config.Traefik.Username && + *profile.Password == a.Config.Traefik.Password && profile.Tls == a.Config.Traefik.TLS { return nil } diff --git a/internal/db/types.go b/internal/db/types.go index 4bd326c..d94cade 100644 --- a/internal/db/types.go +++ b/internal/db/types.go @@ -85,11 +85,12 @@ type TraefikConfiguration struct { } type DNSProviderConfig struct { - APIKey string `json:"apiKey"` - APIUrl string `json:"apiUrl"` - TraefikIP string `json:"traefikIp"` - Proxied bool `json:"proxied"` - ZoneType string `json:"zoneType"` + APIKey string `json:"apiKey"` + APIUrl string `json:"apiUrl"` + TraefikIP string `json:"traefikIp"` + Proxied bool `json:"proxied"` + AutoUpdate bool `json:"autoUpdate"` + ZoneType string `json:"zoneType"` } type AgentPrivateIPs struct { @@ -109,7 +110,7 @@ type AgentContainer struct { type AgentContainers []AgentContainer // Handles the JSON marshalling and unmarshalling of the TraefikEntryPoints type -func (e *TraefikEntryPoints) Scan(value interface{}) error { +func (e *TraefikEntryPoints) Scan(value any) error { bytes, ok := value.([]byte) if !ok { return fmt.Errorf("expected bytes, got %T", value) @@ -122,7 +123,7 @@ func (e TraefikEntryPoints) Value() (driver.Value, error) { } // Handles the JSON marshalling and unmarshalling of the TraefikOverview type -func (o *TraefikOverview) Scan(value interface{}) error { +func (o *TraefikOverview) Scan(value any) error { bytes, ok := value.([]byte) if !ok { return fmt.Errorf("expected bytes, got %T", value) @@ -135,7 +136,7 @@ func (o TraefikOverview) Value() (driver.Value, error) { } // Handles the JSON marshalling and unmarshalling of the ConfigurationWrapper type -func (c *TraefikConfiguration) Scan(value interface{}) error { +func (c *TraefikConfiguration) Scan(value any) error { if value == nil { c = nil return nil @@ -161,7 +162,7 @@ func (c TraefikConfiguration) Value() (driver.Value, error) { return json.Marshal(c) } -func (c *DNSProviderConfig) Scan(value interface{}) error { +func (c *DNSProviderConfig) Scan(value any) error { bytes, ok := value.([]byte) if !ok { return fmt.Errorf("expected bytes, got %T", value) @@ -173,7 +174,7 @@ func (c DNSProviderConfig) Value() (driver.Value, error) { return json.Marshal(c) } -func (c *AgentPrivateIPs) Scan(value interface{}) error { +func (c *AgentPrivateIPs) Scan(value any) error { bytes, ok := value.([]byte) if !ok { return fmt.Errorf("expected bytes, got %T", value) @@ -185,7 +186,7 @@ func (c AgentPrivateIPs) Value() (driver.Value, error) { return json.Marshal(c) } -func (c *AgentContainers) Scan(value interface{}) error { +func (c *AgentContainers) Scan(value any) error { bytes, ok := value.([]byte) if !ok { return fmt.Errorf("expected bytes, got %T", value) diff --git a/internal/dns/client.go b/internal/dns/client.go index e27d626..869c4ab 100644 --- a/internal/dns/client.go +++ b/internal/dns/client.go @@ -43,6 +43,17 @@ func getProvider(id int64, q *db.Queries) (DNSProvider, error) { if provider.Config.APIKey == "" { return nil, fmt.Errorf("invalid provider config") } + if provider.Config.AutoUpdate { + machineIPs, err := util.GetPublicIPsCached() + if err != nil { + return nil, err + } + if machineIPs.IPv4 != "" { + provider.Config.TraefikIP = machineIPs.IPv4 + } else if machineIPs.IPv6 != "" { + provider.Config.TraefikIP = machineIPs.IPv6 + } + } var dnsProvider DNSProvider switch provider.Type { diff --git a/internal/dns/cloudflare.go b/internal/dns/cloudflare.go index bdb15f5..0c1b664 100644 --- a/internal/dns/cloudflare.go +++ b/internal/dns/cloudflare.go @@ -4,9 +4,9 @@ import ( "context" "fmt" "log/slog" - "net" "github.com/MizuchiLabs/mantrae/internal/db" + "github.com/MizuchiLabs/mantrae/internal/util" "github.com/cloudflare/cloudflare-go" ) @@ -38,9 +38,13 @@ func (c *CloudflareProvider) UpsertRecord(subdomain string) error { if c.Client == nil { return nil } - recordType := "A" - if net.ParseIP(c.ExternalIP).To4() == nil { + var recordType string + if util.IsValidIPv4(c.ExternalIP) { + recordType = "A" + } else if util.IsValidIPv6(c.ExternalIP) { recordType = "AAAA" + } else { + return fmt.Errorf("invalid IP address: %s", c.ExternalIP) } // Check if the record exists diff --git a/internal/dns/powerdns.go b/internal/dns/powerdns.go index 33fe697..9af49ac 100644 --- a/internal/dns/powerdns.go +++ b/internal/dns/powerdns.go @@ -4,9 +4,9 @@ import ( "context" "fmt" "log/slog" - "net" "github.com/MizuchiLabs/mantrae/internal/db" + "github.com/MizuchiLabs/mantrae/internal/util" "github.com/joeig/go-powerdns/v3" ) @@ -25,9 +25,13 @@ func NewPowerDNSProvider(d *db.DNSProviderConfig) *PowerDNSProvider { } func (p *PowerDNSProvider) UpsertRecord(subdomain string) error { - recordType, err := pdnsRecordType(p.ExternalIP) - if err != nil { - return err + var recordType powerdns.RRType + if util.IsValidIPv4(p.ExternalIP) { + recordType = powerdns.RRTypeA + } else if util.IsValidIPv6(p.ExternalIP) { + recordType = powerdns.RRTypeAAAA + } else { + return fmt.Errorf("invalid IP address: %s", p.ExternalIP) } // Check if the record is managed by us @@ -127,7 +131,7 @@ func (p *PowerDNSProvider) DeleteRecord(subdomain string) error { return err } - if err := p.checkRecord(subdomain); err != nil { + if err = p.checkRecord(subdomain); err != nil { return err } @@ -235,14 +239,3 @@ func (p *PowerDNSProvider) checkRecord(subdomain string) error { return fmt.Errorf("record not managed by Mantrae") } - -func pdnsRecordType(ip string) (powerdns.RRType, error) { - if net.ParseIP(ip) == nil { - return "", fmt.Errorf("invalid IP address") - } - - if net.ParseIP(ip).To4() != nil { - return powerdns.RRTypeA, nil - } - return powerdns.RRTypeAAAA, nil -} diff --git a/internal/dns/technitium.go b/internal/dns/technitium.go index 6937216..7d61596 100644 --- a/internal/dns/technitium.go +++ b/internal/dns/technitium.go @@ -7,12 +7,12 @@ import ( "fmt" "io" "log/slog" - "net" "net/http" "net/url" "slices" "github.com/MizuchiLabs/mantrae/internal/db" + "github.com/MizuchiLabs/mantrae/internal/util" ) type TechnitiumProvider struct { @@ -38,7 +38,7 @@ func NewTechnitiumProvider(d *db.DNSProviderConfig) *TechnitiumProvider { func (t *TechnitiumProvider) doRequest( ctx context.Context, method, endpoint string, - body interface{}, + body any, ) (*http.Response, error) { url := t.BaseURL + endpoint @@ -64,9 +64,13 @@ func (t *TechnitiumProvider) doRequest( } func (t *TechnitiumProvider) UpsertRecord(subdomain string) error { - recordType := "A" - if net.ParseIP(t.ExternalIP).To4() == nil { + var recordType string + if util.IsValidIPv4(t.ExternalIP) { + recordType = "A" + } else if util.IsValidIPv6(t.ExternalIP) { recordType = "AAAA" + } else { + return fmt.Errorf("invalid IP address: %s", t.ExternalIP) } // Check if the record exists @@ -105,7 +109,7 @@ func (t *TechnitiumProvider) DeleteRecord(subdomain string) error { return err } - if err := t.checkRecord(subdomain); err != nil { + if err = t.checkRecord(subdomain); err != nil { return err } diff --git a/internal/util/ip.go b/internal/util/ip.go index a88f192..773ec00 100644 --- a/internal/util/ip.go +++ b/internal/util/ip.go @@ -1,111 +1,152 @@ package util import ( - "errors" + "context" "fmt" "io" - "log/slog" "net" "net/http" "strings" "time" - - "golang.org/x/exp/slices" ) -// Public IP APIs -var ipAPIs = []string{ - "https://api.ipify.org?format=text", - "https://ifconfig.co/ip", - "https://checkip.amazonaws.com", - "https://ipinfo.io/ip", +// IPAddresses holds both IPv4 and IPv6 addresses +type IPAddresses struct { + IPv4 string `json:"ipv4,omitempty"` + IPv6 string `json:"ipv6,omitempty"` } -func getIP(url string) (string, error) { - client := &http.Client{ - Timeout: 3 * time.Second, +var ( + cachedIPs IPAddresses + cacheExpiry time.Time + cacheDuration = 5 * time.Minute +) + +func GetPublicIPsCached() (IPAddresses, error) { + if time.Now().Before(cacheExpiry) { + return cachedIPs, nil } - resp, err := client.Get(url) + ips, err := GetPublicIPs() if err != nil { - return "", err - } - defer resp.Body.Close() - - if resp.StatusCode != 200 { - return "", errors.New("non-200 response from API") + return IPAddresses{}, err } - ip, err := io.ReadAll(resp.Body) - if err != nil { - return "", err - } + // Update cache + cachedIPs = ips + cacheExpiry = time.Now().Add(cacheDuration) - return string(ip), nil + return ips, nil } -func isValidPublicIP(ip string) bool { - if ip == "" { - return false +func GetPublicIPs() (IPAddresses, error) { + ipv4Services := []string{ + "https://api.ipify.org", + "https://api.ip.sb/ip", + "https://ipinfo.io/ip", + "https://ifconfig.me/ip", + "https://ifconfig.co/ip", + "https://ipecho.net/plain", + "https://checkip.amazonaws.com", } + ipv6Services := []string{ + "https://api6.ipify.org", + "https://v6.ident.me", + "https://api-ipv6.ip.sb/ip", + } + + // Create channels for concurrent IP fetching + ipv4Ch := make(chan string, 1) + ipv6Ch := make(chan string, 1) + errorCh := make(chan error, 2) + + // Fetch IPv4 and IPv6 addresses concurrently + go func() { + ip, err := getIP(ipv4Services, IsValidIPv4) + if err != nil { + errorCh <- fmt.Errorf("IPv4: %v", err) + ipv4Ch <- "" + return + } + ipv4Ch <- ip + }() + + go func() { + ip, err := getIP(ipv6Services, IsValidIPv6) + if err != nil { + errorCh <- fmt.Errorf("IPv6: %v", err) + ipv6Ch <- "" + return + } + ipv6Ch <- ip + }() + + // Wait for results + ipv4 := <-ipv4Ch + ipv6 := <-ipv6Ch + + // Check if we got at least one address + if ipv4 == "" && ipv6 == "" { + return IPAddresses{}, fmt.Errorf("failed to get any IP address") + } + + return IPAddresses{ + IPv4: ipv4, + IPv6: ipv6, + }, nil +} + +func getIP(services []string, validationFunc func(string) bool) (string, error) { + client := &http.Client{Timeout: 10 * time.Second} + + for _, service := range services { + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + req, err := http.NewRequestWithContext(ctx, "GET", service, nil) + if err != nil { + continue + } + req.Header.Set( + "User-Agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36", + ) + + resp, err := client.Do(req) + if err != nil { + continue + } + defer resp.Body.Close() + + if resp.StatusCode != http.StatusOK { + continue + } + body, err := io.ReadAll(resp.Body) + if err != nil { + continue + } + ip := strings.TrimSpace(string(body)) + if validationFunc(ip) { + return ip, nil + } + } + + return "", fmt.Errorf("failed to get IP from any service") +} + +func IsValidIPv4(ip string) bool { parsedIP := net.ParseIP(ip) if parsedIP == nil { return false } + return parsedIP.To4() != nil +} - // Check if it's a private or loopback IP - if parsedIP.IsLoopback() || parsedIP.IsPrivate() { +func IsValidIPv6(ip string) bool { + parsedIP := net.ParseIP(ip) + if parsedIP == nil { return false } - - return true -} - -func GetPublicIP() (string, error) { - for _, api := range ipAPIs { - ip, err := getIP(api) - if err == nil && isValidPublicIP(ip) { - return ip, nil - } - slog.Warn("Failed to query API", "API", api, "Error", err) - } - return "", fmt.Errorf("failed to get public IP") -} - -func GetPrivateIP() ([]string, error) { - var ips []string - - interfaces, err := net.Interfaces() - if err != nil { - return nil, err - } - - excluded := []string{"lo", "docker", "br-", "veth", "kube", "cni"} - for _, iface := range interfaces { - if slices.ContainsFunc(excluded, func(s string) bool { - return strings.Contains(iface.Name, s) - }) || iface.Flags&net.FlagUp == 0 { - continue - } else { - addrs, err := iface.Addrs() - if err != nil { - return nil, err - } - - for _, addr := range addrs { - if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { - if ipnet.IP.To4() != nil { - ips = append(ips, ipnet.IP.String()) - } - } - } - } - } - - if len(ips) == 0 { - return nil, errors.New("no private IP addresses found") - } - - return ips, nil + return parsedIP.To4() == nil && parsedIP.To16() != nil } diff --git a/web/package.json b/web/package.json index c848262..1b55738 100644 --- a/web/package.json +++ b/web/package.json @@ -15,26 +15,26 @@ "@neoconfetti/svelte": "^2.2.1", "@sveltejs/adapter-auto": "^3.3.1", "@sveltejs/adapter-static": "^3.0.8", - "@sveltejs/kit": "^2.17.1", + "@sveltejs/kit": "^2.17.2", "@sveltejs/vite-plugin-svelte": "^4.0.4", "@types/eslint": "^9.6.1", - "@types/node": "^22.13.1", + "@types/node": "^22.13.5", "autoprefixer": "^10.4.20", "bits-ui": "1.0.0-next.79", "clsx": "^2.1.1", - "eslint": "^9.19.0", + "eslint": "^9.21.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.46.1", "formsnap": "^2.0.0", - "globals": "^15.14.0", + "globals": "^15.15.0", "highlight.js": "^11.11.1", "lucide-svelte": "^0.424.0", "mode-watcher": "^0.4.1", - "postcss": "^8.5.1", - "prettier": "^3.4.2", + "postcss": "^8.5.3", + "prettier": "^3.5.2", "prettier-plugin-svelte": "^3.3.3", "prettier-plugin-tailwindcss": "^0.6.11", - "svelte": "^5.19.8", + "svelte": "^5.20.4", "svelte-check": "^4.1.4", "svelte-highlight": "^7.8.2", "svelte-sonner": "^0.3.28", @@ -44,16 +44,16 @@ "tailwindcss": "^3.4.17", "tailwindcss-animate": "^1.0.7", "typescript": "^5.7.3", - "typescript-eslint": "^8.23.0", + "typescript-eslint": "^8.25.0", "vite": "^5.4.14", "yaml": "^2.7.0", - "zod": "^3.24.1" + "zod": "^3.24.2" }, "type": "module", "dependencies": { "@formkit/auto-animate": "^0.8.2", "@tanstack/match-sorter-utils": "^8.19.4", - "@tanstack/table-core": "^8.20.5" + "@tanstack/table-core": "^8.21.2" }, "packageManager": "pnpm@9.4.0+sha512.f549b8a52c9d2b8536762f99c0722205efc5af913e77835dbccc3b0b0b2ca9e7dc8022b78062c17291c48e88749c70ce88eb5a74f1fa8c4bf5e18bb46c8bd83a" } diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index 30634b9..cb517eb 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -15,8 +15,8 @@ importers: specifier: ^8.19.4 version: 8.19.4 '@tanstack/table-core': - specifier: ^8.20.5 - version: 8.20.5 + specifier: ^8.21.2 + version: 8.21.2 devDependencies: '@fontsource/fira-mono': specifier: ^5.1.1 @@ -26,82 +26,82 @@ importers: version: 2.2.1 '@sveltejs/adapter-auto': specifier: ^3.3.1 - version: 3.3.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1))) + version: 3.3.1(@sveltejs/kit@2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5))) '@sveltejs/adapter-static': specifier: ^3.0.8 - version: 3.0.8(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1))) + version: 3.0.8(@sveltejs/kit@2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5))) '@sveltejs/kit': - specifier: ^2.17.1 - version: 2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)) + specifier: ^2.17.2 + version: 2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)) '@sveltejs/vite-plugin-svelte': specifier: ^4.0.4 - version: 4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)) + version: 4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)) '@types/eslint': specifier: ^9.6.1 version: 9.6.1 '@types/node': - specifier: ^22.13.1 - version: 22.13.1 + specifier: ^22.13.5 + version: 22.13.5 autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.5.1) + version: 10.4.20(postcss@8.5.3) bits-ui: specifier: 1.0.0-next.79 - version: 1.0.0-next.79(svelte@5.19.8) + version: 1.0.0-next.79(svelte@5.20.4) clsx: specifier: ^2.1.1 version: 2.1.1 eslint: - specifier: ^9.19.0 - version: 9.19.0(jiti@1.21.7) + specifier: ^9.21.0 + version: 9.21.0(jiti@1.21.7) eslint-config-prettier: specifier: ^9.1.0 - version: 9.1.0(eslint@9.19.0(jiti@1.21.7)) + version: 9.1.0(eslint@9.21.0(jiti@1.21.7)) eslint-plugin-svelte: specifier: ^2.46.1 - version: 2.46.1(eslint@9.19.0(jiti@1.21.7))(svelte@5.19.8) + version: 2.46.1(eslint@9.21.0(jiti@1.21.7))(svelte@5.20.4) formsnap: specifier: ^2.0.0 - version: 2.0.0(svelte@5.19.8)(sveltekit-superforms@2.23.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(@types/json-schema@7.0.15)(svelte@5.19.8)(typescript@5.7.3)) + version: 2.0.0(svelte@5.20.4)(sveltekit-superforms@2.23.1(@sveltejs/kit@2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(@types/json-schema@7.0.15)(svelte@5.20.4)(typescript@5.7.3)) globals: - specifier: ^15.14.0 - version: 15.14.0 + specifier: ^15.15.0 + version: 15.15.0 highlight.js: specifier: ^11.11.1 version: 11.11.1 lucide-svelte: specifier: ^0.424.0 - version: 0.424.0(svelte@5.19.8) + version: 0.424.0(svelte@5.20.4) mode-watcher: specifier: ^0.4.1 - version: 0.4.1(svelte@5.19.8) + version: 0.4.1(svelte@5.20.4) postcss: - specifier: ^8.5.1 - version: 8.5.1 + specifier: ^8.5.3 + version: 8.5.3 prettier: - specifier: ^3.4.2 - version: 3.4.2 + specifier: ^3.5.2 + version: 3.5.2 prettier-plugin-svelte: specifier: ^3.3.3 - version: 3.3.3(prettier@3.4.2)(svelte@5.19.8) + version: 3.3.3(prettier@3.5.2)(svelte@5.20.4) prettier-plugin-tailwindcss: specifier: ^0.6.11 - version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.4.2)(svelte@5.19.8))(prettier@3.4.2) + version: 0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.2)(svelte@5.20.4))(prettier@3.5.2) svelte: - specifier: ^5.19.8 - version: 5.19.8 + specifier: ^5.20.4 + version: 5.20.4 svelte-check: specifier: ^4.1.4 - version: 4.1.4(svelte@5.19.8)(typescript@5.7.3) + version: 4.1.4(svelte@5.20.4)(typescript@5.7.3) svelte-highlight: specifier: ^7.8.2 version: 7.8.2 svelte-sonner: specifier: ^0.3.28 - version: 0.3.28(svelte@5.19.8) + version: 0.3.28(svelte@5.20.4) sveltekit-superforms: specifier: ^2.23.1 - version: 2.23.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(@types/json-schema@7.0.15)(svelte@5.19.8)(typescript@5.7.3) + version: 2.23.1(@sveltejs/kit@2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(@types/json-schema@7.0.15)(svelte@5.20.4)(typescript@5.7.3) tailwind-merge: specifier: ^2.6.0 version: 2.6.0 @@ -118,17 +118,17 @@ importers: specifier: ^5.7.3 version: 5.7.3 typescript-eslint: - specifier: ^8.23.0 - version: 8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + specifier: ^8.25.0 + version: 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) vite: specifier: ^5.4.14 - version: 5.4.14(@types/node@22.13.1) + version: 5.4.14(@types/node@22.13.5) yaml: specifier: ^2.7.0 version: 2.7.0 zod: - specifier: ^3.24.1 - version: 3.24.1 + specifier: ^3.24.2 + version: 3.24.2 packages: @@ -140,14 +140,14 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@ark/schema@0.39.0': - resolution: {integrity: sha512-LQbQUb3Sj461LgklXObAyUJNtsUUCBxZlO2HqRLYvRSqpStm0xTMrXn51DwBNNxeSULvKVpXFwoxiSec9kwKww==} + '@ark/schema@0.40.0': + resolution: {integrity: sha512-vD78TCZkoMWYDVfJVyoBI4ndxaR5jGUeYQuhFNZHXV8Ve2pKrwb4vQFD/VHg7GgF8Pd1pxy0CPouerKNR3y79g==} - '@ark/util@0.39.0': - resolution: {integrity: sha512-90APHVklk8BP4kku7hIh1BgrhuyKYqoZ4O7EybtFRo7cDl9mIyc/QUbGvYDg//73s0J2H0I/gW9pzroA1R4IBQ==} + '@ark/util@0.40.0': + resolution: {integrity: sha512-YN+qWGs1q5Pl19VcnCWZMUpDEKW9aST6kuSOs0iAswDDe494xjgmg+DJeX0OF2MspH5yY03VqitNcvkywqXNpw==} - '@babel/runtime@7.26.7': - resolution: {integrity: sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==} + '@babel/runtime@7.26.9': + resolution: {integrity: sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==} engines: {node: '>=6.9.0'} '@esbuild/aix-ppc64@0.21.5': @@ -156,8 +156,8 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@esbuild/aix-ppc64@0.25.0': + resolution: {integrity: sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -168,8 +168,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/android-arm64@0.25.0': + resolution: {integrity: sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -180,8 +180,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + '@esbuild/android-arm@0.25.0': + resolution: {integrity: sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -192,8 +192,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@esbuild/android-x64@0.25.0': + resolution: {integrity: sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -204,8 +204,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@esbuild/darwin-arm64@0.25.0': + resolution: {integrity: sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -216,8 +216,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + '@esbuild/darwin-x64@0.25.0': + resolution: {integrity: sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -228,8 +228,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + '@esbuild/freebsd-arm64@0.25.0': + resolution: {integrity: sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -240,8 +240,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + '@esbuild/freebsd-x64@0.25.0': + resolution: {integrity: sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -252,8 +252,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@esbuild/linux-arm64@0.25.0': + resolution: {integrity: sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -264,8 +264,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + '@esbuild/linux-arm@0.25.0': + resolution: {integrity: sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -276,8 +276,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@esbuild/linux-ia32@0.25.0': + resolution: {integrity: sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -288,8 +288,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-loong64@0.25.0': + resolution: {integrity: sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -300,8 +300,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + '@esbuild/linux-mips64el@0.25.0': + resolution: {integrity: sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -312,8 +312,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + '@esbuild/linux-ppc64@0.25.0': + resolution: {integrity: sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -324,8 +324,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@esbuild/linux-riscv64@0.25.0': + resolution: {integrity: sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -336,8 +336,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-s390x@0.25.0': + resolution: {integrity: sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -348,14 +348,14 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + '@esbuild/linux-x64@0.25.0': + resolution: {integrity: sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@esbuild/netbsd-arm64@0.25.0': + resolution: {integrity: sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] @@ -366,14 +366,14 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + '@esbuild/netbsd-x64@0.25.0': + resolution: {integrity: sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + '@esbuild/openbsd-arm64@0.25.0': + resolution: {integrity: sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -384,8 +384,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@esbuild/openbsd-x64@0.25.0': + resolution: {integrity: sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -396,8 +396,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + '@esbuild/sunos-x64@0.25.0': + resolution: {integrity: sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -408,8 +408,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@esbuild/win32-arm64@0.25.0': + resolution: {integrity: sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -420,8 +420,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + '@esbuild/win32-ia32@0.25.0': + resolution: {integrity: sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -432,8 +432,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-x64@0.25.0': + resolution: {integrity: sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -452,24 +452,24 @@ packages: resolution: {integrity: sha512-GNKqxfHG2ySmJOBSHg7LxeUx4xpuCoFjacmlCoYWEbaPXLwvfIjixRI12xCQZeULksQb23uiA8F40w5TojpV7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.10.0': - resolution: {integrity: sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==} + '@eslint/core@0.12.0': + resolution: {integrity: sha512-cmrR6pytBuSMTaBweKoGMwu3EiHiEC+DoyupPmlZ0HxBJBtIxwe+j/E4XPIKNx+Q74c8lXKPwYawBf5glsTkHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.2.0': - resolution: {integrity: sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==} + '@eslint/eslintrc@3.3.0': + resolution: {integrity: sha512-yaVPAiNAalnCZedKLdR21GOGILMLKPyqSLWaAjQFvYA2i/ciDi8ArYVr69Anohb6cH2Ukhqti4aFnYyPm8wdwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.19.0': - resolution: {integrity: sha512-rbq9/g38qjfqFLOVPvwjIvFFdNziEC5S65jmjPw5r6A//QH+W91akh9irMwjDN8zKUTak6W9EsAv4m/7Wnw0UQ==} + '@eslint/js@9.21.0': + resolution: {integrity: sha512-BqStZ3HX8Yz6LvsF5ByXYrtigrV5AXADWLAGc7PH/1SxOb7/FIYYMszZZWiUou/GB9P2lXWk2SV4d+Z8h0nknw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.2.5': - resolution: {integrity: sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==} + '@eslint/plugin-kit@0.2.7': + resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@exodus/schemasafe@1.3.0': @@ -516,8 +516,8 @@ packages: resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} engines: {node: '>=18.18'} - '@humanwhocodes/retry@0.4.1': - resolution: {integrity: sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==} + '@humanwhocodes/retry@0.4.2': + resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} '@internationalized/date@3.7.0': @@ -571,98 +571,98 @@ packages: resolution: {integrity: sha512-ct43jurbe7lsUX5eIrj4ijO3j/6zIPp7CDnFWXDs7UPAbw1Pu1iH3oAmFdP4jcskKJBURH5M9oTtyeiUXyHX8Q==} engines: {node: '>=18.16.0'} - '@rollup/rollup-android-arm-eabi@4.34.4': - resolution: {integrity: sha512-gGi5adZWvjtJU7Axs//CWaQbQd/vGy8KGcnEaCWiyCqxWYDxwIlAHFuSe6Guoxtd0SRvSfVTDMPd5H+4KE2kKA==} + '@rollup/rollup-android-arm-eabi@4.34.8': + resolution: {integrity: sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.34.4': - resolution: {integrity: sha512-1aRlh1gqtF7vNPMnlf1vJKk72Yshw5zknR/ZAVh7zycRAGF2XBMVDAHmFQz/Zws5k++nux3LOq/Ejj1WrDR6xg==} + '@rollup/rollup-android-arm64@4.34.8': + resolution: {integrity: sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.34.4': - resolution: {integrity: sha512-drHl+4qhFj+PV/jrQ78p9ch6A0MfNVZScl/nBps5a7u01aGf/GuBRrHnRegA9bP222CBDfjYbFdjkIJ/FurvSQ==} + '@rollup/rollup-darwin-arm64@4.34.8': + resolution: {integrity: sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.34.4': - resolution: {integrity: sha512-hQqq/8QALU6t1+fbNmm6dwYsa0PDD4L5r3TpHx9dNl+aSEMnIksHZkSO3AVH+hBMvZhpumIGrTFj8XCOGuIXjw==} + '@rollup/rollup-darwin-x64@4.34.8': + resolution: {integrity: sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.34.4': - resolution: {integrity: sha512-/L0LixBmbefkec1JTeAQJP0ETzGjFtNml2gpQXA8rpLo7Md+iXQzo9kwEgzyat5Q+OG/C//2B9Fx52UxsOXbzw==} + '@rollup/rollup-freebsd-arm64@4.34.8': + resolution: {integrity: sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.34.4': - resolution: {integrity: sha512-6Rk3PLRK+b8L/M6m/x6Mfj60LhAUcLJ34oPaxufA+CfqkUrDoUPQYFdRrhqyOvtOKXLJZJwxlOLbQjNYQcRQfw==} + '@rollup/rollup-freebsd-x64@4.34.8': + resolution: {integrity: sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.34.4': - resolution: {integrity: sha512-kmT3x0IPRuXY/tNoABp2nDvI9EvdiS2JZsd4I9yOcLCCViKsP0gB38mVHOhluzx+SSVnM1KNn9k6osyXZhLoCA==} + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': + resolution: {integrity: sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.34.4': - resolution: {integrity: sha512-3iSA9tx+4PZcJH/Wnwsvx/BY4qHpit/u2YoZoXugWVfc36/4mRkgGEoRbRV7nzNBSCOgbWMeuQ27IQWgJ7tRzw==} + '@rollup/rollup-linux-arm-musleabihf@4.34.8': + resolution: {integrity: sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.34.4': - resolution: {integrity: sha512-7CwSJW+sEhM9sESEk+pEREF2JL0BmyCro8UyTq0Kyh0nu1v0QPNY3yfLPFKChzVoUmaKj8zbdgBxUhBRR+xGxg==} + '@rollup/rollup-linux-arm64-gnu@4.34.8': + resolution: {integrity: sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.34.4': - resolution: {integrity: sha512-GZdafB41/4s12j8Ss2izofjeFXRAAM7sHCb+S4JsI9vaONX/zQ8cXd87B9MRU/igGAJkKvmFmJJBeeT9jJ5Cbw==} + '@rollup/rollup-linux-arm64-musl@4.34.8': + resolution: {integrity: sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.34.4': - resolution: {integrity: sha512-uuphLuw1X6ur11675c2twC6YxbzyLSpWggvdawTUamlsoUv81aAXRMPBC1uvQllnBGls0Qt5Siw8reSIBnbdqQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': + resolution: {integrity: sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': - resolution: {integrity: sha512-KvLEw1os2gSmD6k6QPCQMm2T9P2GYvsMZMRpMz78QpSoEevHbV/KOUbI/46/JRalhtSAYZBYLAnT9YE4i/l4vg==} + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': + resolution: {integrity: sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.34.4': - resolution: {integrity: sha512-wcpCLHGM9yv+3Dql/CI4zrY2mpQ4WFergD3c9cpRowltEh5I84pRT/EuHZsG0In4eBPPYthXnuR++HrFkeqwkA==} + '@rollup/rollup-linux-riscv64-gnu@4.34.8': + resolution: {integrity: sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.34.4': - resolution: {integrity: sha512-nLbfQp2lbJYU8obhRQusXKbuiqm4jSJteLwfjnunDT5ugBKdxqw1X9KWwk8xp1OMC6P5d0WbzxzhWoznuVK6XA==} + '@rollup/rollup-linux-s390x-gnu@4.34.8': + resolution: {integrity: sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.34.4': - resolution: {integrity: sha512-JGejzEfVzqc/XNiCKZj14eb6s5w8DdWlnQ5tWUbs99kkdvfq9btxxVX97AaxiUX7xJTKFA0LwoS0KU8C2faZRg==} + '@rollup/rollup-linux-x64-gnu@4.34.8': + resolution: {integrity: sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.34.4': - resolution: {integrity: sha512-/iFIbhzeyZZy49ozAWJ1ZR2KW6ZdYUbQXLT4O5n1cRZRoTpwExnHLjlurDXXPKEGxiAg0ujaR9JDYKljpr2fDg==} + '@rollup/rollup-linux-x64-musl@4.34.8': + resolution: {integrity: sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.34.4': - resolution: {integrity: sha512-qORc3UzoD5UUTneiP2Afg5n5Ti1GAW9Gp5vHPxzvAFFA3FBaum9WqGvYXGf+c7beFdOKNos31/41PRMUwh1tpA==} + '@rollup/rollup-win32-arm64-msvc@4.34.8': + resolution: {integrity: sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.34.4': - resolution: {integrity: sha512-5g7E2PHNK2uvoD5bASBD9aelm44nf1w4I5FEI7MPHLWcCSrR8JragXZWgKPXk5i2FU3JFfa6CGZLw2RrGBHs2Q==} + '@rollup/rollup-win32-ia32-msvc@4.34.8': + resolution: {integrity: sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.34.4': - resolution: {integrity: sha512-p0scwGkR4kZ242xLPBuhSckrJ734frz6v9xZzD+kHVYRAkSUmdSLCIJRfql6H5//aF8Q10K+i7q8DiPfZp0b7A==} + '@rollup/rollup-win32-x64-msvc@4.34.8': + resolution: {integrity: sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==} cpu: [x64] os: [win32] @@ -675,8 +675,11 @@ packages: '@sideway/pinpoint@2.0.0': resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - '@sinclair/typebox@0.34.16': - resolution: {integrity: sha512-rIljj8VPYAfn26ANY+5pCNVBPiv6hSufuKGe46y65cJZpvx8vHvPXlU0Q/Le4OGtlNaL8Jg2FuhtvQX18lSIqA==} + '@sinclair/typebox@0.34.28': + resolution: {integrity: sha512-e2B9vmvaa5ym5hWgCHw5CstP54au6AOLXrhZErLsOyyRzuWJtXl/8TszKtc5x8rw/b+oY7HKS9m9iRI53RK0WQ==} + + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} '@sveltejs/adapter-auto@3.3.1': resolution: {integrity: sha512-5Sc7WAxYdL6q9j/+D0jJKjGREGlfIevDyHSQ2eNETHcB1TKlQWHcAo8AS8H1QdjNvSXpvOwNjykDUHPEAyGgdQ==} @@ -688,8 +691,8 @@ packages: peerDependencies: '@sveltejs/kit': ^2.0.0 - '@sveltejs/kit@2.17.1': - resolution: {integrity: sha512-CpoGSLqE2MCmcQwA2CWJvOsZ9vW+p/1H3itrFykdgajUNAEyQPbsaSn7fZb6PLHQwe+07njxje9ss0fjZoCAyw==} + '@sveltejs/kit@2.17.2': + resolution: {integrity: sha512-Vypk02baf7qd3SOB1uUwUC/3Oka+srPo2J0a8YN3EfJypRshDkNx9HzNKjSmhOnGWwT+SSO06+N0mAb8iVTmTQ==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -719,8 +722,8 @@ packages: resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} engines: {node: '>=12'} - '@tanstack/table-core@8.20.5': - resolution: {integrity: sha512-P9dF7XbibHph2PFRz8gfBKEXEY/HJPOhym8CHmjF8y3q5mWpKx9xtZapXQUWCgkqvsK0R46Azuz+VaxD4Xl+Tg==} + '@tanstack/table-core@8.21.2': + resolution: {integrity: sha512-uvXk/U4cBiFMxt+p9/G7yUWI/UbHYbyghLCjlpWZ3mLeIZiUBSKcUnw9UnKkdRz7Z/N4UBuFLWQdJCjUe7HjvA==} engines: {node: '>=12'} '@types/cookie@0.6.0': @@ -735,8 +738,8 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - '@types/node@22.13.1': - resolution: {integrity: sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==} + '@types/node@22.13.5': + resolution: {integrity: sha512-+lTU0PxZXn0Dr1NBtC7Y8cR21AJr87dLLU953CWA6pMxxv/UDc7jYAY90upcrie1nRcD6XNG5HOYEDtgW5TxAg==} '@types/validator@13.12.2': resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==} @@ -757,51 +760,51 @@ packages: '@types/json-schema': optional: true - '@typescript-eslint/eslint-plugin@8.23.0': - resolution: {integrity: sha512-vBz65tJgRrA1Q5gWlRfvoH+w943dq9K1p1yDBY2pc+a1nbBLZp7fB9+Hk8DaALUbzjqlMfgaqlVPT1REJdkt/w==} + '@typescript-eslint/eslint-plugin@8.25.0': + resolution: {integrity: sha512-VM7bpzAe7JO/BFf40pIT1lJqS/z1F8OaSsUB3rpFJucQA4cOSuH2RVVVkFULN+En0Djgr29/jb4EQnedUo95KA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/parser@8.23.0': - resolution: {integrity: sha512-h2lUByouOXFAlMec2mILeELUbME5SZRN/7R9Cw2RD2lRQQY08MWMM+PmVVKKJNK1aIwqTo9t/0CvOxwPbRIE2Q==} + '@typescript-eslint/parser@8.25.0': + resolution: {integrity: sha512-4gbs64bnbSzu4FpgMiQ1A+D+urxkoJk/kqlDJ2W//5SygaEiAP2B4GoS7TEdxgwol2el03gckFV9lJ4QOMiiHg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/scope-manager@8.23.0': - resolution: {integrity: sha512-OGqo7+dXHqI7Hfm+WqkZjKjsiRtFUQHPdGMXzk5mYXhJUedO7e/Y7i8AK3MyLMgZR93TX4bIzYrfyVjLC+0VSw==} + '@typescript-eslint/scope-manager@8.25.0': + resolution: {integrity: sha512-6PPeiKIGbgStEyt4NNXa2ru5pMzQ8OYKO1hX1z53HMomrmiSB+R5FmChgQAP1ro8jMtNawz+TRQo/cSXrauTpg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.23.0': - resolution: {integrity: sha512-iIuLdYpQWZKbiH+RkCGc6iu+VwscP5rCtQ1lyQ7TYuKLrcZoeJVpcLiG8DliXVkUxirW/PWlmS+d6yD51L9jvA==} + '@typescript-eslint/type-utils@8.25.0': + resolution: {integrity: sha512-d77dHgHWnxmXOPJuDWO4FDWADmGQkN5+tt6SFRZz/RtCWl4pHgFl3+WdYCn16+3teG09DY6XtEpf3gGD0a186g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/types@8.23.0': - resolution: {integrity: sha512-1sK4ILJbCmZOTt9k4vkoulT6/y5CHJ1qUYxqpF1K/DBAd8+ZUL4LlSCxOssuH5m4rUaaN0uS0HlVPvd45zjduQ==} + '@typescript-eslint/types@8.25.0': + resolution: {integrity: sha512-+vUe0Zb4tkNgznQwicsvLUJgZIRs6ITeWSCclX1q85pR1iOiaj+4uZJIUp//Z27QWu5Cseiw3O3AR8hVpax7Aw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.23.0': - resolution: {integrity: sha512-LcqzfipsB8RTvH8FX24W4UUFk1bl+0yTOf9ZA08XngFwMg4Kj8A+9hwz8Cr/ZS4KwHrmo9PJiLZkOt49vPnuvQ==} + '@typescript-eslint/typescript-estree@8.25.0': + resolution: {integrity: sha512-ZPaiAKEZ6Blt/TPAx5Ot0EIB/yGtLI2EsGoY6F7XKklfMxYQyvtL+gT/UCqkMzO0BVFHLDlzvFqQzurYahxv9Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/utils@8.23.0': - resolution: {integrity: sha512-uB/+PSo6Exu02b5ZEiVtmY6RVYO7YU5xqgzTIVZwTHvvK3HsL8tZZHFaTLFtRG3CsV4A5mhOv+NZx5BlhXPyIA==} + '@typescript-eslint/utils@8.25.0': + resolution: {integrity: sha512-syqRbrEv0J1wywiLsK60XzHnQe/kRViI3zwFALrNEgnntn1l24Ra2KvOAWwWbWZ1lBZxZljPDGOq967dsl6fkA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' - '@typescript-eslint/visitor-keys@8.23.0': - resolution: {integrity: sha512-oWWhcWDLwDfu++BGTZcmXWqpwtkwb5o7fxUIGksMQQDSdPW9prsSnfIOZMlsj4vBOSrcnjIUZMiIjODgGosFhQ==} + '@typescript-eslint/visitor-keys@8.25.0': + resolution: {integrity: sha512-kCYXKAum9CecGVHGij7muybDfTS2sD3t0L4bJsEZLkyrXUImiCTq1M3LG2SRtOhiHFwMR9wAFplpT6XHYjTkwQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vinejs/compiler@3.0.0': @@ -863,8 +866,8 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - arktype@2.0.4: - resolution: {integrity: sha512-S68rWVDnJauwH7/QCm8zCUM3aTe9Xk6oRihdcc3FSUAtxCo/q1Fwq46JhcwB5Ufv1YStwdQRz+00Y/URlvbhAQ==} + arktype@2.1.0: + resolution: {integrity: sha512-BjXPbh4S8nBSuHmlakrQ+ViiGIhTcxAw7dWuJjW3nlHdY8wGktuuKfP52eWjmC3Y/Og1BbbRYEDGr/H0Kg26Mg==} autoprefixer@10.4.20: resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} @@ -920,8 +923,8 @@ packages: resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} engines: {node: '>=16'} - caniuse-lite@1.0.30001697: - resolution: {integrity: sha512-GwNPlWJin8E+d7Gxq96jxM6w0w+VFeyyXRsjU58emtkYqnbwHqXm5uT2uCmO0RQE9htWknOP4xtBlLmM/gWxvQ==} + caniuse-lite@1.0.30001700: + resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1000,11 +1003,11 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - effect@3.12.9: - resolution: {integrity: sha512-u3PsO0KWtCTO56yGGYaa8RLOccE6Kbeb4UotS/ArAG/tqAyf0x3JF3WaaklhnxJtt67P6SktLmwRPT4hiuhKEA==} + effect@3.13.2: + resolution: {integrity: sha512-/w+CPqHDJ33Wq7xC4YKAchrEEPtjvxh563xH9kDTZp99seNYBoBs87vl8DJwartEjj+KLQLP8PzoDne+XmGT2A==} - electron-to-chromium@1.5.93: - resolution: {integrity: sha512-M+29jTcfNNoR9NV7la4SwUqzWAxEwnc7ThA5e1m6LRSotmpfpCpLcIfgtSCVL+MllNLgAyM/5ru86iMRemPzDQ==} + electron-to-chromium@1.5.104: + resolution: {integrity: sha512-Us9M2L4cO/zMBqVkJtnj353nQhMju9slHm62NprKTmdF3HH8wYOtNvDFq/JB2+ZRoGLzdvYDiATlMHs98XBM1g==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1023,8 +1026,8 @@ packages: engines: {node: '>=12'} hasBin: true - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.0: + resolution: {integrity: sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==} engines: {node: '>=18'} hasBin: true @@ -1074,8 +1077,8 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.19.0: - resolution: {integrity: sha512-ug92j0LepKlbbEv6hD911THhoRHmbdXt2gX+VDABAW/Ir7D3nqKdv5Pf5vtlyY6HQMTEP2skXY43ueqTCWssEA==} + eslint@9.21.0: + resolution: {integrity: sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -1099,8 +1102,8 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} - esrap@1.4.3: - resolution: {integrity: sha512-Xddc1RsoFJ4z9nR7W7BFaEPIp4UXoeQ0+077UdWLxbafMQFyU79sQJMk7kxNgRwQ9/aVgaKacCHC2pUACGwmYw==} + esrap@1.4.5: + resolution: {integrity: sha512-CjNMjkBWWZeHn+VX+gS8YvFwJ5+NDhg8aWZBSFJPR8qQduDNjbJodA2WcwCm7uQa5Rjqj+nZvVmceg1RbHFB9g==} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -1158,11 +1161,11 @@ packages: resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} engines: {node: '>=16'} - flatted@3.3.2: - resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} + flatted@3.3.3: + resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + foreground-child@3.3.1: + resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} formsnap@2.0.0: @@ -1199,8 +1202,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.14.0: - resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} graphemer@1.4.0: @@ -1307,8 +1310,8 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - libphonenumber-js@1.11.19: - resolution: {integrity: sha512-bW/Yp/9dod6fmyR+XqSUL1N5JE7QRxQ3KrBIbYS1FTv32e5i3SEtQVX+71CYNv8maWNSOgnlCoNp9X78f/cKiA==} + libphonenumber-js@1.11.20: + resolution: {integrity: sha512-/ipwAMvtSZRdiQBHqW1qxqeYiBMzncOQLVA+62MWYr7N4m7Q2jqpJ0WgT7zlOEOpyLRSqrMXidbJpC0J77AaKA==} lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} @@ -1373,8 +1376,8 @@ packages: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} - mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} + mrmime@2.0.1: + resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} ms@2.1.3: @@ -1524,8 +1527,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.5.1: - resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -1593,8 +1596,8 @@ packages: prettier-plugin-svelte: optional: true - prettier@3.4.2: - resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} + prettier@3.5.2: + resolution: {integrity: sha512-lc6npv5PH7hVqozBR7lkBNOGXV9vMwROAPlumdBkX0wTbbzPu/U1hk5yL8p2pt4Xoc+2mkT8t/sow2YrV/M5qg==} engines: {node: '>=14'} hasBin: true @@ -1618,8 +1621,8 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.1.1: - resolution: {integrity: sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==} + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} regenerator-runtime@0.14.1: @@ -1641,16 +1644,16 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.34.4: - resolution: {integrity: sha512-spF66xoyD7rz3o08sHP7wogp1gZ6itSq22SGa/IZTcUDXDlOyrShwMwkVSB+BUxFRZZCUYqdb3KWDEOMVQZxuw==} + rollup@4.34.8: + resolution: {integrity: sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - runed@0.23.2: - resolution: {integrity: sha512-AhHCb5/B+YQW6ar1pzhGQOQy+byfjCH63ofuhrexSWwQKhC0EbQ60Z/wMYwETLo3ZubhwlNryxBt0seOMOrVFQ==} + runed@0.23.4: + resolution: {integrity: sha512-9q8oUiBYeXIDLWNK5DfCWlkL0EW3oGbk845VdKlPeia28l751VpfesaB/+7pI6rnbx1I6rqoZ2fZxptOJLxILA==} peerDependencies: svelte: ^5.7.0 @@ -1678,8 +1681,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - sirv@3.0.0: - resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} + sirv@3.0.1: + resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} engines: {node: '>=18'} source-map-js@1.2.1: @@ -1770,8 +1773,8 @@ packages: peerDependencies: svelte: ^5.0.0 - svelte@5.19.8: - resolution: {integrity: sha512-56Vd/nwJrljV0w7RCV1A8sB4/yjSbWW5qrGDTAzp7q42OxwqEWT+6obWzDt41tHjIW+C9Fs2ygtejjJrXR+ZPA==} + svelte@5.20.4: + resolution: {integrity: sha512-2Mo/AfObaw9zuD0u1JJ7sOVzRCGcpETEyDkLbtkcctWpCMCIyT0iz83xD8JT29SR7O4SgswuPRIDYReYF/607A==} engines: {node: '>=18'} sveltekit-superforms@2.23.1: @@ -1850,8 +1853,8 @@ packages: resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} engines: {node: '>=12.20'} - typescript-eslint@8.23.0: - resolution: {integrity: sha512-/LBRo3HrXr5LxmrdYSOCvoAMm7p2jNizNfbIpCgvG4HMsnoprRUOce/+8VJ9BDYWW68rqIENE/haVLWPeFZBVQ==} + typescript-eslint@8.25.0: + resolution: {integrity: sha512-TxRdQQLH4g7JkoFlYG3caW5v1S6kEkz8rqt80iQJZUYPq1zD1Ra7HfQBJJ88ABRaMvHAXnwRvRB4V+6sQ9xN5Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1923,8 +1926,8 @@ packages: terser: optional: true - vitefu@1.0.5: - resolution: {integrity: sha512-h4Vflt9gxODPFNGPwp4zAMZRpZR7eslzwH2c5hn5kNZ5rhnKyRJ50U+yGCdc2IRaBs8O4haIgLNGrV5CrpMsCA==} + vitefu@1.0.6: + resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} peerDependencies: vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: @@ -1967,13 +1970,13 @@ packages: zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} - zod-to-json-schema@3.24.1: - resolution: {integrity: sha512-3h08nf3Vw3Wl3PK+q3ow/lIil81IT2Oa7YpQyUUDsEWbXveMesdfK1xBd2RhCkynwZndAxixji/7SYJJowr62w==} + zod-to-json-schema@3.24.3: + resolution: {integrity: sha512-HIAfWdYIt1sssHfYZFCXp4rU1w2r8hVVXYIlmoa0r0gABLs5di3RCqPU5DDROogVz1pAdYBaz7HK5n9pSUNs3A==} peerDependencies: zod: ^3.24.1 - zod@3.24.1: - resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} snapshots: @@ -1984,15 +1987,15 @@ snapshots: '@jridgewell/gen-mapping': 0.3.8 '@jridgewell/trace-mapping': 0.3.25 - '@ark/schema@0.39.0': + '@ark/schema@0.40.0': dependencies: - '@ark/util': 0.39.0 + '@ark/util': 0.40.0 optional: true - '@ark/util@0.39.0': + '@ark/util@0.40.0': optional: true - '@babel/runtime@7.26.7': + '@babel/runtime@7.26.9': dependencies: regenerator-runtime: 0.14.1 optional: true @@ -2000,150 +2003,150 @@ snapshots: '@esbuild/aix-ppc64@0.21.5': optional: true - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/aix-ppc64@0.25.0': optional: true '@esbuild/android-arm64@0.21.5': optional: true - '@esbuild/android-arm64@0.24.2': + '@esbuild/android-arm64@0.25.0': optional: true '@esbuild/android-arm@0.21.5': optional: true - '@esbuild/android-arm@0.24.2': + '@esbuild/android-arm@0.25.0': optional: true '@esbuild/android-x64@0.21.5': optional: true - '@esbuild/android-x64@0.24.2': + '@esbuild/android-x64@0.25.0': optional: true '@esbuild/darwin-arm64@0.21.5': optional: true - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/darwin-arm64@0.25.0': optional: true '@esbuild/darwin-x64@0.21.5': optional: true - '@esbuild/darwin-x64@0.24.2': + '@esbuild/darwin-x64@0.25.0': optional: true '@esbuild/freebsd-arm64@0.21.5': optional: true - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/freebsd-arm64@0.25.0': optional: true '@esbuild/freebsd-x64@0.21.5': optional: true - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/freebsd-x64@0.25.0': optional: true '@esbuild/linux-arm64@0.21.5': optional: true - '@esbuild/linux-arm64@0.24.2': + '@esbuild/linux-arm64@0.25.0': optional: true '@esbuild/linux-arm@0.21.5': optional: true - '@esbuild/linux-arm@0.24.2': + '@esbuild/linux-arm@0.25.0': optional: true '@esbuild/linux-ia32@0.21.5': optional: true - '@esbuild/linux-ia32@0.24.2': + '@esbuild/linux-ia32@0.25.0': optional: true '@esbuild/linux-loong64@0.21.5': optional: true - '@esbuild/linux-loong64@0.24.2': + '@esbuild/linux-loong64@0.25.0': optional: true '@esbuild/linux-mips64el@0.21.5': optional: true - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/linux-mips64el@0.25.0': optional: true '@esbuild/linux-ppc64@0.21.5': optional: true - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/linux-ppc64@0.25.0': optional: true '@esbuild/linux-riscv64@0.21.5': optional: true - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/linux-riscv64@0.25.0': optional: true '@esbuild/linux-s390x@0.21.5': optional: true - '@esbuild/linux-s390x@0.24.2': + '@esbuild/linux-s390x@0.25.0': optional: true '@esbuild/linux-x64@0.21.5': optional: true - '@esbuild/linux-x64@0.24.2': + '@esbuild/linux-x64@0.25.0': optional: true - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/netbsd-arm64@0.25.0': optional: true '@esbuild/netbsd-x64@0.21.5': optional: true - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/netbsd-x64@0.25.0': optional: true - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/openbsd-arm64@0.25.0': optional: true '@esbuild/openbsd-x64@0.21.5': optional: true - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/openbsd-x64@0.25.0': optional: true '@esbuild/sunos-x64@0.21.5': optional: true - '@esbuild/sunos-x64@0.24.2': + '@esbuild/sunos-x64@0.25.0': optional: true '@esbuild/win32-arm64@0.21.5': optional: true - '@esbuild/win32-arm64@0.24.2': + '@esbuild/win32-arm64@0.25.0': optional: true '@esbuild/win32-ia32@0.21.5': optional: true - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-ia32@0.25.0': optional: true '@esbuild/win32-x64@0.21.5': optional: true - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-x64@0.25.0': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.19.0(jiti@1.21.7))': + '@eslint-community/eslint-utils@4.4.1(eslint@9.21.0(jiti@1.21.7))': dependencies: - eslint: 9.19.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -2156,11 +2159,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/core@0.10.0': + '@eslint/core@0.12.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/eslintrc@3.2.0': + '@eslint/eslintrc@3.3.0': dependencies: ajv: 6.12.6 debug: 4.4.0 @@ -2174,13 +2177,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.19.0': {} + '@eslint/js@9.21.0': {} '@eslint/object-schema@2.1.6': {} - '@eslint/plugin-kit@0.2.5': + '@eslint/plugin-kit@0.2.7': dependencies: - '@eslint/core': 0.10.0 + '@eslint/core': 0.12.0 levn: 0.4.1 '@exodus/schemasafe@1.3.0': @@ -2206,8 +2209,8 @@ snapshots: valibot: 0.31.1 optionalDependencies: '@types/json-schema': 7.0.15 - esbuild: 0.24.2 - esbuild-runner: 2.2.2(esbuild@0.24.2) + esbuild: 0.25.0 + esbuild-runner: 2.2.2(esbuild@0.25.0) optional: true '@hapi/hoek@9.3.0': @@ -2229,7 +2232,7 @@ snapshots: '@humanwhocodes/retry@0.3.1': {} - '@humanwhocodes/retry@0.4.1': {} + '@humanwhocodes/retry@0.4.2': {} '@internationalized/date@3.7.0': dependencies: @@ -2283,61 +2286,61 @@ snapshots: '@poppinss/macroable@1.0.4': optional: true - '@rollup/rollup-android-arm-eabi@4.34.4': + '@rollup/rollup-android-arm-eabi@4.34.8': optional: true - '@rollup/rollup-android-arm64@4.34.4': + '@rollup/rollup-android-arm64@4.34.8': optional: true - '@rollup/rollup-darwin-arm64@4.34.4': + '@rollup/rollup-darwin-arm64@4.34.8': optional: true - '@rollup/rollup-darwin-x64@4.34.4': + '@rollup/rollup-darwin-x64@4.34.8': optional: true - '@rollup/rollup-freebsd-arm64@4.34.4': + '@rollup/rollup-freebsd-arm64@4.34.8': optional: true - '@rollup/rollup-freebsd-x64@4.34.4': + '@rollup/rollup-freebsd-x64@4.34.8': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.34.4': + '@rollup/rollup-linux-arm-gnueabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.34.4': + '@rollup/rollup-linux-arm-musleabihf@4.34.8': optional: true - '@rollup/rollup-linux-arm64-gnu@4.34.4': + '@rollup/rollup-linux-arm64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-arm64-musl@4.34.4': + '@rollup/rollup-linux-arm64-musl@4.34.8': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.34.4': + '@rollup/rollup-linux-loongarch64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.34.4': + '@rollup/rollup-linux-powerpc64le-gnu@4.34.8': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.34.4': + '@rollup/rollup-linux-riscv64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-s390x-gnu@4.34.4': + '@rollup/rollup-linux-s390x-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-gnu@4.34.4': + '@rollup/rollup-linux-x64-gnu@4.34.8': optional: true - '@rollup/rollup-linux-x64-musl@4.34.4': + '@rollup/rollup-linux-x64-musl@4.34.8': optional: true - '@rollup/rollup-win32-arm64-msvc@4.34.4': + '@rollup/rollup-win32-arm64-msvc@4.34.8': optional: true - '@rollup/rollup-win32-ia32-msvc@4.34.4': + '@rollup/rollup-win32-ia32-msvc@4.34.8': optional: true - '@rollup/rollup-win32-x64-msvc@4.34.4': + '@rollup/rollup-win32-x64-msvc@4.34.8': optional: true '@sideway/address@4.1.5': @@ -2351,21 +2354,24 @@ snapshots: '@sideway/pinpoint@2.0.0': optional: true - '@sinclair/typebox@0.34.16': + '@sinclair/typebox@0.34.28': optional: true - '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))': + '@standard-schema/spec@1.0.0': + optional: true + + '@sveltejs/adapter-auto@3.3.1(@sveltejs/kit@2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))': dependencies: - '@sveltejs/kit': 2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)) + '@sveltejs/kit': 2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)) import-meta-resolve: 4.1.0 - '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))': + '@sveltejs/adapter-static@3.0.8(@sveltejs/kit@2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))': dependencies: - '@sveltejs/kit': 2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)) + '@sveltejs/kit': 2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)) - '@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1))': + '@sveltejs/kit@2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5))': dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)) + '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 @@ -2373,32 +2379,32 @@ snapshots: import-meta-resolve: 4.1.0 kleur: 4.1.5 magic-string: 0.30.17 - mrmime: 2.0.0 + mrmime: 2.0.1 sade: 1.8.1 set-cookie-parser: 2.7.1 - sirv: 3.0.0 - svelte: 5.19.8 - vite: 5.4.14(@types/node@22.13.1) + sirv: 3.0.1 + svelte: 5.20.4 + vite: 5.4.14(@types/node@22.13.5) - '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1))': + '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5))': dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)) + '@sveltejs/vite-plugin-svelte': 4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)) debug: 4.4.0 - svelte: 5.19.8 - vite: 5.4.14(@types/node@22.13.1) + svelte: 5.20.4 + vite: 5.4.14(@types/node@22.13.5) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1))': + '@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)) + '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 5.19.8 - vite: 5.4.14(@types/node@22.13.1) - vitefu: 1.0.5(vite@5.4.14(@types/node@22.13.1)) + svelte: 5.20.4 + vite: 5.4.14(@types/node@22.13.5) + vitefu: 1.0.6(vite@5.4.14(@types/node@22.13.5)) transitivePeerDependencies: - supports-color @@ -2410,7 +2416,7 @@ snapshots: dependencies: remove-accents: 0.5.0 - '@tanstack/table-core@8.20.5': {} + '@tanstack/table-core@8.21.2': {} '@types/cookie@0.6.0': {} @@ -2423,7 +2429,7 @@ snapshots: '@types/json-schema@7.0.15': {} - '@types/node@22.13.1': + '@types/node@22.13.5': dependencies: undici-types: 6.20.0 @@ -2444,15 +2450,15 @@ snapshots: '@types/json-schema': 7.0.15 optional: true - '@typescript-eslint/eslint-plugin@8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/eslint-plugin@8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/type-utils': 8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/utils': 8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.23.0 - eslint: 9.19.0(jiti@1.21.7) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/type-utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 + eslint: 9.21.0(jiti@1.21.7) graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 @@ -2461,40 +2467,40 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) - '@typescript-eslint/visitor-keys': 8.23.0 + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 - eslint: 9.19.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.23.0': + '@typescript-eslint/scope-manager@8.25.0': dependencies: - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/visitor-keys': 8.23.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 - '@typescript-eslint/type-utils@8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/type-utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) - '@typescript-eslint/utils': 8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) debug: 4.4.0 - eslint: 9.19.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) ts-api-utils: 2.0.1(typescript@5.7.3) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.23.0': {} + '@typescript-eslint/types@8.25.0': {} - '@typescript-eslint/typescript-estree@8.23.0(typescript@5.7.3)': + '@typescript-eslint/typescript-estree@8.25.0(typescript@5.7.3)': dependencies: - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/visitor-keys': 8.23.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/visitor-keys': 8.25.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -2505,20 +2511,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3)': + '@typescript-eslint/utils@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.23.0 - '@typescript-eslint/types': 8.23.0 - '@typescript-eslint/typescript-estree': 8.23.0(typescript@5.7.3) - eslint: 9.19.0(jiti@1.21.7) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.25.0 + '@typescript-eslint/types': 8.25.0 + '@typescript-eslint/typescript-estree': 8.25.0(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.23.0': + '@typescript-eslint/visitor-keys@8.25.0': dependencies: - '@typescript-eslint/types': 8.23.0 + '@typescript-eslint/types': 8.25.0 eslint-visitor-keys: 4.2.0 '@vinejs/compiler@3.0.0': @@ -2576,20 +2582,20 @@ snapshots: aria-query@5.3.2: {} - arktype@2.0.4: + arktype@2.1.0: dependencies: - '@ark/schema': 0.39.0 - '@ark/util': 0.39.0 + '@ark/schema': 0.40.0 + '@ark/util': 0.40.0 optional: true - autoprefixer@10.4.20(postcss@8.5.1): + autoprefixer@10.4.20(postcss@8.5.3): dependencies: browserslist: 4.24.4 - caniuse-lite: 1.0.30001697 + caniuse-lite: 1.0.30001700 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.1.1 - postcss: 8.5.1 + postcss: 8.5.3 postcss-value-parser: 4.2.0 axobject-query@4.1.0: {} @@ -2598,15 +2604,15 @@ snapshots: binary-extensions@2.3.0: {} - bits-ui@1.0.0-next.79(svelte@5.19.8): + bits-ui@1.0.0-next.79(svelte@5.20.4): dependencies: '@floating-ui/core': 1.6.9 '@floating-ui/dom': 1.6.13 '@internationalized/date': 3.7.0 esm-env: 1.2.2 - runed: 0.23.2(svelte@5.19.8) - svelte: 5.19.8 - svelte-toolbelt: 0.7.1(svelte@5.19.8) + runed: 0.23.4(svelte@5.20.4) + svelte: 5.20.4 + svelte-toolbelt: 0.7.1(svelte@5.20.4) brace-expansion@1.1.11: dependencies: @@ -2623,8 +2629,8 @@ snapshots: browserslist@4.24.4: dependencies: - caniuse-lite: 1.0.30001697 - electron-to-chromium: 1.5.93 + caniuse-lite: 1.0.30001700 + electron-to-chromium: 1.5.104 node-releases: 2.0.19 update-browserslist-db: 1.1.2(browserslist@4.24.4) @@ -2638,7 +2644,7 @@ snapshots: camelcase@8.0.0: optional: true - caniuse-lite@1.0.30001697: {} + caniuse-lite@1.0.30001700: {} chalk@4.1.2: dependencies: @@ -2659,12 +2665,12 @@ snapshots: chokidar@4.0.3: dependencies: - readdirp: 4.1.1 + readdirp: 4.1.2 class-validator@0.14.1: dependencies: '@types/validator': 13.12.2 - libphonenumber-js: 1.11.19 + libphonenumber-js: 1.11.20 validator: 13.12.0 optional: true @@ -2709,20 +2715,21 @@ snapshots: eastasianwidth@0.2.0: {} - effect@3.12.9: + effect@3.13.2: dependencies: + '@standard-schema/spec': 1.0.0 fast-check: 3.23.2 optional: true - electron-to-chromium@1.5.93: {} + electron-to-chromium@1.5.104: {} emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} - esbuild-runner@2.2.2(esbuild@0.24.2): + esbuild-runner@2.2.2(esbuild@0.25.0): dependencies: - esbuild: 0.24.2 + esbuild: 0.25.0 source-map-support: 0.5.21 tslib: 2.4.0 optional: true @@ -2753,64 +2760,64 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - esbuild@0.24.2: + esbuild@0.25.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@esbuild/aix-ppc64': 0.25.0 + '@esbuild/android-arm': 0.25.0 + '@esbuild/android-arm64': 0.25.0 + '@esbuild/android-x64': 0.25.0 + '@esbuild/darwin-arm64': 0.25.0 + '@esbuild/darwin-x64': 0.25.0 + '@esbuild/freebsd-arm64': 0.25.0 + '@esbuild/freebsd-x64': 0.25.0 + '@esbuild/linux-arm': 0.25.0 + '@esbuild/linux-arm64': 0.25.0 + '@esbuild/linux-ia32': 0.25.0 + '@esbuild/linux-loong64': 0.25.0 + '@esbuild/linux-mips64el': 0.25.0 + '@esbuild/linux-ppc64': 0.25.0 + '@esbuild/linux-riscv64': 0.25.0 + '@esbuild/linux-s390x': 0.25.0 + '@esbuild/linux-x64': 0.25.0 + '@esbuild/netbsd-arm64': 0.25.0 + '@esbuild/netbsd-x64': 0.25.0 + '@esbuild/openbsd-arm64': 0.25.0 + '@esbuild/openbsd-x64': 0.25.0 + '@esbuild/sunos-x64': 0.25.0 + '@esbuild/win32-arm64': 0.25.0 + '@esbuild/win32-ia32': 0.25.0 + '@esbuild/win32-x64': 0.25.0 optional: true escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-compat-utils@0.5.1(eslint@9.19.0(jiti@1.21.7)): + eslint-compat-utils@0.5.1(eslint@9.21.0(jiti@1.21.7)): dependencies: - eslint: 9.19.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) semver: 7.7.1 - eslint-config-prettier@9.1.0(eslint@9.19.0(jiti@1.21.7)): + eslint-config-prettier@9.1.0(eslint@9.21.0(jiti@1.21.7)): dependencies: - eslint: 9.19.0(jiti@1.21.7) + eslint: 9.21.0(jiti@1.21.7) - eslint-plugin-svelte@2.46.1(eslint@9.19.0(jiti@1.21.7))(svelte@5.19.8): + eslint-plugin-svelte@2.46.1(eslint@9.21.0(jiti@1.21.7))(svelte@5.20.4): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) '@jridgewell/sourcemap-codec': 1.5.0 - eslint: 9.19.0(jiti@1.21.7) - eslint-compat-utils: 0.5.1(eslint@9.19.0(jiti@1.21.7)) + eslint: 9.21.0(jiti@1.21.7) + eslint-compat-utils: 0.5.1(eslint@9.21.0(jiti@1.21.7)) esutils: 2.0.3 known-css-properties: 0.35.0 - postcss: 8.5.1 - postcss-load-config: 3.1.4(postcss@8.5.1) - postcss-safe-parser: 6.0.0(postcss@8.5.1) + postcss: 8.5.3 + postcss-load-config: 3.1.4(postcss@8.5.3) + postcss-safe-parser: 6.0.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 semver: 7.7.1 - svelte-eslint-parser: 0.43.0(svelte@5.19.8) + svelte-eslint-parser: 0.43.0(svelte@5.20.4) optionalDependencies: - svelte: 5.19.8 + svelte: 5.20.4 transitivePeerDependencies: - ts-node @@ -2828,18 +2835,18 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.19.0(jiti@1.21.7): + eslint@9.21.0(jiti@1.21.7): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.19.0(jiti@1.21.7)) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.21.0(jiti@1.21.7)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.19.2 - '@eslint/core': 0.10.0 - '@eslint/eslintrc': 3.2.0 - '@eslint/js': 9.19.0 - '@eslint/plugin-kit': 0.2.5 + '@eslint/core': 0.12.0 + '@eslint/eslintrc': 3.3.0 + '@eslint/js': 9.21.0 + '@eslint/plugin-kit': 0.2.7 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.4.1 + '@humanwhocodes/retry': 0.4.2 '@types/estree': 1.0.6 '@types/json-schema': 7.0.15 ajv: 6.12.6 @@ -2887,7 +2894,7 @@ snapshots: dependencies: estraverse: 5.3.0 - esrap@1.4.3: + esrap@1.4.5: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -2939,21 +2946,21 @@ snapshots: flat-cache@4.0.1: dependencies: - flatted: 3.3.2 + flatted: 3.3.3 keyv: 4.5.4 - flatted@3.3.2: {} + flatted@3.3.3: {} - foreground-child@3.3.0: + foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - formsnap@2.0.0(svelte@5.19.8)(sveltekit-superforms@2.23.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(@types/json-schema@7.0.15)(svelte@5.19.8)(typescript@5.7.3)): + formsnap@2.0.0(svelte@5.20.4)(sveltekit-superforms@2.23.1(@sveltejs/kit@2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(@types/json-schema@7.0.15)(svelte@5.20.4)(typescript@5.7.3)): dependencies: - svelte: 5.19.8 - svelte-toolbelt: 0.5.0(svelte@5.19.8) - sveltekit-superforms: 2.23.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(@types/json-schema@7.0.15)(svelte@5.19.8)(typescript@5.7.3) + svelte: 5.20.4 + svelte-toolbelt: 0.5.0(svelte@5.20.4) + sveltekit-superforms: 2.23.1(@sveltejs/kit@2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(@types/json-schema@7.0.15)(svelte@5.20.4)(typescript@5.7.3) fraction.js@4.3.7: {} @@ -2972,7 +2979,7 @@ snapshots: glob@10.4.5: dependencies: - foreground-child: 3.3.0 + foreground-child: 3.3.1 jackspeak: 3.4.3 minimatch: 9.0.5 minipass: 7.1.2 @@ -2981,7 +2988,7 @@ snapshots: globals@14.0.0: {} - globals@15.14.0: {} + globals@15.15.0: {} graphemer@1.4.0: {} @@ -3055,7 +3062,7 @@ snapshots: json-schema-to-ts@3.1.1: dependencies: - '@babel/runtime': 7.26.7 + '@babel/runtime': 7.26.9 ts-algebra: 2.0.0 optional: true @@ -3076,7 +3083,7 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libphonenumber-js@1.11.19: + libphonenumber-js@1.11.20: optional: true lilconfig@2.1.0: {} @@ -3095,9 +3102,9 @@ snapshots: lru-cache@10.4.3: {} - lucide-svelte@0.424.0(svelte@5.19.8): + lucide-svelte@0.424.0(svelte@5.20.4): dependencies: - svelte: 5.19.8 + svelte: 5.20.4 magic-string@0.30.17: dependencies: @@ -3122,13 +3129,13 @@ snapshots: minipass@7.1.2: {} - mode-watcher@0.4.1(svelte@5.19.8): + mode-watcher@0.4.1(svelte@5.20.4): dependencies: - svelte: 5.19.8 + svelte: 5.20.4 mri@1.2.0: {} - mrmime@2.0.0: {} + mrmime@2.0.1: {} ms@2.1.3: {} @@ -3197,44 +3204,44 @@ snapshots: pirates@4.0.6: {} - postcss-import@15.1.0(postcss@8.5.1): + postcss-import@15.1.0(postcss@8.5.3): dependencies: - postcss: 8.5.1 + postcss: 8.5.3 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.10 - postcss-js@4.0.1(postcss@8.5.1): + postcss-js@4.0.1(postcss@8.5.3): dependencies: camelcase-css: 2.0.1 - postcss: 8.5.1 + postcss: 8.5.3 - postcss-load-config@3.1.4(postcss@8.5.1): + postcss-load-config@3.1.4(postcss@8.5.3): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.5.1 + postcss: 8.5.3 - postcss-load-config@4.0.2(postcss@8.5.1): + postcss-load-config@4.0.2(postcss@8.5.3): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: - postcss: 8.5.1 + postcss: 8.5.3 - postcss-nested@6.2.0(postcss@8.5.1): + postcss-nested@6.2.0(postcss@8.5.3): dependencies: - postcss: 8.5.1 + postcss: 8.5.3 postcss-selector-parser: 6.1.2 - postcss-safe-parser@6.0.0(postcss@8.5.1): + postcss-safe-parser@6.0.0(postcss@8.5.3): dependencies: - postcss: 8.5.1 + postcss: 8.5.3 - postcss-scss@4.0.9(postcss@8.5.1): + postcss-scss@4.0.9(postcss@8.5.3): dependencies: - postcss: 8.5.1 + postcss: 8.5.3 postcss-selector-parser@6.1.2: dependencies: @@ -3243,7 +3250,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.5.1: + postcss@8.5.3: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -3251,18 +3258,18 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.3.3(prettier@3.4.2)(svelte@5.19.8): + prettier-plugin-svelte@3.3.3(prettier@3.5.2)(svelte@5.20.4): dependencies: - prettier: 3.4.2 - svelte: 5.19.8 + prettier: 3.5.2 + svelte: 5.20.4 - prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.4.2)(svelte@5.19.8))(prettier@3.4.2): + prettier-plugin-tailwindcss@0.6.11(prettier-plugin-svelte@3.3.3(prettier@3.5.2)(svelte@5.20.4))(prettier@3.5.2): dependencies: - prettier: 3.4.2 + prettier: 3.5.2 optionalDependencies: - prettier-plugin-svelte: 3.3.3(prettier@3.4.2)(svelte@5.19.8) + prettier-plugin-svelte: 3.3.3(prettier@3.5.2)(svelte@5.20.4) - prettier@3.4.2: {} + prettier@3.5.2: {} property-expr@2.0.6: optional: true @@ -3282,7 +3289,7 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.1.1: {} + readdirp@4.1.2: {} regenerator-runtime@0.14.1: optional: true @@ -3299,39 +3306,39 @@ snapshots: reusify@1.0.4: {} - rollup@4.34.4: + rollup@4.34.8: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.34.4 - '@rollup/rollup-android-arm64': 4.34.4 - '@rollup/rollup-darwin-arm64': 4.34.4 - '@rollup/rollup-darwin-x64': 4.34.4 - '@rollup/rollup-freebsd-arm64': 4.34.4 - '@rollup/rollup-freebsd-x64': 4.34.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.34.4 - '@rollup/rollup-linux-arm-musleabihf': 4.34.4 - '@rollup/rollup-linux-arm64-gnu': 4.34.4 - '@rollup/rollup-linux-arm64-musl': 4.34.4 - '@rollup/rollup-linux-loongarch64-gnu': 4.34.4 - '@rollup/rollup-linux-powerpc64le-gnu': 4.34.4 - '@rollup/rollup-linux-riscv64-gnu': 4.34.4 - '@rollup/rollup-linux-s390x-gnu': 4.34.4 - '@rollup/rollup-linux-x64-gnu': 4.34.4 - '@rollup/rollup-linux-x64-musl': 4.34.4 - '@rollup/rollup-win32-arm64-msvc': 4.34.4 - '@rollup/rollup-win32-ia32-msvc': 4.34.4 - '@rollup/rollup-win32-x64-msvc': 4.34.4 + '@rollup/rollup-android-arm-eabi': 4.34.8 + '@rollup/rollup-android-arm64': 4.34.8 + '@rollup/rollup-darwin-arm64': 4.34.8 + '@rollup/rollup-darwin-x64': 4.34.8 + '@rollup/rollup-freebsd-arm64': 4.34.8 + '@rollup/rollup-freebsd-x64': 4.34.8 + '@rollup/rollup-linux-arm-gnueabihf': 4.34.8 + '@rollup/rollup-linux-arm-musleabihf': 4.34.8 + '@rollup/rollup-linux-arm64-gnu': 4.34.8 + '@rollup/rollup-linux-arm64-musl': 4.34.8 + '@rollup/rollup-linux-loongarch64-gnu': 4.34.8 + '@rollup/rollup-linux-powerpc64le-gnu': 4.34.8 + '@rollup/rollup-linux-riscv64-gnu': 4.34.8 + '@rollup/rollup-linux-s390x-gnu': 4.34.8 + '@rollup/rollup-linux-x64-gnu': 4.34.8 + '@rollup/rollup-linux-x64-musl': 4.34.8 + '@rollup/rollup-win32-arm64-msvc': 4.34.8 + '@rollup/rollup-win32-ia32-msvc': 4.34.8 + '@rollup/rollup-win32-x64-msvc': 4.34.8 fsevents: 2.3.3 run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - runed@0.23.2(svelte@5.19.8): + runed@0.23.4(svelte@5.20.4): dependencies: esm-env: 1.2.2 - svelte: 5.19.8 + svelte: 5.20.4 sade@1.8.1: dependencies: @@ -3349,10 +3356,10 @@ snapshots: signal-exit@4.1.0: {} - sirv@3.0.0: + sirv@3.0.1: dependencies: '@polka/url': 1.0.0-next.28 - mrmime: 2.0.0 + mrmime: 2.0.1 totalist: 3.0.1 source-map-js@1.2.1: {} @@ -3411,50 +3418,50 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.1.4(svelte@5.19.8)(typescript@5.7.3): + svelte-check@4.1.4(svelte@5.20.4)(typescript@5.7.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.3 fdir: 6.4.3 picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.19.8 + svelte: 5.20.4 typescript: 5.7.3 transitivePeerDependencies: - picomatch - svelte-eslint-parser@0.43.0(svelte@5.19.8): + svelte-eslint-parser@0.43.0(svelte@5.20.4): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.5.1 - postcss-scss: 4.0.9(postcss@8.5.1) + postcss: 8.5.3 + postcss-scss: 4.0.9(postcss@8.5.3) optionalDependencies: - svelte: 5.19.8 + svelte: 5.20.4 svelte-highlight@7.8.2: dependencies: highlight.js: 11.11.1 - svelte-sonner@0.3.28(svelte@5.19.8): + svelte-sonner@0.3.28(svelte@5.20.4): dependencies: - svelte: 5.19.8 + svelte: 5.20.4 - svelte-toolbelt@0.5.0(svelte@5.19.8): + svelte-toolbelt@0.5.0(svelte@5.20.4): dependencies: clsx: 2.1.1 style-to-object: 1.0.8 - svelte: 5.19.8 + svelte: 5.20.4 - svelte-toolbelt@0.7.1(svelte@5.19.8): + svelte-toolbelt@0.7.1(svelte@5.20.4): dependencies: clsx: 2.1.1 - runed: 0.23.2(svelte@5.19.8) + runed: 0.23.4(svelte@5.20.4) style-to-object: 1.0.8 - svelte: 5.19.8 + svelte: 5.20.4 - svelte@5.19.8: + svelte@5.20.4: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -3465,35 +3472,35 @@ snapshots: axobject-query: 4.1.0 clsx: 2.1.1 esm-env: 1.2.2 - esrap: 1.4.3 + esrap: 1.4.5 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.17 zimmerframe: 1.1.2 - sveltekit-superforms@2.23.1(@sveltejs/kit@2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(@types/json-schema@7.0.15)(svelte@5.19.8)(typescript@5.7.3): + sveltekit-superforms@2.23.1(@sveltejs/kit@2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(@types/json-schema@7.0.15)(svelte@5.20.4)(typescript@5.7.3): dependencies: - '@sveltejs/kit': 2.17.1(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)))(svelte@5.19.8)(vite@5.4.14(@types/node@22.13.1)) + '@sveltejs/kit': 2.17.2(@sveltejs/vite-plugin-svelte@4.0.4(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)))(svelte@5.20.4)(vite@5.4.14(@types/node@22.13.5)) devalue: 5.1.1 memoize-weak: 1.0.2 - svelte: 5.19.8 + svelte: 5.20.4 ts-deepmerge: 7.0.2 optionalDependencies: '@exodus/schemasafe': 1.3.0 '@gcornut/valibot-json-schema': 0.31.0 - '@sinclair/typebox': 0.34.16 + '@sinclair/typebox': 0.34.28 '@typeschema/class-validator': 0.3.0(@types/json-schema@7.0.15)(class-validator@0.14.1) '@vinejs/vine': 3.0.0 - arktype: 2.0.4 + arktype: 2.1.0 class-validator: 0.14.1 - effect: 3.12.9 + effect: 3.13.2 joi: 17.13.3 json-schema-to-ts: 3.1.1 superstruct: 2.0.2 valibot: 1.0.0-beta.11(typescript@5.7.3) yup: 1.6.1 - zod: 3.24.1 - zod-to-json-schema: 3.24.1(zod@3.24.1) + zod: 3.24.2 + zod-to-json-schema: 3.24.3(zod@3.24.2) transitivePeerDependencies: - '@types/json-schema' - typescript @@ -3525,11 +3532,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.1.1 - postcss: 8.5.1 - postcss-import: 15.1.0(postcss@8.5.1) - postcss-js: 4.0.1(postcss@8.5.1) - postcss-load-config: 4.0.2(postcss@8.5.1) - postcss-nested: 6.2.0(postcss@8.5.1) + postcss: 8.5.3 + postcss-import: 15.1.0(postcss@8.5.3) + postcss-js: 4.0.1(postcss@8.5.3) + postcss-load-config: 4.0.2(postcss@8.5.3) + postcss-nested: 6.2.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 resolve: 1.22.10 sucrase: 3.35.0 @@ -3579,12 +3586,12 @@ snapshots: type-fest@2.19.0: optional: true - typescript-eslint@8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3): + typescript-eslint@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.23.0(@typescript-eslint/parser@8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/parser': 8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) - '@typescript-eslint/utils': 8.23.0(eslint@9.19.0(jiti@1.21.7))(typescript@5.7.3) - eslint: 9.19.0(jiti@1.21.7) + '@typescript-eslint/eslint-plugin': 8.25.0(@typescript-eslint/parser@8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3))(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/parser': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + '@typescript-eslint/utils': 8.25.0(eslint@9.21.0(jiti@1.21.7))(typescript@5.7.3) + eslint: 9.21.0(jiti@1.21.7) typescript: 5.7.3 transitivePeerDependencies: - supports-color @@ -3616,18 +3623,18 @@ snapshots: validator@13.12.0: optional: true - vite@5.4.14(@types/node@22.13.1): + vite@5.4.14(@types/node@22.13.5): dependencies: esbuild: 0.21.5 - postcss: 8.5.1 - rollup: 4.34.4 + postcss: 8.5.3 + rollup: 4.34.8 optionalDependencies: - '@types/node': 22.13.1 + '@types/node': 22.13.5 fsevents: 2.3.3 - vitefu@1.0.5(vite@5.4.14(@types/node@22.13.1)): + vitefu@1.0.6(vite@5.4.14(@types/node@22.13.5)): optionalDependencies: - vite: 5.4.14(@types/node@22.13.1) + vite: 5.4.14(@types/node@22.13.5) which@2.0.2: dependencies: @@ -3663,9 +3670,9 @@ snapshots: zimmerframe@1.1.2: {} - zod-to-json-schema@3.24.1(zod@3.24.1): + zod-to-json-schema@3.24.3(zod@3.24.2): dependencies: - zod: 3.24.1 + zod: 3.24.2 optional: true - zod@3.24.1: {} + zod@3.24.2: {} diff --git a/web/src/lib/api.ts b/web/src/lib/api.ts index b2a8df4..f232315 100644 --- a/web/src/lib/api.ts +++ b/web/src/lib/api.ts @@ -5,6 +5,7 @@ import { type DNSProvider, type Plugin, type Profile, + type PublicIP, type RouterDNSProvider, type Settings, type Stats, @@ -131,10 +132,10 @@ export const api = { }); if (data.token) { token.value = data.token; + user.value = data.user; + await api.load(); goto('/'); } - - await api.load(); }, async verify(fetch: typeof window.fetch = window.fetch) { @@ -147,9 +148,8 @@ export const api = { }, fetch ); - - if (data) { - user.value = data; + if (data.user) { + user.value = data.user; } } catch (err: unknown) { const error = err instanceof Error ? err.message : String(err); @@ -171,9 +171,10 @@ export const api = { if (data.token) { token.value = data.token; + user.value = data.user; + await api.load(); goto('/'); } - await api.load(); }, async load() { @@ -259,10 +260,7 @@ export const api = { }, async getTraefikConfigLocal() { - if (!profile.isValid()) { - toast.error('No valid profile selected'); - return; - } + if (!profile.isValid()) return; // Get the local config without mutating the stores const res = await send(`/traefik/${profile.id}/${TraefikSource.LOCAL}`); if (!res) { @@ -608,6 +606,10 @@ export const api = { plugins.set(data); }, + async getIP(): Promise { + return await send('/ip'); + }, + async getVersion() { return await send('/version'); } diff --git a/web/src/lib/components/modals/dns.svelte b/web/src/lib/components/modals/dns.svelte index aea8ce5..9560fd3 100644 --- a/web/src/lib/components/modals/dns.svelte +++ b/web/src/lib/components/modals/dns.svelte @@ -1,7 +1,9 @@ @@ -107,6 +118,37 @@ {/if} +
+ + (dns.config.autoUpdate = value === 'on')} + class="flex flex-col gap-2" + > +
+ + On + Off + +
+
+
+
-
+ +
- + {#if dns.config.autoUpdate} +
+ {#if currentIP?.ipv4} + {currentIP?.ipv4} + {/if} + {#if currentIP?.ipv6} + {currentIP?.ipv6} + {/if} +
+ {:else} + + {/if}
diff --git a/web/src/lib/components/modals/info.svelte b/web/src/lib/components/modals/info.svelte index a482151..33a54e2 100644 --- a/web/src/lib/components/modals/info.svelte +++ b/web/src/lib/components/modals/info.svelte @@ -25,6 +25,7 @@ }; onMount(async () => { + await api.load(); await api.getDynamicConfig(); }); diff --git a/web/src/lib/components/modals/user.svelte b/web/src/lib/components/modals/user.svelte index 74d42d8..284e077 100644 --- a/web/src/lib/components/modals/user.svelte +++ b/web/src/lib/components/modals/user.svelte @@ -12,17 +12,17 @@ import Separator from '../ui/separator/separator.svelte'; interface Props { - user: User | undefined; + user: User; open?: boolean; } - let { user = $bindable({} as User), open = $bindable(false) }: Props = $props(); + let { user = $bindable(), open = $bindable(false) }: Props = $props(); let password = $state(''); let isSelf = $derived(user.id === currentUser?.id); const handleSubmit = async () => { - if (!user.username) return; + if (!user?.username) return; if (user.password) user.password = password; if (user.id) { await api.updateUser(user); @@ -41,7 +41,7 @@ {#if isSelf} Update Profile {:else} - {user.id ? 'Update' : 'Add'} User + {user?.id ? 'Update' : 'Add'} User {/if} diff --git a/web/src/lib/stores/common.ts b/web/src/lib/stores/common.ts index 0b53101..de0b75e 100644 --- a/web/src/lib/stores/common.ts +++ b/web/src/lib/stores/common.ts @@ -1,10 +1,10 @@ import { createLocalStorage } from '$lib/storage.svelte'; -export const token = createLocalStorage('auth-token', null); +export const token = createLocalStorage('auth_token', null); export const limit = createLocalStorage('limit', '10'); -export const routerColumns = createLocalStorage('router-columns', []); -export const middlewareColumns = createLocalStorage('middleware-columns', []); -export const ruleTab = createLocalStorage('rule-tab', 'simple'); +export const routerColumns = createLocalStorage('router_columns', []); +export const middlewareColumns = createLocalStorage('middleware_columns', []); +export const ruleTab = createLocalStorage('rule_tab', 'simple'); export const DateFormat = new Intl.DateTimeFormat('en-US', { year: 'numeric', diff --git a/web/src/lib/stores/source.ts b/web/src/lib/stores/source.ts index c612260..2d0639c 100644 --- a/web/src/lib/stores/source.ts +++ b/web/src/lib/stores/source.ts @@ -2,7 +2,7 @@ import { createLocalStorage } from '$lib/storage.svelte'; import { TraefikSource } from '$lib/types'; class TraefikSourceStore { - private store = createLocalStorage('traefik_source', TraefikSource.API); + private store = createLocalStorage('selected_source', TraefikSource.API); get value(): TraefikSource { return this.store.value ?? TraefikSource.API; diff --git a/web/src/lib/types.ts b/web/src/lib/types.ts index aa08b01..a9bd5ac 100644 --- a/web/src/lib/types.ts +++ b/web/src/lib/types.ts @@ -48,6 +48,7 @@ export interface DNSProviderConfig { apiUrl: string; traefikIp: string; proxied: boolean; + autoUpdate: boolean; zoneType: string; } @@ -154,3 +155,8 @@ export interface Stats { dnsProviders: number; activeDNS: string; } + +export interface PublicIP { + ipv4: string; + ipv6: string; +} diff --git a/web/src/routes/+layout.svelte b/web/src/routes/+layout.svelte index 454ce62..f85936d 100644 --- a/web/src/routes/+layout.svelte +++ b/web/src/routes/+layout.svelte @@ -29,20 +29,20 @@ let data: Event = JSON.parse(event.data); switch (data.message) { case 'profile': - api.listProfiles(); + await api.listProfiles(); break; case 'traefik': if (!source.isValid(source.value)) return; await api.getTraefikConfig(source.value); break; case 'user': - api.listUsers(); + await api.listUsers(); break; case 'dns': - api.listDNSProviders(); + await api.listDNSProviders(); break; case 'agent': - api.listAgentsByProfile(); + await api.listAgentsByProfile(); break; default: break;