From 752fc72d6c5591a4fe00af140dccaecef5551034 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Fri, 22 Aug 2025 14:53:04 +0800 Subject: [PATCH 1/8] chore(deps): upgrade gomod dependencies --- go.mod | 94 +++++++++++++++++++++++++------------------------- go.sum | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+), 46 deletions(-) diff --git a/go.mod b/go.mod index 45b8da3dc..6b7fcba96 100644 --- a/go.mod +++ b/go.mod @@ -5,8 +5,8 @@ go 1.24.0 toolchain go1.24.3 require ( - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.2 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.11.0 github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azcertificates v1.4.0 github.com/Edgio/edgio-api v0.0.0-workspace github.com/G-Core/gcorelabscdn-go v1.0.32 @@ -14,9 +14,9 @@ require ( github.com/alibabacloud-go/apig-20240327/v3 v3.2.2 github.com/alibabacloud-go/cas-20200407/v3 v3.0.4 github.com/alibabacloud-go/cdn-20180510/v5 v5.2.2 - github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.6 - github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.9 - github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.1 + github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.7 + github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.11 + github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.2 github.com/alibabacloud-go/esa-20240910/v2 v2.36.0 github.com/alibabacloud-go/fc-20230330/v4 v4.3.6 github.com/alibabacloud-go/fc-open-20210406/v2 v2.0.12 @@ -24,21 +24,21 @@ require ( github.com/alibabacloud-go/live-20161101 v1.1.1 github.com/alibabacloud-go/nlb-20220430/v2 v2.0.3 github.com/alibabacloud-go/slb-20140515/v4 v4.0.10 - github.com/alibabacloud-go/tea v1.3.10 - github.com/alibabacloud-go/vod-20170321/v4 v4.8.4 + github.com/alibabacloud-go/tea v1.3.11 + github.com/alibabacloud-go/vod-20170321/v4 v4.9.2 github.com/alibabacloud-go/waf-openapi-20211001/v5 v5.6.0 github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible - github.com/aws/aws-sdk-go-v2/service/acm v1.33.1 - github.com/aws/aws-sdk-go-v2/service/cloudfront v1.47.0 - github.com/aws/aws-sdk-go-v2/service/iam v1.43.1 - github.com/baidubce/bce-sdk-go v0.9.235 + github.com/aws/aws-sdk-go-v2/service/acm v1.36.0 + github.com/aws/aws-sdk-go-v2/service/cloudfront v1.50.0 + github.com/aws/aws-sdk-go-v2/service/iam v1.47.1 + github.com/baidubce/bce-sdk-go v0.9.240 github.com/blinkbean/dingtalk v1.1.3 github.com/byteplus-sdk/byteplus-sdk-golang v1.0.53 - github.com/go-acme/lego/v4 v4.25.1 + github.com/go-acme/lego/v4 v4.25.2 github.com/go-lark/lark v1.16.0 github.com/go-resty/resty/v2 v2.16.5 github.com/go-viper/mapstructure/v2 v2.4.0 - github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.159 + github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.163 github.com/jdcloud-api/jdcloud-sdk-go v1.64.0 github.com/kong/go-kong v0.67.0 github.com/libdns/dynv6 v1.0.0 @@ -47,36 +47,36 @@ require ( github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0 github.com/pkg/sftp v1.13.9 github.com/pocketbase/dbx v1.11.0 - github.com/pocketbase/pocketbase v0.29.0 + github.com/pocketbase/pocketbase v0.29.2 github.com/povsister/scp v0.0.0-20250701154629-777cf82de5df github.com/qiniu/go-sdk/v7 v7.25.4 github.com/samber/lo v1.51.0 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1207 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1212 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1213 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.1.5 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.1.14 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.14 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap v1.0.1200 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.0.1208 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.1209 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.1211 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1212 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.1210 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1213 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.1.3 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.1.0 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.1.10 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.1.7 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.1.13 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.1.11 github.com/ucloud/ucloud-sdk-go v0.22.45 - github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.18 - github.com/volcengine/volc-sdk-golang v1.0.216 - github.com/volcengine/volcengine-go-sdk v1.1.23 + github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.21 + github.com/volcengine/volc-sdk-golang v1.0.217 + github.com/volcengine/volcengine-go-sdk v1.1.28 gitlab.ecloud.com/ecloud/ecloudsdkclouddns v1.0.1 gitlab.ecloud.com/ecloud/ecloudsdkcore v1.0.0 - golang.org/x/crypto v0.40.0 - golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 - k8s.io/api v0.33.3 - k8s.io/apimachinery v0.33.3 - k8s.io/client-go v0.33.3 + golang.org/x/crypto v0.41.0 + golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b + k8s.io/api v0.33.4 + k8s.io/apimachinery v0.33.4 + k8s.io/client-go v0.33.4 software.sslmate.com/src/go-pkcs12 v0.6.0 ) require ( - github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.3.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.9.0 // indirect @@ -105,9 +105,10 @@ require ( github.com/go-playground/universal-translator v0.18.1 // indirect github.com/go-playground/validator/v10 v10.23.0 // indirect github.com/go-sql-driver/mysql v1.8.1 // indirect + github.com/goccy/go-yaml v1.9.8 // indirect github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v5 v5.2.3 // indirect + github.com/golang-jwt/jwt/v5 v5.3.0 // indirect github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-cmp v0.7.0 // indirect github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect @@ -140,6 +141,7 @@ require ( github.com/x448/float16 v0.8.4 // indirect go.mongodb.org/mongo-driver v1.17.2 // indirect go.yaml.in/yaml/v2 v2.4.2 // indirect + golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ns1/ns1-go.v2 v2.14.4 // indirect @@ -164,19 +166,19 @@ require ( github.com/alibabacloud-go/tea-xml v1.1.3 // indirect github.com/aliyun/credentials-go v1.4.6 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go-v2 v1.36.6 + github.com/aws/aws-sdk-go-v2 v1.38.1 github.com/aws/aws-sdk-go-v2/config v1.29.18 github.com/aws/aws-sdk-go-v2/credentials v1.17.71 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.4 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.4 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.25.6 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.4 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.34.1 // indirect - github.com/aws/smithy-go v1.22.4 // indirect + github.com/aws/smithy-go v1.22.5 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/clbanning/mxj/v2 v2.7.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect @@ -192,7 +194,7 @@ require ( github.com/google/uuid v1.6.0 github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect - github.com/json-iterator/go v1.1.12 // indirect + github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 // indirect github.com/kr/fs v0.1.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect @@ -207,22 +209,22 @@ require ( github.com/spf13/pflag v1.0.7 // indirect github.com/tjfoc/gmsm v1.4.1 // indirect golang.org/x/image v0.29.0 // indirect - golang.org/x/mod v0.26.0 // indirect - golang.org/x/net v0.42.0 // indirect + golang.org/x/mod v0.27.0 // indirect + golang.org/x/net v0.43.0 // indirect golang.org/x/oauth2 v0.30.0 // indirect golang.org/x/sync v0.16.0 - golang.org/x/sys v0.34.0 // indirect - golang.org/x/term v0.33.0 // indirect - golang.org/x/text v0.27.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/term v0.34.0 // indirect + golang.org/x/text v0.28.0 // indirect golang.org/x/time v0.12.0 - golang.org/x/tools v0.35.0 // indirect + golang.org/x/tools v0.36.0 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - modernc.org/libc v1.65.10 // indirect + modernc.org/libc v1.66.3 // indirect modernc.org/mathutil v1.7.1 // indirect modernc.org/memory v1.11.0 // indirect - modernc.org/sqlite v1.38.0 // indirect + modernc.org/sqlite v1.38.2 // indirect ) replace github.com/Edgio/edgio-api v0.0.0-workspace => ./pkg/forks/github.com/Edgio/edgio-api@v0.0.0-workspace diff --git a/go.sum b/go.sum index 7a24655e2..9d0dce11e 100644 --- a/go.sum +++ b/go.sum @@ -36,12 +36,18 @@ filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4 github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1 h1:Wc1ml6QlJs2BHQ/9Bqu1jiyggbsSjramq2oUmp5WeIo= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.2 h1:Hr5FTipp7SL07o2FvoVOX9HRiRH3CR3Mj8pxqCcdD5A= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.2/go.mod h1:QyVsSSN64v5TGltphKLQ2sQxe4OBQg0J1eKRcVBnfgE= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1/go.mod h1:JdM5psgjfBf5fo2uWOZhflPWyDBZ/O/CNAH9CtsuZE4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.11.0 h1:MhRfI58HblXzCtWEZCO0feHs8LweePB3s90r7WaR1KU= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.11.0/go.mod h1:okZ+ZURbArNdlJ+ptXoyHNuOETzOl1Oww19rm8I2WLA= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2 h1:9iefClla7iYpfYWdzPCRDozdmndjTm8DXdpCzPajMgA= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.2/go.mod h1:XtLgD3ZD34DAaVIIAyG3objl5DynM3CQ/vMcbBNJZGI= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 h1:lpOxwrQ919lCZoNCd69rVt8u1eLZuMORrGXqy8sNf3c= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0/go.mod h1:fSvRkb8d26z9dbL40Uf/OO6Vo9iExtZK3D0ulRV+8M0= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v3 v3.1.0 h1:2qsIIvxVT+uE6yrNldntJKlLRgxGbZ85kgtz5SNBhMw= @@ -102,6 +108,8 @@ github.com/alibabacloud-go/cdn-20180510/v5 v5.2.2 h1:+KJOPukTM+xMyiLOW5qBwYKG2df github.com/alibabacloud-go/cdn-20180510/v5 v5.2.2/go.mod h1:GnPiPL3HlzCi8SGiLiVgKrAFkP1vTtcF4yGtjsl4wfo= github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.6 h1:0NB4hiiqqF7etZ7WgsaO7fkaj79pEMGEUeb74ZGPRKE= github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.6/go.mod h1:5bdtTnhDmV4jXyIinHY15bJrUl8TwMIhrICNQBy+MD8= +github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.7 h1:+NCbioja/R33VQdqA35X7AVuYrpkCZ6uDVQ+j1GkSjY= +github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.7/go.mod h1:6fBf26RoBBpSq3dMPro5UnOw34+dk5PnikcynJX9opU= github.com/alibabacloud-go/darabonba-array v0.1.0 h1:vR8s7b1fWAQIjEjWnuF0JiKsCvclSRTfDzZHTYqfufY= github.com/alibabacloud-go/darabonba-array v0.1.0/go.mod h1:BLKxr0brnggqOJPqT09DFJ8g3fsDshapUD3C3aOEFaI= github.com/alibabacloud-go/darabonba-encode-util v0.0.2 h1:1uJGrbsGEVqWcWxrS9MyC2NG0Ax+GpOM5gtupki31XE= @@ -117,6 +125,8 @@ github.com/alibabacloud-go/darabonba-openapi/v2 v2.0.11/go.mod h1:wHxkgZT1ClZdcw github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.8/go.mod h1:d+z3ScRqc7PFzg4h9oqE3h8yunRZvAvU7u+iuPYEhpU= github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.9 h1:7P0KWfed/YMtpeuW3E2iwokzoz9L7H9rB+VZzg5DeBs= github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.9/go.mod h1:kgnXaV74AVjM3ZWJu1GhyXGuCtxljJ677oUfz6MyJOE= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.11 h1:5JIs4BPVpzbgcBrgmUxBdDsMjmsHZvPbTPD1m4aB+ZQ= +github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.11/go.mod h1:ue0+WkdPxpCB2JP3iaG4Iawayxp72kyT5uDbozQKaW8= github.com/alibabacloud-go/darabonba-signature-util v0.0.7 h1:UzCnKvsjPFzApvODDNEYqBHMFt1w98wC7FOo0InLyxg= github.com/alibabacloud-go/darabonba-signature-util v0.0.7/go.mod h1:oUzCYV2fcCH797xKdL6BDH8ADIHlzrtKVjeRtunBNTQ= github.com/alibabacloud-go/darabonba-string v1.0.2 h1:E714wms5ibdzCqGeYJ9JCFywE5nDyvIXIIQbZVFkkqo= @@ -125,6 +135,8 @@ github.com/alibabacloud-go/dcdn-20180115/v3 v3.5.0 h1:EQmKhYju6y38kJ1ZvZROeJG2Q1 github.com/alibabacloud-go/dcdn-20180115/v3 v3.5.0/go.mod h1:b9qzvr/2V1f0r1Z6xUmkLqEouKcPGy4LCC22yV+6HQo= github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.1 h1:KD17N7f83BO+bSKfPU7Mg2pSfIiBCbBlHL14Zd3S/a0= github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.1/go.mod h1:iXO5nADvrdxU7Lek8DjNrWG7yD7EV6X18kewPUKBC2c= +github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.2 h1:KvHAZ1yCJ6NnF6aeqhR0e8kuc7zCrUAkS7+2RyQaJJU= +github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.2/go.mod h1:fBEEvkfQEp5k7yfMzU4n0zWcibHDoGfakv3YaopBdiI= github.com/alibabacloud-go/debug v0.0.0-20190504072949-9472017b5c68/go.mod h1:6pb/Qy8c+lqua8cFpEy7g39NRRqOWc3rOwAy8m5Y2BY= github.com/alibabacloud-go/debug v1.0.0/go.mod h1:8gfgZCCAC3+SCzjWtY053FrOcd4/qlH6IHTI4QyICOc= github.com/alibabacloud-go/debug v1.0.1 h1:MsW9SmUtbb1Fnt3ieC6NNZi6aEwrXfDksD4QA6GSbPg= @@ -166,6 +178,8 @@ github.com/alibabacloud-go/tea v1.2.2/go.mod h1:CF3vOzEMAG+bR4WOql8gc2G9H3EkH3ZL github.com/alibabacloud-go/tea v1.3.9/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= github.com/alibabacloud-go/tea v1.3.10 h1:J0Ke8iMyoxX2daj90hdPr1QgfxJnhR8SOflB910o/Dk= github.com/alibabacloud-go/tea v1.3.10/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= +github.com/alibabacloud-go/tea v1.3.11 h1:F7s2HRszY0J+tFckhy5FCpnBEENTijgFcYR68Brg9/Y= +github.com/alibabacloud-go/tea v1.3.11/go.mod h1:A560v/JTQ1n5zklt2BEpurJzZTI8TUT+Psg2drWlxRg= github.com/alibabacloud-go/tea-fileform v1.1.1 h1:1YG6erAP3joQ0XdCXYIotuD7zyOM6qCR49xkp5FZDeU= github.com/alibabacloud-go/tea-fileform v1.1.1/go.mod h1:ZeCV91o4ISmxidd686f0ebdS5EDHWU+vW+TkjLhrsFE= github.com/alibabacloud-go/tea-oss-sdk v1.1.3/go.mod h1:yUnodpR3Bf2rudLE7V/Gft5txjJF30Pk+hH77K/Eab0= @@ -190,6 +204,8 @@ github.com/alibabacloud-go/tea-xml v1.1.3 h1:7LYnm+JbOq2B+T/B0fHC4Ies4/FofC4zHzY github.com/alibabacloud-go/tea-xml v1.1.3/go.mod h1:Rq08vgCcCAjHyRi/M7xlHKUykZCEtyBy9+DPF6GgEu8= github.com/alibabacloud-go/vod-20170321/v4 v4.8.4 h1:MYP2xfrcud8vlWljQ4lhemNgAgi9/AUAa450n8TUXZo= github.com/alibabacloud-go/vod-20170321/v4 v4.8.4/go.mod h1:5ocQ6hIc9tpGixD2iy099aOGwIgpzjT2le4Krd4aLn8= +github.com/alibabacloud-go/vod-20170321/v4 v4.9.2 h1:4TojRyj2k/k0Vs9j0SVRR3BJbdTXMEZhJy7poFs3ZkM= +github.com/alibabacloud-go/vod-20170321/v4 v4.9.2/go.mod h1:3iJRCLBKjbMhYXt2sUbvz5vUdMuynms3cMTKNQ9nIdM= github.com/alibabacloud-go/waf-openapi-20211001/v5 v5.6.0 h1:jqiPGtZJhdnGnni6EKIrUY9yhwOo37qz1IeX0bkfBbk= github.com/alibabacloud-go/waf-openapi-20211001/v5 v5.6.0/go.mod h1:9itYSTzipL3NlvhvNYfTjFaapoZzG68nlu/KUdh9SpA= github.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible h1:8psS8a+wKfiLt1iVDX79F7Y6wUM49Lcha2FMXt4UM8g= @@ -216,6 +232,8 @@ github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2 v1.36.6 h1:zJqGjVbRdTPojeCGWn5IR5pbJwSQSBh5RWFTQcEQGdU= github.com/aws/aws-sdk-go-v2 v1.36.6/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0= +github.com/aws/aws-sdk-go-v2 v1.38.1 h1:j7sc33amE74Rz0M/PoCpsZQ6OunLqys/m5antM0J+Z8= +github.com/aws/aws-sdk-go-v2 v1.38.1/go.mod h1:9Q0OoGQoboYIAJyslFyF1f5K1Ryddop8gqMhWx/n4Wg= github.com/aws/aws-sdk-go-v2/config v1.29.18 h1:x4T1GRPnqKV8HMJOMtNktbpQMl3bIsfx8KbqmveUO2I= github.com/aws/aws-sdk-go-v2/config v1.29.18/go.mod h1:bvz8oXugIsH8K7HLhBv06vDqnFv3NsGDt2Znpk7zmOU= github.com/aws/aws-sdk-go-v2/credentials v1.17.71 h1:r2w4mQWnrTMJjOyIsZtGp3R3XGY3nqHn8C26C2lQWgA= @@ -224,17 +242,27 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33 h1:D9ixiWSG4lyUBL2DDNK924 github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.33/go.mod h1:caS/m4DI+cij2paz3rtProRBI4s/+TCiWoaWZuQ9010= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37 h1:osMWfm/sC/L4tvEdQ65Gri5ZZDCUpuYJZbTTDrsn4I0= github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.37/go.mod h1:ZV2/1fbjOPr4G4v38G3Ww5TBT4+hmsK45s/rxu1fGy0= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.4 h1:IdCLsiiIj5YJ3AFevsewURCPV+YWUlOW8JiPhoAy8vg= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.4/go.mod h1:l4bdfCD7XyyZA9BolKBo1eLqgaJxl0/x91PL4Yqe0ao= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37 h1:v+X21AvTb2wZ+ycg1gx+orkB/9U6L7AOp93R7qYxsxM= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.37/go.mod h1:G0uM1kyssELxmJ2VZEfG0q2npObR3BAkF3c1VsfVnfs= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.4 h1:j7vjtr1YIssWQOMeOWRbh3z8g2oY/xPjnZH2gLY4sGw= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.4/go.mod h1:yDmJgqOiH4EA8Hndnv4KwAo8jCGTSnM5ASG1nBI+toA= 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/service/acm v1.33.1 h1:VAAadBIWgoYoS0tRWkghu1E2LfSsKQw8m/sOkdF1D3E= github.com/aws/aws-sdk-go-v2/service/acm v1.33.1/go.mod h1:eq3JsAPGHsNfhRbPoVRUVDxtQFynlnFcDXzxFMEeOdQ= +github.com/aws/aws-sdk-go-v2/service/acm v1.36.0 h1:U16SZFwZpyQGXUyrrmOqWqU9jMYhokCSpc+fYajYLy0= +github.com/aws/aws-sdk-go-v2/service/acm v1.36.0/go.mod h1:fdYDfiFuQij96Ryxl5uJK5xGAjyLhHGiBwquH7mpuAc= github.com/aws/aws-sdk-go-v2/service/cloudfront v1.47.0 h1:RyGeARqe2WTJU1K7L7rFQuCqLscbzQoi1oy7LxnROIE= github.com/aws/aws-sdk-go-v2/service/cloudfront v1.47.0/go.mod h1:0zgTNyuzL2+HfnkP+w8Z+eKtKu7KbOTWuywJYdjkWfY= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.50.0 h1:PN9qG49RrQ5b9in9ZfHqY3LxVEKoURo0Ia0LMjzFkw8= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.50.0/go.mod h1:HLzQI9ENSq0pNCO+ASh5KbwL7AoYBqPkTLv1Y40+pl4= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= github.com/aws/aws-sdk-go-v2/service/iam v1.43.1 h1:xpPZZpbmqIJse9OH+Kf/bW/n+bRe0BtE/LtHvBJYcbc= github.com/aws/aws-sdk-go-v2/service/iam v1.43.1/go.mod h1:/IEkOg5Gkv2HFxOb3Prs84xpRyxO9P/9Zow/clWl84Q= +github.com/aws/aws-sdk-go-v2/service/iam v1.47.1 h1:8qIz2VOP22KhWlMhh2nZOlvQjXHcZ1jIYy/LmP1r0go= +github.com/aws/aws-sdk-go-v2/service/iam v1.47.1/go.mod h1:t7ahGe9ZaK9mmtYhCMjVA6euun4iNzaeDnJyONTBlms= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.18 h1:vvbXsA2TVO80/KT7ZqCbx934dt6PY+vQ8hZpUZ/cpYg= @@ -250,8 +278,12 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.34.1/go.mod h1:3wFBZKoWnX3r+Sm7in79i github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw= github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= +github.com/aws/smithy-go v1.22.5 h1:P9ATCXPMb2mPjYBgueqJNCA5S9UfktsW0tTxi+a7eqw= +github.com/aws/smithy-go v1.22.5/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI= github.com/baidubce/bce-sdk-go v0.9.235 h1:iAi+seH9w1Go2szFNzyGumahLGDsuYZ3i8hduX3qiM8= github.com/baidubce/bce-sdk-go v0.9.235/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg= +github.com/baidubce/bce-sdk-go v0.9.240 h1:vw0BDkg+uV47tqYXqwgsQnCEIAmKEvq/4lprs6bH0bg= +github.com/baidubce/bce-sdk-go v0.9.240/go.mod h1:zbYJMQwE4IZuyrJiFO8tO8NbtYiKTFTbwh4eIsqjVdg= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -329,6 +361,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.10.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM= github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU= @@ -353,6 +386,8 @@ github.com/go-acme/alidns-20150109/v4 v4.5.10 h1:epLD0VaHR5XUpiM6mjm4MzQFICrk+zp github.com/go-acme/alidns-20150109/v4 v4.5.10/go.mod h1:qGRq8kD0xVgn82qRSQmhHwh/oWxKRjF4Db5OI4ScV5g= github.com/go-acme/lego/v4 v4.25.1 h1:AYPUM7quPN/g2PcjjWw8sAMz3eV+Z8UWkr1kitDOyVA= github.com/go-acme/lego/v4 v4.25.1/go.mod h1:OORYyVNZPaNdIdVYCGSBNRNZDIjhQbPuFxwGDgWj/yM= +github.com/go-acme/lego/v4 v4.25.2 h1:+D1Q+VnZrD+WJdlkgUEGHFFTcDrwGlE7q24IFtMmHDI= +github.com/go-acme/lego/v4 v4.25.2/go.mod h1:OORYyVNZPaNdIdVYCGSBNRNZDIjhQbPuFxwGDgWj/yM= github.com/go-acme/tencentclouddnspod v1.0.1208 h1:xAVy1lmg2KcKKeYmFSBQUttwc1o1S++9QTjAotGC+BM= github.com/go-acme/tencentclouddnspod v1.0.1208/go.mod h1:yxG02mkbbVd7lTb97nOn7oj09djhm7hAwxNQw4B9dpQ= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -392,6 +427,7 @@ github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= 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/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4= github.com/go-playground/validator/v10 v10.7.0/go.mod h1:xm76BBt941f7yWdGnI2DVPFFg1UK3YY04qifoXU3lOk= github.com/go-playground/validator/v10 v10.23.0 h1:/PwmTwZhS0dPkav3cdK9kV1FsAmrL8sThn8IHr/sO+o= github.com/go-playground/validator/v10 v10.23.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM= @@ -410,6 +446,8 @@ github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncV github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs= github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +github.com/goccy/go-yaml v1.9.8 h1:5gMyLUeU1/6zl+WFfR1hN7D2kf+1/eRGa7DFtToiBvQ= +github.com/goccy/go-yaml v1.9.8/go.mod h1:JubOolP3gh0HpiBc4BLRD4YmjEjHAmIIB2aaXKkTfoE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= @@ -420,6 +458,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0= github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo= +github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -546,6 +586,8 @@ github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKEN github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.159 h1:6LZysc4iyO4cHB1aJsRklWfSEJr8CEhW7BmcM0SkYcU= github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.159/go.mod h1:Y/+YLCFCJtS29i2MbYPTUlNNfwXvkzEsZKR0imY/2aY= +github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.163 h1:2OAYy5J1sJXjVTqucSDqf4VSd8Pzf10ZuyzK2HTTqUU= +github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.163/go.mod h1:M+yna96Fx9o5GbIUnF3OvVvQGjgfVSyeJbV9Yb1z/wI= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= @@ -580,6 +622,8 @@ github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= 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/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12 h1:9Nu54bhS/H/Kgo2/7xNSUuC5G28VR8ljfrLKU2G4IjU= +github.com/json-iterator/go v1.1.13-0.20220915233716-71ac16282d12/go.mod h1:TBzl5BIHNXfS9+C35ZyJaklL7mLDbgUkcgXzSLa8Tk0= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= @@ -743,6 +787,8 @@ github.com/pocketbase/dbx v1.11.0 h1:LpZezioMfT3K4tLrqA55wWFw1EtH1pM4tzSVa7kgszU github.com/pocketbase/dbx v1.11.0/go.mod h1:xXRCIAKTHMgUCyCKZm55pUOdvFziJjQfXaWKhu2vhMs= github.com/pocketbase/pocketbase v0.29.0 h1:oL6qvkU2QSybClVtQdaq9Z1F3Wk59iKYCfIaf1R8KUs= github.com/pocketbase/pocketbase v0.29.0/go.mod h1:SqyH7o/3e+/uLySATlJqxH4S8gyU6R0adG56ZSV1vuU= +github.com/pocketbase/pocketbase v0.29.2 h1:MghVgLYy/xh9lBwHtteNSYjYOvHKYD+dS9pzUzOP79Q= +github.com/pocketbase/pocketbase v0.29.2/go.mod h1:QZPKtMCWfiDJb0aLhwgj7ZOr6O8tusbui2EhTFAHThU= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/povsister/scp v0.0.0-20250701154629-777cf82de5df h1:zEgSHrxo8f6hGG1xCaqunfBq8hlfDmFd1JM0QXiQi7o= @@ -791,6 +837,7 @@ github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb github.com/samber/lo v1.51.0 h1:kysRYLbHy/MB7kQZf5DSN50JHmMsNEdeY24VzJFu7wI= github.com/samber/lo v1.51.0/go.mod h1:4+MXEGsJzbKGaUEQFKBq2xtfuznW9oz/WrgyzMzRoM0= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.3.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= @@ -836,8 +883,12 @@ github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOf github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1207 h1:FO4Q4UNwLP6achx7Y8EblzeVDG4BW66aGG4Hk7y5r9U= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.1207/go.mod h1:YQW7rko8ub/X7RJWS/Yqb8fG30Wk4EEmnZI7GTnKBp4= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.1.5 h1:d1Qxqq2eHHGkNhUS1lUmgNnyJMVz0Eg+n8gIqTMxA+8= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.1.5/go.mod h1:ITOgZuYkf3FdQJceKzaBwUhG535JaqSA5Nog4mM/e1I= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1212 h1:PrOVwyGIVITOP51HzfBqiD3PDrWJ3ZrijsiYyEj8Wn4= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1212/go.mod h1:EDYceO3jwZ8FU7LWjXpZGeCO4Ti3iqeg2j2NZTMBHQs= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.1.14 h1:AyCLbxE55tuoei9fhlhGVrd9yiU/PdyDOyMQYFvRxJU= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.1.14/go.mod h1:zHhSaVjo4w4+toT8XsV6TCT5N5gtPOg538L7Aay7U+E= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1200/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1207/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1208/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= @@ -847,20 +898,41 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1211/go.mod github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1212/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1213 h1:ChLfbQsFFiBoolNyZ4Umvrg90QrdsnYH0KiKZwOhLkE= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1213/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.0/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.3/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.5/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.7/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.10/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.11/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.13/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.14 h1:+I+n8wDpnG95yLnV3rtT4MUs8gdwgbpuZEVKQhSxqxs= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.1.14/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap v1.0.1200 h1:SqfiAwdDQx1SG2XKMBBxwUTZSBlVNFCVt/hynkl6JHM= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/gaap v1.0.1200/go.mod h1:zwjcd7dfjsmAPD7yEHHY36tnDM5ts5rUgThXGvsZ+OE= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.0.1208 h1:GLCCKdL1yWCSAF7hinVnOmOGgMfKXDrWkOuvhAhIg8I= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.0.1208/go.mod h1:0TssSKHt8SCgjMTaxr1Fjfrp+OUTqp+tkglNoXIkCyM= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.1.3 h1:z8cdM+64rsQ6DbG6aXG9NaP/CldF+lgpZwli0qFnuVc= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/live v1.1.3/go.mod h1:O9AbLV8J4wdm1pEx66qy7UbACGE8NO2UxucPPDNMcDQ= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.1209 h1:2cYGQZktchIE3jjn1qglPwSCGg2kaQBW8k5xbUIEWIw= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.0.1209/go.mod h1:u14H5ciHEeHMPQL1e6HwHf5gAHc4h65c5gDMaF4dF38= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.1.0 h1:tBrYIRge/u1vOXLDuFBbiP3uv59I7JUekhkCzM8KQ5A= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/scf v1.1.0/go.mod h1:q904dfEmrK/ETugTjgL7j1spCT08ioeLUV5JA4Bj8Xk= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.1211 h1:SXEmqWgiSln9UDElTFz2XwZAwxLS2F92fOeWygMFA9I= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.0.1211/go.mod h1:k0C4B9RPQcL++fMFS32d8nAl6ApXs8+Nfusk1HugCis= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.1.10 h1:dj7PUBNAK1D4aSWxSxAbPxmJ12M8Etos8lYVJWyIdGs= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ssl v1.1.10/go.mod h1:Xt/9WKwki9CCfSAG8e848Sk54HfNa9ZApFhLHxBr1W8= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1212 h1:LUeCZrOPScN5HVRvT+Vz+MJ0aOHE0kqhkCy/UXdzRJc= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.0.1212/go.mod h1:mWIN9z1o7n3T59FAu0bpPq2iKG4VcmHHWTe74Cz6wN0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.1.7 h1:2nuXJAtcySCGhKyv/LOFA04v9DtukYk6U0Xc3ZZU0pA= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.1.7/go.mod h1:uqAhbeIHHrk9eb3D4pFIREq1kY0y+AjXY26pNj5N2Zo= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.1210 h1:DbRK20aFfzpnFEUbzuBaeMmIMrpQs5LCZIZlPTmvJ68= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.1210/go.mod h1:8Gy21lo1a5wUAzrzhmgXF/4zhulI5sbW3HwGt5i5qzc= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.1.13 h1:eU1aa13vM0YWPP4DC/2HSeAVGP+U/Qdqb/syrepIroI= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.1.13/go.mod h1:q8AXovSiUhSct/xncaNrz1Br0Rfg0IiZrLaRIuYz3rI= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1213 h1:/2TWW5pHhxHcft+aj9tLS3o+s8ZfrYaXC+eZo1eMyko= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1213/go.mod h1:xzGeque72VBwuOin47PdjPh5axADALnYc9WR5g/plBU= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.1.11 h1:2jrTSxfC4AX0qv8rrK2Cpay+hz1FJlii2jNMlPFlnPI= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.1.11/go.mod h1:JY5OQafRSIAh/s+YIT8mgnZbqiq+EjdFgDriJLMThf0= github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -878,11 +950,17 @@ github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0o github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.18 h1:uint/YlMWuQ5et0ab+AOHq+re+yi8pOvjS77gker8ms= github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.18/go.mod h1:IrjK84IJJTuOZOTMv/P18Ydjy/x+ow7fF7q11jAxXLM= +github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.21 h1:t6OkemY2V5wi6YNWB5ezqTrQM+/+bu0Bf35H9XrP5kQ= +github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.21/go.mod h1:IrjK84IJJTuOZOTMv/P18Ydjy/x+ow7fF7q11jAxXLM= github.com/volcengine/volc-sdk-golang v1.0.23/go.mod h1:AfG/PZRUkHJ9inETvbjNifTDgut25Wbkm2QoYBTbvyU= github.com/volcengine/volc-sdk-golang v1.0.216 h1:+wAq8RvxpGECveRJaAXZFpzrZoQ33WjMuRyd9iY2Oc0= github.com/volcengine/volc-sdk-golang v1.0.216/go.mod h1:zHJlaqiMbIB+0mcrsZPTwOb3FB7S/0MCfqlnO8R7hlM= +github.com/volcengine/volc-sdk-golang v1.0.217 h1:ylONAeFRGTRc5D0s2ASvekaoQsKDD1fd+w41IgAoVvk= +github.com/volcengine/volc-sdk-golang v1.0.217/go.mod h1:zHJlaqiMbIB+0mcrsZPTwOb3FB7S/0MCfqlnO8R7hlM= github.com/volcengine/volcengine-go-sdk v1.1.23 h1:wa4ytrLa1UBc/+/R4hEJDtBYD+TpHxLLh5+G+J1x1Rg= github.com/volcengine/volcengine-go-sdk v1.1.23/go.mod h1:EyKoi6t6eZxoPNGr2GdFCZti2Skd7MO3eUzx7TtSvNo= +github.com/volcengine/volcengine-go-sdk v1.1.28 h1:hDErsr+6LDlX++Wfjsmra4bHAx8T0IbkNChG9VsOjjM= +github.com/volcengine/volcengine-go-sdk v1.1.28/go.mod h1:EyKoi6t6eZxoPNGr2GdFCZti2Skd7MO3eUzx7TtSvNo= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= @@ -955,6 +1033,8 @@ golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5D golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4= +golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -970,6 +1050,8 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20250718183923-645b1fa84792 h1:R9PFI6EUdfVKgwKjZef7QIwGcBKu86OEFpJ9nUEP2l4= golang.org/x/exp v0.0.0-20250718183923-645b1fa84792/go.mod h1:A+z0yzpGtvnG90cToK5n2tu8UJVP2XUATh+r+sfOOOc= +golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0= +golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1003,6 +1085,8 @@ golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg= golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ= +golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ= +golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1060,6 +1144,8 @@ golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE= +golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1147,6 +1233,7 @@ golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220406163625-3f8b81556e12/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220615213510-4f61da869c0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1167,6 +1254,8 @@ golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA= golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -1184,6 +1273,8 @@ golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/term v0.33.0 h1:NuFncQrRcaRvVmgRkvM3j/F00gWIAlcmlB8ACEKmGIg= golang.org/x/term v0.33.0/go.mod h1:s18+ql9tYWp1IfpV9DmCtQDDSRBUjKaw9M1eAv5UeF0= +golang.org/x/term v0.34.0 h1:O/2T7POpk0ZZ7MAzMeWFSg6S5IpWd/RXDlM9hgM3DR4= +golang.org/x/term v0.34.0/go.mod h1:5jC53AEywhIVebHgPVeg0mj8OD3VO9OzclacVrqpaAw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1204,6 +1295,8 @@ golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng= +golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1267,9 +1360,12 @@ golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0= golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= +golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg= +golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= @@ -1407,10 +1503,16 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8= k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE= +k8s.io/api v0.33.4 h1:oTzrFVNPXBjMu0IlpA2eDDIU49jsuEorGHB4cvKupkk= +k8s.io/api v0.33.4/go.mod h1:VHQZ4cuxQ9sCUMESJV5+Fe8bGnqAARZ08tSTdHWfeAc= k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA= k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/apimachinery v0.33.4 h1:SOf/JW33TP0eppJMkIgQ+L6atlDiP/090oaX0y9pd9s= +k8s.io/apimachinery v0.33.4/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA= k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg= +k8s.io/client-go v0.33.4 h1:TNH+CSu8EmXfitntjUPwaKVPN0AYMbc9F1bBS8/ABpw= +k8s.io/client-go v0.33.4/go.mod h1:LsA0+hBG2DPwovjd931L/AoaezMPX9CmBgyVyBZmbCY= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= @@ -1428,6 +1530,8 @@ modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= modernc.org/libc v1.65.10 h1:ZwEk8+jhW7qBjHIT+wd0d9VjitRyQef9BnzlzGwMODc= modernc.org/libc v1.65.10/go.mod h1:StFvYpx7i/mXtBAfVOjaU0PWZOvIRoZSgXhrwXzr8Po= +modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ= +modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8= modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU= modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg= modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI= @@ -1438,6 +1542,8 @@ modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w= modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE= modernc.org/sqlite v1.38.0 h1:+4OrfPQ8pxHKuWG4md1JpR/EYAh3Md7TdejuuzE7EUI= modernc.org/sqlite v1.38.0/go.mod h1:1Bj+yES4SVvBZ4cBOpVZ6QgesMCKpJZDq0nxYzOpmNE= +modernc.org/sqlite v1.38.2 h1:Aclu7+tgjgcQVShZqim41Bbw9Cho0y/7WzYptXqkEek= +modernc.org/sqlite v1.38.2/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E= 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= From 625e13ece3a8499cfc904d3e67727bab1bd58906 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Fri, 22 Aug 2025 16:01:05 +0800 Subject: [PATCH 2/8] feat: delay node --- internal/domain/workflow.go | 47 ++++++---- internal/rest/handlers/workflow.go | 5 + internal/workflow/engine/engine.go | 1 + internal/workflow/engine/executor_delay.go | 28 ++++++ internal/workflow/engine/models.go | 1 + internal/workflow/service.go | 2 +- .../workflow/designer/NodeDrawer.tsx | 7 +- .../designer/forms/DelayNodeConfigDrawer.tsx | 40 ++++++++ .../designer/forms/DelayNodeConfigForm.tsx | 92 +++++++++++++++++++ .../designer/nodes/BizApplyNodeRegistry.tsx | 1 + .../designer/nodes/BizDeployNodeRegistry.tsx | 1 + .../designer/nodes/BizMonitorNodeRegistry.tsx | 1 + .../designer/nodes/BizNotifyNodeRegistry.tsx | 1 + .../designer/nodes/BizUploadNodeRegistry.tsx | 1 + .../workflow/designer/nodes/DelayNode.tsx | 63 +++++++++++++ .../workflow/designer/nodes/index.ts | 2 + .../workflow/designer/nodes/typings.ts | 2 + ui/src/domain/workflow.ts | 19 ++++ .../i18n/locales/en/nls.workflow.nodes.json | 8 ++ .../i18n/locales/zh/nls.workflow.nodes.json | 8 ++ .../pages/workflows/WorkflowDetailDesign.tsx | 15 +-- 21 files changed, 312 insertions(+), 33 deletions(-) create mode 100644 internal/workflow/engine/executor_delay.go create mode 100644 ui/src/components/workflow/designer/forms/DelayNodeConfigDrawer.tsx create mode 100644 ui/src/components/workflow/designer/forms/DelayNodeConfigForm.tsx create mode 100644 ui/src/components/workflow/designer/nodes/DelayNode.tsx diff --git a/internal/domain/workflow.go b/internal/domain/workflow.go index 236db82c9..2fa0a8f42 100644 --- a/internal/domain/workflow.go +++ b/internal/domain/workflow.go @@ -93,6 +93,7 @@ const ( WorkflowNodeTypeTryCatch = WorkflowNodeType("tryCatch") WorkflowNodeTypeTryBlock = WorkflowNodeType("tryBlock") WorkflowNodeTypeCatchBlock = WorkflowNodeType("catchBlock") + WorkflowNodeTypeDelay = WorkflowNodeType("delay") WorkflowNodeTypeBizApply = WorkflowNodeType("bizApply") WorkflowNodeTypeBizUpload = WorkflowNodeType("bizUpload") WorkflowNodeTypeBizMonitor = WorkflowNodeType("bizMonitor") @@ -107,6 +108,29 @@ type WorkflowNodeData struct { type WorkflowNodeConfig map[string]any +func (c WorkflowNodeConfig) AsDelay() WorkflowNodeConfigForDelay { + return WorkflowNodeConfigForDelay{ + Wait: xmaps.GetInt32(c, "wait"), + } +} + +func (c WorkflowNodeConfig) AsBranchBlock() WorkflowNodeConfigForBranchBlock { + expression := c["expression"] + if expression == nil { + return WorkflowNodeConfigForBranchBlock{} + } + + exprRaw, _ := json.Marshal(expression) + expr, err := expr.UnmarshalExpr([]byte(exprRaw)) + if err != nil { + return WorkflowNodeConfigForBranchBlock{} + } + + return WorkflowNodeConfigForBranchBlock{ + Expression: expr, + } +} + func (c WorkflowNodeConfig) AsBizApply() WorkflowNodeConfigForBizApply { return WorkflowNodeConfigForBizApply{ Domains: xmaps.GetString(c, "domains"), @@ -169,21 +193,12 @@ func (c WorkflowNodeConfig) AsBizNotify() WorkflowNodeConfigForBizNotify { } } -func (c WorkflowNodeConfig) AsBranchBlock() WorkflowNodeConfigForBranchBlock { - expression := c["expression"] - if expression == nil { - return WorkflowNodeConfigForBranchBlock{} - } +type WorkflowNodeConfigForDelay struct { + Wait int32 `json:"wait"` // 等待时间 +} - exprRaw, _ := json.Marshal(expression) - expr, err := expr.UnmarshalExpr([]byte(exprRaw)) - if err != nil { - return WorkflowNodeConfigForBranchBlock{} - } - - return WorkflowNodeConfigForBranchBlock{ - Expression: expr, - } +type WorkflowNodeConfigForBranchBlock struct { + Expression expr.Expr `json:"expression"` // 条件表达式 } type WorkflowNodeConfigForBizApply struct { @@ -236,7 +251,3 @@ type WorkflowNodeConfigForBizNotify struct { Message string `json:"message"` // 通知内容 SkipOnAllPrevSkipped bool `json:"skipOnAllPrevSkipped"` // 前序节点均已跳过时是否跳过 } - -type WorkflowNodeConfigForBranchBlock struct { - Expression expr.Expr `json:"expression"` // 条件表达式 -} diff --git a/internal/rest/handlers/workflow.go b/internal/rest/handlers/workflow.go index 3de0a5544..ff3df00c9 100644 --- a/internal/rest/handlers/workflow.go +++ b/internal/rest/handlers/workflow.go @@ -2,10 +2,12 @@ package handlers import ( "context" + "errors" "github.com/pocketbase/pocketbase/core" "github.com/pocketbase/pocketbase/tools/router" + "github.com/certimate-go/certimate/internal/domain" "github.com/certimate-go/certimate/internal/domain/dtos" "github.com/certimate-go/certimate/internal/rest/resp" ) @@ -36,6 +38,9 @@ func (handler *WorkflowHandler) run(e *core.RequestEvent) error { if err := e.BindBody(req); err != nil { return resp.Err(e, err) } + if req.RunTrigger != domain.WorkflowTriggerTypeManual { + return resp.Err(e, errors.New("invalid parameters: the value of 'trigger' must be 'manual'")) + } res, err := handler.service.StartRun(e.Request.Context(), req) if err != nil { diff --git a/internal/workflow/engine/engine.go b/internal/workflow/engine/engine.go index fa41f93bc..772002740 100644 --- a/internal/workflow/engine/engine.go +++ b/internal/workflow/engine/engine.go @@ -282,6 +282,7 @@ func NewWorkflowEngine() WorkflowEngine { } engine.executors[NodeTypeStart] = newStartNodeExecutor() engine.executors[NodeTypeEnd] = newEndNodeExecutor() + engine.executors[NodeTypeDelay] = newDelayNodeExecutor() engine.executors[NodeTypeCondition] = newConditionNodeExecutor() engine.executors[NodeTypeBranchBlock] = newBranchBlockNodeExecutor() engine.executors[NodeTypeTryCatch] = newTryCatchNodeExecutor() diff --git a/internal/workflow/engine/executor_delay.go b/internal/workflow/engine/executor_delay.go new file mode 100644 index 000000000..b3f32b71b --- /dev/null +++ b/internal/workflow/engine/executor_delay.go @@ -0,0 +1,28 @@ +package engine + +import ( + "fmt" + "log/slog" + "time" +) + +type delayNodeExecutor struct { + nodeExecutor +} + +func (ne *delayNodeExecutor) Execute(execCtx *NodeExecutionContext) (*NodeExecutionResult, error) { + execRes := newNodeExecutionResult(execCtx.Node) + + nodeCfg := execCtx.Node.Data.Config.AsDelay() + ne.logger.Info(fmt.Sprintf("delay for %d second(s) before continuing ...", nodeCfg.Wait)) + + time.Sleep(time.Duration(nodeCfg.Wait) * time.Second) + + return execRes, nil +} + +func newDelayNodeExecutor() NodeExecutor { + return &delayNodeExecutor{ + nodeExecutor: nodeExecutor{logger: slog.Default()}, + } +} diff --git a/internal/workflow/engine/models.go b/internal/workflow/engine/models.go index 079b676c5..e8a32273a 100644 --- a/internal/workflow/engine/models.go +++ b/internal/workflow/engine/models.go @@ -16,6 +16,7 @@ const ( NodeTypeTryCatch = domain.WorkflowNodeTypeTryCatch NodeTypeTryBlock = domain.WorkflowNodeTypeTryBlock NodeTypeCatchBlock = domain.WorkflowNodeTypeCatchBlock + NodeTypeDelay = domain.WorkflowNodeTypeDelay NodeTypeBizApply = domain.WorkflowNodeTypeBizApply NodeTypeBizUpload = domain.WorkflowNodeTypeBizUpload NodeTypeBizMonitor = domain.WorkflowNodeTypeBizMonitor diff --git a/internal/workflow/service.go b/internal/workflow/service.go index 02260cae7..96cad7a05 100644 --- a/internal/workflow/service.go +++ b/internal/workflow/service.go @@ -81,7 +81,7 @@ func (s *WorkflowService) StartRun(ctx context.Context, req *dtos.WorkflowStartR return nil, err } - if workflow.LastRunStatus == domain.WorkflowRunStatusTypePending || workflow.LastRunStatus == domain.WorkflowRunStatusTypeProcessing { + if req.RunTrigger == domain.WorkflowTriggerTypeManual && (workflow.LastRunStatus == domain.WorkflowRunStatusTypePending || workflow.LastRunStatus == domain.WorkflowRunStatusTypeProcessing) { return nil, errors.New("workflow is already pending or processing") } else if workflow.GraphContent == nil { return nil, errors.New("workflow graph content is empty") diff --git a/ui/src/components/workflow/designer/NodeDrawer.tsx b/ui/src/components/workflow/designer/NodeDrawer.tsx index c7e6ade74..59f534e53 100644 --- a/ui/src/components/workflow/designer/NodeDrawer.tsx +++ b/ui/src/components/workflow/designer/NodeDrawer.tsx @@ -10,6 +10,7 @@ import BizMonitorNodeConfigDrawer from "./forms/BizMonitorNodeConfigDrawer"; import BizNotifyNodeConfigDrawer from "./forms/BizNotifyNodeConfigDrawer"; import BizUploadNodeConfigDrawer from "./forms/BizUploadNodeConfigDrawer"; import BranchBlockNodeConfigDrawer from "./forms/BranchBlockNodeConfigDrawer"; +import DelayNodeConfigDrawer from "./forms/DelayNodeConfigDrawer"; import StartNodeConfigDrawer from "./forms/StartNodeConfigDrawer"; import { NodeType } from "./nodes/typings"; @@ -50,6 +51,10 @@ const NodeDrawer = ({ node, trigger, ...props }: NodeDrawerProps) => { {node?.flowNodeType === NodeType.Start ? ( + ) : node?.flowNodeType === NodeType.Delay ? ( + + ) : node?.flowNodeType === NodeType.BranchBlock ? ( + ) : node?.flowNodeType === NodeType.BizApply ? ( ) : node?.flowNodeType === NodeType.BizUpload ? ( @@ -60,8 +65,6 @@ const NodeDrawer = ({ node, trigger, ...props }: NodeDrawerProps) => { ) : node?.flowNodeType === NodeType.BizNotify ? ( - ) : node?.flowNodeType === NodeType.BranchBlock ? ( - ) : ( <> )} diff --git a/ui/src/components/workflow/designer/forms/DelayNodeConfigDrawer.tsx b/ui/src/components/workflow/designer/forms/DelayNodeConfigDrawer.tsx new file mode 100644 index 000000000..65a11b777 --- /dev/null +++ b/ui/src/components/workflow/designer/forms/DelayNodeConfigDrawer.tsx @@ -0,0 +1,40 @@ +import { useTranslation } from "react-i18next"; +import { type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor"; +import { Form } from "antd"; + +import { NodeConfigDrawer } from "./_shared"; +import DelayNodeConfigForm from "./DelayNodeConfigForm"; +import { NodeType } from "../nodes/typings"; + +export interface DelayNodeConfigDrawerProps { + afterClose?: () => void; + loading?: boolean; + node: FlowNodeEntity; + open?: boolean; + onOpenChange?: (open: boolean) => void; +} + +const DelayNodeConfigDrawer = ({ node, ...props }: DelayNodeConfigDrawerProps) => { + if (node.flowNodeType !== NodeType.Delay) { + console.warn(`[certimate] current workflow node type is not: ${NodeType.Delay}`); + } + + const { i18n } = useTranslation(); + + const [formInst] = Form.useForm(); + + return ( + + + + ); +}; + +export default DelayNodeConfigDrawer; diff --git a/ui/src/components/workflow/designer/forms/DelayNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/DelayNodeConfigForm.tsx new file mode 100644 index 000000000..e202c8a08 --- /dev/null +++ b/ui/src/components/workflow/designer/forms/DelayNodeConfigForm.tsx @@ -0,0 +1,92 @@ +import { useMemo } from "react"; +import { getI18n, useTranslation } from "react-i18next"; +import { type FlowNodeEntity, getNodeForm } from "@flowgram.ai/fixed-layout-editor"; +import { type AnchorProps, Form, type FormInstance, InputNumber } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { z } from "zod"; + +import { type WorkflowNodeConfigForDelay, defaultNodeConfigForDelay } from "@/domain/workflow"; +import { useAntdForm } from "@/hooks"; + +import { NodeFormContextProvider } from "./_context"; +import { NodeType } from "../nodes/typings"; + +export interface DelayNodeConfigFormProps { + form: FormInstance; + node: FlowNodeEntity; +} + +const DelayNodeConfigForm = ({ node, ...props }: DelayNodeConfigFormProps) => { + if (node.flowNodeType !== NodeType.Delay) { + console.warn(`[certimate] current workflow node type is not: ${NodeType.Delay}`); + } + + const { i18n, t } = useTranslation(); + + const initialValues = useMemo(() => { + return getNodeForm(node)?.getValueIn("config") as WorkflowNodeConfigForDelay | undefined; + }, [node]); + + const formSchema = getSchema({ i18n }); + const formRule = createSchemaFieldRule(formSchema); + const { form: formInst, formProps } = useAntdForm({ + form: props.form, + name: "workflowNodeDelayConfigForm", + initialValues: initialValues ?? getInitialValues(), + }); + + return ( + +
+
+ + + +
+
+
+ ); +}; + +const getAnchorItems = ({ i18n = getI18n() }: { i18n?: ReturnType }): Required["items"] => { + const { t } = i18n; + + return ["parameters"].map((key) => ({ + key: key, + title: t(`workflow_node.delay.form_anchor.${key}.tab`), + href: "#" + key, + })); +}; + +const getInitialValues = (): Nullish>> => { + return { + ...defaultNodeConfigForDelay(), + }; +}; + +const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) => { + const { t } = i18n; + + return z.object({ + wait: z.preprocess( + (v) => Number(v), + z + .number(t("workflow_node.delay.form.wait.placeholder")) + .int(t("workflow_node.delay.form.wait.placeholder")) + .gte(1, t("workflow_node.delay.form.wait.placeholder")) + ), + }); +}; + +const _default = Object.assign(DelayNodeConfigForm, { + getAnchorItems, + getSchema, +}); + +export default _default; diff --git a/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx b/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx index b219b2675..b7d000fae 100644 --- a/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx +++ b/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx @@ -24,6 +24,7 @@ export const BizApplyNodeRegistry: NodeRegistry = { iconBgColor: "#5b65f5", clickable: true, + expandable: false, }, formMeta: { diff --git a/ui/src/components/workflow/designer/nodes/BizDeployNodeRegistry.tsx b/ui/src/components/workflow/designer/nodes/BizDeployNodeRegistry.tsx index cd36aad77..de62ad2d9 100644 --- a/ui/src/components/workflow/designer/nodes/BizDeployNodeRegistry.tsx +++ b/ui/src/components/workflow/designer/nodes/BizDeployNodeRegistry.tsx @@ -25,6 +25,7 @@ export const BizDeployNodeRegistry: NodeRegistry = { iconBgColor: "#5b65f5", clickable: true, + expandable: false, }, formMeta: { diff --git a/ui/src/components/workflow/designer/nodes/BizMonitorNodeRegistry.tsx b/ui/src/components/workflow/designer/nodes/BizMonitorNodeRegistry.tsx index 9f1916df0..d581d0977 100644 --- a/ui/src/components/workflow/designer/nodes/BizMonitorNodeRegistry.tsx +++ b/ui/src/components/workflow/designer/nodes/BizMonitorNodeRegistry.tsx @@ -22,6 +22,7 @@ export const BizMonitorNodeRegistry: NodeRegistry = { iconBgColor: "#5b65f5", clickable: true, + expandable: false, }, formMeta: { diff --git a/ui/src/components/workflow/designer/nodes/BizNotifyNodeRegistry.tsx b/ui/src/components/workflow/designer/nodes/BizNotifyNodeRegistry.tsx index f0a080c7f..a427db013 100644 --- a/ui/src/components/workflow/designer/nodes/BizNotifyNodeRegistry.tsx +++ b/ui/src/components/workflow/designer/nodes/BizNotifyNodeRegistry.tsx @@ -24,6 +24,7 @@ export const BizNotifyNodeRegistry: NodeRegistry = { iconBgColor: "#0693d4", clickable: true, + expandable: false, }, formMeta: { diff --git a/ui/src/components/workflow/designer/nodes/BizUploadNodeRegistry.tsx b/ui/src/components/workflow/designer/nodes/BizUploadNodeRegistry.tsx index 32f216b4e..cd4706837 100644 --- a/ui/src/components/workflow/designer/nodes/BizUploadNodeRegistry.tsx +++ b/ui/src/components/workflow/designer/nodes/BizUploadNodeRegistry.tsx @@ -22,6 +22,7 @@ export const BizUploadNodeRegistry: NodeRegistry = { iconBgColor: "#5b65f5", clickable: true, + expandable: false, }, formMeta: { diff --git a/ui/src/components/workflow/designer/nodes/DelayNode.tsx b/ui/src/components/workflow/designer/nodes/DelayNode.tsx new file mode 100644 index 000000000..8bcf22588 --- /dev/null +++ b/ui/src/components/workflow/designer/nodes/DelayNode.tsx @@ -0,0 +1,63 @@ +import { getI18n } from "react-i18next"; +import { FeedbackLevel, Field } from "@flowgram.ai/fixed-layout-editor"; +import { IconHourglassHigh } from "@tabler/icons-react"; + +import { newNode } from "@/domain/workflow"; + +import { BaseNode } from "./_shared"; +import { NodeKindType, type NodeRegistry, NodeType } from "./typings"; +import DelayNodeConfigForm from "../forms/DelayNodeConfigForm"; + +export const DelayNodeRegistry: NodeRegistry = { + type: NodeType.Delay, + + kind: NodeKindType.Basis, + + meta: { + helpText: getI18n().t("workflow_node.delay.help"), + labelText: getI18n().t("workflow_node.delay.label"), + + icon: IconHourglassHigh, + iconColor: "#2a354c", + iconBgColor: "#fed421", + + clickable: true, + expandable: false, + }, + + formMeta: { + validate: { + ["config"]: ({ value }) => { + const res = DelayNodeConfigForm.getSchema({}).safeParse(value); + if (!res.success) { + return { + message: res.error.message, + level: FeedbackLevel.Error, + }; + } + }, + }, + + render: () => { + const { t } = getI18n(); + + return ( + + {({ field: { value } }) => ( + <> +
{value != null ? `${value} ${t("workflow_node.delay.form.wait.unit")}` : t("workflow.detail.design.editor.placeholder")}
+ + )} + + } + /> + ); + }, + }, + + onAdd() { + return newNode(NodeType.Delay, { i18n: getI18n() }); + }, +}; diff --git a/ui/src/components/workflow/designer/nodes/index.ts b/ui/src/components/workflow/designer/nodes/index.ts index 3a6e48a2a..586bd01fc 100644 --- a/ui/src/components/workflow/designer/nodes/index.ts +++ b/ui/src/components/workflow/designer/nodes/index.ts @@ -4,6 +4,7 @@ import { BizMonitorNodeRegistry } from "./BizMonitorNodeRegistry"; import { BizNotifyNodeRegistry } from "./BizNotifyNodeRegistry"; import { BizUploadNodeRegistry } from "./BizUploadNodeRegistry"; import { BranchBlockNodeRegistry, ConditionNodeRegistry } from "./ConditionNode"; +import { DelayNodeRegistry } from "./DelayNode"; import { EndNodeRegistry } from "./EndNode"; import { StartNodeRegistry } from "./StartNode"; import { CatchBlockNodeRegistry, TryCatchNodeRegistry } from "./TryCatchNode"; @@ -12,6 +13,7 @@ export const getAllNodeRegistries = () => { return [ StartNodeRegistry, EndNodeRegistry, + DelayNodeRegistry, BizApplyNodeRegistry, BizUploadNodeRegistry, BizMonitorNodeRegistry, diff --git a/ui/src/components/workflow/designer/nodes/typings.ts b/ui/src/components/workflow/designer/nodes/typings.ts index 5199e90f4..e3dceae1b 100644 --- a/ui/src/components/workflow/designer/nodes/typings.ts +++ b/ui/src/components/workflow/designer/nodes/typings.ts @@ -13,6 +13,7 @@ import { WORKFLOW_NODE_TYPES, type WorkflowNode } from "@/domain/workflow"; export enum NodeType { Start = "start", End = "end", + Delay = "delay", Condition = "condition", BranchBlock = "branchBlock", TryCatch = "tryCatch", @@ -28,6 +29,7 @@ export enum NodeType { /* TYPE GUARD, PLEASE DO NOT REMOVE THESE! */ console.assert(NodeType.Start === WORKFLOW_NODE_TYPES.START); console.assert(NodeType.End === WORKFLOW_NODE_TYPES.END); +console.assert(NodeType.Delay === WORKFLOW_NODE_TYPES.DELAY); console.assert(NodeType.Condition === WORKFLOW_NODE_TYPES.CONDITION); console.assert(NodeType.BranchBlock === WORKFLOW_NODE_TYPES.BRANCHBLOCK); console.assert(NodeType.TryCatch === WORKFLOW_NODE_TYPES.TRYCATCH); diff --git a/ui/src/domain/workflow.ts b/ui/src/domain/workflow.ts index a2cea54e4..48c4b9738 100644 --- a/ui/src/domain/workflow.ts +++ b/ui/src/domain/workflow.ts @@ -37,6 +37,7 @@ export type WorkflowTriggerType = (typeof WORKFLOW_TRIGGERS)[keyof typeof WORKFL export const WORKFLOW_NODE_TYPES = Object.freeze({ START: "start", END: "end", + DELAY: "delay", CONDITION: "condition", BRANCHBLOCK: "branchBlock", TRYCATCH: "tryCatch", @@ -73,6 +74,14 @@ export const defaultNodeConfigForStart = (): Partial }; }; +export type WorkflowNodeConfigForDelay = { + wait?: number; +}; + +export const defaultNodeConfigForDelay = (): Partial => { + return {}; +}; + export type WorkflowNodeConfigForBranchBlock = { expression?: Expr; }; @@ -189,6 +198,16 @@ export const newNode = (type: WorkflowNodeType, { i18n = getI18n() }: { i18n?: R }, }; + case WORKFLOW_NODE_TYPES.DELAY: + return { + id: newNodeId(), + type: type, + data: { + name: t("workflow_node.delay.default_name"), + config: defaultNodeConfigForDelay(), + }, + }; + case WORKFLOW_NODE_TYPES.CONDITION: { const branch1 = newNode(WORKFLOW_NODE_TYPES.BRANCHBLOCK, { i18n }); branch1.data.name = `${branch1.data.name} 1`; diff --git a/ui/src/i18n/locales/en/nls.workflow.nodes.json b/ui/src/i18n/locales/en/nls.workflow.nodes.json index 5646b884d..c1c620987 100644 --- a/ui/src/i18n/locales/en/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/en/nls.workflow.nodes.json @@ -1025,6 +1025,14 @@ "workflow_node.notify.form.skip_on_all_prev_skipped.switch.on": "skip", "workflow_node.notify.form.skip_on_all_prev_skipped.switch.off": "not skip", + "workflow_node.delay.label": "Delay", + "workflow_node.delay.help": "Pause the execution, and wait for a certain amount of time.", + "workflow_node.delay.default_name": "Delay", + "workflow_node.delay.form_anchor.parameters.tab": "Parameters", + "workflow_node.delay.form.wait.label": "Waiting time", + "workflow_node.delay.form.wait.placeholder": "Please enter waiting time", + "workflow_node.delay.form.wait.unit": "seconds", + "workflow_node.condition.label": "Parallel/Conditional branch", "workflow_node.condition.help": "When the specified conditions are met, enter the corresponding branch. The failure of a node in a certain branch does not affect the continuation of parallel branch execution.", "workflow_node.condition.default_name": "Parallel", diff --git a/ui/src/i18n/locales/zh/nls.workflow.nodes.json b/ui/src/i18n/locales/zh/nls.workflow.nodes.json index b098eea67..45069defa 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.nodes.json +++ b/ui/src/i18n/locales/zh/nls.workflow.nodes.json @@ -1023,6 +1023,14 @@ "workflow_node.notify.form.skip_on_all_prev_skipped.switch.on": "跳过", "workflow_node.notify.form.skip_on_all_prev_skipped.switch.off": "不跳过", + "workflow_node.delay.label": "延迟等待", + "workflow_node.delay.help": "暂停执行工作流并等待一段时间。这在某些需要降低调用执行频率的场景很有用。", + "workflow_node.delay.default_name": "延迟", + "workflow_node.delay.form_anchor.parameters.tab": "参数设置", + "workflow_node.delay.form.wait.label": "等待时间", + "workflow_node.delay.form.wait.placeholder": "请输入等待时间", + "workflow_node.delay.form.wait.unit": "秒", + "workflow_node.condition.label": "并行/条件分支", "workflow_node.condition.help": "当满足指定的条件时,进入相应分支。某一分支中的节点执行失败不影响平行分支继续执行。", "workflow_node.condition.default_name": "并行", diff --git a/ui/src/pages/workflows/WorkflowDetailDesign.tsx b/ui/src/pages/workflows/WorkflowDetailDesign.tsx index 5a9c92e49..2fe36e5ce 100644 --- a/ui/src/pages/workflows/WorkflowDetailDesign.tsx +++ b/ui/src/pages/workflows/WorkflowDetailDesign.tsx @@ -1,4 +1,4 @@ -import { useEffect, useMemo, useRef, useState } from "react"; +import { useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { IconArrowBackUp, IconDots } from "@tabler/icons-react"; import { useDeepCompareEffect } from "ahooks"; @@ -7,7 +7,6 @@ import { debounce } from "radash"; import Show from "@/components/Show"; import { WorkflowDesigner, type WorkflowDesignerInstance, WorkflowNodeDrawer, WorkflowToolbar } from "@/components/workflow/designer"; -import { WORKFLOW_RUN_STATUSES } from "@/domain/workflowRun"; import { useZustandShallowSelector } from "@/hooks"; import { useWorkflowStore } from "@/stores/workflow"; import { getErrMsg } from "@/utils/error"; @@ -20,16 +19,8 @@ const WorkflowDetailDesign = () => { const { workflow, ...workflowStore } = useWorkflowStore(useZustandShallowSelector(["workflow", "orchestrate", "publish", "rollback"])); - const [workflowRunDisabled, setWorkflowRunDisabled] = useState(false); - const workflowRollbackDisabled = useMemo( - () => workflowRunDisabled || !workflow.hasDraft || !workflow.hasContent, - [workflowRunDisabled, workflow.hasDraft, workflow.hasContent] - ); - const workflowPublishDisabled = useMemo(() => workflowRunDisabled || !workflow.hasDraft, [workflowRunDisabled, workflow.hasDraft]); - useEffect(() => { - const running = workflow.lastRunStatus === WORKFLOW_RUN_STATUSES.PENDING || workflow.lastRunStatus === WORKFLOW_RUN_STATUSES.PROCESSING; - setWorkflowRunDisabled(running); - }, [workflow.lastRunStatus]); + const workflowRollbackDisabled = useMemo(() => !workflow.hasDraft || !workflow.hasContent, [workflow.hasDraft, workflow.hasContent]); + const workflowPublishDisabled = useMemo(() => !workflow.hasDraft, [workflow.hasDraft]); const designerRef = useRef(null); const designerPending = useRef(false); // 保存中时阻止刷新画布 From 628aff9dddb4b24c9dcb2d2ab3b91f741ff1e21c Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Fri, 22 Aug 2025 22:31:27 +0800 Subject: [PATCH 3/8] feat: disable node --- internal/domain/workflow.go | 5 +- internal/workflow/engine/engine.go | 5 ++ .../workflow/designer/forms/_shared.tsx | 59 ++++++++++++++++--- .../workflow/designer/nodes/_shared.tsx | 15 ++++- .../workflow/designer/nodes/typings.ts | 46 +++++++++++++++ ui/src/i18n/locales/en/nls.workflow.json | 2 + ui/src/i18n/locales/zh/nls.workflow.json | 2 + 7 files changed, 122 insertions(+), 12 deletions(-) diff --git a/internal/domain/workflow.go b/internal/domain/workflow.go index 2fa0a8f42..b3f39d65c 100644 --- a/internal/domain/workflow.go +++ b/internal/domain/workflow.go @@ -102,8 +102,9 @@ const ( ) type WorkflowNodeData struct { - Name string `json:"name"` - Config WorkflowNodeConfig `json:"config"` + Name string `json:"name"` + Disabled bool `json:"disabled,omitempty,omitzero"` + Config WorkflowNodeConfig `json:"config,omitempty,omitzero"` } type WorkflowNodeConfig map[string]any diff --git a/internal/workflow/engine/engine.go b/internal/workflow/engine/engine.go index 772002740..9c32af7da 100644 --- a/internal/workflow/engine/engine.go +++ b/internal/workflow/engine/engine.go @@ -195,6 +195,11 @@ func (we *workflowEngine) executeBlocks(wfCtx *WorkflowContext, blocks []*Node) default: } + // 节点已禁用,直接跳过执行 + if node.Data.Disabled { + continue + } + err := we.executeNode(wfCtx, node) if err != nil { return err diff --git a/ui/src/components/workflow/designer/forms/_shared.tsx b/ui/src/components/workflow/designer/forms/_shared.tsx index 16e245f1b..320d1413c 100644 --- a/ui/src/components/workflow/designer/forms/_shared.tsx +++ b/ui/src/components/workflow/designer/forms/_shared.tsx @@ -1,11 +1,12 @@ -import { useRef, useState } from "react"; +import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; -import { type FlowNodeEntity, getNodeForm } from "@flowgram.ai/fixed-layout-editor"; -import { IconX } from "@tabler/icons-react"; +import { type FlowNodeEntity, getNodeForm, useClientContext, useRefresh, useWatchFormValueIn } from "@flowgram.ai/fixed-layout-editor"; +import { IconEye, IconEyeOff, IconX } from "@tabler/icons-react"; import { useControllableValue } from "ahooks"; -import { Anchor, type AnchorProps, App, Button, Drawer, Flex, type FormInstance, Typography } from "antd"; +import { Anchor, type AnchorProps, App, Button, Drawer, Flex, type FormInstance, Tooltip, Typography } from "antd"; import { isEqual } from "radash"; +import Show from "@/components/Show"; import { getErrMsg } from "@/utils/error"; import { type NodeRegistry } from "../nodes/typings"; @@ -25,6 +26,11 @@ export interface NodeConfigDrawerProps { export const NodeConfigDrawer = ({ children, afterClose, anchor, footer = true, form: formInst, loading, node, ...props }: NodeConfigDrawerProps) => { const { t } = useTranslation(); + const ctx = useClientContext(); + const { playground } = ctx; + + const refresh = useRefresh(); + const { modal, notification } = App.useApp(); const [open, setOpen] = useControllableValue(props, { @@ -52,6 +58,22 @@ export const NodeConfigDrawer = ({ children, afterClose, anchor, footer = true, ); + const [isNodeDisabled, setIsNodeDisabled] = useState(() => { + if (node) { + return getNodeForm(node)?.getValueIn("disabled"); + } + return false; + }); + useEffect(() => { + const d1 = playground.config.onDataChange(() => refresh()); + const d2 = node?.onDataChange(() => setIsNodeDisabled(getNodeForm(node)?.getValueIn("disabled"))); + + return () => { + d1.dispose(); + d2.dispose(); + }; + }); + const handleOkClick = async () => { if (node == null) { setOpen(false); @@ -127,6 +149,10 @@ export const NodeConfigDrawer = ({ children, afterClose, anchor, footer = true, promise.then(() => setOpen(false)); }; + const handleDisableNodeClick = () => { + getNodeForm(node)!.setValueIn("disabled", !isNodeDisabled); + }; + return (
{renderNodeIcon()}
{node?.toJSON()?.data?.name}
+ + + + + + } + open={open} + title={t("workflow.detail.design.action.import.modal.title")} + width="768px" + onCancel={handleCancelClick} + > +
+ +
+ + + ); +}; + +const useModal = () => { + const [open, setOpen] = useState(false); + const [onOkHandler, setOnOkHandler] = useState<{ handler: WorkflowGraphImportModalProps["onOk"] }>(); + + const onOpenChange = useCallback((open: boolean) => { + setOpen(open); + }, []); + + return { + modalProps: { + afterClose: () => { + startTransition(() => { + if (!open) { + setOnOkHandler(void 0); + } + }); + }, + open, + onOk: (graph: WorkflowGraph) => { + onOkHandler?.handler?.(graph); + }, + onOpenChange, + }, + + open: () => { + setOpen(true); + + const { promise, resolve } = Promise.withResolvers(); + setOnOkHandler({ handler: (graph) => resolve(graph) }); + return promise; + }, + close: () => { + setOpen(false); + }, + }; +}; + +const _default = Object.assign(WorkflowGraphImportModal, { + useModal, +}); + +export default _default; diff --git a/ui/src/components/workflow/WorkflowRunDetailDrawer.tsx b/ui/src/components/workflow/WorkflowRunDetailDrawer.tsx index 4419062cc..a667323da 100644 --- a/ui/src/components/workflow/WorkflowRunDetailDrawer.tsx +++ b/ui/src/components/workflow/WorkflowRunDetailDrawer.tsx @@ -65,7 +65,7 @@ const WorkflowRunDetailDrawer = ({ afterClose, data, loading, trigger, ...props const useDrawer = () => { type DataType = WorkflowRunDetailDrawerProps["data"]; const [data, setData] = useState(); - const [open, setOpen] = useState(false); + const [open, setOpen] = useState(false); const onOpenChange = useCallback((open: boolean) => { setOpen(open); diff --git a/ui/src/components/workflow/designer/NodeDrawer.tsx b/ui/src/components/workflow/designer/NodeDrawer.tsx index 59f534e53..c33ad67b1 100644 --- a/ui/src/components/workflow/designer/NodeDrawer.tsx +++ b/ui/src/components/workflow/designer/NodeDrawer.tsx @@ -75,7 +75,7 @@ const NodeDrawer = ({ node, trigger, ...props }: NodeDrawerProps) => { const useDrawer = () => { type NodeDataType = NodeDrawerProps["node"]; const [node, setNode] = useState(); - const [open, setOpen] = useState(false); + const [open, setOpen] = useState(false); const onOpenChange = useCallback((open: boolean) => { setOpen(open); diff --git a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigFormExpressionEditor.tsx b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx similarity index 96% rename from ui/src/components/workflow/designer/forms/BranchBlockNodeConfigFormExpressionEditor.tsx rename to ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx index 4240bd03d..3d0f4b9bc 100644 --- a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigFormExpressionEditor.tsx +++ b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx @@ -21,7 +21,7 @@ import { useNodeFormContext } from "./_context"; import { getAllPreviousNodes } from "../_util"; import { NodeType } from "../nodes/typings"; -export interface BranchBlockNodeConfigFormExpressionEditorProps { +export interface BranchBlockNodeConfigExprInputBoxProps { className?: string; style?: React.CSSProperties; defaultValue?: Expr; @@ -29,8 +29,8 @@ export interface BranchBlockNodeConfigFormExpressionEditorProps { onChange?: (value: Expr) => void; } -export interface BranchBlockNodeConfigFormExpressionEditorInstance { - validate: () => Promise; +export interface BranchBlockNodeConfigExprInputBoxInstance { + validate: () => Promise; } // 表单内部使用的扁平结构 @@ -50,7 +50,7 @@ type ConditionFormValues = { logicalOperator: ExprLogicalOperator; }; -const exprToFormValues = (expr?: Expr): ConditionFormValues => { +const exprToFormValues = (expr: Expr | undefined): ConditionFormValues => { if (!expr) return getInitialValues(); const conditions: ConditionItem[] = []; @@ -138,7 +138,7 @@ const formValuesToExpr = (values: ConditionFormValues): Expr | undefined => { return expr; }; -const BranchBlockNodeConfigFormExpressionEditor = forwardRef( +const BranchBlockNodeConfigExprInputBox = forwardRef( ({ className, style, ...props }, ref) => { const { t } = useTranslation(); @@ -153,7 +153,7 @@ const BranchBlockNodeConfigFormExpressionEditor = forwardRef(); - const formName = useAntdFormName({ form: formInst, name: "workflowNodeBranchBlockConfigFormExpressionEditorForm" }); + const formName = useAntdFormName({ form: formInst, name: "workflowNodeBranchBlockConfigExprInputBoxForm" }); const [formModel, setFormModel] = useState(getInitialValues()); useEffect(() => { @@ -253,8 +253,9 @@ const BranchBlockNodeConfigFormExpressionEditor = forwardRef { await formInst.validateFields(); + return formValuesToExpr(formInst.getFieldsValue()); }, - } as BranchBlockNodeConfigFormExpressionEditorInstance; + }; }); return ( @@ -383,4 +384,4 @@ const getInitialValues = (): ConditionFormValues => { }; }; -export default BranchBlockNodeConfigFormExpressionEditor; +export default BranchBlockNodeConfigExprInputBox; diff --git a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx index a3929f5ed..4df968c2d 100644 --- a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx @@ -18,7 +18,7 @@ import { import { useAntdForm } from "@/hooks"; import { NodeFormContextProvider } from "./_context"; -import BranchBlockNodeConfigFormExpressionEditor, { type BranchBlockNodeConfigFormExpressionEditorInstance } from "./BranchBlockNodeConfigFormExpressionEditor"; +import BranchBlockNodeConfigExprInputBox, { type BranchBlockNodeConfigExprInputBoxInstance } from "./BranchBlockNodeConfigExprInputBox"; import { NodeType } from "../nodes/typings"; @@ -41,7 +41,7 @@ const BranchBlockNodeConfigForm = ({ node, ...props }: BranchBlockNodeConfigForm const formSchema = getSchema({ i18n }).superRefine(async (values, ctx) => { if (values.expression != null) { try { - await exprEditorRef.current!.validate(); + await exprInputBoxRef.current!.validate(); } catch { if (!ctx.issues.some((issue) => issue.path?.[0] === "expression")) { ctx.addIssue({ @@ -60,14 +60,14 @@ const BranchBlockNodeConfigForm = ({ node, ...props }: BranchBlockNodeConfigForm initialValues: initialValues ?? getInitialValues(), }); - const exprEditorRef = useRef(null); + const exprInputBoxRef = useRef(null); return (
- +
diff --git a/ui/src/components/workflow/designer/forms/_shared.tsx b/ui/src/components/workflow/designer/forms/_shared.tsx index 320d1413c..3d09b93c3 100644 --- a/ui/src/components/workflow/designer/forms/_shared.tsx +++ b/ui/src/components/workflow/designer/forms/_shared.tsx @@ -1,6 +1,6 @@ import { useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; -import { type FlowNodeEntity, getNodeForm, useClientContext, useRefresh, useWatchFormValueIn } from "@flowgram.ai/fixed-layout-editor"; +import { type FlowNodeEntity, getNodeForm, useClientContext, useRefresh } from "@flowgram.ai/fixed-layout-editor"; import { IconEye, IconEyeOff, IconX } from "@tabler/icons-react"; import { useControllableValue } from "ahooks"; import { Anchor, type AnchorProps, App, Button, Drawer, Flex, type FormInstance, Tooltip, Typography } from "antd"; @@ -41,7 +41,7 @@ export const NodeConfigDrawer = ({ children, afterClose, anchor, footer = true, const containerRef = useRef(null); - const [formPending, setFormPending] = useState(false); + const [formPending, setFormPending] = useState(false); const nodeRegistry = node?.getNodeRegistry(); const NodeIcon = nodeRegistry?.meta?.icon; @@ -134,13 +134,12 @@ export const NodeConfigDrawer = ({ children, afterClose, anchor, footer = true, const newValues = picker(formInst.getFieldsValue(true)); const changed = !isEqual(oldValues, {}) && !isEqual(oldValues, newValues); - const { promise, resolve, reject } = Promise.withResolvers(); + const { promise, resolve } = Promise.withResolvers(); if (changed) { modal.confirm({ title: t("common.text.operation_confirm"), content: t("workflow.detail.design.unsaved_changes.confirm"), onOk: () => resolve(void 0), - onCancel: () => reject(), }); } else { resolve(void 0); diff --git a/ui/src/domain/workflow.ts b/ui/src/domain/workflow.ts index 48c4b9738..f57dd7b49 100644 --- a/ui/src/domain/workflow.ts +++ b/ui/src/domain/workflow.ts @@ -59,6 +59,7 @@ export type WorkflowNode = { name?: string; disabled?: boolean; config?: Record; + [key: string]: unknown; }; blocks?: WorkflowNode[]; }; diff --git a/ui/src/i18n/locales/en/nls.common.json b/ui/src/i18n/locales/en/nls.common.json index 41be6024f..829ef007c 100644 --- a/ui/src/i18n/locales/en/nls.common.json +++ b/ui/src/i18n/locales/en/nls.common.json @@ -1,9 +1,10 @@ { "common.button.add": "Add", "common.button.cancel": "Cancel", + "common.button.close": "Close", "common.button.confirm": "Confirm", - "common.button.create": "Create", "common.button.copy": "Copy", + "common.button.create": "Create", "common.button.delete": "Delete", "common.button.download": "Download", "common.button.edit": "Edit", @@ -23,6 +24,7 @@ "common.text.operation_succeeded": "Operation succeeded", "common.text.operation_failed": "Operation failed", "common.text.request_error": "Request error", + "common.text.saving": "Saving ...", "common.text.search": "Search ...", "common.menu.document": "Document", diff --git a/ui/src/i18n/locales/en/nls.workflow.json b/ui/src/i18n/locales/en/nls.workflow.json index 1696b2bfc..8346ee152 100644 --- a/ui/src/i18n/locales/en/nls.workflow.json +++ b/ui/src/i18n/locales/en/nls.workflow.json @@ -82,6 +82,24 @@ "workflow.detail.design.action.rollback.button": "Rollback", "workflow.detail.design.action.rollback.modal.title": "Rollback changes", "workflow.detail.design.action.rollback.modal.content": "Are you sure to rollback your changes to the last published version?", + "workflow.detail.design.action.import.button": "Import", + "workflow.detail.design.action.import.modal.title": "Import workflow", + "workflow.detail.design.action.import.modal.ok_button": "Import", + "workflow.detail.design.action.import.form.format.label": "Format", + "workflow.detail.design.action.import.form.content.label": "Content", + "workflow.detail.design.action.import.form.content.errmsg.invalid": "Please enter a valid content", + "workflow.detail.design.action.import.form.content.errmsg.first_node_start": "The first node must be a start node", + "workflow.detail.design.action.import.form.content.errmsg.last_node_end": "The last node must be an end node", + "workflow.detail.design.action.import.form.content.errmsg.duplicate_start": "The start node must be unique", + "workflow.detail.design.action.import.form.content.errmsg.invalid_id": "Node ID invalid: #{{nodeId}}", + "workflow.detail.design.action.import.form.content.errmsg.invalid_config": "Node config invalid: #{{nodeId}}", + "workflow.detail.design.action.import.form.content.errmsg.conflict_id": "Node ID conflict: #{{nodeId}}", + "workflow.detail.design.action.import.form.content.errmsg.abnormal_condition_branch": "Abnormal parallel/conditional branch: #{{nodeId}}", + "workflow.detail.design.action.import.form.content.errmsg.abnormal_try_catch_branch": "Abnormal execution result branch: #{{nodeId}}", + "workflow.detail.design.action.export.button": "Export", + "workflow.detail.design.action.export.modal.title": "Export workflow", + "workflow.detail.design.action.export.form.format.label": "Format", + "workflow.detail.design.action.export.form.content.label": "Content", "workflow.detail.design.uncompleted_design.alert": "The orchestration is not ready. Please check if there are any nodes not configured.", "workflow.detail.design.unpublished_draft.alert": "The orchestration is not released yet.", "workflow.detail.design.unsaved_changes.confirm": "You have unsaved changes. Do you really want to close the panel and drop those changes?", diff --git a/ui/src/i18n/locales/zh/nls.common.json b/ui/src/i18n/locales/zh/nls.common.json index f55239c64..5bfe67f36 100644 --- a/ui/src/i18n/locales/zh/nls.common.json +++ b/ui/src/i18n/locales/zh/nls.common.json @@ -1,9 +1,10 @@ { "common.button.add": "新增", "common.button.cancel": "取消", + "common.button.close": "关闭", "common.button.confirm": "确定", - "common.button.create": "新建", "common.button.copy": "复制", + "common.button.create": "新建", "common.button.delete": "刪除", "common.button.download": "下载", "common.button.edit": "编辑", @@ -23,6 +24,7 @@ "common.text.operation_succeeded": "操作成功", "common.text.operation_failed": "操作失败", "common.text.request_error": "请求错误", + "common.text.saving": "保存中 ……", "common.text.search": "搜索 ……", "common.menu.document": "文档", diff --git a/ui/src/i18n/locales/zh/nls.workflow.json b/ui/src/i18n/locales/zh/nls.workflow.json index 9bda61118..67e5948b1 100644 --- a/ui/src/i18n/locales/zh/nls.workflow.json +++ b/ui/src/i18n/locales/zh/nls.workflow.json @@ -82,6 +82,24 @@ "workflow.detail.design.action.rollback.button": "回退更改", "workflow.detail.design.action.rollback.modal.title": "回退更改", "workflow.detail.design.action.rollback.modal.content": "确定要回退到最近一次发布的版本吗?", + "workflow.detail.design.action.import.button": "导入", + "workflow.detail.design.action.import.modal.title": "导入工作流", + "workflow.detail.design.action.import.modal.ok_button": "导入", + "workflow.detail.design.action.import.form.format.label": "格式", + "workflow.detail.design.action.import.form.content.label": "内容", + "workflow.detail.design.action.import.form.content.errmsg.invalid": "请输入有效的内容", + "workflow.detail.design.action.import.form.content.errmsg.first_node_start": "第一个节点必须是开始节点", + "workflow.detail.design.action.import.form.content.errmsg.last_node_end": "最后一个节点必须是结束节点", + "workflow.detail.design.action.import.form.content.errmsg.duplicate_start": "有且只能有一个开始节点", + "workflow.detail.design.action.import.form.content.errmsg.invalid_id": "节点 ID 无效:#{{nodeId}}", + "workflow.detail.design.action.import.form.content.errmsg.invalid_config": "节点配置无效:#{{nodeId}}", + "workflow.detail.design.action.import.form.content.errmsg.conflict_id": "节点 ID 冲突:#{{nodeId}}", + "workflow.detail.design.action.import.form.content.errmsg.abnormal_condition_branch": "并行/条件分支结构异常:#{{nodeId}}", + "workflow.detail.design.action.import.form.content.errmsg.abnormal_try_catch_branch": "执行结果分支结构异常:#{{nodeId}}", + "workflow.detail.design.action.export.button": "导出", + "workflow.detail.design.action.export.modal.title": "导出工作流", + "workflow.detail.design.action.export.form.format.label": "格式", + "workflow.detail.design.action.export.form.content.label": "内容", "workflow.detail.design.uncompleted_design.alert": "流程编排未就绪,请检查是否有节点未完成配置。", "workflow.detail.design.unpublished_draft.alert": "当前编排有尚未发布的更改。", "workflow.detail.design.unsaved_changes.confirm": "你有尚未保存的更改。确定要关闭面板吗?", diff --git a/ui/src/pages/workflows/WorkflowDetail.tsx b/ui/src/pages/workflows/WorkflowDetail.tsx index 5ce0f68a1..4c9d7121e 100644 --- a/ui/src/pages/workflows/WorkflowDetail.tsx +++ b/ui/src/pages/workflows/WorkflowDetail.tsx @@ -65,13 +65,12 @@ const WorkflowDetail = () => { }, [workflow.lastRunStatus]); const handleRunClick = () => { - const { promise, resolve, reject } = Promise.withResolvers(); + const { promise, resolve } = Promise.withResolvers(); if (workflow.hasDraft) { modal.confirm({ title: t("workflow.action.run.modal.title"), content: t("workflow.action.run.modal.content"), onOk: () => resolve(void 0), - onCancel: () => reject(), }); } else { resolve(void 0); diff --git a/ui/src/pages/workflows/WorkflowDetailDesign.tsx b/ui/src/pages/workflows/WorkflowDetailDesign.tsx index 2fe36e5ce..bab6d4794 100644 --- a/ui/src/pages/workflows/WorkflowDetailDesign.tsx +++ b/ui/src/pages/workflows/WorkflowDetailDesign.tsx @@ -1,12 +1,14 @@ import { useMemo, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; -import { IconArrowBackUp, IconDots } from "@tabler/icons-react"; +import { IconArrowBackUp, IconDots, IconTransferIn, IconTransferOut } from "@tabler/icons-react"; import { useDeepCompareEffect } from "ahooks"; import { Alert, App, Button, Card, Dropdown, Result, Space, theme } from "antd"; import { debounce } from "radash"; import Show from "@/components/Show"; import { WorkflowDesigner, type WorkflowDesignerInstance, WorkflowNodeDrawer, WorkflowToolbar } from "@/components/workflow/designer"; +import WorkflowGraphExportModal from "@/components/workflow/WorkflowGraphExportModal"; +import WorkflowGraphImportModal from "@/components/workflow/WorkflowGraphImportModal"; import { useZustandShallowSelector } from "@/hooks"; import { useWorkflowStore } from "@/stores/workflow"; import { getErrMsg } from "@/utils/error"; @@ -93,8 +95,33 @@ const WorkflowDetailDesign = () => { }); }; + const handleImportClick = async () => { + graphImportModal.open().then(async (graph) => { + const loadingKey = Math.random().toString(36).substring(0, 8); + message.loading({ key: loadingKey, content: t("common.text.saving"), duration: 0 }); + + try { + await workflowStore.orchestrate(graph); + + message.destroy(loadingKey); + message.success(t("common.text.operation_succeeded")); + } catch (err) { + console.error(err); + message.destroy(loadingKey); + notification.error({ message: t("common.text.request_error"), description: getErrMsg(err) }); + } + }); + }; + + const handleExportClick = () => { + graphExportModal.open(workflow.graphDraft!); + }; + const { drawerProps: designerNodeDrawerProps, ...designerNodeDrawer } = WorkflowNodeDrawer.useDrawer(); + const { modalProps: graphImportModalProps, ...graphImportModal } = WorkflowGraphImportModal.useModal(); + const { modalProps: graphExportModalProps, ...graphExportModal } = WorkflowGraphExportModal.useModal(); + return (
{ icon: , onClick: handleRollbackClick, }, + { + type: "divider", + }, + { + key: "import", + label: t("workflow.detail.design.action.import.button"), + icon: , + onClick: handleImportClick, + }, + { + key: "export", + label: t("workflow.detail.design.action.export.button"), + icon: , + onClick: handleExportClick, + }, ], }} trigger={["click"]} @@ -164,6 +206,9 @@ const WorkflowDetailDesign = () => { + + +
); diff --git a/ui/src/utils/validators.ts b/ui/src/utils/validators.ts index 348d96694..63e431fef 100644 --- a/ui/src/utils/validators.ts +++ b/ui/src/utils/validators.ts @@ -14,30 +14,15 @@ export const validDomainName = (value: string, { allowWildcard = false }: { allo }; export const validEmailAddress = (value: string) => { - try { - z.email().parse(value); - return true; - } catch (_) { - return false; - } + return z.email().safeParse(value).success; }; export const validIPv4Address = (value: string) => { - try { - z.ipv4().parse(value); - return true; - } catch (_) { - return false; - } + return z.ipv4().safeParse(value).success; }; export const validIPv6Address = (value: string) => { - try { - z.ipv6().parse(value); - return true; - } catch (_) { - return false; - } + return z.ipv6().safeParse(value).success; }; export const validHttpOrHttpsUrl = (value: string) => { From 7b71593ad3dfdb9c5c1b368173661155d0f257e1 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Tue, 26 Aug 2025 10:19:28 +0800 Subject: [PATCH 7/8] feat: optimize data list fetching without unnecessary fields --- go.mod | 2 +- go.sum | 2 ++ internal/certificate/service_deps.go | 2 +- internal/domain/statistics.go | 6 ++-- internal/repository/certificate.go | 2 +- internal/repository/statistics.go | 6 ++-- migrations/1755187200_cm0.4.0_migrate.go | 5 +++ ui/src/components/access/AccessEditDrawer.tsx | 24 ++++++++++++-- ui/src/components/access/AccessForm.tsx | 2 +- .../certificate/CertificateDetailDrawer.tsx | 24 ++++++++++++-- .../workflow/WorkflowGraphExportModal.tsx | 2 +- ...zDeployNodeConfigFormProviderAliyunCLB.tsx | 2 +- ...NodeConfigFormProviderBaiduCloudAppBLB.tsx | 2 +- ...loyNodeConfigFormProviderBaiduCloudBLB.tsx | 2 +- .../forms/BizNotifyNodeConfigForm.tsx | 2 +- ...otifyNodeConfigFormProviderTelegramBot.tsx | 2 +- .../BranchBlockNodeConfigExprInputBox.tsx | 12 +++---- .../workflow/designer/forms/_shared.tsx | 3 +- ui/src/domain/access.ts | 4 +-- ui/src/domain/certificate.ts | 2 +- ui/src/domain/statistics.ts | 2 +- ui/src/domain/workflow.ts | 2 +- ui/src/domain/workflowRun.ts | 2 +- ui/src/i18n/locales/en/nls.certificate.json | 2 +- ui/src/i18n/locales/en/nls.dashboard.json | 2 +- .../i18n/locales/en/nls.workflow.nodes.json | 2 +- ui/src/pages/accesses/AccessList.tsx | 17 ++++++---- ui/src/pages/certificates/CertificateList.tsx | 14 ++++++-- ui/src/pages/dashboard/Dashboard.tsx | 4 +-- .../pages/workflows/WorkflowDetailDesign.tsx | 12 +++---- ui/src/pages/workflows/WorkflowNew.tsx | 10 +++--- ui/src/repository/access.ts | 21 ++++++++---- ui/src/repository/certificate.ts | 31 ++++++++++++++++-- ui/src/repository/workflow.ts | 32 ++++++++++++++++--- ui/src/repository/workflowRun.ts | 14 ++++++++ 35 files changed, 200 insertions(+), 75 deletions(-) diff --git a/go.mod b/go.mod index 6b7fcba96..5bb1dcd36 100644 --- a/go.mod +++ b/go.mod @@ -47,7 +47,7 @@ require ( github.com/pavlo-v-chernykh/keystore-go/v4 v4.5.0 github.com/pkg/sftp v1.13.9 github.com/pocketbase/dbx v1.11.0 - github.com/pocketbase/pocketbase v0.29.2 + github.com/pocketbase/pocketbase v0.29.3 github.com/povsister/scp v0.0.0-20250701154629-777cf82de5df github.com/qiniu/go-sdk/v7 v7.25.4 github.com/samber/lo v1.51.0 diff --git a/go.sum b/go.sum index 9d0dce11e..602120ed6 100644 --- a/go.sum +++ b/go.sum @@ -789,6 +789,8 @@ github.com/pocketbase/pocketbase v0.29.0 h1:oL6qvkU2QSybClVtQdaq9Z1F3Wk59iKYCfIa github.com/pocketbase/pocketbase v0.29.0/go.mod h1:SqyH7o/3e+/uLySATlJqxH4S8gyU6R0adG56ZSV1vuU= github.com/pocketbase/pocketbase v0.29.2 h1:MghVgLYy/xh9lBwHtteNSYjYOvHKYD+dS9pzUzOP79Q= github.com/pocketbase/pocketbase v0.29.2/go.mod h1:QZPKtMCWfiDJb0aLhwgj7ZOr6O8tusbui2EhTFAHThU= +github.com/pocketbase/pocketbase v0.29.3 h1:Mj8o5awsbVJIdIoTuQNhfC2oL/c4aImQ3RyfFZlzFVg= +github.com/pocketbase/pocketbase v0.29.3/go.mod h1:oGpT67LObxCFK4V2fSL7J9YnPbBnnshOpJ5v3zcneww= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/povsister/scp v0.0.0-20250701154629-777cf82de5df h1:zEgSHrxo8f6hGG1xCaqunfBq8hlfDmFd1JM0QXiQi7o= diff --git a/internal/certificate/service_deps.go b/internal/certificate/service_deps.go index 7b22dbbad..ecdca099e 100644 --- a/internal/certificate/service_deps.go +++ b/internal/certificate/service_deps.go @@ -9,7 +9,7 @@ import ( ) type certificateRepository interface { - ListExpireSoon(ctx context.Context) ([]*domain.Certificate, error) + ListExpiringSoon(ctx context.Context) ([]*domain.Certificate, error) GetById(ctx context.Context, id string) (*domain.Certificate, error) DeleteWhere(ctx context.Context, exprs ...dbx.Expression) (int, error) } diff --git a/internal/domain/statistics.go b/internal/domain/statistics.go index 1d3cbfdd3..bf3246df3 100644 --- a/internal/domain/statistics.go +++ b/internal/domain/statistics.go @@ -1,9 +1,9 @@ package domain type Statistics struct { - CertificateTotal int `json:"certificateTotal"` - CertificateExpireSoon int `json:"certificateExpireSoon"` - CertificateExpired int `json:"certificateExpired"` + CertificateTotal int `json:"certificateTotal"` + CertificateExpiringSoon int `json:"certificateExpiringSoon"` + CertificateExpired int `json:"certificateExpired"` WorkflowTotal int `json:"workflowTotal"` WorkflowEnabled int `json:"workflowEnabled"` diff --git a/internal/repository/certificate.go b/internal/repository/certificate.go index a8152ab23..16d5d95b2 100644 --- a/internal/repository/certificate.go +++ b/internal/repository/certificate.go @@ -18,7 +18,7 @@ func NewCertificateRepository() *CertificateRepository { return &CertificateRepository{} } -func (r *CertificateRepository) ListExpireSoon(ctx context.Context) ([]*domain.Certificate, error) { +func (r *CertificateRepository) ListExpiringSoon(ctx context.Context) ([]*domain.Certificate, error) { records, err := app.GetApp().FindAllRecords( domain.CollectionNameCertificate, dbx.NewExp("validityNotAfter>DATETIME('now')"), diff --git a/internal/repository/statistics.go b/internal/repository/statistics.go index e43aeaa60..0343bb336 100644 --- a/internal/repository/statistics.go +++ b/internal/repository/statistics.go @@ -28,15 +28,15 @@ func (r *StatisticsRepository) Get(ctx context.Context) (*domain.Statistics, err rs.CertificateTotal = certTotal.Total // 即将过期证书 - certExpireSoonTotal := struct { + certExpiringSoonTotal := struct { Total int `db:"total"` }{} if err := app.GetDB(). NewQuery("SELECT COUNT(*) AS total FROM certificate WHERE validityNotAfter > DATETIME('now') and validityNotAfter < DATETIME('now', '+20 days') AND deleted = ''"). - One(&certExpireSoonTotal); err != nil { + One(&certExpiringSoonTotal); err != nil { return nil, err } - rs.CertificateExpireSoon = certExpireSoonTotal.Total + rs.CertificateExpiringSoon = certExpiringSoonTotal.Total // 已过期证书 certExpiredTotal := struct { diff --git a/migrations/1755187200_cm0.4.0_migrate.go b/migrations/1755187200_cm0.4.0_migrate.go index 0a4e6f0e1..9d85755a8 100644 --- a/migrations/1755187200_cm0.4.0_migrate.go +++ b/migrations/1755187200_cm0.4.0_migrate.go @@ -37,12 +37,17 @@ func init() { // update collection `access` // - modify field `config` schema: rename property `defaultReceiver` to `receiver` + // - modify field `reserve` candidates // - delete records: 'local' { collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") if err != nil { return err } else if collection != nil { + if _, err := app.DB().NewQuery("UPDATE access SET reserve = 'notif' WHERE reserve = 'notification'").Execute(); err != nil { + return err + } + if _, err := app.DB().NewQuery("DELETE FROM access WHERE provider = 'local'").Execute(); err != nil { return err } diff --git a/ui/src/components/access/AccessEditDrawer.tsx b/ui/src/components/access/AccessEditDrawer.tsx index 0dc6bf1f6..6792dfebd 100644 --- a/ui/src/components/access/AccessEditDrawer.tsx +++ b/ui/src/components/access/AccessEditDrawer.tsx @@ -1,7 +1,7 @@ import { startTransition, useCallback, useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { IconX } from "@tabler/icons-react"; -import { useControllableValue } from "ahooks"; +import { useControllableValue, useGetState } from "ahooks"; import { App, Button, Drawer, Flex } from "antd"; import { type AccessModel } from "@/domain/access"; @@ -145,7 +145,8 @@ const AccessEditDrawer = ({ afterClose, afterSubmit, mode, data, loading, trigge const useDrawer = () => { type DataType = AccessEditDrawerProps["data"]; - const [data, setData] = useState(); + const [data, setData, getData] = useGetState(); + const [loading, setLoading] = useState(); const [open, setOpen] = useState(false); const onOpenChange = useCallback((open: boolean) => { @@ -158,17 +159,34 @@ const useDrawer = () => { startTransition(() => { if (!open) { setData(void 0); + setLoading(void 0); } }); }, data, + loading, open, onOpenChange, }, - open: (data: NonNullable) => { + open: ({ data, loading }: { data: NonNullable; loading?: boolean }) => { setData(data); + setLoading(loading); setOpen(true); + + return { + safeUpdate: ({ data, loading }: { data?: NonNullable; loading?: boolean }) => { + if (data != null) { + if (data.id !== getData()?.id) return; // 确保数据不脏读 + + setData(data); + } + + if (loading != null) { + setLoading(loading); + } + }, + }; }, close: () => { setOpen(false); diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx index 8ce53863f..9978e2733 100644 --- a/ui/src/components/access/AccessForm.tsx +++ b/ui/src/components/access/AccessForm.tsx @@ -334,7 +334,7 @@ const AccessForm = forwardRef(({ className, getFieldsValue: () => { const values = formInst.getFieldsValue(true); values.config = nestedFormInst.getFieldsValue(); - values.reserve = usage === "ca" ? "ca" : usage === "notification" ? "notification" : void 0; + values.reserve = usage === "ca" ? "ca" : usage === "notification" ? "notif" : void 0; return values; }, resetFields: (fields) => { diff --git a/ui/src/components/certificate/CertificateDetailDrawer.tsx b/ui/src/components/certificate/CertificateDetailDrawer.tsx index 788143790..4bc7e0f53 100644 --- a/ui/src/components/certificate/CertificateDetailDrawer.tsx +++ b/ui/src/components/certificate/CertificateDetailDrawer.tsx @@ -1,6 +1,6 @@ import { startTransition, useCallback, useState } from "react"; import { IconX } from "@tabler/icons-react"; -import { useControllableValue } from "ahooks"; +import { useControllableValue, useGetState } from "ahooks"; import { Button, Drawer, Flex } from "antd"; import Show from "@/components/Show"; @@ -64,7 +64,8 @@ const CertificateDetailDrawer = ({ afterClose, data, loading, trigger, ...props const useDrawer = () => { type DataType = CertificateDetailDrawerProps["data"]; - const [data, setData] = useState(); + const [data, setData, getData] = useGetState(); + const [loading, setLoading] = useState(); const [open, setOpen] = useState(false); const onOpenChange = useCallback((open: boolean) => { @@ -77,17 +78,34 @@ const useDrawer = () => { startTransition(() => { if (!open) { setData(void 0); + setLoading(void 0); } }); }, data, + loading, open, onOpenChange, }, - open: (data: NonNullable) => { + open: ({ data, loading }: { data: NonNullable; loading?: boolean }) => { setData(data); + setLoading(loading); setOpen(true); + + return { + safeUpdate: ({ data, loading }: { data?: NonNullable; loading?: boolean }) => { + if (data != null) { + if (data.id !== getData()?.id) return; // 确保数据不脏读 + + setData(data); + } + + if (loading != null) { + setLoading(loading); + } + }, + }; }, close: () => { setOpen(false); diff --git a/ui/src/components/workflow/WorkflowGraphExportModal.tsx b/ui/src/components/workflow/WorkflowGraphExportModal.tsx index 9adfbc9cb..0569630c9 100644 --- a/ui/src/components/workflow/WorkflowGraphExportModal.tsx +++ b/ui/src/components/workflow/WorkflowGraphExportModal.tsx @@ -78,7 +78,7 @@ const useModal = () => { onOpenChange, }, - open: (data: DataType) => { + open: ({ data }: { data: DataType }) => { setData(data); setOpen(true); }, diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderAliyunCLB.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderAliyunCLB.tsx index e20b91635..f3f1ee94f 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderAliyunCLB.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderAliyunCLB.tsx @@ -107,7 +107,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) region: z.string().nonempty(t("workflow_node.deploy.form.aliyun_clb_region.placeholder")), resourceType: z.literal([RESOURCE_TYPE_LOADBALANCER, RESOURCE_TYPE_LISTENER], t("workflow_node.deploy.form.aliyun_clb_resource_type.placeholder")), loadbalancerId: z.string().nonempty(t("workflow_node.deploy.form.aliyun_clb_loadbalancer_id.placeholder")), - listenerPort: z.preprocess((v) => (v == null || v === "" ? undefined : Number(v)), z.number().nullish()), + listenerPort: z.preprocess((v) => (v == null || v === "" ? void 0 : Number(v)), z.number().nullish()), domain: z .string() .nullish() diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudAppBLB.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudAppBLB.tsx index a52ff49f4..bace7c3a9 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudAppBLB.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudAppBLB.tsx @@ -107,7 +107,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) region: z.string().nonempty(t("workflow_node.deploy.form.baiducloud_appblb_region.placeholder")), resourceType: z.literal([RESOURCE_TYPE_LOADBALANCER, RESOURCE_TYPE_LISTENER], t("workflow_node.deploy.form.baiducloud_appblb_resource_type.placeholder")), loadbalancerId: z.string().nonempty(t("workflow_node.deploy.form.baiducloud_appblb_loadbalancer_id.placeholder")), - listenerPort: z.preprocess((v) => (v == null || v === "" ? undefined : Number(v)), z.number().nullish()), + listenerPort: z.preprocess((v) => (v == null || v === "" ? void 0 : Number(v)), z.number().nullish()), domain: z .string() .nullish() diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudBLB.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudBLB.tsx index 4b2fd05d6..c4663e9ff 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudBLB.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFormProviderBaiduCloudBLB.tsx @@ -107,7 +107,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) region: z.string().nonempty(t("workflow_node.deploy.form.baiducloud_blb_region.placeholder")), resourceType: z.literal([RESOURCE_TYPE_LOADBALANCER, RESOURCE_TYPE_LISTENER], t("workflow_node.deploy.form.baiducloud_blb_resource_type.placeholder")), loadbalancerId: z.string().nonempty(t("workflow_node.deploy.form.baiducloud_blb_loadbalancer_id.placeholder")), - listenerPort: z.preprocess((v) => (v == null || v === "" ? undefined : Number(v)), z.number().nullish()), + listenerPort: z.preprocess((v) => (v == null || v === "" ? void 0 : Number(v)), z.number().nullish()), domain: z .string() .nullish() diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx index 3d86d8d60..881e075c3 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx @@ -168,7 +168,7 @@ const BizNotifyNodeConfigForm = ({ node, ...props }: BizNotifyNodeConfigFormProp showSearch onChange={handleProviderAccessSelect} onFilter={(_, option) => { - if (option.reserve !== "notification") return false; + if (option.reserve !== "notif") return false; const provider = accessProvidersMap.get(option.provider); return !!provider?.usages?.includes(ACCESS_USAGES.NOTIFICATION); diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx index c085e79ed..2c4ba7ae7 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFormProviderTelegramBot.tsx @@ -40,7 +40,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) return z.object({ chatId: z .preprocess( - (v) => (v == null || v === "" ? undefined : Number(v)), + (v) => (v == null || v === "" ? void 0 : Number(v)), z .number() .nullish() diff --git a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx index 3d0f4b9bc..0fa1799b4 100644 --- a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx +++ b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx @@ -60,9 +60,9 @@ const exprToFormValues = (expr: Expr | undefined): ConditionFormValues => { if (expr.type === ExprType.Comparison) { if (expr.left.type == ExprType.Variant && expr.right.type == ExprType.Constant) { conditions.push({ - leftSelector: expr.left.selector?.id != null ? `${expr.left.selector.id}#${expr.left.selector.name}#${expr.left.selector.type}` : undefined, - operator: expr.operator != null ? expr.operator : undefined, - rightValue: expr.right?.value != null ? String(expr.right.value) : undefined, + leftSelector: expr.left.selector?.id != null ? `${expr.left.selector.id}#${expr.left.selector.name}#${expr.left.selector.type}` : void 0, + operator: expr.operator != null ? expr.operator : void 0, + rightValue: expr.right?.value != null ? String(expr.right.value) : void 0, }); } else { console.warn("[certimate] invalid comparison expression: left must be a variant and right must be a constant", expr); @@ -113,14 +113,14 @@ const formValuesToExpr = (values: ConditionFormValues): Expr | undefined => { }; if (values.conditions.length === 0) { - return undefined; + return; } // 只有一个条件时,直接返回比较表达式 if (values.conditions.length === 1) { const { leftSelector, operator, rightValue } = values.conditions[0]; if (!leftSelector || !operator || !rightValue) { - return undefined; + return; } return wrapExpr(values.conditions[0]); } @@ -316,7 +316,7 @@ const BranchBlockNodeConfigExprInputBox = forwardRef