mirror of
https://github.com/GlueOps/autoglue.git
synced 2026-02-13 21:00:06 +01:00
Compare commits
13 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f8e543b595 | ||
|
|
8cc81e52b7 | ||
|
|
d6e28c7fa2 | ||
|
|
9832229194 | ||
|
|
da82998754 | ||
|
|
bca32fe784 | ||
|
|
848e8d5179 | ||
|
|
d3ee38881c | ||
|
|
d39db44aa7 | ||
|
|
01b29a4706 | ||
|
|
bc3bd92d54 | ||
|
|
2057f92b82 | ||
|
|
169283b6c7 |
2
.github/workflows/docker-publish.yml
vendored
2
.github/workflows/docker-publish.yml
vendored
@@ -47,7 +47,7 @@ jobs:
|
|||||||
# multi-platform images and export cache
|
# multi-platform images and export cache
|
||||||
# https://github.com/docker/setup-buildx-action
|
# https://github.com/docker/setup-buildx-action
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@e468171a9de216ec08956ac3ada2f0791b6bd435 # v3.11.1
|
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
|
||||||
|
|
||||||
# Login against a Docker registry except on PR
|
# Login against a Docker registry except on PR
|
||||||
# https://github.com/docker/login-action
|
# https://github.com/docker/login-action
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#################################
|
#################################
|
||||||
# Builder: Go + Node in one
|
# Builder: Go + Node in one
|
||||||
#################################
|
#################################
|
||||||
FROM golang:1.25.5-alpine@sha256:26111811bc967321e7b6f852e914d14bede324cd1accb7f81811929a6a57fea9 AS builder
|
FROM golang:1.25.5-alpine@sha256:ac09a5f469f307e5da71e766b0bd59c9c49ea460a528cc3e6686513d64a6f1fb AS builder
|
||||||
|
|
||||||
RUN apk add --no-cache \
|
RUN apk add --no-cache \
|
||||||
bash git ca-certificates tzdata \
|
bash git ca-certificates tzdata \
|
||||||
@@ -24,7 +24,7 @@ RUN make build
|
|||||||
#################################
|
#################################
|
||||||
# Runtime
|
# Runtime
|
||||||
#################################
|
#################################
|
||||||
FROM alpine:3.23@sha256:51183f2cfa6320055da30872f211093f9ff1d3cf06f39a0bdb212314c5dc7375
|
FROM alpine:3.23@sha256:865b95f46d98cf867a156fe4a135ad3fe50d2056aa3f25ed31662dff6da4eb62
|
||||||
|
|
||||||
RUN apk add --no-cache ca-certificates tzdata postgresql17-client \
|
RUN apk add --no-cache ca-certificates tzdata postgresql17-client \
|
||||||
&& addgroup -S app && adduser -S app -G app
|
&& addgroup -S app && adduser -S app -G app
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -4164,6 +4164,42 @@ paths:
|
|||||||
external deletion policy)
|
external deletion policy)
|
||||||
tags:
|
tags:
|
||||||
- DNS
|
- DNS
|
||||||
|
get:
|
||||||
|
operationId: GetRecordSet
|
||||||
|
parameters:
|
||||||
|
- description: Organization UUID
|
||||||
|
in: header
|
||||||
|
name: X-Org-ID
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
- description: Record Set ID (UUID)
|
||||||
|
in: path
|
||||||
|
name: id
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
$ref: '#/components/schemas/dto.RecordSetResponse'
|
||||||
|
description: OK
|
||||||
|
"403":
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
description: organization required
|
||||||
|
"404":
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
description: not found
|
||||||
|
summary: Get a record set (org scoped)
|
||||||
|
tags:
|
||||||
|
- DNS
|
||||||
patch:
|
patch:
|
||||||
operationId: UpdateRecordSet
|
operationId: UpdateRecordSet
|
||||||
parameters:
|
parameters:
|
||||||
|
|||||||
2
go.mod
2
go.mod
@@ -9,6 +9,7 @@ require (
|
|||||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.6
|
github.com/aws/aws-sdk-go-v2/credentials v1.19.6
|
||||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0
|
github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0
|
||||||
|
github.com/aws/smithy-go v1.24.0
|
||||||
github.com/coreos/go-oidc/v3 v3.17.0
|
github.com/coreos/go-oidc/v3 v3.17.0
|
||||||
github.com/dyaksa/archer v1.1.5
|
github.com/dyaksa/archer v1.1.5
|
||||||
github.com/fergusstrange/embedded-postgres v1.33.0
|
github.com/fergusstrange/embedded-postgres v1.33.0
|
||||||
@@ -52,7 +53,6 @@ require (
|
|||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 // indirect
|
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 // indirect
|
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 // indirect
|
||||||
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 // indirect
|
github.com/aws/aws-sdk-go-v2/service/sts v1.41.5 // indirect
|
||||||
github.com/aws/smithy-go v1.24.0 // indirect
|
|
||||||
github.com/beorn7/perks v1.0.1 // indirect
|
github.com/beorn7/perks v1.0.1 // indirect
|
||||||
github.com/bytedance/sonic v1.14.0 // indirect
|
github.com/bytedance/sonic v1.14.0 // indirect
|
||||||
github.com/bytedance/sonic/loader v0.3.0 // indirect
|
github.com/bytedance/sonic/loader v0.3.0 // indirect
|
||||||
|
|||||||
16
go.sum
16
go.sum
@@ -14,12 +14,8 @@ github.com/aws/aws-sdk-go-v2 v1.41.0 h1:tNvqh1s+v0vFYdA1xq0aOJH+Y5cRyZ5upu6roPgP
|
|||||||
github.com/aws/aws-sdk-go-v2 v1.41.0/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
|
github.com/aws/aws-sdk-go-v2 v1.41.0/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0=
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 h1:489krEF9xIGkOaaX3CE/Be2uWjiXrkCH6gUX+bZA/BU=
|
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4 h1:489krEF9xIGkOaaX3CE/Be2uWjiXrkCH6gUX+bZA/BU=
|
||||||
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4/go.mod h1:IOAPF6oT9KCsceNTvvYMNHy0+kMF8akOjeDvPENWxp4=
|
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.4/go.mod h1:IOAPF6oT9KCsceNTvvYMNHy0+kMF8akOjeDvPENWxp4=
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.32.5 h1:pz3duhAfUgnxbtVhIK39PGF/AHYyrzGEyRD9Og0QrE8=
|
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.32.5/go.mod h1:xmDjzSUs/d0BB7ClzYPAZMmgQdrodNjPPhd6bGASwoE=
|
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.32.6 h1:hFLBGUKjmLAekvi1evLi5hVvFQtSo3GYwi+Bx4lpJf8=
|
github.com/aws/aws-sdk-go-v2/config v1.32.6 h1:hFLBGUKjmLAekvi1evLi5hVvFQtSo3GYwi+Bx4lpJf8=
|
||||||
github.com/aws/aws-sdk-go-v2/config v1.32.6/go.mod h1:lcUL/gcd8WyjCrMnxez5OXkO3/rwcNmvfno62tnXNcI=
|
github.com/aws/aws-sdk-go-v2/config v1.32.6/go.mod h1:lcUL/gcd8WyjCrMnxez5OXkO3/rwcNmvfno62tnXNcI=
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.5 h1:xMo63RlqP3ZZydpJDMBsH9uJ10hgHYfQFIk1cHDXrR4=
|
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.5/go.mod h1:hhbH6oRcou+LpXfA/0vPElh/e0M3aFeOblE1sssAAEk=
|
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.6 h1:F9vWao2TwjV2MyiyVS+duza0NIRtAslgLUM0vTA1ZaE=
|
github.com/aws/aws-sdk-go-v2/credentials v1.19.6 h1:F9vWao2TwjV2MyiyVS+duza0NIRtAslgLUM0vTA1ZaE=
|
||||||
github.com/aws/aws-sdk-go-v2/credentials v1.19.6/go.mod h1:SgHzKjEVsdQr6Opor0ihgWtkWdfRAIwxYzSJ8O85VHY=
|
github.com/aws/aws-sdk-go-v2/credentials v1.19.6/go.mod h1:SgHzKjEVsdQr6Opor0ihgWtkWdfRAIwxYzSJ8O85VHY=
|
||||||
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 h1:80+uETIWS1BqjnN9uJ0dBUaETh+P1XwFy5vwHwK5r9k=
|
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.16 h1:80+uETIWS1BqjnN9uJ0dBUaETh+P1XwFy5vwHwK5r9k=
|
||||||
@@ -42,14 +38,10 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16 h1:NSbvS17MlI2lu
|
|||||||
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16/go.mod h1:SwT8Tmqd4sA6G1qaGdzWCJN99bUmPGHfRwwq3G5Qb+A=
|
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.16/go.mod h1:SwT8Tmqd4sA6G1qaGdzWCJN99bUmPGHfRwwq3G5Qb+A=
|
||||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0 h1:80pDB3Tpmb2RCSZORrK9/3iQxsd+w6vSzVqpT1FGiwE=
|
github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0 h1:80pDB3Tpmb2RCSZORrK9/3iQxsd+w6vSzVqpT1FGiwE=
|
||||||
github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0/go.mod h1:6EZUGGNLPLh5Unt30uEoA+KQcByERfXIkax9qrc80nA=
|
github.com/aws/aws-sdk-go-v2/service/route53 v1.62.0/go.mod h1:6EZUGGNLPLh5Unt30uEoA+KQcByERfXIkax9qrc80nA=
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.93.2 h1:U3ygWUhCpiSPYSHOrRhb3gOl9T5Y3kB8k5Vjs//57bE=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.93.2/go.mod h1:79S2BdqCJpScXZA2y+cpZuocWsjGjJINyXnOsf5DTz8=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0 h1:SWTxh/EcUCDVqi/0s26V6pVUq0BBG7kx0tDTmF/hCgA=
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0 h1:SWTxh/EcUCDVqi/0s26V6pVUq0BBG7kx0tDTmF/hCgA=
|
||||||
github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0/go.mod h1:79S2BdqCJpScXZA2y+cpZuocWsjGjJINyXnOsf5DTz8=
|
github.com/aws/aws-sdk-go-v2/service/s3 v1.94.0/go.mod h1:79S2BdqCJpScXZA2y+cpZuocWsjGjJINyXnOsf5DTz8=
|
||||||
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 h1:HpI7aMmJ+mm1wkSHIA2t5EaFFv5EFYXePW30p1EIrbQ=
|
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4 h1:HpI7aMmJ+mm1wkSHIA2t5EaFFv5EFYXePW30p1EIrbQ=
|
||||||
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4/go.mod h1:C5RdGMYGlfM0gYq/tifqgn4EbyX99V15P2V3R+VHbQU=
|
github.com/aws/aws-sdk-go-v2/service/signin v1.0.4/go.mod h1:C5RdGMYGlfM0gYq/tifqgn4EbyX99V15P2V3R+VHbQU=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.7 h1:eYnlt6QxnFINKzwxP5/Ucs1vkG7VT3Iezmvfgc2waUw=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.7/go.mod h1:+fWt2UHSb4kS7Pu8y+BMBvJF0EWx+4H0hzNwtDNRTrg=
|
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 h1:aM/Q24rIlS3bRAhTyFurowU8A0SMyGDtEOY/l/s/1Uw=
|
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8 h1:aM/Q24rIlS3bRAhTyFurowU8A0SMyGDtEOY/l/s/1Uw=
|
||||||
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8/go.mod h1:+fWt2UHSb4kS7Pu8y+BMBvJF0EWx+4H0hzNwtDNRTrg=
|
github.com/aws/aws-sdk-go-v2/service/sso v1.30.8/go.mod h1:+fWt2UHSb4kS7Pu8y+BMBvJF0EWx+4H0hzNwtDNRTrg=
|
||||||
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 h1:AHDr0DaHIAo8c9t1emrzAlVDFp+iMMKnPdYy6XO4MCE=
|
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.12 h1:AHDr0DaHIAo8c9t1emrzAlVDFp+iMMKnPdYy6XO4MCE=
|
||||||
@@ -87,10 +79,6 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk
|
|||||||
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
|
||||||
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
|
||||||
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
|
||||||
github.com/gabriel-vasile/mimetype v1.4.10 h1:zyueNbySn/z8mJZHLt6IPw0KoZsiQNszIpU+bX4+ZK0=
|
|
||||||
github.com/gabriel-vasile/mimetype v1.4.10/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
|
|
||||||
github.com/gabriel-vasile/mimetype v1.4.11 h1:AQvxbp830wPhHTqc1u7nzoLT+ZFxGY7emj5DR5DYFik=
|
|
||||||
github.com/gabriel-vasile/mimetype v1.4.11/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
|
|
||||||
github.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw=
|
github.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw=
|
||||||
github.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
|
github.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
|
||||||
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
|
github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w=
|
||||||
@@ -124,10 +112,6 @@ github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/o
|
|||||||
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
|
||||||
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
|
||||||
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
|
||||||
github.com/go-playground/validator/v10 v10.28.0 h1:Q7ibns33JjyW48gHkuFT91qX48KG0ktULL6FgHdG688=
|
|
||||||
github.com/go-playground/validator/v10 v10.28.0/go.mod h1:GoI6I1SjPBh9p7ykNE/yj3fFYbyDOpwMn5KXd+m2hUU=
|
|
||||||
github.com/go-playground/validator/v10 v10.29.0 h1:lQlF5VNJWNlRbRZNeOIkWElR+1LL/OuHcc0Kp14w1xk=
|
|
||||||
github.com/go-playground/validator/v10 v10.29.0/go.mod h1:D6QxqeMlgIPuT02L66f2ccrZ7AGgHkzKmmTMZhk/Kc4=
|
|
||||||
github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w=
|
github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w=
|
||||||
github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM=
|
github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM=
|
||||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ func mountDNSRoutes(r chi.Router, db *gorm.DB, authOrg func(http.Handler) http.H
|
|||||||
|
|
||||||
d.Get("/domains/{domain_id}/records", handlers.ListRecordSets(db))
|
d.Get("/domains/{domain_id}/records", handlers.ListRecordSets(db))
|
||||||
d.Post("/domains/{domain_id}/records", handlers.CreateRecordSet(db))
|
d.Post("/domains/{domain_id}/records", handlers.CreateRecordSet(db))
|
||||||
|
d.Get("/records/{id}", handlers.GetRecordSet(db))
|
||||||
d.Patch("/records/{id}", handlers.UpdateRecordSet(db))
|
d.Patch("/records/{id}", handlers.UpdateRecordSet(db))
|
||||||
d.Delete("/records/{id}", handlers.DeleteRecordSet(db))
|
d.Delete("/records/{id}", handlers.DeleteRecordSet(db))
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -36,6 +36,21 @@ func ClusterActionWorker(db *gorm.DB) archer.WorkerFn {
|
|||||||
var args ClusterActionArgs
|
var args ClusterActionArgs
|
||||||
_ = j.ParseArguments(&args)
|
_ = j.ParseArguments(&args)
|
||||||
|
|
||||||
|
runID, _ := uuid.Parse(j.ID)
|
||||||
|
|
||||||
|
updateRun := func(status string, errMsg string) {
|
||||||
|
updates := map[string]any{
|
||||||
|
"status": status,
|
||||||
|
"error": errMsg,
|
||||||
|
}
|
||||||
|
if status == "succeeded" || status == "failed" {
|
||||||
|
updates["finished_at"] = time.Now().UTC().Format(time.RFC3339)
|
||||||
|
}
|
||||||
|
db.Model(&models.ClusterRun{}).Where("id = ?", runID).Updates(updates)
|
||||||
|
}
|
||||||
|
|
||||||
|
updateRun("running", "")
|
||||||
|
|
||||||
logger := log.With().
|
logger := log.With().
|
||||||
Str("job", j.ID).
|
Str("job", j.ID).
|
||||||
Str("cluster_id", args.ClusterID.String()).
|
Str("cluster_id", args.ClusterID.String()).
|
||||||
@@ -56,18 +71,20 @@ func ClusterActionWorker(db *gorm.DB) archer.WorkerFn {
|
|||||||
Preload("NodePools.Servers.SshKey").
|
Preload("NodePools.Servers.SshKey").
|
||||||
Where("id = ? AND organization_id = ?", args.ClusterID, args.OrgID).
|
Where("id = ? AND organization_id = ?", args.ClusterID, args.OrgID).
|
||||||
First(&c).Error; err != nil {
|
First(&c).Error; err != nil {
|
||||||
|
updateRun("failed", fmt.Errorf("load cluster: %w", err).Error())
|
||||||
return nil, fmt.Errorf("load cluster: %w", err)
|
return nil, fmt.Errorf("load cluster: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---- Step 1: Prepare (mostly lifted from ClusterPrepareWorker)
|
// ---- Step 1: Prepare (mostly lifted from ClusterPrepareWorker)
|
||||||
if err := setClusterStatus(db, c.ID, clusterStatusBootstrapping, ""); err != nil {
|
if err := setClusterStatus(db, c.ID, clusterStatusBootstrapping, ""); err != nil {
|
||||||
|
updateRun("failed", err.Error())
|
||||||
return nil, fmt.Errorf("mark bootstrapping: %w", err)
|
return nil, fmt.Errorf("mark bootstrapping: %w", err)
|
||||||
}
|
}
|
||||||
c.Status = clusterStatusBootstrapping
|
c.Status = clusterStatusBootstrapping
|
||||||
|
|
||||||
if err := validateClusterForPrepare(&c); err != nil {
|
if err := validateClusterForPrepare(&c); err != nil {
|
||||||
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
||||||
|
updateRun("failed", err.Error())
|
||||||
return nil, fmt.Errorf("validate: %w", err)
|
return nil, fmt.Errorf("validate: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,6 +92,7 @@ func ClusterActionWorker(db *gorm.DB) archer.WorkerFn {
|
|||||||
keyPayloads, sshConfig, err := buildSSHAssetsForCluster(db, &c, allServers)
|
keyPayloads, sshConfig, err := buildSSHAssetsForCluster(db, &c, allServers)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
||||||
|
updateRun("failed", err.Error())
|
||||||
return nil, fmt.Errorf("build ssh assets: %w", err)
|
return nil, fmt.Errorf("build ssh assets: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,6 +116,7 @@ func ClusterActionWorker(db *gorm.DB) archer.WorkerFn {
|
|||||||
orgKey, orgSecret, err := findOrCreateClusterAutomationKey(db, c.OrganizationID, c.ID, 24*time.Hour)
|
orgKey, orgSecret, err := findOrCreateClusterAutomationKey(db, c.OrganizationID, c.ID, 24*time.Hour)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
||||||
|
updateRun("failed", err.Error())
|
||||||
return nil, fmt.Errorf("org key: %w", err)
|
return nil, fmt.Errorf("org key: %w", err)
|
||||||
}
|
}
|
||||||
dtoCluster.OrgKey = &orgKey
|
dtoCluster.OrgKey = &orgKey
|
||||||
@@ -106,6 +125,7 @@ func ClusterActionWorker(db *gorm.DB) archer.WorkerFn {
|
|||||||
payloadJSON, err := json.MarshalIndent(dtoCluster, "", " ")
|
payloadJSON, err := json.MarshalIndent(dtoCluster, "", " ")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
||||||
|
updateRun("failed", err.Error())
|
||||||
return nil, fmt.Errorf("marshal payload: %w", err)
|
return nil, fmt.Errorf("marshal payload: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -115,11 +135,13 @@ func ClusterActionWorker(db *gorm.DB) archer.WorkerFn {
|
|||||||
cancel()
|
cancel()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, err.Error())
|
||||||
|
updateRun("failed", err.Error())
|
||||||
return nil, fmt.Errorf("push assets: %w", err)
|
return nil, fmt.Errorf("push assets: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := setClusterStatus(db, c.ID, clusterStatusPending, ""); err != nil {
|
if err := setClusterStatus(db, c.ID, clusterStatusPending, ""); err != nil {
|
||||||
|
updateRun("failed", err.Error())
|
||||||
return nil, fmt.Errorf("mark pending: %w", err)
|
return nil, fmt.Errorf("mark pending: %w", err)
|
||||||
}
|
}
|
||||||
c.Status = clusterStatusPending
|
c.Status = clusterStatusPending
|
||||||
@@ -132,11 +154,13 @@ func ClusterActionWorker(db *gorm.DB) archer.WorkerFn {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error().Err(err).Str("output", out).Msg("ping-servers failed")
|
logger.Error().Err(err).Str("output", out).Msg("ping-servers failed")
|
||||||
_ = setClusterStatus(db, c.ID, clusterStatusFailed, fmt.Sprintf("make ping-servers: %v", err))
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, fmt.Sprintf("make ping-servers: %v", err))
|
||||||
|
updateRun("failed", err.Error())
|
||||||
return nil, fmt.Errorf("ping-servers: %w", err)
|
return nil, fmt.Errorf("ping-servers: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := setClusterStatus(db, c.ID, clusterStatusProvisioning, ""); err != nil {
|
if err := setClusterStatus(db, c.ID, clusterStatusProvisioning, ""); err != nil {
|
||||||
|
updateRun("failed", err.Error())
|
||||||
return nil, fmt.Errorf("mark provisioning: %w", err)
|
return nil, fmt.Errorf("mark provisioning: %w", err)
|
||||||
}
|
}
|
||||||
c.Status = clusterStatusProvisioning
|
c.Status = clusterStatusProvisioning
|
||||||
@@ -149,13 +173,18 @@ func ClusterActionWorker(db *gorm.DB) archer.WorkerFn {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
logger.Error().Err(err).Str("output", out).Msg("bootstrap target failed")
|
logger.Error().Err(err).Str("output", out).Msg("bootstrap target failed")
|
||||||
_ = setClusterStatus(db, c.ID, clusterStatusFailed, fmt.Sprintf("make %s: %v", args.MakeTarget, err))
|
_ = setClusterStatus(db, c.ID, clusterStatusFailed, fmt.Sprintf("make %s: %v", args.MakeTarget, err))
|
||||||
|
updateRun("failed", err.Error())
|
||||||
return nil, fmt.Errorf("make %s: %w", args.MakeTarget, err)
|
return nil, fmt.Errorf("make %s: %w", args.MakeTarget, err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := setClusterStatus(db, c.ID, clusterStatusReady, ""); err != nil {
|
if err := setClusterStatus(db, c.ID, clusterStatusReady, ""); err != nil {
|
||||||
|
updateRun("failed", err.Error())
|
||||||
return nil, fmt.Errorf("mark ready: %w", err)
|
return nil, fmt.Errorf("mark ready: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateRun("succeeded", "")
|
||||||
|
|
||||||
return ClusterActionResult{
|
return ClusterActionResult{
|
||||||
Status: "ok",
|
Status: "ok",
|
||||||
Action: args.Action,
|
Action: args.Action,
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import (
|
|||||||
"github.com/glueops/autoglue/internal/models"
|
"github.com/glueops/autoglue/internal/models"
|
||||||
"github.com/glueops/autoglue/internal/utils"
|
"github.com/glueops/autoglue/internal/utils"
|
||||||
"github.com/google/uuid"
|
"github.com/google/uuid"
|
||||||
|
"github.com/rs/zerolog"
|
||||||
"github.com/rs/zerolog/log"
|
"github.com/rs/zerolog/log"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
|
|
||||||
@@ -23,6 +24,8 @@ import (
|
|||||||
"github.com/aws/aws-sdk-go-v2/credentials"
|
"github.com/aws/aws-sdk-go-v2/credentials"
|
||||||
r53 "github.com/aws/aws-sdk-go-v2/service/route53"
|
r53 "github.com/aws/aws-sdk-go-v2/service/route53"
|
||||||
r53types "github.com/aws/aws-sdk-go-v2/service/route53/types"
|
r53types "github.com/aws/aws-sdk-go-v2/service/route53/types"
|
||||||
|
"github.com/aws/smithy-go"
|
||||||
|
smithyhttp "github.com/aws/smithy-go/transport/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
/************* args & small DTOs *************/
|
/************* args & small DTOs *************/
|
||||||
@@ -47,6 +50,9 @@ const externalDNSPoisonOwner = "autoglue-lock"
|
|||||||
// ExternalDNS poison content – fake owner so real external-dns skips it.
|
// ExternalDNS poison content – fake owner so real external-dns skips it.
|
||||||
const externalDNSPoisonValue = "heritage=external-dns,external-dns/owner=" + externalDNSPoisonOwner + ",external-dns/resource=manual/autoglue"
|
const externalDNSPoisonValue = "heritage=external-dns,external-dns/owner=" + externalDNSPoisonOwner + ",external-dns/resource=manual/autoglue"
|
||||||
|
|
||||||
|
// Default TTL for non-alias records (alias not supported in this reconciler)
|
||||||
|
const defaultRecordTTLSeconds int64 = 300
|
||||||
|
|
||||||
/************* entrypoint worker *************/
|
/************* entrypoint worker *************/
|
||||||
|
|
||||||
func DNSReconsileWorker(db *gorm.DB, jobs *Jobs) archer.WorkerFn {
|
func DNSReconsileWorker(db *gorm.DB, jobs *Jobs) archer.WorkerFn {
|
||||||
@@ -225,7 +231,14 @@ func processPendingRecordsForDomain(ctx context.Context, db *gorm.DB, d *models.
|
|||||||
applied := 0
|
applied := 0
|
||||||
for i := range records {
|
for i := range records {
|
||||||
if err := applyRecord(ctx, db, r53c, d, &records[i]); err != nil {
|
if err := applyRecord(ctx, db, r53c, d, &records[i]); err != nil {
|
||||||
log.Error().Err(err).Str("rr", records[i].Name).Msg("[dns] apply record failed")
|
log.Error().
|
||||||
|
Err(err).
|
||||||
|
Str("zone_id", d.ZoneID).
|
||||||
|
Str("domain", d.DomainName).
|
||||||
|
Str("record_id", records[i].ID.String()).
|
||||||
|
Str("name", records[i].Name).
|
||||||
|
Str("type", strings.ToUpper(records[i].Type)).
|
||||||
|
Msg("[dns] apply record failed")
|
||||||
_ = setRecordFailed(db, &records[i], err)
|
_ = setRecordFailed(db, &records[i], err)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -249,12 +262,24 @@ func applyRecord(ctx context.Context, db *gorm.DB, r53c *r53.Client, d *models.D
|
|||||||
mname := markerName(fq)
|
mname := markerName(fq)
|
||||||
expected := buildMarkerValue(d.OrganizationID.String(), r.ID.String(), r.Fingerprint)
|
expected := buildMarkerValue(d.OrganizationID.String(), r.ID.String(), r.Fingerprint)
|
||||||
|
|
||||||
|
logCtx := log.With().
|
||||||
|
Str("zone_id", zoneID).
|
||||||
|
Str("domain", d.DomainName).
|
||||||
|
Str("fqdn", fq).
|
||||||
|
Str("rr_type", rt).
|
||||||
|
Str("record_id", r.ID.String()).
|
||||||
|
Str("org_id", d.OrganizationID.String()).
|
||||||
|
Logger()
|
||||||
|
|
||||||
|
start := time.Now()
|
||||||
|
|
||||||
// ---- ExternalDNS preflight ----
|
// ---- ExternalDNS preflight ----
|
||||||
extOwned, err := hasExternalDNSOwnership(ctx, r53c, zoneID, fq, rt)
|
extOwned, err := hasExternalDNSOwnership(ctx, r53c, zoneID, fq, rt)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("external_dns_lookup: %w", err)
|
return fmt.Errorf("external_dns_lookup: %w", err)
|
||||||
}
|
}
|
||||||
if extOwned {
|
if extOwned {
|
||||||
|
logCtx.Warn().Msg("[dns] ownership conflict: external-dns claims this record")
|
||||||
r.Owner = "external"
|
r.Owner = "external"
|
||||||
_ = db.Save(r).Error
|
_ = db.Save(r).Error
|
||||||
return fmt.Errorf("ownership_conflict: external-dns claims %s; refusing to modify", strings.TrimSuffix(fq, "."))
|
return fmt.Errorf("ownership_conflict: external-dns claims %s; refusing to modify", strings.TrimSuffix(fq, "."))
|
||||||
@@ -265,6 +290,7 @@ func applyRecord(ctx context.Context, db *gorm.DB, r53c *r53.Client, d *models.D
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("marker lookup: %w", err)
|
return fmt.Errorf("marker lookup: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
hasForeignOwner := false
|
hasForeignOwner := false
|
||||||
hasOurExact := false
|
hasOurExact := false
|
||||||
for _, v := range markerVals {
|
for _, v := range markerVals {
|
||||||
@@ -279,25 +305,26 @@ func applyRecord(ctx context.Context, db *gorm.DB, r53c *r53.Client, d *models.D
|
|||||||
hasForeignOwner = true
|
hasForeignOwner = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logCtx.Debug().
|
||||||
|
Bool("externaldns_owned", extOwned).
|
||||||
|
Int("marker_txt_count", len(markerVals)).
|
||||||
|
Bool("marker_has_our_exact", hasOurExact).
|
||||||
|
Bool("marker_has_foreign", hasForeignOwner).
|
||||||
|
Msg("[dns] ownership preflight")
|
||||||
|
|
||||||
if hasForeignOwner {
|
if hasForeignOwner {
|
||||||
|
logCtx.Warn().Msg("[dns] ownership conflict: foreign _autoglue marker")
|
||||||
r.Owner = "external"
|
r.Owner = "external"
|
||||||
_ = db.Save(r).Error
|
_ = db.Save(r).Error
|
||||||
return fmt.Errorf("ownership_conflict: marker for %s is owned by another controller; refusing to modify", strings.TrimSuffix(fq, "."))
|
return fmt.Errorf("ownership_conflict: marker for %s is owned by another controller; refusing to modify", strings.TrimSuffix(fq, "."))
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build RR change (UPSERT)
|
|
||||||
rrChange := r53types.Change{
|
|
||||||
Action: r53types.ChangeActionUpsert,
|
|
||||||
ResourceRecordSet: &r53types.ResourceRecordSet{
|
|
||||||
Name: aws.String(fq),
|
|
||||||
Type: r53types.RRType(rt),
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decode user values
|
// Decode user values
|
||||||
var userVals []string
|
var userVals []string
|
||||||
if len(r.Values) > 0 {
|
rawVals := strings.TrimSpace(string(r.Values))
|
||||||
if err := jsonUnmarshalStrict([]byte(r.Values), &userVals); err != nil {
|
if rawVals != "" && rawVals != "null" {
|
||||||
|
if err := jsonUnmarshalStrict([]byte(rawVals), &userVals); err != nil {
|
||||||
return fmt.Errorf("values decode: %w", err)
|
return fmt.Errorf("values decode: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -306,15 +333,38 @@ func applyRecord(ctx context.Context, db *gorm.DB, r53c *r53.Client, d *models.D
|
|||||||
recs := make([]r53types.ResourceRecord, 0, len(userVals))
|
recs := make([]r53types.ResourceRecord, 0, len(userVals))
|
||||||
for _, v := range userVals {
|
for _, v := range userVals {
|
||||||
v = strings.TrimSpace(v)
|
v = strings.TrimSpace(v)
|
||||||
|
if v == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
if rt == "TXT" && !(strings.HasPrefix(v, `"`) && strings.HasSuffix(v, `"`)) {
|
if rt == "TXT" && !(strings.HasPrefix(v, `"`) && strings.HasSuffix(v, `"`)) {
|
||||||
v = strconv.Quote(v)
|
v = strconv.Quote(v)
|
||||||
}
|
}
|
||||||
recs = append(recs, r53types.ResourceRecord{Value: aws.String(v)})
|
recs = append(recs, r53types.ResourceRecord{Value: aws.String(v)})
|
||||||
}
|
}
|
||||||
rrChange.ResourceRecordSet.ResourceRecords = recs
|
|
||||||
if r.TTL != nil {
|
// Alias is NOT supported - enforce at least one value for all record types we manage
|
||||||
ttl := int64(*r.TTL)
|
if len(recs) == 0 {
|
||||||
rrChange.ResourceRecordSet.TTL = aws.Int64(ttl)
|
logCtx.Warn().
|
||||||
|
Str("raw_values", truncateForLog(string(r.Values), 240)).
|
||||||
|
Int("decoded_value_count", len(userVals)).
|
||||||
|
Msg("[dns] invalid record: no values (alias not supported)")
|
||||||
|
return fmt.Errorf("invalid_record: %s %s requires at least one value (alias not supported)", strings.TrimSuffix(fq, "."), rt)
|
||||||
|
}
|
||||||
|
|
||||||
|
ttl := defaultRecordTTLSeconds
|
||||||
|
if r.TTL != nil && *r.TTL > 0 {
|
||||||
|
ttl = int64(*r.TTL)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build RR change (UPSERT)
|
||||||
|
rrChange := r53types.Change{
|
||||||
|
Action: r53types.ChangeActionUpsert,
|
||||||
|
ResourceRecordSet: &r53types.ResourceRecordSet{
|
||||||
|
Name: aws.String(fq),
|
||||||
|
Type: r53types.RRType(rt),
|
||||||
|
TTL: aws.Int64(ttl),
|
||||||
|
ResourceRecords: recs,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build marker TXT change (UPSERT)
|
// Build marker TXT change (UPSERT)
|
||||||
@@ -323,7 +373,7 @@ func applyRecord(ctx context.Context, db *gorm.DB, r53c *r53.Client, d *models.D
|
|||||||
ResourceRecordSet: &r53types.ResourceRecordSet{
|
ResourceRecordSet: &r53types.ResourceRecordSet{
|
||||||
Name: aws.String(mname),
|
Name: aws.String(mname),
|
||||||
Type: r53types.RRTypeTxt,
|
Type: r53types.RRTypeTxt,
|
||||||
TTL: aws.Int64(300),
|
TTL: aws.Int64(defaultRecordTTLSeconds),
|
||||||
ResourceRecords: []r53types.ResourceRecord{
|
ResourceRecords: []r53types.ResourceRecord{
|
||||||
{Value: aws.String(strconv.Quote(expected))},
|
{Value: aws.String(strconv.Quote(expected))},
|
||||||
},
|
},
|
||||||
@@ -337,14 +387,26 @@ func applyRecord(ctx context.Context, db *gorm.DB, r53c *r53.Client, d *models.D
|
|||||||
changes := []r53types.Change{rrChange, markerChange}
|
changes := []r53types.Change{rrChange, markerChange}
|
||||||
changes = append(changes, poisonChanges...)
|
changes = append(changes, poisonChanges...)
|
||||||
|
|
||||||
|
// Log what we are about to send
|
||||||
|
logCtx.Debug().
|
||||||
|
Interface("route53_change_batch", toLogChangeBatch(zoneID, changes)).
|
||||||
|
Msg("[dns] route53 request preview")
|
||||||
|
|
||||||
_, err = r53c.ChangeResourceRecordSets(ctx, &r53.ChangeResourceRecordSetsInput{
|
_, err = r53c.ChangeResourceRecordSets(ctx, &r53.ChangeResourceRecordSetsInput{
|
||||||
HostedZoneId: aws.String(zoneID),
|
HostedZoneId: aws.String(zoneID),
|
||||||
ChangeBatch: &r53types.ChangeBatch{Changes: changes},
|
ChangeBatch: &r53types.ChangeBatch{Changes: changes},
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
logAWSError(logCtx, err)
|
||||||
|
logCtx.Info().Dur("elapsed", time.Since(start)).Msg("[dns] apply failed")
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logCtx.Info().
|
||||||
|
Dur("elapsed", time.Since(start)).
|
||||||
|
Int("change_count", len(changes)).
|
||||||
|
Msg("[dns] apply ok")
|
||||||
|
|
||||||
// Success → mark ready & ownership
|
// Success → mark ready & ownership
|
||||||
r.Status = "ready"
|
r.Status = "ready"
|
||||||
r.LastError = ""
|
r.LastError = ""
|
||||||
@@ -352,6 +414,7 @@ func applyRecord(ctx context.Context, db *gorm.DB, r53c *r53.Client, d *models.D
|
|||||||
if err := db.Save(r).Error; err != nil {
|
if err := db.Save(r).Error; err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
_ = hasOurExact // could be used to skip marker write in future
|
_ = hasOurExact // could be used to skip marker write in future
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -568,7 +631,7 @@ func buildExternalDNSPoisonTXTChanges(fqdn, rrType string) []r53types.Change {
|
|||||||
ResourceRecordSet: &r53types.ResourceRecordSet{
|
ResourceRecordSet: &r53types.ResourceRecordSet{
|
||||||
Name: aws.String(n),
|
Name: aws.String(n),
|
||||||
Type: r53types.RRTypeTxt,
|
Type: r53types.RRTypeTxt,
|
||||||
TTL: aws.Int64(300),
|
TTL: aws.Int64(defaultRecordTTLSeconds),
|
||||||
ResourceRecords: []r53types.ResourceRecord{
|
ResourceRecords: []r53types.ResourceRecord{
|
||||||
{Value: aws.String(val)},
|
{Value: aws.String(val)},
|
||||||
},
|
},
|
||||||
@@ -595,3 +658,125 @@ func jsonUnmarshalStrict(b []byte, dst any) error {
|
|||||||
}
|
}
|
||||||
return json.Unmarshal(b, dst)
|
return json.Unmarshal(b, dst)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/************* logging DTOs & helpers *************/
|
||||||
|
|
||||||
|
type logRR struct {
|
||||||
|
Value string `json:"value"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type logRRSet struct {
|
||||||
|
Action string `json:"action"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
Type string `json:"type"`
|
||||||
|
TTL *int64 `json:"ttl,omitempty"`
|
||||||
|
Records []logRR `json:"records,omitempty"`
|
||||||
|
RecordCount int `json:"record_count"`
|
||||||
|
HasAliasTarget bool `json:"has_alias_target"`
|
||||||
|
SetIdentifier *string `json:"set_identifier,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type logChangeBatch struct {
|
||||||
|
HostedZoneID string `json:"hosted_zone_id"`
|
||||||
|
ChangeCount int `json:"change_count"`
|
||||||
|
Changes []logRRSet `json:"changes"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func truncateForLog(s string, max int) string {
|
||||||
|
s = strings.TrimSpace(s)
|
||||||
|
if max <= 0 || len(s) <= max {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
return s[:max] + "…"
|
||||||
|
}
|
||||||
|
|
||||||
|
func toLogChangeBatch(zoneID string, changes []r53types.Change) logChangeBatch {
|
||||||
|
out := logChangeBatch{
|
||||||
|
HostedZoneID: zoneID,
|
||||||
|
ChangeCount: len(changes),
|
||||||
|
Changes: make([]logRRSet, 0, len(changes)),
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, ch := range changes {
|
||||||
|
if ch.ResourceRecordSet == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
rrs := ch.ResourceRecordSet
|
||||||
|
lc := logRRSet{
|
||||||
|
Action: string(ch.Action),
|
||||||
|
Name: aws.ToString(rrs.Name),
|
||||||
|
Type: string(rrs.Type),
|
||||||
|
TTL: rrs.TTL,
|
||||||
|
HasAliasTarget: rrs.AliasTarget != nil,
|
||||||
|
SetIdentifier: rrs.SetIdentifier,
|
||||||
|
RecordCount: len(rrs.ResourceRecords),
|
||||||
|
Records: make([]logRR, 0, min(len(rrs.ResourceRecords), 5)),
|
||||||
|
}
|
||||||
|
|
||||||
|
// Log up to first 5 values (truncate each) to avoid log bloat / secrets
|
||||||
|
for i, rr := range rrs.ResourceRecords {
|
||||||
|
if i >= 5 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
lc.Records = append(lc.Records, logRR{Value: truncateForLog(aws.ToString(rr.Value), 160)})
|
||||||
|
}
|
||||||
|
|
||||||
|
out.Changes = append(out.Changes, lc)
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
func min(a, b int) int {
|
||||||
|
if a < b {
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
// logAWSError extracts useful smithy/HTTP metadata (status code + request id + api code) into logs.
|
||||||
|
// logAWSError extracts useful smithy/HTTP metadata (status code + request id + api code) into logs.
|
||||||
|
func logAWSError(l zerolog.Logger, err error) {
|
||||||
|
// Add operation context if present
|
||||||
|
var opErr *smithy.OperationError
|
||||||
|
if errors.As(err, &opErr) {
|
||||||
|
l = l.With().
|
||||||
|
Str("aws_service", opErr.ServiceID).
|
||||||
|
Str("aws_operation", opErr.OperationName).
|
||||||
|
Logger()
|
||||||
|
err = opErr.Unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
// HTTP status + request id (smithy-go transport/http)
|
||||||
|
var re *smithyhttp.ResponseError
|
||||||
|
if errors.As(err, &re) {
|
||||||
|
status := re.HTTPStatusCode()
|
||||||
|
|
||||||
|
reqID := ""
|
||||||
|
if resp := re.HTTPResponse(); resp != nil && resp.Header != nil {
|
||||||
|
reqID = resp.Header.Get("x-amzn-RequestId")
|
||||||
|
if reqID == "" {
|
||||||
|
reqID = resp.Header.Get("x-amz-request-id")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ev := l.Error().Int("http_status", status).Err(err)
|
||||||
|
if reqID != "" {
|
||||||
|
ev = ev.Str("aws_request_id", reqID)
|
||||||
|
}
|
||||||
|
ev.Msg("[dns] aws route53 call failed")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// API error code/message (best-effort)
|
||||||
|
var apiErr smithy.APIError
|
||||||
|
if errors.As(err, &apiErr) {
|
||||||
|
l.Error().
|
||||||
|
Str("aws_error_code", apiErr.ErrorCode()).
|
||||||
|
Str("aws_error_message", apiErr.ErrorMessage()).
|
||||||
|
Err(err).
|
||||||
|
Msg("[dns] aws route53 api error")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
l.Error().Err(err).Msg("[dns] aws route53 error")
|
||||||
|
}
|
||||||
|
|||||||
@@ -503,6 +503,51 @@ func ListRecordSets(db *gorm.DB) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// GetRecordSet godoc
|
||||||
|
//
|
||||||
|
// @ID GetRecordSet
|
||||||
|
// @Summary Get a record set (org scoped)
|
||||||
|
// @Tags DNS
|
||||||
|
// @Produce json
|
||||||
|
// @Param X-Org-ID header string false "Organization UUID"
|
||||||
|
// @Param id path string true "Record Set ID (UUID)"
|
||||||
|
// @Success 200 {object} dto.RecordSetResponse
|
||||||
|
// @Failure 403 {string} string "organization required"
|
||||||
|
// @Failure 404 {string} string "not found"
|
||||||
|
// @Router /dns/records/{id} [get]
|
||||||
|
func GetRecordSet(db *gorm.DB) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
orgID, ok := httpmiddleware.OrgIDFrom(r.Context())
|
||||||
|
if !ok {
|
||||||
|
utils.WriteError(w, http.StatusForbidden, "org_required", "specify X-Org-ID")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
id, err := uuid.Parse(chi.URLParam(r, "id"))
|
||||||
|
if err != nil {
|
||||||
|
utils.WriteError(w, http.StatusBadRequest, "bad_id", "invalid UUID")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
var row models.RecordSet
|
||||||
|
if err := db.
|
||||||
|
Joins("Domain").
|
||||||
|
Where(`record_sets.id = ? AND "Domain"."organization_id" = ?`, id, orgID).
|
||||||
|
First(&row).Error; err != nil {
|
||||||
|
|
||||||
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||||
|
utils.WriteError(w, http.StatusNotFound, "not_found", "record set not found")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
utils.WriteError(w, http.StatusInternalServerError, "db_error", err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
utils.WriteJSON(w, http.StatusOK, recordOut(&row))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// CreateRecordSet godoc
|
// CreateRecordSet godoc
|
||||||
//
|
//
|
||||||
// @ID CreateRecordSet
|
// @ID CreateRecordSet
|
||||||
|
|||||||
@@ -46,7 +46,7 @@
|
|||||||
"date-fns": "^4.1.0",
|
"date-fns": "^4.1.0",
|
||||||
"embla-carousel-react": "^8.6.0",
|
"embla-carousel-react": "^8.6.0",
|
||||||
"input-otp": "^1.4.2",
|
"input-otp": "^1.4.2",
|
||||||
"lucide-react": "^0.561.0",
|
"lucide-react": "^0.562.0",
|
||||||
"motion": "^12.23.26",
|
"motion": "^12.23.26",
|
||||||
"next-themes": "^0.4.6",
|
"next-themes": "^0.4.6",
|
||||||
"rapidoc": "^9.3.8",
|
"rapidoc": "^9.3.8",
|
||||||
@@ -67,20 +67,20 @@
|
|||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@eslint/js": "9.39.2",
|
"@eslint/js": "9.39.2",
|
||||||
"@ianvs/prettier-plugin-sort-imports": "4.7.0",
|
"@ianvs/prettier-plugin-sort-imports": "4.7.0",
|
||||||
"@types/node": "25.0.1",
|
"@types/node": "25.0.3",
|
||||||
"@types/react": "19.2.7",
|
"@types/react": "19.2.7",
|
||||||
"@types/react-dom": "19.2.3",
|
"@types/react-dom": "19.2.3",
|
||||||
"@vitejs/plugin-react": "5.1.2",
|
"@vitejs/plugin-react": "5.1.2",
|
||||||
"eslint": "9.39.2",
|
"eslint": "9.39.2",
|
||||||
"eslint-plugin-react-hooks": "7.0.1",
|
"eslint-plugin-react-hooks": "7.0.1",
|
||||||
"eslint-plugin-react-refresh": "0.4.24",
|
"eslint-plugin-react-refresh": "0.4.26",
|
||||||
"globals": "16.5.0",
|
"globals": "16.5.0",
|
||||||
"prettier": "3.7.4",
|
"prettier": "3.7.4",
|
||||||
"prettier-plugin-tailwindcss": "0.7.2",
|
"prettier-plugin-tailwindcss": "0.7.2",
|
||||||
"shadcn": "3.6.0",
|
"shadcn": "3.6.2",
|
||||||
"tw-animate-css": "1.4.0",
|
"tw-animate-css": "1.4.0",
|
||||||
"typescript": "5.9.3",
|
"typescript": "5.9.3",
|
||||||
"typescript-eslint": "8.50.0",
|
"typescript-eslint": "8.50.0",
|
||||||
"vite": "7.2.7"
|
"vite": "7.3.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -946,13 +946,12 @@ export const ClustersPage = () => {
|
|||||||
|
|
||||||
{/* Configure dialog (attachments + kubeconfig + node pools + actions/runs) */}
|
{/* Configure dialog (attachments + kubeconfig + node pools + actions/runs) */}
|
||||||
<Dialog open={!!configCluster} onOpenChange={(open) => !open && setConfigCluster(null)}>
|
<Dialog open={!!configCluster} onOpenChange={(open) => !open && setConfigCluster(null)}>
|
||||||
<DialogContent className="max-h-[90vh] w-full max-w-3xl overflow-y-auto">
|
<DialogContent className="max-h-[90vh] overflow-y-auto sm:max-w-2xl lg:max-w-250 ">
|
||||||
<DialogHeader>
|
<DialogHeader>
|
||||||
<DialogTitle>
|
<DialogTitle>
|
||||||
Configure Cluster{configCluster?.name ? `: ${configCluster.name}` : ""}
|
Configure Cluster{configCluster?.name ? `: ${configCluster.name}` : ""}
|
||||||
</DialogTitle>
|
</DialogTitle>
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
|
|
||||||
{configCluster && (
|
{configCluster && (
|
||||||
<div className="space-y-6 py-2">
|
<div className="space-y-6 py-2">
|
||||||
{/* Cluster Actions */}
|
{/* Cluster Actions */}
|
||||||
|
|||||||
310
ui/yarn.lock
310
ui/yarn.lock
@@ -332,135 +332,135 @@
|
|||||||
dependencies:
|
dependencies:
|
||||||
tslib "^2.4.0"
|
tslib "^2.4.0"
|
||||||
|
|
||||||
"@esbuild/aix-ppc64@0.25.12":
|
"@esbuild/aix-ppc64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz#80fcbe36130e58b7670511e888b8e88a259ed76c"
|
resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz#521cbd968dcf362094034947f76fa1b18d2d403c"
|
||||||
integrity sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==
|
integrity sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==
|
||||||
|
|
||||||
"@esbuild/android-arm64@0.25.12":
|
"@esbuild/android-arm64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz#8aa4965f8d0a7982dc21734bf6601323a66da752"
|
resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz#61ea550962d8aa12a9b33194394e007657a6df57"
|
||||||
integrity sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==
|
integrity sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==
|
||||||
|
|
||||||
"@esbuild/android-arm@0.25.12":
|
"@esbuild/android-arm@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.25.12.tgz#300712101f7f50f1d2627a162e6e09b109b6767a"
|
resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.27.2.tgz#554887821e009dd6d853f972fde6c5143f1de142"
|
||||||
integrity sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==
|
integrity sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==
|
||||||
|
|
||||||
"@esbuild/android-x64@0.25.12":
|
"@esbuild/android-x64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.25.12.tgz#87dfb27161202bdc958ef48bb61b09c758faee16"
|
resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.27.2.tgz#a7ce9d0721825fc578f9292a76d9e53334480ba2"
|
||||||
integrity sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==
|
integrity sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==
|
||||||
|
|
||||||
"@esbuild/darwin-arm64@0.25.12":
|
"@esbuild/darwin-arm64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz#79197898ec1ff745d21c071e1c7cc3c802f0c1fd"
|
resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz#2cb7659bd5d109803c593cfc414450d5430c8256"
|
||||||
integrity sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==
|
integrity sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==
|
||||||
|
|
||||||
"@esbuild/darwin-x64@0.25.12":
|
"@esbuild/darwin-x64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz#146400a8562133f45c4d2eadcf37ddd09718079e"
|
resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz#e741fa6b1abb0cd0364126ba34ca17fd5e7bf509"
|
||||||
integrity sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==
|
integrity sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==
|
||||||
|
|
||||||
"@esbuild/freebsd-arm64@0.25.12":
|
"@esbuild/freebsd-arm64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz#1c5f9ba7206e158fd2b24c59fa2d2c8bb47ca0fe"
|
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz#2b64e7116865ca172d4ce034114c21f3c93e397c"
|
||||||
integrity sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==
|
integrity sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==
|
||||||
|
|
||||||
"@esbuild/freebsd-x64@0.25.12":
|
"@esbuild/freebsd-x64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz#ea631f4a36beaac4b9279fa0fcc6ca29eaeeb2b3"
|
resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz#e5252551e66f499e4934efb611812f3820e990bb"
|
||||||
integrity sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==
|
integrity sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==
|
||||||
|
|
||||||
"@esbuild/linux-arm64@0.25.12":
|
"@esbuild/linux-arm64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz#e1066bce58394f1b1141deec8557a5f0a22f5977"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz#dc4acf235531cd6984f5d6c3b13dbfb7ddb303cb"
|
||||||
integrity sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==
|
integrity sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==
|
||||||
|
|
||||||
"@esbuild/linux-arm@0.25.12":
|
"@esbuild/linux-arm@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz#452cd66b20932d08bdc53a8b61c0e30baf4348b9"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz#56a900e39240d7d5d1d273bc053daa295c92e322"
|
||||||
integrity sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==
|
integrity sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==
|
||||||
|
|
||||||
"@esbuild/linux-ia32@0.25.12":
|
"@esbuild/linux-ia32@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz#b24f8acc45bcf54192c7f2f3be1b53e6551eafe0"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz#d4a36d473360f6870efcd19d52bbfff59a2ed1cc"
|
||||||
integrity sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==
|
integrity sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==
|
||||||
|
|
||||||
"@esbuild/linux-loong64@0.25.12":
|
"@esbuild/linux-loong64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz#f9cfffa7fc8322571fbc4c8b3268caf15bd81ad0"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz#fcf0ab8c3eaaf45891d0195d4961cb18b579716a"
|
||||||
integrity sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==
|
integrity sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==
|
||||||
|
|
||||||
"@esbuild/linux-mips64el@0.25.12":
|
"@esbuild/linux-mips64el@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz#575a14bd74644ffab891adc7d7e60d275296f2cd"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz#598b67d34048bb7ee1901cb12e2a0a434c381c10"
|
||||||
integrity sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==
|
integrity sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==
|
||||||
|
|
||||||
"@esbuild/linux-ppc64@0.25.12":
|
"@esbuild/linux-ppc64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz#75b99c70a95fbd5f7739d7692befe60601591869"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz#3846c5df6b2016dab9bc95dde26c40f11e43b4c0"
|
||||||
integrity sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==
|
integrity sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==
|
||||||
|
|
||||||
"@esbuild/linux-riscv64@0.25.12":
|
"@esbuild/linux-riscv64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz#2e3259440321a44e79ddf7535c325057da875cd6"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz#173d4475b37c8d2c3e1707e068c174bb3f53d07d"
|
||||||
integrity sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==
|
integrity sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==
|
||||||
|
|
||||||
"@esbuild/linux-s390x@0.25.12":
|
"@esbuild/linux-s390x@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz#17676cabbfe5928da5b2a0d6df5d58cd08db2663"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz#f7a4790105edcab8a5a31df26fbfac1aa3dacfab"
|
||||||
integrity sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==
|
integrity sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==
|
||||||
|
|
||||||
"@esbuild/linux-x64@0.25.12":
|
"@esbuild/linux-x64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz#0583775685ca82066d04c3507f09524d3cd7a306"
|
resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz#2ecc1284b1904aeb41e54c9ddc7fcd349b18f650"
|
||||||
integrity sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==
|
integrity sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==
|
||||||
|
|
||||||
"@esbuild/netbsd-arm64@0.25.12":
|
"@esbuild/netbsd-arm64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz#f04c4049cb2e252fe96b16fed90f70746b13f4a4"
|
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz#e2863c2cd1501845995cb11adf26f7fe4be527b0"
|
||||||
integrity sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==
|
integrity sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==
|
||||||
|
|
||||||
"@esbuild/netbsd-x64@0.25.12":
|
"@esbuild/netbsd-x64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz#77da0d0a0d826d7c921eea3d40292548b258a076"
|
resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz#93f7609e2885d1c0b5a1417885fba8d1fcc41272"
|
||||||
integrity sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==
|
integrity sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==
|
||||||
|
|
||||||
"@esbuild/openbsd-arm64@0.25.12":
|
"@esbuild/openbsd-arm64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz#6296f5867aedef28a81b22ab2009c786a952dccd"
|
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz#a1985604a203cdc325fd47542e106fafd698f02e"
|
||||||
integrity sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==
|
integrity sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==
|
||||||
|
|
||||||
"@esbuild/openbsd-x64@0.25.12":
|
"@esbuild/openbsd-x64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz#f8d23303360e27b16cf065b23bbff43c14142679"
|
resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz#8209e46c42f1ffbe6e4ef77a32e1f47d404ad42a"
|
||||||
integrity sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==
|
integrity sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==
|
||||||
|
|
||||||
"@esbuild/openharmony-arm64@0.25.12":
|
"@esbuild/openharmony-arm64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz#49e0b768744a3924be0d7fd97dd6ce9b2923d88d"
|
resolved "https://registry.yarnpkg.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz#8fade4441893d9cc44cbd7dcf3776f508ab6fb2f"
|
||||||
integrity sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==
|
integrity sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==
|
||||||
|
|
||||||
"@esbuild/sunos-x64@0.25.12":
|
"@esbuild/sunos-x64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz#a6ed7d6778d67e528c81fb165b23f4911b9b13d6"
|
resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz#980d4b9703a16f0f07016632424fc6d9a789dfc2"
|
||||||
integrity sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==
|
integrity sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==
|
||||||
|
|
||||||
"@esbuild/win32-arm64@0.25.12":
|
"@esbuild/win32-arm64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz#9ac14c378e1b653af17d08e7d3ce34caef587323"
|
resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz#1c09a3633c949ead3d808ba37276883e71f6111a"
|
||||||
integrity sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==
|
integrity sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==
|
||||||
|
|
||||||
"@esbuild/win32-ia32@0.25.12":
|
"@esbuild/win32-ia32@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz#918942dcbbb35cc14fca39afb91b5e6a3d127267"
|
resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz#1b1e3a63ad4bef82200fef4e369e0fff7009eee5"
|
||||||
integrity sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==
|
integrity sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==
|
||||||
|
|
||||||
"@esbuild/win32-x64@0.25.12":
|
"@esbuild/win32-x64@0.27.2":
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz#9bdad8176be7811ad148d1f8772359041f46c6c5"
|
resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz#9e585ab6086bef994c6e8a5b3a0481219ada862b"
|
||||||
integrity sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==
|
integrity sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==
|
||||||
|
|
||||||
"@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0":
|
"@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0":
|
||||||
version "4.9.0"
|
version "4.9.0"
|
||||||
@@ -2247,10 +2247,10 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
|
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841"
|
||||||
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
|
integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==
|
||||||
|
|
||||||
"@types/node@25.0.1":
|
"@types/node@25.0.3":
|
||||||
version "25.0.1"
|
version "25.0.3"
|
||||||
resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.1.tgz#9c41c277a1b16491174497cd075f8de7c27a1ac4"
|
resolved "https://registry.yarnpkg.com/@types/node/-/node-25.0.3.tgz#79b9ac8318f373fbfaaf6e2784893efa9701f269"
|
||||||
integrity sha512-czWPzKIAXucn9PtsttxmumiQ9N0ok9FrBwgRWrwmVLlp86BrMExzvXRLFYRJ+Ex3g6yqj+KuaxfX1JTgV2lpfg==
|
integrity sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA==
|
||||||
dependencies:
|
dependencies:
|
||||||
undici-types "~7.16.0"
|
undici-types "~7.16.0"
|
||||||
|
|
||||||
@@ -3080,37 +3080,37 @@ es-set-tostringtag@^2.1.0:
|
|||||||
has-tostringtag "^1.0.2"
|
has-tostringtag "^1.0.2"
|
||||||
hasown "^2.0.2"
|
hasown "^2.0.2"
|
||||||
|
|
||||||
esbuild@^0.25.0:
|
esbuild@^0.27.0:
|
||||||
version "0.25.12"
|
version "0.27.2"
|
||||||
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.25.12.tgz#97a1d041f4ab00c2fce2f838d2b9969a2d2a97a5"
|
resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.27.2.tgz#d83ed2154d5813a5367376bb2292a9296fc83717"
|
||||||
integrity sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==
|
integrity sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==
|
||||||
optionalDependencies:
|
optionalDependencies:
|
||||||
"@esbuild/aix-ppc64" "0.25.12"
|
"@esbuild/aix-ppc64" "0.27.2"
|
||||||
"@esbuild/android-arm" "0.25.12"
|
"@esbuild/android-arm" "0.27.2"
|
||||||
"@esbuild/android-arm64" "0.25.12"
|
"@esbuild/android-arm64" "0.27.2"
|
||||||
"@esbuild/android-x64" "0.25.12"
|
"@esbuild/android-x64" "0.27.2"
|
||||||
"@esbuild/darwin-arm64" "0.25.12"
|
"@esbuild/darwin-arm64" "0.27.2"
|
||||||
"@esbuild/darwin-x64" "0.25.12"
|
"@esbuild/darwin-x64" "0.27.2"
|
||||||
"@esbuild/freebsd-arm64" "0.25.12"
|
"@esbuild/freebsd-arm64" "0.27.2"
|
||||||
"@esbuild/freebsd-x64" "0.25.12"
|
"@esbuild/freebsd-x64" "0.27.2"
|
||||||
"@esbuild/linux-arm" "0.25.12"
|
"@esbuild/linux-arm" "0.27.2"
|
||||||
"@esbuild/linux-arm64" "0.25.12"
|
"@esbuild/linux-arm64" "0.27.2"
|
||||||
"@esbuild/linux-ia32" "0.25.12"
|
"@esbuild/linux-ia32" "0.27.2"
|
||||||
"@esbuild/linux-loong64" "0.25.12"
|
"@esbuild/linux-loong64" "0.27.2"
|
||||||
"@esbuild/linux-mips64el" "0.25.12"
|
"@esbuild/linux-mips64el" "0.27.2"
|
||||||
"@esbuild/linux-ppc64" "0.25.12"
|
"@esbuild/linux-ppc64" "0.27.2"
|
||||||
"@esbuild/linux-riscv64" "0.25.12"
|
"@esbuild/linux-riscv64" "0.27.2"
|
||||||
"@esbuild/linux-s390x" "0.25.12"
|
"@esbuild/linux-s390x" "0.27.2"
|
||||||
"@esbuild/linux-x64" "0.25.12"
|
"@esbuild/linux-x64" "0.27.2"
|
||||||
"@esbuild/netbsd-arm64" "0.25.12"
|
"@esbuild/netbsd-arm64" "0.27.2"
|
||||||
"@esbuild/netbsd-x64" "0.25.12"
|
"@esbuild/netbsd-x64" "0.27.2"
|
||||||
"@esbuild/openbsd-arm64" "0.25.12"
|
"@esbuild/openbsd-arm64" "0.27.2"
|
||||||
"@esbuild/openbsd-x64" "0.25.12"
|
"@esbuild/openbsd-x64" "0.27.2"
|
||||||
"@esbuild/openharmony-arm64" "0.25.12"
|
"@esbuild/openharmony-arm64" "0.27.2"
|
||||||
"@esbuild/sunos-x64" "0.25.12"
|
"@esbuild/sunos-x64" "0.27.2"
|
||||||
"@esbuild/win32-arm64" "0.25.12"
|
"@esbuild/win32-arm64" "0.27.2"
|
||||||
"@esbuild/win32-ia32" "0.25.12"
|
"@esbuild/win32-ia32" "0.27.2"
|
||||||
"@esbuild/win32-x64" "0.25.12"
|
"@esbuild/win32-x64" "0.27.2"
|
||||||
|
|
||||||
escalade@^3.1.1, escalade@^3.2.0:
|
escalade@^3.1.1, escalade@^3.2.0:
|
||||||
version "3.2.0"
|
version "3.2.0"
|
||||||
@@ -3138,10 +3138,10 @@ eslint-plugin-react-hooks@7.0.1:
|
|||||||
zod "^3.25.0 || ^4.0.0"
|
zod "^3.25.0 || ^4.0.0"
|
||||||
zod-validation-error "^3.5.0 || ^4.0.0"
|
zod-validation-error "^3.5.0 || ^4.0.0"
|
||||||
|
|
||||||
eslint-plugin-react-refresh@0.4.24:
|
eslint-plugin-react-refresh@0.4.26:
|
||||||
version "0.4.24"
|
version "0.4.26"
|
||||||
resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.24.tgz#6914e8757eb7d7ccc3efb9dbcc8a51feda71d89e"
|
resolved "https://registry.yarnpkg.com/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.26.tgz#2bcdd109ea9fb4e0b56bb1b5146cf8841b21b626"
|
||||||
integrity sha512-nLHIW7TEq3aLrEYWpVaJ1dRgFR+wLDPN8e8FpYAql/bMV2oBEfC37K0gLEGgv9fy66juNShSMV8OkTqzltcG/w==
|
integrity sha512-1RETEylht2O6FM/MvgnyvT+8K21wLqDNg4qD51Zj3guhjt433XbnnkVttHMyaVyAFD03QSV4LPS5iE3VQmO7XQ==
|
||||||
|
|
||||||
eslint-scope@^8.4.0:
|
eslint-scope@^8.4.0:
|
||||||
version "8.4.0"
|
version "8.4.0"
|
||||||
@@ -4095,10 +4095,10 @@ lru-cache@^5.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
yallist "^3.0.2"
|
yallist "^3.0.2"
|
||||||
|
|
||||||
lucide-react@^0.561.0:
|
lucide-react@^0.562.0:
|
||||||
version "0.561.0"
|
version "0.562.0"
|
||||||
resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.561.0.tgz#8eb440395cf01b27da9c65cb014eb2c71f77e656"
|
resolved "https://registry.yarnpkg.com/lucide-react/-/lucide-react-0.562.0.tgz#217796c2f57624f012b484ea7f08505067c90d51"
|
||||||
integrity sha512-Y59gMY38tl4/i0qewcqohPdEbieBy7SovpBL9IFebhc2mDd8x4PZSOsiFRkpPcOq6bj1r/mjH/Rk73gSlIJP2A==
|
integrity sha512-82hOAu7y0dbVuFfmO4bYF1XEwYk/mEbM5E+b1jgci/udUBEE/R7LF5Ip0CCEmXe8AybRM8L+04eP+LGZeDvkiw==
|
||||||
|
|
||||||
magic-string@^0.30.21:
|
magic-string@^0.30.21:
|
||||||
version "0.30.21"
|
version "0.30.21"
|
||||||
@@ -4998,10 +4998,10 @@ setprototypeof@~1.2.0:
|
|||||||
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
|
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
|
||||||
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
|
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
|
||||||
|
|
||||||
shadcn@3.6.0:
|
shadcn@3.6.2:
|
||||||
version "3.6.0"
|
version "3.6.2"
|
||||||
resolved "https://registry.yarnpkg.com/shadcn/-/shadcn-3.6.0.tgz#bc5216bcc79c1bc5d8893838c7034c68be157733"
|
resolved "https://registry.yarnpkg.com/shadcn/-/shadcn-3.6.2.tgz#f784a21a67e0f97de27af3644ef82089b4627c54"
|
||||||
integrity sha512-6uXnm38JWRtVHnULsTxV3J1IUsI1efZM5qqKhab1j32IFxAhKWIOoIFwtjrMYRgtcBrKwPXKaVfyhs1JPHRXpA==
|
integrity sha512-2g48/7UsXTSWMFU9GYww85AN5iVTkErbeycrcleI55R+atqW8HE1M/YDFyQ+0T3Bwsd4e8vycPu9gmwODunDpw==
|
||||||
dependencies:
|
dependencies:
|
||||||
"@antfu/ni" "^25.0.0"
|
"@antfu/ni" "^25.0.0"
|
||||||
"@babel/core" "^7.28.0"
|
"@babel/core" "^7.28.0"
|
||||||
@@ -5512,12 +5512,12 @@ victory-vendor@^36.6.8:
|
|||||||
d3-time "^3.0.0"
|
d3-time "^3.0.0"
|
||||||
d3-timer "^3.0.1"
|
d3-timer "^3.0.1"
|
||||||
|
|
||||||
vite@7.2.7:
|
vite@7.3.0:
|
||||||
version "7.2.7"
|
version "7.3.0"
|
||||||
resolved "https://registry.yarnpkg.com/vite/-/vite-7.2.7.tgz#0789a4c3206081699f34a9ecca2dda594a07478e"
|
resolved "https://registry.yarnpkg.com/vite/-/vite-7.3.0.tgz#066c7a835993a66e82004eac3e185d0d157fd658"
|
||||||
integrity sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==
|
integrity sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==
|
||||||
dependencies:
|
dependencies:
|
||||||
esbuild "^0.25.0"
|
esbuild "^0.27.0"
|
||||||
fdir "^6.5.0"
|
fdir "^6.5.0"
|
||||||
picomatch "^4.0.3"
|
picomatch "^4.0.3"
|
||||||
postcss "^8.5.6"
|
postcss "^8.5.6"
|
||||||
|
|||||||
Reference in New Issue
Block a user