diff --git a/go.mod b/go.mod index 7318e37c0..88635d103 100644 --- a/go.mod +++ b/go.mod @@ -8,14 +8,14 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/azcore v1.19.1 github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.13.0 github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azcertificates v1.4.0 - github.com/G-Core/gcorelabscdn-go v1.0.34 + github.com/G-Core/gcorelabscdn-go v1.0.35 github.com/alibabacloud-go/alb-20200616/v2 v2.2.9 github.com/alibabacloud-go/apig-20240327/v5 v5.0.1 github.com/alibabacloud-go/cas-20200407/v4 v4.0.3 github.com/alibabacloud-go/cdn-20180510/v8 v8.0.2 github.com/alibabacloud-go/cloudapi-20160714/v5 v5.7.7 github.com/alibabacloud-go/darabonba-openapi/v2 v2.1.13 - github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.2 + github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.4 github.com/alibabacloud-go/esa-20240910/v2 v2.39.2 github.com/alibabacloud-go/fc-20230330/v4 v4.6.3 github.com/alibabacloud-go/fc-open-20210406/v2 v2.0.12 @@ -25,18 +25,18 @@ require ( github.com/alibabacloud-go/slb-20140515/v4 v4.0.10 github.com/alibabacloud-go/tea v1.3.13 github.com/alibabacloud-go/vod-20170321/v4 v4.10.0 - github.com/alibabacloud-go/waf-openapi-20211001/v6 v6.6.0 + github.com/alibabacloud-go/waf-openapi-20211001/v6 v6.7.0 github.com/aliyun/alibabacloud-oss-go-sdk-v2 v1.3.0 - github.com/aws/aws-sdk-go-v2/service/acm v1.37.6 - github.com/aws/aws-sdk-go-v2/service/cloudfront v1.55.2 - github.com/aws/aws-sdk-go-v2/service/iam v1.49.0 + github.com/aws/aws-sdk-go-v2/service/acm v1.37.10 + github.com/aws/aws-sdk-go-v2/service/cloudfront v1.55.3 + github.com/aws/aws-sdk-go-v2/service/iam v1.49.1 github.com/baidubce/bce-sdk-go v0.9.250 github.com/byteplus-sdk/byteplus-sdk-golang v1.0.58 - github.com/go-acme/lego/v4 v4.27.0 + github.com/go-acme/lego/v4 v4.28.0 github.com/go-cmd/cmd v1.4.3 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.172 + github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.173 github.com/jdcloud-api/jdcloud-sdk-go v1.64.0 github.com/kong/go-kong v0.69.0 github.com/libdns/dynv6 v1.0.0 @@ -59,10 +59,10 @@ require ( github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/teo v1.1.47 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.1.13 github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.1.36 - github.com/ucloud/ucloud-sdk-go v0.22.54 + github.com/ucloud/ucloud-sdk-go v0.22.56 github.com/volcengine/ve-tos-golang-sdk/v2 v2.7.21 - github.com/volcengine/volc-sdk-golang v1.0.224 - github.com/volcengine/volcengine-go-sdk v1.1.44 + github.com/volcengine/volc-sdk-golang v1.0.225 + github.com/volcengine/volcengine-go-sdk v1.1.46 github.com/xhit/go-str2duration/v2 v2.1.0 gitlab.ecloud.com/ecloud/ecloudsdkclouddns v1.0.1 gitlab.ecloud.com/ecloud/ecloudsdkcore v1.0.0 @@ -87,7 +87,7 @@ require ( github.com/alibabacloud-go/tea-oss-utils v1.1.0 // indirect github.com/alibabacloud-go/tea-utils/v2 v2.0.7 // indirect github.com/avast/retry-go v3.0.0+incompatible // indirect - github.com/aws/aws-sdk-go-v2/service/route53 v1.58.4 // indirect + github.com/aws/aws-sdk-go-v2/service/route53 v1.59.1 // indirect github.com/buger/goterm v1.0.4 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/diskfs/go-diskfs v1.5.0 // indirect @@ -124,10 +124,9 @@ require ( github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/namedotcom/go/v4 v4.0.2 // indirect - github.com/nrdcg/bunny-go v0.0.0-20250327222614-988a091fc7ea // indirect - github.com/nrdcg/desec v0.11.0 // indirect + github.com/nrdcg/bunny-go v0.1.0 // indirect + github.com/nrdcg/desec v0.11.1 // indirect github.com/nrdcg/goacmedns v0.2.0 // indirect - github.com/nrdcg/mailinabox v0.2.0 // indirect github.com/nrdcg/porkbun v0.4.0 // indirect github.com/peterhellberg/link v1.2.0 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect @@ -147,7 +146,7 @@ require ( golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // 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.15.0 // indirect + gopkg.in/ns1/ns1-go.v2 v2.15.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b // indirect @@ -169,18 +168,18 @@ require ( github.com/alibabacloud-go/tea-xml v1.1.3 // indirect github.com/aliyun/credentials-go v1.4.7 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go-v2 v1.39.4 - github.com/aws/aws-sdk-go-v2/config v1.31.12 - github.com/aws/aws-sdk-go-v2/credentials v1.18.16 - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.11 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.11 // 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.13.1 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.29.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.38.6 // indirect + github.com/aws/aws-sdk-go-v2 v1.39.5 + github.com/aws/aws-sdk-go-v2/config v1.31.15 + github.com/aws/aws-sdk-go-v2/credentials v1.18.19 + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.11 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12 // indirect + github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.11 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.29.8 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.38.9 // indirect github.com/aws/smithy-go v1.23.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/clbanning/mxj/v2 v2.7.0 // indirect diff --git a/go.sum b/go.sum index 902855f03..02794a994 100644 --- a/go.sum +++ b/go.sum @@ -66,8 +66,8 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= -github.com/G-Core/gcorelabscdn-go v1.0.34 h1:Qpvd4xKGFSejBf9Fw+BrCbnvdm9/d/tfAAw94G7/0OE= -github.com/G-Core/gcorelabscdn-go v1.0.34/go.mod h1:iSGXaTvZBzDHQW+rKFS918BgFVpONcyLEijwh8WsXpE= +github.com/G-Core/gcorelabscdn-go v1.0.35 h1:7UFoL1jSb8e+JN1xxQisGE8gtflqx1vM1gH7wa9fa1E= +github.com/G-Core/gcorelabscdn-go v1.0.35/go.mod h1:iSGXaTvZBzDHQW+rKFS918BgFVpONcyLEijwh8WsXpE= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= @@ -125,8 +125,8 @@ github.com/alibabacloud-go/darabonba-string v1.0.2 h1:E714wms5ibdzCqGeYJ9JCFywE5 github.com/alibabacloud-go/darabonba-string v1.0.2/go.mod h1:93cTfV3vuPhhEwGGpKKqhVW4jLe7tDpo3LUM0i0g6mA= github.com/alibabacloud-go/dcdn-20180115/v3 v3.5.0 h1:EQmKhYju6y38kJ1ZvZROeJG2Q1Wk6hlc8KQrVhvGyaw= 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.2 h1:KvHAZ1yCJ6NnF6aeqhR0e8kuc7zCrUAkS7+2RyQaJJU= -github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.2/go.mod h1:fBEEvkfQEp5k7yfMzU4n0zWcibHDoGfakv3YaopBdiI= +github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.4 h1:7QCjt29gSpdF1/BXto4GJLozAshNPbR6Obo/8pXlao4= +github.com/alibabacloud-go/ddoscoo-20200101/v4 v4.0.4/go.mod h1:EXd820TvsKZyYHxdkkAtPFqS5Cjp3zAmKxQ9yZ4YLCk= 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= @@ -193,8 +193,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.10.0 h1:e28BNu9IRhCtHI5HA+2ZRG4r9SDftAyp258q9py2tRU= github.com/alibabacloud-go/vod-20170321/v4 v4.10.0/go.mod h1:IkHD+fJL2oWvs9oxyp5Dc651AO5eptIP5PRsH0ofraA= -github.com/alibabacloud-go/waf-openapi-20211001/v6 v6.6.0 h1:UCKCmA7hnnSlGUCVF31Z8v/+3UloJtyqNGV/ITAtr7U= -github.com/alibabacloud-go/waf-openapi-20211001/v6 v6.6.0/go.mod h1:Pi1XJ9yMR6weUxPMDqVaT+mhHeeSPRdMZh2fl4VCKLs= +github.com/alibabacloud-go/waf-openapi-20211001/v6 v6.7.0 h1:PBX4pFYXV8Ey+QKJYV3G0AC7X926jTFG2zVd5gRkCL4= +github.com/alibabacloud-go/waf-openapi-20211001/v6 v6.7.0/go.mod h1:Pi1XJ9yMR6weUxPMDqVaT+mhHeeSPRdMZh2fl4VCKLs= github.com/aliyun/alibabacloud-oss-go-sdk-v2 v1.3.0 h1:wQlqotpyjYPjJz+Noh5bRu7Snmydk8SKC5Z6u1CR20Y= github.com/aliyun/alibabacloud-oss-go-sdk-v2 v1.3.0/go.mod h1:FTzydeQVmR24FI0D6XWUOMKckjXehM/jgMn1xC+DA9M= github.com/aliyun/credentials-go v1.1.2/go.mod h1:ozcZaMR5kLM7pwtCMEpVmQ242suV6qTJya2bDq4X1Tw= @@ -218,39 +218,39 @@ github.com/avast/retry-go v3.0.0+incompatible h1:4SOWQ7Qs+oroOTQOYnAHqelpCO0biHS github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= 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.39.4 h1:qTsQKcdQPHnfGYBBs+Btl8QwxJeoWcOcPcixK90mRhg= -github.com/aws/aws-sdk-go-v2 v1.39.4/go.mod h1:yWSxrnioGUZ4WVv9TgMrNUeLV3PFESn/v+6T/Su8gnM= -github.com/aws/aws-sdk-go-v2/config v1.31.12 h1:pYM1Qgy0dKZLHX2cXslNacbcEFMkDMl+Bcj5ROuS6p8= -github.com/aws/aws-sdk-go-v2/config v1.31.12/go.mod h1:/MM0dyD7KSDPR+39p9ZNVKaHDLb9qnfDurvVS2KAhN8= -github.com/aws/aws-sdk-go-v2/credentials v1.18.16 h1:4JHirI4zp958zC026Sm+V4pSDwW4pwLefKrc0bF2lwI= -github.com/aws/aws-sdk-go-v2/credentials v1.18.16/go.mod h1:qQMtGx9OSw7ty1yLclzLxXCRbrkjWAM7JnObZjmCB7I= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9 h1:Mv4Bc0mWmv6oDuSWTKnk+wgeqPL5DRFu5bQL9BGPQ8Y= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.9/go.mod h1:IKlKfRppK2a1y0gy1yH6zD+yX5uplJ6UuPlgd48dJiQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.11 h1:7AANQZkF3ihM8fbdftpjhken0TP9sBzFbV/Ze/Y4HXA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.11/go.mod h1:NTF4QCGkm6fzVwncpkFQqoquQyOolcyXfbpC98urj+c= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.11 h1:ShdtWUZT37LCAA4Mw2kJAJtzaszfSHFb5n25sdcv4YE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.11/go.mod h1:7bUb2sSr2MZ3M/N+VyETLTQtInemHXb/Fl3s8CLzm0Y= -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.37.6 h1:48oGbMpBSzihrU145gpjrxySIs+VNGCXu9kLTLAdJJg= -github.com/aws/aws-sdk-go-v2/service/acm v1.37.6/go.mod h1:4Xgg9iUMFMpWd19UokmUwBCU6fqNJ7LPo11YYt3/xl4= -github.com/aws/aws-sdk-go-v2/service/cloudfront v1.55.2 h1:MnDEmZz8maF6Ge2GaK6T16jqPDhyesUODhMheFqUBqU= -github.com/aws/aws-sdk-go-v2/service/cloudfront v1.55.2/go.mod h1:Ql3i8VKmdfYCcDhG6OpVkGM60IN9fPDV/7aMHCH3lds= +github.com/aws/aws-sdk-go-v2 v1.39.5 h1:e/SXuia3rkFtapghJROrydtQpfQaaUgd1cUvyO1mp2w= +github.com/aws/aws-sdk-go-v2 v1.39.5/go.mod h1:yWSxrnioGUZ4WVv9TgMrNUeLV3PFESn/v+6T/Su8gnM= +github.com/aws/aws-sdk-go-v2/config v1.31.15 h1:gE3M4xuNXfC/9bG4hyowGm/35uQTi7bUKeYs5e/6uvU= +github.com/aws/aws-sdk-go-v2/config v1.31.15/go.mod h1:HvnvGJoE2I95KAIW8kkWVPJ4XhdrlvwJpV6pEzFQa8o= +github.com/aws/aws-sdk-go-v2/credentials v1.18.19 h1:Jc1zzwkSY1QbkEcLujwqRTXOdvW8ppND3jRBb/VhBQc= +github.com/aws/aws-sdk-go-v2/credentials v1.18.19/go.mod h1:DIfQ9fAk5H0pGtnqfqkbSIzky82qYnGvh06ASQXXg6A= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.11 h1:X7X4YKb+c0rkI6d4uJ5tEMxXgCZ+jZ/D6mvkno8c8Uw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.11/go.mod h1:EqM6vPZQsZHYvC4Cai35UDg/f5NCEU+vp0WfbVqVcZc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12 h1:p/9flfXdoAnwJnuW9xHEAFY22R3A6skYkW19JFF9F+8= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.12/go.mod h1:ZTLHakoVCTtW8AaLGSwJ3LXqHD9uQKnOcv1TrpO6u2k= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12 h1:2lTWFvRcnWFFLzHWmtddu5MTchc5Oj2OOey++99tPZ0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.12/go.mod h1:hI92pK+ho8HVcWMHKHrK3Uml4pfG7wvL86FzO0LVtQQ= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk= +github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc= +github.com/aws/aws-sdk-go-v2/service/acm v1.37.10 h1:kORfSAFKQJuV+86FiEzSG4yDVPSBTPL2hcNdUHiTfjw= +github.com/aws/aws-sdk-go-v2/service/acm v1.37.10/go.mod h1:socc8VxK7qg7mAEMa192VhUkNsikgtzsWHpAGGfSbfE= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.55.3 h1:I1cy4m75ZT4A1pOdIS9gRiJ3Sp3oAQDnoSr7FdH0cWw= +github.com/aws/aws-sdk-go-v2/service/cloudfront v1.55.3/go.mod h1:af/zNle59yEZVwKlGorGjIYteuW2QkFKIli28DsM26g= 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.49.0 h1:3wiwzsfXBaykcbC4c6vaWkx9B46LXhFR8jyVMCZXK/k= -github.com/aws/aws-sdk-go-v2/service/iam v1.49.0/go.mod h1:QvuzFFqvuknv43XjhxdWTMHt1ESYlQPaLJtb6iBlD3M= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1 h1:oegbebPEMA/1Jny7kvwejowCaHz1FWZAQ94WXFNCyTM= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.1/go.mod h1:kemo5Myr9ac0U9JfSjMo9yHLtw+pECEHsFtJ9tqCEI8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9 h1:5r34CgVOD4WZudeEKZ9/iKpiT6cM1JyEROpXjOcdWv8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.9/go.mod h1:dB12CEbNWPbzO2uC6QSWHteqOg4JfBVJOojbAoAUb5I= -github.com/aws/aws-sdk-go-v2/service/route53 v1.58.4 h1:KycXrohD5OxAZ5h02YechO2gevvoHfAPAaJM5l8zqb0= -github.com/aws/aws-sdk-go-v2/service/route53 v1.58.4/go.mod h1:xNLZLn4SusktBQ5moqUOgiDKGz3a7vHwF4W0KD+WBPc= -github.com/aws/aws-sdk-go-v2/service/sso v1.29.6 h1:A1oRkiSQOWstGh61y4Wc/yQ04sqrQZr1Si/oAXj20/s= -github.com/aws/aws-sdk-go-v2/service/sso v1.29.6/go.mod h1:5PfYspyCU5Vw1wNPsxi15LZovOnULudOQuVxphSflQA= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1 h1:5fm5RTONng73/QA73LhCNR7UT9RpFH3hR6HWL6bIgVY= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.1/go.mod h1:xBEjWD13h+6nq+z4AkqSfSvqRKFgDIQeaMguAJndOWo= -github.com/aws/aws-sdk-go-v2/service/sts v1.38.6 h1:p3jIvqYwUZgu/XYeI48bJxOhvm47hZb5HUQ0tn6Q9kA= -github.com/aws/aws-sdk-go-v2/service/sts v1.38.6/go.mod h1:WtKK+ppze5yKPkZ0XwqIVWD4beCwv056ZbPQNoeHqM8= +github.com/aws/aws-sdk-go-v2/service/iam v1.49.1 h1:eTd/dueph9k4ZPn2s2uMmzDrBpwtRchhVxYk4ZT7SDU= +github.com/aws/aws-sdk-go-v2/service/iam v1.49.1/go.mod h1:OZUVTVNvBruorgXsEUctXiCDdmho+pY+l5O1P3JtKxY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2 h1:xtuxji5CS0JknaXoACOunXOYOQzgfTvGAc9s2QdCJA4= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.2/go.mod h1:zxwi0DIR0rcRcgdbl7E2MSOvxDyyXGBlScvBkARFaLQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.11 h1:GpMf3z2KJa4RnJ0ew3Hac+hRFYLZ9DDjfgXjuW+pB54= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.11/go.mod h1:6MZP3ZI4QQsgUCFTwMZA2V0sEriNQ8k2hmoHF3qjimQ= +github.com/aws/aws-sdk-go-v2/service/route53 v1.59.1 h1:KuoA/cmy/yK8n9v/d6WH36cZwGxFOrn0TmZ4lNN3MKQ= +github.com/aws/aws-sdk-go-v2/service/route53 v1.59.1/go.mod h1:BymbICXBfXQHO6i+yTBhocA9a6DM0uMDQqYelqa9wzs= +github.com/aws/aws-sdk-go-v2/service/sso v1.29.8 h1:M5nimZmugcZUO9wG7iVtROxPhiqyZX6ejS1lxlDPbTU= +github.com/aws/aws-sdk-go-v2/service/sso v1.29.8/go.mod h1:mbef/pgKhtKRwrigPPs7SSSKZgytzP8PQ6P6JAAdqyM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.3 h1:S5GuJZpYxE0lKeMHKn+BRTz6PTFpgThyJ+5mYfux7BM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.3/go.mod h1:X4OF+BTd7HIb3L+tc4UlWHVrpgwZZIVENU15pRDVTI0= +github.com/aws/aws-sdk-go-v2/service/sts v1.38.9 h1:Ekml5vGg6sHSZLZJQJagefnVe6PmqC2oiRkBq4F7fU0= +github.com/aws/aws-sdk-go-v2/service/sts v1.38.9/go.mod h1:/e15V+o1zFHWdH3u7lpI3rVBcxszktIKuHKCY2/py+k= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= github.com/aws/smithy-go v1.23.1 h1:sLvcH6dfAFwGkHLZ7dGiYF7aK6mg4CgKA/iDKjLDt9M= github.com/aws/smithy-go v1.23.1/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= @@ -351,8 +351,8 @@ github.com/ganigeorgiev/fexpr v0.5.0/go.mod h1:RyGiGqmeXhEQ6+mlGdnUleLHgtzzu/VGO github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-acme/alidns-20150109/v4 v4.6.1 h1:Dch3aWRcw4U62+jKPjPQN3iW3TPvgIywATbvHzojXeo= github.com/go-acme/alidns-20150109/v4 v4.6.1/go.mod h1:RBcqBA5IvUWtlpjx6dC6EkPVyBNLQ+mR18XoaP38BFY= -github.com/go-acme/lego/v4 v4.27.0 h1:cIhWd7Uj4BNFLEF3IpwuMkukVVRs5qjlp4KdUGa75yU= -github.com/go-acme/lego/v4 v4.27.0/go.mod h1:9FfNZHZmg6hf5CWOp4Lzo4gU8aBEvqZvrwdkBboa+4g= +github.com/go-acme/lego/v4 v4.28.0 h1:URKsCcybo7SjqqZckeBcDN9Vl29/bKS///75tcNkMHQ= +github.com/go-acme/lego/v4 v4.28.0/go.mod h1:bzjilr03IgbaOwlH396hq5W56Bi0/uoRwW/JM8hP7m4= github.com/go-acme/tencentclouddnspod v1.1.10 h1:ERVJ4mc3cT4Nb3+n6H/c1AwZnChGBqLoymE0NVYscKI= github.com/go-acme/tencentclouddnspod v1.1.10/go.mod h1:Bo/0YQJ/99FM+44HmCQkByuptX1tJsJ9V14MGV/2Qco= github.com/go-cmd/cmd v1.4.3 h1:6y3G+3UqPerXvPcXvj+5QNPHT02BUw7p6PsqRxLNA7Y= @@ -545,8 +545,8 @@ github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.172 h1:68VUVbLKwBxPh8tjCXwnLO/d8/thdZ+ExpxdFMEdK5A= -github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.172/go.mod h1:M+yna96Fx9o5GbIUnF3OvVvQGjgfVSyeJbV9Yb1z/wI= +github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.173 h1:Y4ixGadyrK9xHw6Z+cyiiME3SBXepEcUoiT+B8C5FoQ= +github.com/huaweicloud/huaweicloud-sdk-go-v3 v0.1.173/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= @@ -689,14 +689,12 @@ github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OS github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w= github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= -github.com/nrdcg/bunny-go v0.0.0-20250327222614-988a091fc7ea h1:OSgRS4kqOs/WuxuFOObP2gwrenL4/qiKXQbQugr/Two= -github.com/nrdcg/bunny-go v0.0.0-20250327222614-988a091fc7ea/go.mod h1:IDRRngAngb2eTEaWgpO0hukQFI/vJId46fT1KErMytA= -github.com/nrdcg/desec v0.11.0 h1:XZVHy07sg12y8FozMp+l7XvzPsdzog0AYXuQMaHBsfs= -github.com/nrdcg/desec v0.11.0/go.mod h1:5+4vyhMRTs49V9CNoODF/HwT8Mwxv9DJ6j+7NekUnBs= +github.com/nrdcg/bunny-go v0.1.0 h1:GAHTRpHaG/TxfLZlqoJ8OJFzw8rI74+jOTkzxWh0uHA= +github.com/nrdcg/bunny-go v0.1.0/go.mod h1:u+C9dgsspgtWVaAz6QkyV17s9fxD8viwwKoxb9XMz1A= +github.com/nrdcg/desec v0.11.1 h1:ilpKmCr4gGsLcyq3RHfHNmlRzm9fzT2XbWxoVaUCS0s= +github.com/nrdcg/desec v0.11.1/go.mod h1:2LuxHlOcwML/7cntu0eimONmA1U+ZxFDAonoSXr4igQ= github.com/nrdcg/goacmedns v0.2.0 h1:ADMbThobzEMnr6kg2ohs4KGa3LFqmgiBA22/6jUWJR0= github.com/nrdcg/goacmedns v0.2.0/go.mod h1:T5o6+xvSLrQpugmwHvrSNkzWht0UGAwj2ACBMhh73Cg= -github.com/nrdcg/mailinabox v0.2.0 h1:IKq8mfKiVwNW2hQii/ng1dJ4yYMMv3HAP3fMFIq2CFk= -github.com/nrdcg/mailinabox v0.2.0/go.mod h1:0yxqeYOiGyxAu7Sb94eMxHPIOsPYXAjTeA9ZhePhGnc= github.com/nrdcg/namesilo v0.5.0 h1:6QNxT/XxE+f5B+7QlfWorthNzOzcGlBLRQxqi6YeBrE= github.com/nrdcg/namesilo v0.5.0/go.mod h1:4UkwlwQfDt74kSGmhLaDylnBrD94IfflnpoEaj6T2qw= github.com/nrdcg/porkbun v0.4.0 h1:rWweKlwo1PToQ3H+tEO9gPRW0wzzgmI/Ob3n2Guticw= @@ -877,18 +875,18 @@ github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn github.com/tjfoc/gmsm v1.4.1 h1:aMe1GlZb+0bLjn+cKTPEvvn9oUEBlJitaZiiBwsbgho= github.com/tjfoc/gmsm v1.4.1/go.mod h1:j4INPkHWMrhJb38G+J6W4Tw0AbuN8Thu3PbdVYhVcTE= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ucloud/ucloud-sdk-go v0.22.54 h1:eNZeYApGPWm22sXoHOFd3fP+mNqwyeFGR5E3CnOXxv8= -github.com/ucloud/ucloud-sdk-go v0.22.54/go.mod h1:dyLmFHmUfgb4RZKYQP9IArlvQ2pxzFthfhwxRzOEPIw= +github.com/ucloud/ucloud-sdk-go v0.22.56 h1:bUzoUxT06lI6psFN654btMPdzI4MtaWl6RC/4YmMlBs= +github.com/ucloud/ucloud-sdk-go v0.22.56/go.mod h1:dyLmFHmUfgb4RZKYQP9IArlvQ2pxzFthfhwxRzOEPIw= github.com/ulikunitz/xz v0.5.11 h1:kpFauv27b6ynzBNT/Xy+1k+fK4WswhN/6PN5WhFAGw8= github.com/ulikunitz/xz v0.5.11/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= 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.224 h1:k9Vtg64tQAgFTOGWzhyL0b0axuTuExXbLNVlslWlBZI= -github.com/volcengine/volc-sdk-golang v1.0.224/go.mod h1:zHJlaqiMbIB+0mcrsZPTwOb3FB7S/0MCfqlnO8R7hlM= -github.com/volcengine/volcengine-go-sdk v1.1.44 h1:WLoLlzt67ZlJeow55PPx65/Mh52DewVXqkHcFSodM9w= -github.com/volcengine/volcengine-go-sdk v1.1.44/go.mod h1:oxoVo+A17kvkwPkIeIHPVLjSw7EQAm+l/Vau1YGHN+A= +github.com/volcengine/volc-sdk-golang v1.0.225 h1:z50OEuSiK+5H2Mhw0ziLE0YfsV9MGUf30nMI/08W8T0= +github.com/volcengine/volc-sdk-golang v1.0.225/go.mod h1:zHJlaqiMbIB+0mcrsZPTwOb3FB7S/0MCfqlnO8R7hlM= +github.com/volcengine/volcengine-go-sdk v1.1.46 h1:Fl1SfTDdNelERa/Y7nWeGCokEJgD1zIjP0RvIdEoYPc= +github.com/volcengine/volcengine-go-sdk v1.1.46/go.mod h1:oxoVo+A17kvkwPkIeIHPVLjSw7EQAm+l/Vau1YGHN+A= github.com/vultr/govultr/v3 v3.24.0 h1:fTTTj0VBve+Miy+wGhlb90M2NMDfpGFi6Frlj3HVy6M= github.com/vultr/govultr/v3 v3.24.0/go.mod h1:9WwnWGCKnwDlNjHjtt+j+nP+0QWq6hQXzaHgddqrLWY= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= @@ -1390,8 +1388,8 @@ gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= -gopkg.in/ns1/ns1-go.v2 v2.15.0 h1:cE3xSMdSCV8kf9SQldzqgW/Ueh7sv3yO2JwKtYxxz3E= -gopkg.in/ns1/ns1-go.v2 v2.15.0/go.mod h1:pfaU0vECVP7DIOr453z03HXS6dFJpXdNRwOyRzwmPSc= +gopkg.in/ns1/ns1-go.v2 v2.15.1 h1:8rri2TzAPYcVbBGXn48+dz1Xg30PzHfZ4k8A9JOS0Z0= +gopkg.in/ns1/ns1-go.v2 v2.15.1/go.mod h1:pfaU0vECVP7DIOr453z03HXS6dFJpXdNRwOyRzwmPSc= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/internal/certapply/applicators/sp_hostingde.go b/internal/certapply/applicators/sp_hostingde.go new file mode 100644 index 000000000..9c3716a60 --- /dev/null +++ b/internal/certapply/applicators/sp_hostingde.go @@ -0,0 +1,29 @@ +package applicators + +import ( + "fmt" + + "github.com/go-acme/lego/v4/challenge" + + "github.com/certimate-go/certimate/internal/domain" + "github.com/certimate-go/certimate/pkg/core/ssl-applicator/acme-dns01/providers/hostingde" + xmaps "github.com/certimate-go/certimate/pkg/utils/maps" +) + +func init() { + if err := ACMEDns01Registries.Register(domain.ACMEDns01ProviderTypeHostingde, func(options *ProviderFactoryOptions) (challenge.Provider, error) { + credentials := domain.AccessConfigForHostingde{} + if err := xmaps.Populate(options.ProviderAccessConfig, &credentials); err != nil { + return nil, fmt.Errorf("failed to populate provider access config: %w", err) + } + + provider, err := hostingde.NewChallengeProvider(&hostingde.ChallengeProviderConfig{ + ApiKey: credentials.ApiKey, + DnsPropagationTimeout: options.DnsPropagationTimeout, + DnsTTL: options.DnsTTL, + }) + return provider, err + }); err != nil { + panic(err) + } +} diff --git a/internal/domain/access.go b/internal/domain/access.go index 991e55ab1..59e28e6db 100644 --- a/internal/domain/access.go +++ b/internal/domain/access.go @@ -247,6 +247,10 @@ type AccessConfigForHetzner struct { ApiToken string `json:"apiToken"` } +type AccessConfigForHostingde struct { + ApiKey string `json:"apiKey"` +} + type AccessConfigForHostinger struct { ApiToken string `json:"apiToken"` } diff --git a/internal/domain/certificate.go b/internal/domain/certificate.go index d5afd9e38..a645b488d 100644 --- a/internal/domain/certificate.go +++ b/internal/domain/certificate.go @@ -26,6 +26,7 @@ type Certificate struct { KeyAlgorithm CertificateKeyAlgorithmType `json:"keyAlgorithm" db:"keyAlgorithm"` ValidityNotBefore time.Time `json:"validityNotBefore" db:"validityNotBefore"` ValidityNotAfter time.Time `json:"validityNotAfter" db:"validityNotAfter"` + ValidityInterval int32 `json:"validityInterval" db:"validityInterval"` ACMEAcctUrl string `json:"acmeAcctUrl" db:"acmeAcctUrl"` ACMECertUrl string `json:"acmeCertUrl" db:"acmeCertUrl"` ACMECertStableUrl string `json:"acmeCertStableUrl" db:"acmeCertStableUrl"` @@ -43,6 +44,7 @@ func (c *Certificate) PopulateFromX509(certX509 *x509.Certificate) *Certificate c.IssuerOrg = strings.Join(certX509.Issuer.Organization, ";") c.ValidityNotBefore = certX509.NotBefore c.ValidityNotAfter = certX509.NotAfter + c.ValidityInterval = int32(certX509.NotAfter.Sub(certX509.NotBefore).Seconds()) keyAlgorithm, keySize, _ := xcryptokey.GetPublicKeyAlgorithm(certX509.PublicKey) switch keyAlgorithm { diff --git a/internal/domain/provider.go b/internal/domain/provider.go index d2f2c5f10..4980be0c8 100644 --- a/internal/domain/provider.go +++ b/internal/domain/provider.go @@ -54,6 +54,7 @@ const ( AccessProviderTypeGoEdge = AccessProviderType("goedge") AccessProviderTypeGoogleTrustServices = AccessProviderType("googletrustservices") AccessProviderTypeHetzner = AccessProviderType("hetzner") + AccessProviderTypeHostingde = AccessProviderType("hostingde") AccessProviderTypeHostinger = AccessProviderType("hostinger") AccessProviderTypeHuaweiCloud = AccessProviderType("huaweicloud") AccessProviderTypeIONOS = AccessProviderType("ionos") @@ -165,6 +166,7 @@ const ( ACMEDns01ProviderTypeGname = ACMEDns01ProviderType(AccessProviderTypeGname) ACMEDns01ProviderTypeGoDaddy = ACMEDns01ProviderType(AccessProviderTypeGoDaddy) ACMEDns01ProviderTypeHetzner = ACMEDns01ProviderType(AccessProviderTypeHetzner) + ACMEDns01ProviderTypeHostingde = ACMEDns01ProviderType(AccessProviderTypeHostingde) ACMEDns01ProviderTypeHostinger = ACMEDns01ProviderType(AccessProviderTypeHostinger) ACMEDns01ProviderTypeHuaweiCloud = ACMEDns01ProviderType(AccessProviderTypeHuaweiCloud) // 兼容旧值,等同于 [ACMEDns01ProviderTypeHuaweiCloudDNS] ACMEDns01ProviderTypeHuaweiCloudDNS = ACMEDns01ProviderType(AccessProviderTypeHuaweiCloud + "-dns") diff --git a/internal/repository/certificate.go b/internal/repository/certificate.go index 13e3e2bc5..7e1c0765c 100644 --- a/internal/repository/certificate.go +++ b/internal/repository/certificate.go @@ -126,6 +126,7 @@ func (r *CertificateRepository) Save(ctx context.Context, certificate *domain.Ce record.Set("keyAlgorithm", string(certificate.KeyAlgorithm)) record.Set("validityNotBefore", certificate.ValidityNotBefore) record.Set("validityNotAfter", certificate.ValidityNotAfter) + record.Set("validityInterval", certificate.ValidityInterval) record.Set("acmeAcctUrl", certificate.ACMEAcctUrl) record.Set("acmeCertUrl", certificate.ACMECertUrl) record.Set("acmeCertStableUrl", certificate.ACMECertStableUrl) @@ -188,6 +189,7 @@ func (r *CertificateRepository) castRecordToModel(record *core.Record) (*domain. KeyAlgorithm: domain.CertificateKeyAlgorithmType(record.GetString("keyAlgorithm")), ValidityNotBefore: record.GetDateTime("validityNotBefore").Time(), ValidityNotAfter: record.GetDateTime("validityNotAfter").Time(), + ValidityInterval: int32(record.GetInt("validityInterval")), ACMEAcctUrl: record.GetString("acmeAcctUrl"), ACMECertUrl: record.GetString("acmeCertUrl"), ACMECertStableUrl: record.GetString("acmeCertStableUrl"), diff --git a/migrations/1762142400_m0.4.3.go b/migrations/1762142400_m0.4.3.go index 13af8fe7d..6912a57be 100644 --- a/migrations/1762142400_m0.4.3.go +++ b/migrations/1762142400_m0.4.3.go @@ -14,12 +14,28 @@ func init() { // update collection `certificate` // - rename field `acmeRenewed` to `isRenewed` // - add field `isRevoked` + // - add field `validityInterval` { collection, err := app.FindCollectionByNameOrId("4szxr9x43tpj6np") if err != nil { return err } + if err := collection.Fields.AddMarshaledJSONAt(10, []byte(`{ + "hidden": false, + "id": "number2453290051", + "max": null, + "min": null, + "name": "validityInterval", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }`)); err != nil { + return err + } + if err := collection.Fields.AddMarshaledJSONAt(14, []byte(`{ "hidden": false, "id": "bool810050391", @@ -47,6 +63,10 @@ func init() { if err := app.Save(collection); err != nil { return err } + + if _, err := app.DB().NewQuery("UPDATE certificate SET validityInterval = (STRFTIME('%s', validityNotAfter) - STRFTIME('%s', validityNotBefore))").Execute(); err != nil { + return err + } } // adapt to new workflow data structure diff --git a/pkg/core/ssl-applicator/acme-dns01/providers/hostingde/hostingde.go b/pkg/core/ssl-applicator/acme-dns01/providers/hostingde/hostingde.go new file mode 100644 index 000000000..4ff4216d3 --- /dev/null +++ b/pkg/core/ssl-applicator/acme-dns01/providers/hostingde/hostingde.go @@ -0,0 +1,38 @@ +package hostingde + +import ( + "errors" + "time" + + "github.com/go-acme/lego/v4/providers/dns/hostingde" + + "github.com/certimate-go/certimate/pkg/core" +) + +type ChallengeProviderConfig struct { + ApiKey string `json:"apiKey"` + DnsPropagationTimeout int32 `json:"dnsPropagationTimeout,omitempty"` + DnsTTL int32 `json:"dnsTTL,omitempty"` +} + +func NewChallengeProvider(config *ChallengeProviderConfig) (core.ACMEChallenger, error) { + if config == nil { + return nil, errors.New("the configuration of the acme challenge provider is nil") + } + + providerConfig := hostingde.NewDefaultConfig() + providerConfig.APIKey = config.ApiKey + if config.DnsPropagationTimeout != 0 { + providerConfig.PropagationTimeout = time.Duration(config.DnsPropagationTimeout) * time.Second + } + if config.DnsTTL != 0 { + providerConfig.TTL = int(config.DnsTTL) + } + + provider, err := hostingde.NewDNSProviderConfig(providerConfig) + if err != nil { + return nil, err + } + + return provider, nil +} diff --git a/ui/package-lock.json b/ui/package-lock.json index 9e900e630..76ed8055c 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -18,8 +18,8 @@ "@uiw/codemirror-extensions-basic-setup": "^4.25.2", "@uiw/codemirror-theme-vscode": "^4.25.2", "@uiw/react-codemirror": "^4.25.2", - "ahooks": "^3.9.5", - "antd": "^5.27.6", + "ahooks": "^3.9.6", + "antd": "^5.28.0", "antd-zod": "^7.0.0", "clsx": "^2.1.1", "cron-parser": "^5.4.0", @@ -33,15 +33,15 @@ "react": "^18.3.1", "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.3.1", - "react-i18next": "^16.2.0", - "react-router-dom": "^7.9.4", + "react-i18next": "^16.2.3", + "react-router-dom": "^7.9.5", "tailwind-merge": "^3.3.1", "yaml": "^2.8.1", "zod": "^4.1.12", "zustand": "^5.0.8" }, "devDependencies": { - "@eslint/js": "^9.38.0", + "@eslint/js": "^9.39.0", "@tailwindcss/postcss": "^4.1.16", "@tailwindcss/vite": "^4.1.16", "@types/file-saver": "^2.0.7", @@ -52,7 +52,7 @@ "@types/react-dom": "^18.3.7", "@vitejs/plugin-legacy": "^7.2.1", "@vitejs/plugin-react": "^5.1.0", - "eslint": "^9.38.0", + "eslint": "^9.39.0", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-better-tailwindcss": "^3.7.10", @@ -2258,23 +2258,24 @@ } }, "node_modules/@eslint/config-helpers": { - "version": "0.4.1", - "resolved": "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", - "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", + "version": "0.4.2", + "resolved": "https://registry.npmmirror.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.16.0" + "@eslint/core": "^0.17.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.16.0", - "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-0.16.0.tgz", - "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "version": "0.17.0", + "resolved": "https://registry.npmmirror.com/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, @@ -2331,9 +2332,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.38.0", - "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.38.0.tgz", - "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", + "version": "9.39.0", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-9.39.0.tgz", + "integrity": "sha512-BIhe0sW91JGPiaF1mOuPy5v8NflqfjIcDNpC+LbW9f609WVRX1rArrhi6Z2ymvrAry9jw+5POTj4t2t62o8Bmw==", "dev": true, "license": "MIT", "engines": { @@ -2354,12 +2355,13 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.4.0", - "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", - "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.16.0", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { @@ -3178,6 +3180,7 @@ "version": "5.0.4", "resolved": "https://registry.npmmirror.com/@rc-component/async-validator/-/async-validator-5.0.4.tgz", "integrity": "sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.4" }, @@ -3259,9 +3262,10 @@ } }, "node_modules/@rc-component/qrcode": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/@rc-component/qrcode/-/qrcode-1.0.1.tgz", - "integrity": "sha512-g8eeeaMyFXVlq8cZUeaxCDhfIYjpao0l9cvm5gFwKXy/Vm1yDWV7h2sjH5jHYzdFedlVKBpATFB1VKMrHzwaWQ==", + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/@rc-component/qrcode/-/qrcode-1.1.0.tgz", + "integrity": "sha512-ABA80Yer0c6I2+moqNY0kF3Y1NxIT6wDP/EINIqbiRbfZKP1HtHpKMh8WuTXLgVGYsoWG2g9/n0PgM8KdnJb4Q==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.24.7", "classnames": "^2.3.2" @@ -4010,7 +4014,8 @@ "version": "7.0.15", "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -4746,9 +4751,10 @@ } }, "node_modules/ahooks": { - "version": "3.9.5", - "resolved": "https://registry.npmmirror.com/ahooks/-/ahooks-3.9.5.tgz", - "integrity": "sha512-TrjXie49Q8HuHKTa84Fm9A+famMDAG1+7a9S9Gq6RQ0h90Jgqmiq3CkObuRjWT/C4d6nRZCw35Y2k2fmybb5eA==", + "version": "3.9.6", + "resolved": "https://registry.npmmirror.com/ahooks/-/ahooks-3.9.6.tgz", + "integrity": "sha512-Mr7f05swd5SmKlR9SZo5U6M0LsL4ErweLzpdgXjA1JPmnZ78Vr6wzx0jUtvoxrcqGKYnX0Yjc02iEASVxHFPjQ==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.21.0", "@types/js-cookie": "^3.0.6", @@ -4761,9 +4767,6 @@ "screenfull": "^5.0.0", "tslib": "^2.4.1" }, - "engines": { - "node": ">=18" - }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4801,9 +4804,9 @@ } }, "node_modules/antd": { - "version": "5.27.6", - "resolved": "https://registry.npmmirror.com/antd/-/antd-5.27.6.tgz", - "integrity": "sha512-70HrjVbzDXvtiUQ5MP1XdNudr/wGAk9Ivaemk6f36yrAeJurJSmZ8KngOIilolLRHdGuNc6/Vk+4T1OZpSjpag==", + "version": "5.28.0", + "resolved": "https://registry.npmmirror.com/antd/-/antd-5.28.0.tgz", + "integrity": "sha512-AmCvyhWGHzlDQ6sfnGBBrFm/8sLPbBI8d/NDBsecliKqrTZUMr07TAQldo43iowwKzvgKxxuRoUHaBaYcBMdQA==", "license": "MIT", "dependencies": { "@ant-design/colors": "^7.2.1", @@ -4815,7 +4818,7 @@ "@babel/runtime": "^7.26.0", "@rc-component/color-picker": "~2.0.1", "@rc-component/mutate-observer": "^1.1.0", - "@rc-component/qrcode": "~1.0.1", + "@rc-component/qrcode": "~1.1.0", "@rc-component/tour": "~1.15.1", "@rc-component/trigger": "^2.3.0", "classnames": "^2.5.1", @@ -4827,7 +4830,7 @@ "rc-dialog": "~9.6.0", "rc-drawer": "~7.3.0", "rc-dropdown": "~4.2.1", - "rc-field-form": "~2.7.0", + "rc-field-form": "~2.7.1", "rc-image": "~7.12.0", "rc-input": "~1.8.0", "rc-input-number": "~9.5.0", @@ -4851,7 +4854,7 @@ "rc-tooltip": "~6.4.0", "rc-tree": "~5.13.1", "rc-tree-select": "~5.27.0", - "rc-upload": "~4.9.2", + "rc-upload": "~4.11.0", "rc-util": "^5.44.4", "scroll-into-view-if-needed": "^3.1.0", "throttle-debounce": "^5.0.2" @@ -5347,6 +5350,7 @@ "version": "1.0.2", "resolved": "https://registry.npmmirror.com/cookie/-/cookie-1.0.2.tgz", "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", "engines": { "node": ">=18" } @@ -5782,20 +5786,20 @@ } }, "node_modules/eslint": { - "version": "9.38.0", - "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.38.0.tgz", - "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", + "version": "9.39.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-9.39.0.tgz", + "integrity": "sha512-iy2GE3MHrYTL5lrCtMZ0X1KLEKKUjmK0kzwcnefhR66txcEmXZD2YWgR5GNdcEwkNx3a0siYkSvl0vIC+Svjmg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.1", - "@eslint/config-helpers": "^0.4.1", - "@eslint/core": "^0.16.0", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.38.0", - "@eslint/plugin-kit": "^0.4.0", + "@eslint/js": "9.39.0", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", @@ -8256,9 +8260,10 @@ } }, "node_modules/rc-field-form": { - "version": "2.7.0", - "resolved": "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-2.7.0.tgz", - "integrity": "sha512-hgKsCay2taxzVnBPZl+1n4ZondsV78G++XVsMIJCAoioMjlMQR9YwAp7JZDIECzIu2Z66R+f4SFIRrO2DjDNAA==", + "version": "2.7.1", + "resolved": "https://registry.npmmirror.com/rc-field-form/-/rc-field-form-2.7.1.tgz", + "integrity": "sha512-vKeSifSJ6HoLaAB+B8aq/Qgm8a3dyxROzCtKNCsBQgiverpc4kWDQihoUwzUj+zNWJOykwSY4dNX3QrGwtVb9A==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.0", "@rc-component/async-validator": "^5.0.3", @@ -8691,9 +8696,10 @@ } }, "node_modules/rc-upload": { - "version": "4.9.2", - "resolved": "https://registry.npmmirror.com/rc-upload/-/rc-upload-4.9.2.tgz", - "integrity": "sha512-nHx+9rbd1FKMiMRYsqQ3NkXUv7COHPBo3X1Obwq9SWS6/diF/A0aJ5OHubvwUAIDs+4RMleljV0pcrNUc823GQ==", + "version": "4.11.0", + "resolved": "https://registry.npmmirror.com/rc-upload/-/rc-upload-4.11.0.tgz", + "integrity": "sha512-ZUyT//2JAehfHzjWowqROcwYJKnZkIUGWaTE/VogVrepSl7AFNbQf4+zGfX4zl9Vrj/Jm8scLO0R6UlPDKK4wA==", + "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", "classnames": "^2.2.5", @@ -8776,9 +8782,9 @@ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, "node_modules/react-i18next": { - "version": "16.2.0", - "resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-16.2.0.tgz", - "integrity": "sha512-giCEDa6NtQYvuLGW9xaBo4HCVxT0Y8jrOpX/uSnd+lZ3Dmm/2BNrGNEgRZzWDkSobmE6IWPJ+/Ow9Rhi/gP6+g==", + "version": "16.2.3", + "resolved": "https://registry.npmmirror.com/react-i18next/-/react-i18next-16.2.3.tgz", + "integrity": "sha512-O0t2zvmIz7nHWKNfIL+O/NTIbpTaOPY0vZov779hegbep3IZ+xcqkeVPKWBSXwzdkiv77q8zmq9toKIUys1x3A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.27.6", @@ -8818,9 +8824,10 @@ } }, "node_modules/react-router": { - "version": "7.9.4", - "resolved": "https://registry.npmmirror.com/react-router/-/react-router-7.9.4.tgz", - "integrity": "sha512-SD3G8HKviFHg9xj7dNODUKDFgpG4xqD5nhyd0mYoB5iISepuZAvzSr8ywxgxKJ52yRzf/HWtVHc9AWwoTbljvA==", + "version": "7.9.5", + "resolved": "https://registry.npmmirror.com/react-router/-/react-router-7.9.5.tgz", + "integrity": "sha512-JmxqrnBZ6E9hWmf02jzNn9Jm3UqyeimyiwzD69NjxGySG6lIz/1LVPsoTCwN7NBX2XjCEa1LIX5EMz1j2b6u6A==", + "license": "MIT", "dependencies": { "cookie": "^1.0.1", "set-cookie-parser": "^2.6.0" @@ -8839,11 +8846,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.9.4", - "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-7.9.4.tgz", - "integrity": "sha512-f30P6bIkmYvnHHa5Gcu65deIXoA2+r3Eb6PJIAddvsT9aGlchMatJ51GgpU470aSqRRbFX22T70yQNUGuW3DfA==", + "version": "7.9.5", + "resolved": "https://registry.npmmirror.com/react-router-dom/-/react-router-dom-7.9.5.tgz", + "integrity": "sha512-mkEmq/K8tKN63Ae2M7Xgz3c9l9YNbY+NHH6NNeUmLA3kDkhKXRsNb/ZpxaEunvGo2/3YXdk5EJU3Hxp3ocaBPw==", + "license": "MIT", "dependencies": { - "react-router": "7.9.4" + "react-router": "7.9.5" }, "engines": { "node": ">=20.0.0" @@ -9200,9 +9208,10 @@ } }, "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==" + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" }, "node_modules/set-function-length": { "version": "1.2.2", diff --git a/ui/package.json b/ui/package.json index 033d4ebdd..cdfbba9d2 100644 --- a/ui/package.json +++ b/ui/package.json @@ -20,8 +20,8 @@ "@uiw/codemirror-extensions-basic-setup": "^4.25.2", "@uiw/codemirror-theme-vscode": "^4.25.2", "@uiw/react-codemirror": "^4.25.2", - "ahooks": "^3.9.5", - "antd": "^5.27.6", + "ahooks": "^3.9.6", + "antd": "^5.28.0", "antd-zod": "^7.0.0", "clsx": "^2.1.1", "cron-parser": "^5.4.0", @@ -35,15 +35,15 @@ "react": "^18.3.1", "react-copy-to-clipboard": "^5.1.0", "react-dom": "^18.3.1", - "react-i18next": "^16.2.0", - "react-router-dom": "^7.9.4", + "react-i18next": "^16.2.3", + "react-router-dom": "^7.9.5", "tailwind-merge": "^3.3.1", "yaml": "^2.8.1", "zod": "^4.1.12", "zustand": "^5.0.8" }, "devDependencies": { - "@eslint/js": "^9.38.0", + "@eslint/js": "^9.39.0", "@tailwindcss/postcss": "^4.1.16", "@tailwindcss/vite": "^4.1.16", "@types/file-saver": "^2.0.7", @@ -54,7 +54,7 @@ "@types/react-dom": "^18.3.7", "@vitejs/plugin-legacy": "^7.2.1", "@vitejs/plugin-react": "^5.1.0", - "eslint": "^9.38.0", + "eslint": "^9.39.0", "eslint-config-prettier": "^10.1.8", "eslint-import-resolver-typescript": "^4.4.4", "eslint-plugin-better-tailwindcss": "^3.7.10", diff --git a/ui/public/imgs/providers/baiducloud.svg b/ui/public/imgs/providers/baiducloud.svg index e448fd3ef..f92dd1bf7 100644 --- a/ui/public/imgs/providers/baiducloud.svg +++ b/ui/public/imgs/providers/baiducloud.svg @@ -1 +1 @@ - + diff --git a/ui/public/imgs/providers/hostingde.svg b/ui/public/imgs/providers/hostingde.svg new file mode 100644 index 000000000..2929b09d0 --- /dev/null +++ b/ui/public/imgs/providers/hostingde.svg @@ -0,0 +1 @@ + diff --git a/ui/src/components/access/AccessForm.tsx b/ui/src/components/access/AccessForm.tsx index a10a82187..535501147 100644 --- a/ui/src/components/access/AccessForm.tsx +++ b/ui/src/components/access/AccessForm.tsx @@ -1,4 +1,3 @@ -import { useMemo } from "react"; import { useTranslation } from "react-i18next"; import { Form, type FormInstance, Input } from "antd"; import { createSchemaFieldRule } from "antd-zod"; @@ -11,91 +10,7 @@ import { useAntdForm } from "@/hooks"; import { FormNestedFieldsContextProvider } from "./forms/_context"; import { useProviderFilterByUsage } from "./forms/_hooks"; -import AccessConfigFieldsProvider1Panel from "./forms/AccessConfigFieldsProvider1Panel"; -import AccessConfigFieldsProviderACMECA from "./forms/AccessConfigFieldsProviderACMECA"; -import AccessConfigFieldsProviderACMEDNS from "./forms/AccessConfigFieldsProviderACMEDNS"; -import AccessConfigFieldsProviderACMEHttpReq from "./forms/AccessConfigFieldsProviderACMEHttpReq"; -import AccessConfigFieldsProviderActalisSSL from "./forms/AccessConfigFieldsProviderActalisSSL"; -import AccessConfigFieldsProviderAliyun from "./forms/AccessConfigFieldsProviderAliyun"; -import AccessConfigFieldsProviderAPISIX from "./forms/AccessConfigFieldsProviderAPISIX"; -import AccessConfigFieldsProviderAWS from "./forms/AccessConfigFieldsProviderAWS"; -import AccessConfigFieldsProviderAzure from "./forms/AccessConfigFieldsProviderAzure"; -import AccessConfigFieldsProviderBaiduCloud from "./forms/AccessConfigFieldsProviderBaiduCloud"; -import AccessConfigFieldsProviderBaishan from "./forms/AccessConfigFieldsProviderBaishan"; -import AccessConfigFieldsProviderBaotaPanel from "./forms/AccessConfigFieldsProviderBaotaPanel"; -import AccessConfigFieldsProviderBaotaPanelGo from "./forms/AccessConfigFieldsProviderBaotaPanelGo"; -import AccessConfigFieldsProviderBaotaWAF from "./forms/AccessConfigFieldsProviderBaotaWAF"; -import AccessConfigFieldsProviderBookMyName from "./forms/AccessConfigFieldsProviderBookMyName"; -import AccessConfigFieldsProviderBunny from "./forms/AccessConfigFieldsProviderBunny"; -import AccessConfigFieldsProviderBytePlus from "./forms/AccessConfigFieldsProviderBytePlus"; -import AccessConfigFieldsProviderCacheFly from "./forms/AccessConfigFieldsProviderCacheFly"; -import AccessConfigFieldsProviderCdnfly from "./forms/AccessConfigFieldsProviderCdnfly"; -import AccessConfigFieldsProviderCloudflare from "./forms/AccessConfigFieldsProviderCloudflare"; -import AccessConfigFieldsProviderClouDNS from "./forms/AccessConfigFieldsProviderClouDNS"; -import AccessConfigFieldsProviderCMCCCloud from "./forms/AccessConfigFieldsProviderCMCCCloud"; -import AccessConfigFieldsProviderConstellix from "./forms/AccessConfigFieldsProviderConstellix"; -import AccessConfigFieldsProviderCTCCCloud from "./forms/AccessConfigFieldsProviderCTCCCloud"; -import AccessConfigFieldsProviderDeSEC from "./forms/AccessConfigFieldsProviderDeSEC"; -import AccessConfigFieldsProviderDigitalOcean from "./forms/AccessConfigFieldsProviderDigitalOcean"; -import AccessConfigFieldsProviderDingTalkBot from "./forms/AccessConfigFieldsProviderDingTalkBot"; -import AccessConfigFieldsProviderDiscordBot from "./forms/AccessConfigFieldsProviderDiscordBot"; -import AccessConfigFieldsProviderDNSLA from "./forms/AccessConfigFieldsProviderDNSLA"; -import AccessConfigFieldsProviderDogeCloud from "./forms/AccessConfigFieldsProviderDogeCloud"; -import AccessConfigFieldsProviderDuckDNS from "./forms/AccessConfigFieldsProviderDuckDNS"; -import AccessConfigFieldsProviderDynv6 from "./forms/AccessConfigFieldsProviderDynv6"; -import AccessConfigFieldsProviderEmail from "./forms/AccessConfigFieldsProviderEmail"; -import AccessConfigFieldsProviderFlexCDN from "./forms/AccessConfigFieldsProviderFlexCDN"; -import AccessConfigFieldsProviderGandinet from "./forms/AccessConfigFieldsProviderGandinet"; -import AccessConfigFieldsProviderGcore from "./forms/AccessConfigFieldsProviderGcore"; -import AccessConfigFieldsProviderGlobalSignAtlas from "./forms/AccessConfigFieldsProviderGlobalSignAtlas"; -import AccessConfigFieldsProviderGname from "./forms/AccessConfigFieldsProviderGname"; -import AccessConfigFieldsProviderGoDaddy from "./forms/AccessConfigFieldsProviderGoDaddy"; -import AccessConfigFieldsProviderGoEdge from "./forms/AccessConfigFieldsProviderGoEdge"; -import AccessConfigFieldsProviderGoogleTrustServices from "./forms/AccessConfigFieldsProviderGoogleTrustServices"; -import AccessConfigFieldsProviderHetzner from "./forms/AccessConfigFieldsProviderHetzner"; -import AccessConfigFieldsProviderHostinger from "./forms/AccessConfigFieldsProviderHostinger"; -import AccessConfigFieldsProviderHuaweiCloud from "./forms/AccessConfigFieldsProviderHuaweiCloud"; -import AccessConfigFieldsProviderIONOS from "./forms/AccessConfigFieldsProviderIONOS"; -import AccessConfigFieldsProviderJDCloud from "./forms/AccessConfigFieldsProviderJDCloud"; -import AccessConfigFieldsProviderKong from "./forms/AccessConfigFieldsProviderKong"; -import AccessConfigFieldsProviderKubernetes from "./forms/AccessConfigFieldsProviderKubernetes"; -import AccessConfigFieldsProviderLarkBot from "./forms/AccessConfigFieldsProviderLarkBot"; -import AccessConfigFieldsProviderLeCDN from "./forms/AccessConfigFieldsProviderLeCDN"; -import AccessConfigFieldsProviderLinode from "./forms/AccessConfigFieldsProviderLinode"; -import AccessConfigFieldsProviderMattermost from "./forms/AccessConfigFieldsProviderMattermost"; -import AccessConfigFieldsProviderNamecheap from "./forms/AccessConfigFieldsProviderNamecheap"; -import AccessConfigFieldsProviderNameDotCom from "./forms/AccessConfigFieldsProviderNameDotCom"; -import AccessConfigFieldsProviderNameSilo from "./forms/AccessConfigFieldsProviderNameSilo"; -import AccessConfigFieldsProviderNetcup from "./forms/AccessConfigFieldsProviderNetcup"; -import AccessConfigFieldsProviderNetlify from "./forms/AccessConfigFieldsProviderNetlify"; -import AccessConfigFieldsProviderNS1 from "./forms/AccessConfigFieldsProviderNS1"; -import AccessConfigFieldsProviderPorkbun from "./forms/AccessConfigFieldsProviderPorkbun"; -import AccessConfigFieldsProviderPowerDNS from "./forms/AccessConfigFieldsProviderPowerDNS"; -import AccessConfigFieldsProviderProxmoxVE from "./forms/AccessConfigFieldsProviderProxmoxVE"; -import AccessConfigFieldsProviderQiniu from "./forms/AccessConfigFieldsProviderQiniu"; -import AccessConfigFieldsProviderRainYun from "./forms/AccessConfigFieldsProviderRainYun"; -import AccessConfigFieldsProviderRatPanel from "./forms/AccessConfigFieldsProviderRatPanel"; -import AccessConfigFieldsProviderRFC2136 from "./forms/AccessConfigFieldsProviderRFC2136"; -import AccessConfigFieldsProviderSafeLine from "./forms/AccessConfigFieldsProviderSafeLine"; -import AccessConfigFieldsProviderSectigo from "./forms/AccessConfigFieldsProviderSectigo"; -import AccessConfigFieldsProviderSlackBot from "./forms/AccessConfigFieldsProviderSlackBot"; -import AccessConfigFieldsProviderSpaceship from "./forms/AccessConfigFieldsProviderSpaceship"; -import AccessConfigFieldsProviderSSH from "./forms/AccessConfigFieldsProviderSSH"; -import AccessConfigFieldsProviderSSLCom from "./forms/AccessConfigFieldsProviderSSLCom"; -import AccessConfigFieldsProviderTechnitiumDNS from "./forms/AccessConfigFieldsProviderTechnitiumDNS"; -import AccessConfigFieldsProviderTelegramBot from "./forms/AccessConfigFieldsProviderTelegramBot"; -import AccessConfigFieldsProviderTencentCloud from "./forms/AccessConfigFieldsProviderTencentCloud"; -import AccessConfigFieldsProviderUCloud from "./forms/AccessConfigFieldsProviderUCloud"; -import AccessConfigFieldsProviderUniCloud from "./forms/AccessConfigFieldsProviderUniCloud"; -import AccessConfigFieldsProviderUpyun from "./forms/AccessConfigFieldsProviderUpyun"; -import AccessConfigFieldsProviderVercel from "./forms/AccessConfigFieldsProviderVercel"; -import AccessConfigFieldsProviderVolcEngine from "./forms/AccessConfigFieldsProviderVolcEngine"; -import AccessConfigFieldsProviderVultr from "./forms/AccessConfigFieldsProviderVultr"; -import AccessConfigFieldsProviderWangsu from "./forms/AccessConfigFieldsProviderWangsu"; -import AccessConfigFieldsProviderWebhook from "./forms/AccessConfigFieldsProviderWebhook"; -import AccessConfigFieldsProviderWeComBot from "./forms/AccessConfigFieldsProviderWeComBot"; -import AccessConfigFieldsProviderWestcn from "./forms/AccessConfigFieldsProviderWestcn"; -import AccessConfigFieldsProviderZeroSSL from "./forms/AccessConfigFieldsProviderZeroSSL"; +import AccessConfigFieldsProvider from "./forms/AccessConfigFieldsProvider"; export type AccessFormModes = "create" | "modify"; export type AccessFormUsages = "dns" | "hosting" | "dns-hosting" | "ca" | "notification"; @@ -114,6 +29,8 @@ export interface AccessFormProps { const AccessForm = ({ className, style, disabled, initialValues, mode, usage, onFormValuesChange, ...props }: AccessFormProps) => { const { t } = useTranslation(); + const providerFilter = useProviderFilterByUsage(usage); + const formSchema = z.object({ name: z .string(t("access.form.name.placeholder")) @@ -130,274 +47,27 @@ const AccessForm = ({ className, style, disabled, initialValues, mode, usage, on initialValues: initialValues, }); - const providerFilter = useProviderFilterByUsage(usage); - const fieldProvider = Form.useWatch("provider", { form: formInst, preserve: true }); - const nestedProviderConfigFields = useMemo(() => { - /* - 注意:如果追加新的子组件,请保持以 ASCII 排序。 - NOTICE: If you add new child component, please keep ASCII order. - */ - switch (fieldProvider) { - case ACCESS_PROVIDERS["1PANEL"]: { - return ; - } - case ACCESS_PROVIDERS.ACMECA: { - return ; - } - case ACCESS_PROVIDERS.ACMEDNS: { - return ; - } - case ACCESS_PROVIDERS.ACMEHTTPREQ: { - return ; - } - case ACCESS_PROVIDERS.ACTALISSSL: { - return ; - } - case ACCESS_PROVIDERS.ALIYUN: { - return ; - } - case ACCESS_PROVIDERS.APISIX: { - return ; - } - case ACCESS_PROVIDERS.AWS: { - return ; - } - case ACCESS_PROVIDERS.AZURE: { - return ; - } - case ACCESS_PROVIDERS.BAIDUCLOUD: { - return ; - } - case ACCESS_PROVIDERS.BAISHAN: { - return ; - } - case ACCESS_PROVIDERS.BAOTAPANEL: { - return ; - } - case ACCESS_PROVIDERS.BAOTAPANELGO: { - return ; - } - case ACCESS_PROVIDERS.BAOTAWAF: { - return ; - } - case ACCESS_PROVIDERS.BOOKMYNAME: { - return ; - } - case ACCESS_PROVIDERS.BUNNY: { - return ; - } - case ACCESS_PROVIDERS.BYTEPLUS: { - return ; - } - case ACCESS_PROVIDERS.CACHEFLY: { - return ; - } - case ACCESS_PROVIDERS.CDNFLY: { - return ; - } - case ACCESS_PROVIDERS.CLOUDFLARE: { - return ; - } - case ACCESS_PROVIDERS.CLOUDNS: { - return ; - } - case ACCESS_PROVIDERS.CMCCCLOUD: { - return ; - } - case ACCESS_PROVIDERS.CONSTELLIX: { - return ; - } - case ACCESS_PROVIDERS.CTCCCLOUD: { - return ; - } - case ACCESS_PROVIDERS.DESEC: { - return ; - } - case ACCESS_PROVIDERS.DIGITALOCEAN: { - return ; - } - case ACCESS_PROVIDERS.DINGTALKBOT: { - return ; - } - case ACCESS_PROVIDERS.DISCORDBOT: { - return ; - } - case ACCESS_PROVIDERS.DNSLA: { - return ; - } - case ACCESS_PROVIDERS.DOGECLOUD: { - return ; - } - case ACCESS_PROVIDERS.DUCKDNS: { - return ; - } - case ACCESS_PROVIDERS.DYNV6: { - return ; - } - case ACCESS_PROVIDERS.EMAIL: { - return ; - } - case ACCESS_PROVIDERS.FLEXCDN: { - return ; - } - case ACCESS_PROVIDERS.GANDINET: { - return ; - } - case ACCESS_PROVIDERS.GCORE: { - return ; - } - case ACCESS_PROVIDERS.GNAME: { - return ; - } - case ACCESS_PROVIDERS.GODADDY: { - return ; - } - case ACCESS_PROVIDERS.GOEDGE: { - return ; - } - case ACCESS_PROVIDERS.GLOBALSIGNATLAS: { - return ; - } - case ACCESS_PROVIDERS.GOOGLETRUSTSERVICES: { - return ; - } - case ACCESS_PROVIDERS.HETZNER: { - return ; - } - case ACCESS_PROVIDERS.HOSTINGER: { - return ; - } - case ACCESS_PROVIDERS.HUAWEICLOUD: { - return ; - } - case ACCESS_PROVIDERS.IONOS: { - return ; - } - case ACCESS_PROVIDERS.JDCLOUD: { - return ; - } - case ACCESS_PROVIDERS.KONG: { - return ; - } - case ACCESS_PROVIDERS.KUBERNETES: { - return ; - } - case ACCESS_PROVIDERS.LARKBOT: { - return ; - } - case ACCESS_PROVIDERS.LECDN: { - return ; - } - case ACCESS_PROVIDERS.LINODE: { - return ; - } - case ACCESS_PROVIDERS.MATTERMOST: { - return ; - } - case ACCESS_PROVIDERS.NAMECHEAP: { - return ; - } - case ACCESS_PROVIDERS.NAMEDOTCOM: { - return ; - } - case ACCESS_PROVIDERS.NAMESILO: { - return ; - } - case ACCESS_PROVIDERS.NETCUP: { - return ; - } - case ACCESS_PROVIDERS.NETLIFY: { - return ; - } - case ACCESS_PROVIDERS.NS1: { - return ; - } - case ACCESS_PROVIDERS.PORKBUN: { - return ; - } - case ACCESS_PROVIDERS.POWERDNS: { - return ; - } - case ACCESS_PROVIDERS.PROXMOXVE: { - return ; - } - case ACCESS_PROVIDERS.QINIU: { - return ; - } - case ACCESS_PROVIDERS.RAINYUN: { - return ; - } - case ACCESS_PROVIDERS.RATPANEL: { - return ; - } - case ACCESS_PROVIDERS.RFC2136: { - return ; - } - case ACCESS_PROVIDERS.SAFELINE: { - return ; - } - case ACCESS_PROVIDERS.SECTIGO: { - return ; - } - case ACCESS_PROVIDERS.SLACKBOT: { - return ; - } - case ACCESS_PROVIDERS.SPACESHIP: { - return ; - } - case ACCESS_PROVIDERS.SSLCOM: { - return ; - } - case ACCESS_PROVIDERS.SSH: { - return ; - } - case ACCESS_PROVIDERS.TECHNITIUMDNS: { - return ; - } - case ACCESS_PROVIDERS.TELEGRAMBOT: { - return ; - } - case ACCESS_PROVIDERS.TENCENTCLOUD: { - return ; - } - case ACCESS_PROVIDERS.UCLOUD: { - return ; - } - case ACCESS_PROVIDERS.UNICLOUD: { - return ; - } - case ACCESS_PROVIDERS.UPYUN: { - return ; - } - case ACCESS_PROVIDERS.VERCEL: { - return ; - } - case ACCESS_PROVIDERS.VOLCENGINE: { - return ; - } - case ACCESS_PROVIDERS.VULTR: { - return ; - } - case ACCESS_PROVIDERS.WANGSU: { - return ; - } - case ACCESS_PROVIDERS.WEBHOOK: { - const webhookUsage = usage === "notification" ? "notification" : usage === "hosting" || usage === "dns-hosting" ? "deployment" : "none"; - return ; - } - case ACCESS_PROVIDERS.WECOMBOT: { - return ; - } - case ACCESS_PROVIDERS.WESTCN: { - return ; - } - case ACCESS_PROVIDERS.ZEROSSL: { - return ; - } - } - }, [disabled, usage, fieldProvider]); + const renderNestedFieldProviderComponent = AccessConfigFieldsProvider.useComponent(fieldProvider, { + initProps: (provider) => { + let props: object = { disabled: disabled }; + + switch (provider) { + case ACCESS_PROVIDERS.WEBHOOK: + { + props = { + ...props, + usage: usage === "notification" ? "notification" : usage === "hosting" || usage === "dns-hosting" ? "deployment" : "none", + }; + } + break; + } + + return props; + }, + deps: [disabled, usage], + }); return (
- <>{nestedProviderConfigFields} + {renderNestedFieldProviderComponent && <>{renderNestedFieldProviderComponent}}
); diff --git a/ui/src/components/access/forms/AccessConfigFieldsProvider.tsx b/ui/src/components/access/forms/AccessConfigFieldsProvider.tsx new file mode 100644 index 000000000..fa5b18009 --- /dev/null +++ b/ui/src/components/access/forms/AccessConfigFieldsProvider.tsx @@ -0,0 +1,210 @@ +import { useEffect, useState } from "react"; + +import { ACCESS_PROVIDERS, type AccessProviderType } from "@/domain/provider"; + +import AccessConfigFieldsProvider1Panel from "./AccessConfigFieldsProvider1Panel"; +import AccessConfigFieldsProviderACMECA from "./AccessConfigFieldsProviderACMECA"; +import AccessConfigFieldsProviderACMEDNS from "./AccessConfigFieldsProviderACMEDNS"; +import AccessConfigFieldsProviderACMEHttpReq from "./AccessConfigFieldsProviderACMEHttpReq"; +import AccessConfigFieldsProviderActalisSSL from "./AccessConfigFieldsProviderActalisSSL"; +import AccessConfigFieldsProviderAliyun from "./AccessConfigFieldsProviderAliyun"; +import AccessConfigFieldsProviderAPISIX from "./AccessConfigFieldsProviderAPISIX"; +import AccessConfigFieldsProviderAWS from "./AccessConfigFieldsProviderAWS"; +import AccessConfigFieldsProviderAzure from "./AccessConfigFieldsProviderAzure"; +import AccessConfigFieldsProviderBaiduCloud from "./AccessConfigFieldsProviderBaiduCloud"; +import AccessConfigFieldsProviderBaishan from "./AccessConfigFieldsProviderBaishan"; +import AccessConfigFieldsProviderBaotaPanel from "./AccessConfigFieldsProviderBaotaPanel"; +import AccessConfigFieldsProviderBaotaPanelGo from "./AccessConfigFieldsProviderBaotaPanelGo"; +import AccessConfigFieldsProviderBaotaWAF from "./AccessConfigFieldsProviderBaotaWAF"; +import AccessConfigFieldsProviderBookMyName from "./AccessConfigFieldsProviderBookMyName"; +import AccessConfigFieldsProviderBunny from "./AccessConfigFieldsProviderBunny"; +import AccessConfigFieldsProviderBytePlus from "./AccessConfigFieldsProviderBytePlus"; +import AccessConfigFieldsProviderCacheFly from "./AccessConfigFieldsProviderCacheFly"; +import AccessConfigFieldsProviderCdnfly from "./AccessConfigFieldsProviderCdnfly"; +import AccessConfigFieldsProviderCloudflare from "./AccessConfigFieldsProviderCloudflare"; +import AccessConfigFieldsProviderClouDNS from "./AccessConfigFieldsProviderClouDNS"; +import AccessConfigFieldsProviderCMCCCloud from "./AccessConfigFieldsProviderCMCCCloud"; +import AccessConfigFieldsProviderConstellix from "./AccessConfigFieldsProviderConstellix"; +import AccessConfigFieldsProviderCTCCCloud from "./AccessConfigFieldsProviderCTCCCloud"; +import AccessConfigFieldsProviderDeSEC from "./AccessConfigFieldsProviderDeSEC"; +import AccessConfigFieldsProviderDigitalOcean from "./AccessConfigFieldsProviderDigitalOcean"; +import AccessConfigFieldsProviderDingTalkBot from "./AccessConfigFieldsProviderDingTalkBot"; +import AccessConfigFieldsProviderDiscordBot from "./AccessConfigFieldsProviderDiscordBot"; +import AccessConfigFieldsProviderDNSLA from "./AccessConfigFieldsProviderDNSLA"; +import AccessConfigFieldsProviderDogeCloud from "./AccessConfigFieldsProviderDogeCloud"; +import AccessConfigFieldsProviderDuckDNS from "./AccessConfigFieldsProviderDuckDNS"; +import AccessConfigFieldsProviderDynv6 from "./AccessConfigFieldsProviderDynv6"; +import AccessConfigFieldsProviderEmail from "./AccessConfigFieldsProviderEmail"; +import AccessConfigFieldsProviderFlexCDN from "./AccessConfigFieldsProviderFlexCDN"; +import AccessConfigFieldsProviderGandinet from "./AccessConfigFieldsProviderGandinet"; +import AccessConfigFieldsProviderGcore from "./AccessConfigFieldsProviderGcore"; +import AccessConfigFieldsProviderGlobalSignAtlas from "./AccessConfigFieldsProviderGlobalSignAtlas"; +import AccessConfigFieldsProviderGname from "./AccessConfigFieldsProviderGname"; +import AccessConfigFieldsProviderGoDaddy from "./AccessConfigFieldsProviderGoDaddy"; +import AccessConfigFieldsProviderGoEdge from "./AccessConfigFieldsProviderGoEdge"; +import AccessConfigFieldsProviderGoogleTrustServices from "./AccessConfigFieldsProviderGoogleTrustServices"; +import AccessConfigFieldsProviderHetzner from "./AccessConfigFieldsProviderHetzner"; +import AccessConfigFieldsProviderHostingde from "./AccessConfigFieldsProviderHostingde"; +import AccessConfigFieldsProviderHostinger from "./AccessConfigFieldsProviderHostinger"; +import AccessConfigFieldsProviderHuaweiCloud from "./AccessConfigFieldsProviderHuaweiCloud"; +import AccessConfigFieldsProviderIONOS from "./AccessConfigFieldsProviderIONOS"; +import AccessConfigFieldsProviderJDCloud from "./AccessConfigFieldsProviderJDCloud"; +import AccessConfigFieldsProviderKong from "./AccessConfigFieldsProviderKong"; +import AccessConfigFieldsProviderKubernetes from "./AccessConfigFieldsProviderKubernetes"; +import AccessConfigFieldsProviderLarkBot from "./AccessConfigFieldsProviderLarkBot"; +import AccessConfigFieldsProviderLeCDN from "./AccessConfigFieldsProviderLeCDN"; +import AccessConfigFieldsProviderLinode from "./AccessConfigFieldsProviderLinode"; +import AccessConfigFieldsProviderMattermost from "./AccessConfigFieldsProviderMattermost"; +import AccessConfigFieldsProviderNamecheap from "./AccessConfigFieldsProviderNamecheap"; +import AccessConfigFieldsProviderNameDotCom from "./AccessConfigFieldsProviderNameDotCom"; +import AccessConfigFieldsProviderNameSilo from "./AccessConfigFieldsProviderNameSilo"; +import AccessConfigFieldsProviderNetcup from "./AccessConfigFieldsProviderNetcup"; +import AccessConfigFieldsProviderNetlify from "./AccessConfigFieldsProviderNetlify"; +import AccessConfigFieldsProviderNS1 from "./AccessConfigFieldsProviderNS1"; +import AccessConfigFieldsProviderPorkbun from "./AccessConfigFieldsProviderPorkbun"; +import AccessConfigFieldsProviderPowerDNS from "./AccessConfigFieldsProviderPowerDNS"; +import AccessConfigFieldsProviderProxmoxVE from "./AccessConfigFieldsProviderProxmoxVE"; +import AccessConfigFieldsProviderQiniu from "./AccessConfigFieldsProviderQiniu"; +import AccessConfigFieldsProviderRainYun from "./AccessConfigFieldsProviderRainYun"; +import AccessConfigFieldsProviderRatPanel from "./AccessConfigFieldsProviderRatPanel"; +import AccessConfigFieldsProviderRFC2136 from "./AccessConfigFieldsProviderRFC2136"; +import AccessConfigFieldsProviderSafeLine from "./AccessConfigFieldsProviderSafeLine"; +import AccessConfigFieldsProviderSectigo from "./AccessConfigFieldsProviderSectigo"; +import AccessConfigFieldsProviderSlackBot from "./AccessConfigFieldsProviderSlackBot"; +import AccessConfigFieldsProviderSpaceship from "./AccessConfigFieldsProviderSpaceship"; +import AccessConfigFieldsProviderSSH from "./AccessConfigFieldsProviderSSH"; +import AccessConfigFieldsProviderSSLCom from "./AccessConfigFieldsProviderSSLCom"; +import AccessConfigFieldsProviderTechnitiumDNS from "./AccessConfigFieldsProviderTechnitiumDNS"; +import AccessConfigFieldsProviderTelegramBot from "./AccessConfigFieldsProviderTelegramBot"; +import AccessConfigFieldsProviderTencentCloud from "./AccessConfigFieldsProviderTencentCloud"; +import AccessConfigFieldsProviderUCloud from "./AccessConfigFieldsProviderUCloud"; +import AccessConfigFieldsProviderUniCloud from "./AccessConfigFieldsProviderUniCloud"; +import AccessConfigFieldsProviderUpyun from "./AccessConfigFieldsProviderUpyun"; +import AccessConfigFieldsProviderVercel from "./AccessConfigFieldsProviderVercel"; +import AccessConfigFieldsProviderVolcEngine from "./AccessConfigFieldsProviderVolcEngine"; +import AccessConfigFieldsProviderVultr from "./AccessConfigFieldsProviderVultr"; +import AccessConfigFieldsProviderWangsu from "./AccessConfigFieldsProviderWangsu"; +import AccessConfigFieldsProviderWebhook from "./AccessConfigFieldsProviderWebhook"; +import AccessConfigFieldsProviderWeComBot from "./AccessConfigFieldsProviderWeComBot"; +import AccessConfigFieldsProviderWestcn from "./AccessConfigFieldsProviderWestcn"; +import AccessConfigFieldsProviderZeroSSL from "./AccessConfigFieldsProviderZeroSSL"; + +const providerComponentMap: Partial>> = { + /* + 注意:如果追加新的子组件,请保持以 ASCII 排序。 + NOTICE: If you add new child component, please keep ASCII order. + */ + [ACCESS_PROVIDERS["1PANEL"]]: AccessConfigFieldsProvider1Panel, + [ACCESS_PROVIDERS.ACMECA]: AccessConfigFieldsProviderACMECA, + [ACCESS_PROVIDERS.ACMEDNS]: AccessConfigFieldsProviderACMEDNS, + [ACCESS_PROVIDERS.ACMEHTTPREQ]: AccessConfigFieldsProviderACMEHttpReq, + [ACCESS_PROVIDERS.ACTALISSSL]: AccessConfigFieldsProviderActalisSSL, + [ACCESS_PROVIDERS.ALIYUN]: AccessConfigFieldsProviderAliyun, + [ACCESS_PROVIDERS.APISIX]: AccessConfigFieldsProviderAPISIX, + [ACCESS_PROVIDERS.AWS]: AccessConfigFieldsProviderAWS, + [ACCESS_PROVIDERS.AZURE]: AccessConfigFieldsProviderAzure, + [ACCESS_PROVIDERS.BAIDUCLOUD]: AccessConfigFieldsProviderBaiduCloud, + [ACCESS_PROVIDERS.BAISHAN]: AccessConfigFieldsProviderBaishan, + [ACCESS_PROVIDERS.BAOTAPANEL]: AccessConfigFieldsProviderBaotaPanel, + [ACCESS_PROVIDERS.BAOTAPANELGO]: AccessConfigFieldsProviderBaotaPanelGo, + [ACCESS_PROVIDERS.BAOTAWAF]: AccessConfigFieldsProviderBaotaWAF, + [ACCESS_PROVIDERS.BOOKMYNAME]: AccessConfigFieldsProviderBookMyName, + [ACCESS_PROVIDERS.BUNNY]: AccessConfigFieldsProviderBunny, + [ACCESS_PROVIDERS.BYTEPLUS]: AccessConfigFieldsProviderBytePlus, + [ACCESS_PROVIDERS.CACHEFLY]: AccessConfigFieldsProviderCacheFly, + [ACCESS_PROVIDERS.CDNFLY]: AccessConfigFieldsProviderCdnfly, + [ACCESS_PROVIDERS.CLOUDFLARE]: AccessConfigFieldsProviderCloudflare, + [ACCESS_PROVIDERS.CLOUDNS]: AccessConfigFieldsProviderClouDNS, + [ACCESS_PROVIDERS.CMCCCLOUD]: AccessConfigFieldsProviderCMCCCloud, + [ACCESS_PROVIDERS.CONSTELLIX]: AccessConfigFieldsProviderConstellix, + [ACCESS_PROVIDERS.CTCCCLOUD]: AccessConfigFieldsProviderCTCCCloud, + [ACCESS_PROVIDERS.DESEC]: AccessConfigFieldsProviderDeSEC, + [ACCESS_PROVIDERS.DIGITALOCEAN]: AccessConfigFieldsProviderDigitalOcean, + [ACCESS_PROVIDERS.DINGTALKBOT]: AccessConfigFieldsProviderDingTalkBot, + [ACCESS_PROVIDERS.DISCORDBOT]: AccessConfigFieldsProviderDiscordBot, + [ACCESS_PROVIDERS.DNSLA]: AccessConfigFieldsProviderDNSLA, + [ACCESS_PROVIDERS.DOGECLOUD]: AccessConfigFieldsProviderDogeCloud, + [ACCESS_PROVIDERS.DUCKDNS]: AccessConfigFieldsProviderDuckDNS, + [ACCESS_PROVIDERS.DYNV6]: AccessConfigFieldsProviderDynv6, + [ACCESS_PROVIDERS.EMAIL]: AccessConfigFieldsProviderEmail, + [ACCESS_PROVIDERS.FLEXCDN]: AccessConfigFieldsProviderFlexCDN, + [ACCESS_PROVIDERS.GANDINET]: AccessConfigFieldsProviderGandinet, + [ACCESS_PROVIDERS.GCORE]: AccessConfigFieldsProviderGcore, + [ACCESS_PROVIDERS.GNAME]: AccessConfigFieldsProviderGname, + [ACCESS_PROVIDERS.GODADDY]: AccessConfigFieldsProviderGoDaddy, + [ACCESS_PROVIDERS.GOEDGE]: AccessConfigFieldsProviderGoEdge, + [ACCESS_PROVIDERS.GLOBALSIGNATLAS]: AccessConfigFieldsProviderGlobalSignAtlas, + [ACCESS_PROVIDERS.GOOGLETRUSTSERVICES]: AccessConfigFieldsProviderGoogleTrustServices, + [ACCESS_PROVIDERS.HETZNER]: AccessConfigFieldsProviderHetzner, + [ACCESS_PROVIDERS.HOSTINGDE]: AccessConfigFieldsProviderHostingde, + [ACCESS_PROVIDERS.HOSTINGER]: AccessConfigFieldsProviderHostinger, + [ACCESS_PROVIDERS.HUAWEICLOUD]: AccessConfigFieldsProviderHuaweiCloud, + [ACCESS_PROVIDERS.IONOS]: AccessConfigFieldsProviderIONOS, + [ACCESS_PROVIDERS.JDCLOUD]: AccessConfigFieldsProviderJDCloud, + [ACCESS_PROVIDERS.KONG]: AccessConfigFieldsProviderKong, + [ACCESS_PROVIDERS.KUBERNETES]: AccessConfigFieldsProviderKubernetes, + [ACCESS_PROVIDERS.LARKBOT]: AccessConfigFieldsProviderLarkBot, + [ACCESS_PROVIDERS.LECDN]: AccessConfigFieldsProviderLeCDN, + [ACCESS_PROVIDERS.LINODE]: AccessConfigFieldsProviderLinode, + [ACCESS_PROVIDERS.MATTERMOST]: AccessConfigFieldsProviderMattermost, + [ACCESS_PROVIDERS.NAMECHEAP]: AccessConfigFieldsProviderNamecheap, + [ACCESS_PROVIDERS.NAMEDOTCOM]: AccessConfigFieldsProviderNameDotCom, + [ACCESS_PROVIDERS.NAMESILO]: AccessConfigFieldsProviderNameSilo, + [ACCESS_PROVIDERS.NETCUP]: AccessConfigFieldsProviderNetcup, + [ACCESS_PROVIDERS.NETLIFY]: AccessConfigFieldsProviderNetlify, + [ACCESS_PROVIDERS.NS1]: AccessConfigFieldsProviderNS1, + [ACCESS_PROVIDERS.PORKBUN]: AccessConfigFieldsProviderPorkbun, + [ACCESS_PROVIDERS.POWERDNS]: AccessConfigFieldsProviderPowerDNS, + [ACCESS_PROVIDERS.PROXMOXVE]: AccessConfigFieldsProviderProxmoxVE, + [ACCESS_PROVIDERS.QINIU]: AccessConfigFieldsProviderQiniu, + [ACCESS_PROVIDERS.RAINYUN]: AccessConfigFieldsProviderRainYun, + [ACCESS_PROVIDERS.RATPANEL]: AccessConfigFieldsProviderRatPanel, + [ACCESS_PROVIDERS.RFC2136]: AccessConfigFieldsProviderRFC2136, + [ACCESS_PROVIDERS.SAFELINE]: AccessConfigFieldsProviderSafeLine, + [ACCESS_PROVIDERS.SECTIGO]: AccessConfigFieldsProviderSectigo, + [ACCESS_PROVIDERS.SLACKBOT]: AccessConfigFieldsProviderSlackBot, + [ACCESS_PROVIDERS.SPACESHIP]: AccessConfigFieldsProviderSpaceship, + [ACCESS_PROVIDERS.SSLCOM]: AccessConfigFieldsProviderSSLCom, + [ACCESS_PROVIDERS.SSH]: AccessConfigFieldsProviderSSH, + [ACCESS_PROVIDERS.TECHNITIUMDNS]: AccessConfigFieldsProviderTechnitiumDNS, + [ACCESS_PROVIDERS.TELEGRAMBOT]: AccessConfigFieldsProviderTelegramBot, + [ACCESS_PROVIDERS.TENCENTCLOUD]: AccessConfigFieldsProviderTencentCloud, + [ACCESS_PROVIDERS.UCLOUD]: AccessConfigFieldsProviderUCloud, + [ACCESS_PROVIDERS.UNICLOUD]: AccessConfigFieldsProviderUniCloud, + [ACCESS_PROVIDERS.UPYUN]: AccessConfigFieldsProviderUpyun, + [ACCESS_PROVIDERS.VERCEL]: AccessConfigFieldsProviderVercel, + [ACCESS_PROVIDERS.VOLCENGINE]: AccessConfigFieldsProviderVolcEngine, + [ACCESS_PROVIDERS.VULTR]: AccessConfigFieldsProviderVultr, + [ACCESS_PROVIDERS.WANGSU]: AccessConfigFieldsProviderWangsu, + [ACCESS_PROVIDERS.WEBHOOK]: AccessConfigFieldsProviderWebhook, + [ACCESS_PROVIDERS.WECOMBOT]: AccessConfigFieldsProviderWeComBot, + [ACCESS_PROVIDERS.WESTCN]: AccessConfigFieldsProviderWestcn, + [ACCESS_PROVIDERS.ZEROSSL]: AccessConfigFieldsProviderZeroSSL, +}; + +const useComponent = (provider: string, { initProps, deps = [] }: { initProps?: (provider: string) => any; deps?: unknown[] }) => { + const initComponent = () => { + const Component = providerComponentMap[provider as AccessProviderType]; + if (!Component) return null; + + const props = initProps?.(provider); + if (props) { + return ; + } + + return ; + }; + + const [component, setComponent] = useState(() => initComponent()); + + useEffect(() => setComponent(initComponent()), [provider]); + useEffect(() => setComponent(initComponent()), deps); + + return component; +}; + +const _default = { + useComponent, +}; + +export default _default; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProvider1Panel.tsx b/ui/src/components/access/forms/AccessConfigFieldsProvider1Panel.tsx index 725da3dd0..8ac354b62 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProvider1Panel.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProvider1Panel.tsx @@ -75,10 +75,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = return z.object({ serverUrl: z.url(t("common.errmsg.url_invalid")), apiVersion: z.string().nonempty(t("access.form.1panel_api_version.placeholder")), - apiKey: z - .string() - .min(1, t("access.form.1panel_api_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + apiKey: z.string().nonempty(t("access.form.1panel_api_key.placeholder")), allowInsecureConnections: z.boolean().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderACMEDNS.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderACMEDNS.tsx index c26cd012b..25eea327b 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderACMEDNS.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderACMEDNS.tsx @@ -53,19 +53,16 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = return z.object({ serverUrl: z.url(t("common.errmsg.url_invalid")), - credentials: z - .string() - .max(20480, t("common.errmsg.string_max", { max: 20480 })) - .refine((v) => { - if (!v) return false; + credentials: z.string().refine((v) => { + if (!v) return false; - try { - const obj = JSON.parse(v); - return typeof obj === "object" && !Array.isArray(obj); - } catch { - return false; - } - }, t("access.form.acmedns_credentials.errmsg.json_invalid")), + try { + const obj = JSON.parse(v); + return typeof obj === "object" && !Array.isArray(obj); + } catch { + return false; + } + }, t("access.form.acmedns_credentials.errmsg.json_invalid")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderACMEHttpReq.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderACMEHttpReq.tsx index 624273dbc..5d8e0b560 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderACMEHttpReq.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderACMEHttpReq.tsx @@ -79,14 +79,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = return z.object({ endpoint: z.url(t("common.errmsg.url_invalid")), mode: z.string().nullish(), - username: z - .string() - .max(256, t("common.errmsg.string_max", { max: 256 })) - .nullish(), - password: z - .string() - .max(256, t("common.errmsg.string_max", { max: 256 })) - .nullish(), + username: z.string().nullish(), + password: z.string().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderAWS.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderAWS.tsx index 9b1685f7c..e0f223712 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderAWS.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderAWS.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKeyId: z - .string() - .min(1, t("access.form.aws_access_key_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - secretAccessKey: z - .string() - .min(1, t("access.form.aws_secret_access_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + accessKeyId: z.string().nonempty(t("access.form.aws_access_key_id.placeholder")), + secretAccessKey: z.string().nonempty(t("access.form.aws_secret_access_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderActalisSSL.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderActalisSSL.tsx index 5d0438f17..03eb3c34c 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderActalisSSL.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderActalisSSL.tsx @@ -50,14 +50,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - eabKid: z - .string() - .min(1, t("access.form.shared_acme_eab_kid.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - eabHmacKey: z - .string() - .min(1, t("access.form.shared_acme_eab_hmac_key.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + eabKid: z.string().nonempty(t("access.form.shared_acme_eab_kid.placeholder")), + eabHmacKey: z.string().nonempty(t("access.form.shared_acme_eab_hmac_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderAliyun.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderAliyun.tsx index 74fda3517..11e7c1d53 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderAliyun.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderAliyun.tsx @@ -61,14 +61,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKeyId: z - .string() - .min(1, t("access.form.aliyun_access_key_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - accessKeySecret: z - .string() - .min(1, t("access.form.aliyun_access_key_secret.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + accessKeyId: z.string().nonempty(t("access.form.aliyun_access_key_id.placeholder")), + accessKeySecret: z.string().nonempty(t("access.form.aliyun_access_key_secret.placeholder")), resourceGroupId: z.string().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderAzure.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderAzure.tsx index 375123097..6020edf65 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderAzure.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderAzure.tsx @@ -76,18 +76,9 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - tenantId: z - .string() - .min(1, t("access.form.azure_tenant_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - clientId: z - .string() - .min(1, t("access.form.azure_client_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - clientSecret: z - .string() - .min(1, t("access.form.azure_client_secret.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + tenantId: z.string().nonempty(t("access.form.azure_tenant_id.placeholder")), + clientId: z.string().nonempty(t("access.form.azure_client_id.placeholder")), + clientSecret: z.string().nonempty(t("access.form.azure_client_secret.placeholder")), cloudName: z.string().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderBaiduCloud.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderBaiduCloud.tsx index 2a4221b6a..2cb73cad8 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderBaiduCloud.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderBaiduCloud.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKeyId: z - .string() - .min(1, t("access.form.baiducloud_access_key_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - secretAccessKey: z - .string() - .min(1, t("access.form.baiducloud_secret_access_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + accessKeyId: z.string().nonempty(t("access.form.baiducloud_access_key_id.placeholder")), + secretAccessKey: z.string().nonempty(t("access.form.baiducloud_secret_access_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderBaishan.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderBaishan.tsx index 93aff79e9..1d53751ec 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderBaishan.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderBaishan.tsx @@ -34,10 +34,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - apiToken: z - .string() - .min(1, t("access.form.baishan_api_token.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + apiToken: z.string().nonempty(t("access.form.baishan_api_token.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderBytePlus.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderBytePlus.tsx index daf88ca54..9be602f2d 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderBytePlus.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderBytePlus.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKey: z - .string() - .min(1, t("access.form.byteplus_access_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - secretKey: z - .string() - .min(1, t("access.form.byteplus_secret_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + accessKey: z.string().nonempty(t("access.form.byteplus_access_key.placeholder")), + secretKey: z.string().nonempty(t("access.form.byteplus_secret_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderCMCCCloud.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderCMCCCloud.tsx index 280c90672..bdf9267ce 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderCMCCCloud.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderCMCCCloud.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKeyId: z - .string() - .min(1, t("access.form.cmcccloud_access_key_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - accessKeySecret: z - .string() - .min(1, t("access.form.cmcccloud_access_key_secret.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + accessKeyId: z.string().nonempty(t("access.form.cmcccloud_access_key_id.placeholder")), + accessKeySecret: z.string().nonempty(t("access.form.cmcccloud_access_key_secret.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderCTCCCloud.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderCTCCCloud.tsx index 7beb283e3..03fe29845 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderCTCCCloud.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderCTCCCloud.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKeyId: z - .string() - .min(1, t("access.form.ctcccloud_access_key_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - secretAccessKey: z - .string() - .min(1, t("access.form.ctcccloud_secret_access_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + accessKeyId: z.string().nonempty(t("access.form.ctcccloud_access_key_id.placeholder")), + secretAccessKey: z.string().nonempty(t("access.form.ctcccloud_secret_access_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderCdnfly.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderCdnfly.tsx index 85ae13e20..87743ba84 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderCdnfly.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderCdnfly.tsx @@ -74,14 +74,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = return z.object({ serverUrl: z.url(t("common.errmsg.url_invalid")), - apiKey: z - .string() - .min(1, t("access.form.cdnfly_api_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - apiSecret: z - .string() - .min(1, t("access.form.cdnfly_api_secret.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + apiKey: z.string().nonempty(t("access.form.cdnfly_api_key.placeholder")), + apiSecret: z.string().nonempty(t("access.form.cdnfly_api_secret.placeholder")), allowInsecureConnections: z.boolean().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderClouDNS.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderClouDNS.tsx index 0efdf49ce..028e9a143 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderClouDNS.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderClouDNS.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - authId: z - .string() - .min(1, t("access.form.cloudns_auth_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - authPassword: z - .string() - .min(1, t("access.form.cloudns_auth_password.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + authId: z.string().nonempty(t("access.form.cloudns_auth_id.placeholder")), + authPassword: z.string().nonempty(t("access.form.cloudns_auth_password.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderCloudflare.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderCloudflare.tsx index cbb72b75f..5f70d3105 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderCloudflare.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderCloudflare.tsx @@ -50,14 +50,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - dnsApiToken: z - .string() - .min(1, t("access.form.cloudflare_dns_api_token.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - zoneApiToken: z - .string() - .max(64, t("common.errmsg.string_max", { max: 64 })) - .nullish(), + dnsApiToken: z.string().nonempty(t("access.form.cloudflare_dns_api_token.placeholder")), + zoneApiToken: z.string().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderDNSLA.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderDNSLA.tsx index dce2b407f..779de5da2 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderDNSLA.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderDNSLA.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - apiId: z - .string() - .min(1, t("access.form.dnsla_api_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - apiSecret: z - .string() - .min(1, t("access.form.dnsla_api_secret.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + apiId: z.string().nonempty(t("access.form.dnsla_api_id.placeholder")), + apiSecret: z.string().nonempty(t("access.form.dnsla_api_secret.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderDeSEC.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderDeSEC.tsx index 8a8110fd3..b45df4d62 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderDeSEC.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderDeSEC.tsx @@ -40,10 +40,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - token: z - .string() - .min(1, t("access.form.desec_token.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + token: z.string().nonempty(t("access.form.desec_token.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderDiscordBot.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderDiscordBot.tsx index 8abfbc021..fac76871a 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderDiscordBot.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderDiscordBot.tsx @@ -51,10 +51,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - botToken: z - .string() - .min(1, t("access.form.discordbot_token.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + botToken: z.string().nonempty(t("access.form.discordbot_token.placeholder")), channelId: z.string().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderDogeCloud.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderDogeCloud.tsx index 69fa743b7..8f9f1ab85 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderDogeCloud.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderDogeCloud.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKey: z - .string() - .min(1, t("access.form.dogecloud_access_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - secretKey: z - .string() - .min(1, t("access.form.dogecloud_secret_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + accessKey: z.string().nonempty(t("access.form.dogecloud_access_key.placeholder")), + secretKey: z.string().nonempty(t("access.form.dogecloud_secret_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderDynv6.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderDynv6.tsx index 3b23629a4..e675d6fc0 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderDynv6.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderDynv6.tsx @@ -40,10 +40,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - httpToken: z - .string() - .min(1, t("access.form.dynv6_http_token.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + httpToken: z.string().nonempty(t("access.form.dynv6_http_token.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderEmail.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderEmail.tsx index 559497399..8feeaded1 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderEmail.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderEmail.tsx @@ -112,23 +112,11 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - smtpHost: z - .string() - .min(1, t("access.form.email_smtp_host.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - smtpPort: z.preprocess( - (v) => Number(v), - z.number().refine((v) => validPortNumber(v), t("common.errmsg.port_invalid")) - ), + smtpHost: z.string().nonempty(t("access.form.email_smtp_host.placeholder")), + smtpPort: z.coerce.number().refine((v) => validPortNumber(v), t("common.errmsg.port_invalid")), smtpTls: z.boolean().nullish(), - username: z - .string() - .min(1, t("access.form.email_username.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - password: z - .string() - .min(1, t("access.form.email_password.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + username: z.string().nonempty(t("access.form.email_username.placeholder")), + password: z.string().nonempty(t("access.form.email_password.placeholder")), senderAddress: z.email(t("common.errmsg.email_invalid")), senderName: z.string().nullish(), receiverAddress: z diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderGlobalSignAtlas.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderGlobalSignAtlas.tsx index 68c75d8ea..b908f9210 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderGlobalSignAtlas.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderGlobalSignAtlas.tsx @@ -50,14 +50,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - eabKid: z - .string() - .min(1, t("access.form.shared_acme_eab_kid.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - eabHmacKey: z - .string() - .min(1, t("access.form.shared_acme_eab_hmac_key.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + eabKid: z.string().nonempty(t("access.form.shared_acme_eab_kid.placeholder")), + eabHmacKey: z.string().nonempty(t("access.form.shared_acme_eab_hmac_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderGname.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderGname.tsx index 746187601..86a5fd8ab 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderGname.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderGname.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - appId: z - .string() - .min(1, t("access.form.gname_app_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - appKey: z - .string() - .min(1, t("access.form.gname_app_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + appId: z.string().nonempty(t("access.form.gname_app_id.placeholder")), + appKey: z.string().nonempty(t("access.form.gname_app_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderGoDaddy.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderGoDaddy.tsx index 3dd30815c..a6f368dc6 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderGoDaddy.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderGoDaddy.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - apiKey: z - .string() - .min(1, t("access.form.godaddy_api_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - apiSecret: z - .string() - .min(1, t("access.form.godaddy_api_secret.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + apiKey: z.string().nonempty(t("access.form.godaddy_api_key.placeholder")), + apiSecret: z.string().nonempty(t("access.form.godaddy_api_secret.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderGoogleTrustServices.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderGoogleTrustServices.tsx index ae5edab5d..82cc01045 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderGoogleTrustServices.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderGoogleTrustServices.tsx @@ -50,14 +50,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - eabKid: z - .string() - .min(1, t("access.form.shared_acme_eab_kid.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - eabHmacKey: z - .string() - .min(1, t("access.form.shared_acme_eab_hmac_key.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + eabKid: z.string().nonempty(t("access.form.shared_acme_eab_kid.placeholder")), + eabHmacKey: z.string().nonempty(t("access.form.shared_acme_eab_hmac_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderHostingde.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderHostingde.tsx new file mode 100644 index 000000000..35d09f49d --- /dev/null +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderHostingde.tsx @@ -0,0 +1,52 @@ +import { getI18n, useTranslation } from "react-i18next"; +import { Form, Input } from "antd"; +import { createSchemaFieldRule } from "antd-zod"; +import { z } from "zod"; + +import { useFormNestedFieldsContext } from "./_context"; + +const AccessConfigFormFieldsProviderHostingde = () => { + const { i18n, t } = useTranslation(); + + const { parentNamePath } = useFormNestedFieldsContext(); + const formSchema = z.object({ + [parentNamePath]: getSchema({ i18n }), + }); + const formRule = createSchemaFieldRule(formSchema); + const initialValues = getInitialValues(); + + return ( + <> + } + > + + + + ); +}; + +const getInitialValues = (): Nullish>> => { + return { + apiKey: "", + }; +}; + +const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) => { + const { t } = i18n; + + return z.object({ + apiKey: z.string().nonempty(t("access.form.hostingde_api_key.placeholder")), + }); +}; + +const _default = Object.assign(AccessConfigFormFieldsProviderHostingde, { + getInitialValues, + getSchema, +}); + +export default _default; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderHuaweiCloud.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderHuaweiCloud.tsx index 279703835..fce3963f7 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderHuaweiCloud.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderHuaweiCloud.tsx @@ -61,14 +61,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKeyId: z - .string() - .min(1, t("access.form.huaweicloud_access_key_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - secretAccessKey: z - .string() - .min(1, t("access.form.huaweicloud_secret_access_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + accessKeyId: z.string().nonempty(t("access.form.huaweicloud_access_key_id.placeholder")), + secretAccessKey: z.string().nonempty(t("access.form.huaweicloud_secret_access_key.placeholder")), enterpriseProjectId: z.string().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderJDCloud.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderJDCloud.tsx index 4a58c29ce..b94df308b 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderJDCloud.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderJDCloud.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKeyId: z - .string() - .min(1, t("access.form.jdcloud_access_key_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - accessKeySecret: z - .string() - .min(1, t("access.form.jdcloud_access_key_secret.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + accessKeyId: z.string().nonempty(t("access.form.jdcloud_access_key_id.placeholder")), + accessKeySecret: z.string().nonempty(t("access.form.jdcloud_access_key_secret.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderNS1.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderNS1.tsx index b60f766d4..14bdef231 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderNS1.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderNS1.tsx @@ -40,10 +40,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - apiKey: z - .string() - .min(1, t("access.form.ns1_api_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + apiKey: z.string().nonempty(t("access.form.ns1_api_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderNameDotCom.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderNameDotCom.tsx index 1efbf2b2d..580cca2b5 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderNameDotCom.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderNameDotCom.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - username: z - .string() - .min(1, t("access.form.namedotcom_username.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - apiToken: z - .string() - .min(1, t("access.form.namedotcom_api_token.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + username: z.string().nonempty(t("access.form.namedotcom_username.placeholder")), + apiToken: z.string().nonempty(t("access.form.namedotcom_api_token.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderNameSilo.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderNameSilo.tsx index aba5bf4b1..b5e2781e5 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderNameSilo.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderNameSilo.tsx @@ -40,10 +40,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - apiKey: z - .string() - .min(1, t("access.form.namesilo_api_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + apiKey: z.string().nonempty(t("access.form.namesilo_api_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderNamecheap.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderNamecheap.tsx index 0b3018a5e..f05333cab 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderNamecheap.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderNamecheap.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - username: z - .string() - .min(1, t("access.form.namecheap_username.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - apiKey: z - .string() - .min(1, t("access.form.namecheap_api_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + username: z.string().nonempty(t("access.form.namecheap_username.placeholder")), + apiKey: z.string().nonempty(t("access.form.namecheap_api_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderPorkbun.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderPorkbun.tsx index 881d32325..3d2eede82 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderPorkbun.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderPorkbun.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - apiKey: z - .string() - .min(1, t("access.form.porkbun_api_key.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - secretApiKey: z - .string() - .min(1, t("access.form.porkbun_secret_api_key.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + apiKey: z.string().nonempty(t("access.form.porkbun_api_key.placeholder")), + secretApiKey: z.string().nonempty(t("access.form.porkbun_secret_api_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderPowerDNS.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderPowerDNS.tsx index b7bbbfe63..687348613 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderPowerDNS.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderPowerDNS.tsx @@ -63,10 +63,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = return z.object({ serverUrl: z.url(t("common.errmsg.url_invalid")), - apiKey: z - .string() - .min(1, t("access.form.powerdns_api_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + apiKey: z.string().nonempty(t("access.form.powerdns_api_key.placeholder")), allowInsecureConnections: z.boolean().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderQiniu.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderQiniu.tsx index 940740c62..0f1cef9e0 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderQiniu.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderQiniu.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKey: z - .string() - .min(1, t("access.form.qiniu_access_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - secretKey: z - .string() - .min(1, t("access.form.qiniu_secret_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + accessKey: z.string().nonempty(t("access.form.qiniu_access_key.placeholder")), + secretKey: z.string().nonempty(t("access.form.qiniu_secret_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderRFC2136.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderRFC2136.tsx index 263e48e9f..0f263cf75 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderRFC2136.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderRFC2136.tsx @@ -82,13 +82,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = return z.object({ host: z.string().refine((v) => validDomainName(v) || validIPv4Address(v) || validIPv6Address(v), t("common.errmsg.host_invalid")), - port: z.preprocess( - (v) => Number(v), - z - .number() - .int(t("access.form.rfc2136_port.placeholder")) - .refine((v) => validPortNumber(v), t("common.errmsg.port_invalid")) - ), + port: z.coerce.number().refine((v) => validPortNumber(v), t("common.errmsg.port_invalid")), tsigAlgorithm: z.string().nonempty(t("access.form.rfc2136_tsig_algorithm.placeholder")), tsigKey: z.string().nullish(), tsigSecret: z.string().nullish(), diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderRainYun.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderRainYun.tsx index e06b3d10c..f82409765 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderRainYun.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderRainYun.tsx @@ -40,10 +40,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - apiKey: z - .string() - .min(1, t("access.form.rainyun_api_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + apiKey: z.string().nonempty(t("access.form.rainyun_api_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderRatPanel.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderRatPanel.tsx index 03c2597bf..971cb4b64 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderRatPanel.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderRatPanel.tsx @@ -75,7 +75,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = return z.object({ serverUrl: z.url(t("common.errmsg.url_invalid")), - accessTokenId: z.preprocess((v) => Number(v), z.number().positive(t("access.form.ratpanel_access_token_id.placeholder"))), + accessTokenId: z.coerce.number().int(t("access.form.ratpanel_access_token_id.placeholder")).positive(t("access.form.ratpanel_access_token_id.placeholder")), accessToken: z.string().nonempty(t("access.form.ratpanel_access_token.placeholder")), allowInsecureConnections: z.boolean().nullish(), }); diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderSSH.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderSSH.tsx index 278faa83e..89003bd51 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderSSH.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderSSH.tsx @@ -235,30 +235,18 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const baseSchema = z .object({ host: z.string().refine((v) => validDomainName(v) || validIPv4Address(v) || validIPv6Address(v), t("common.errmsg.host_invalid")), - port: z.preprocess( - (v) => Number(v), - z - .number() - .int(t("access.form.ssh_port.placeholder")) - .refine((v) => validPortNumber(v), t("common.errmsg.port_invalid")) - ), + port: z.coerce + .number() + .int(t("access.form.ssh_port.placeholder")) + .refine((v) => validPortNumber(v), t("common.errmsg.port_invalid")), authMethod: z.literal([AUTH_METHOD_NONE, AUTH_METHOD_PASSWORD, AUTH_METHOD_KEY], t("access.form.ssh_auth_method.placeholder")), - username: z - .string() - .min(1, t("access.form.ssh_username.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - password: z - .string() - .max(64, t("common.errmsg.string_max", { max: 64 })) - .nullish(), + username: z.string().nonempty(t("access.form.ssh_username.placeholder")), + password: z.string().nullish(), key: z .string() .max(20480, t("common.errmsg.string_max", { max: 20480 })) .nullish(), - keyPassphrase: z - .string() - .max(20480, t("common.errmsg.string_max", { max: 20480 })) - .nullish(), + keyPassphrase: z.string().nullish(), }) .superRefine((values, ctx) => { switch (values.authMethod) { diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderSSLCom.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderSSLCom.tsx index 6e5b83180..fa0ac3c54 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderSSLCom.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderSSLCom.tsx @@ -50,14 +50,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - eabKid: z - .string() - .min(1, t("access.form.shared_acme_eab_kid.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - eabHmacKey: z - .string() - .min(1, t("access.form.shared_acme_eab_hmac_key.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + eabKid: z.string().nonempty(t("access.form.shared_acme_eab_kid.placeholder")), + eabHmacKey: z.string().nonempty(t("access.form.shared_acme_eab_hmac_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderSafeLine.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderSafeLine.tsx index 7b1970b26..a13b55a96 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderSafeLine.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderSafeLine.tsx @@ -63,10 +63,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = return z.object({ serverUrl: z.url(t("common.errmsg.url_invalid")), - apiToken: z - .string() - .min(1, t("access.form.safeline_api_token.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + apiToken: z.string().nonempty(t("access.form.safeline_api_token.placeholder")), allowInsecureConnections: z.boolean().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderSectigo.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderSectigo.tsx index a73614770..a92816db6 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderSectigo.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderSectigo.tsx @@ -68,14 +68,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = return z.object({ validationType: z.string().nonempty(t("access.form.sectigo_validation_type.placeholder")), - eabKid: z - .string() - .min(1, t("access.form.shared_acme_eab_kid.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - eabHmacKey: z - .string() - .min(1, t("access.form.shared_acme_eab_hmac_key.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + eabKid: z.string().nonempty(t("access.form.shared_acme_eab_kid.placeholder")), + eabHmacKey: z.string().nonempty(t("access.form.shared_acme_eab_hmac_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderSlackBot.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderSlackBot.tsx index 142e9d314..fe431f4f4 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderSlackBot.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderSlackBot.tsx @@ -51,10 +51,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - botToken: z - .string() - .min(1, t("access.form.slackbot_token.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + botToken: z.string().nonempty(t("access.form.slackbot_token.placeholder")), channelId: z.string().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderTelegramBot.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderTelegramBot.tsx index 1f1f4aa3e..431ae7469 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderTelegramBot.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderTelegramBot.tsx @@ -51,10 +51,7 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - botToken: z - .string() - .min(1, t("access.form.telegrambot_token.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + botToken: z.string().nonempty(t("access.form.telegrambot_token.placeholder")), chatId: z .preprocess( (v) => (v == null || v === "" ? void 0 : Number(v)), diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderTencentCloud.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderTencentCloud.tsx index f57e93487..9afd266ec 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderTencentCloud.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderTencentCloud.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - secretId: z - .string() - .min(1, t("access.form.tencentcloud_secret_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - secretKey: z - .string() - .min(1, t("access.form.tencentcloud_secret_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + secretId: z.string().nonempty(t("access.form.tencentcloud_secret_id.placeholder")), + secretKey: z.string().nonempty(t("access.form.tencentcloud_secret_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderUCloud.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderUCloud.tsx index 3b506bdb7..af30c2933 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderUCloud.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderUCloud.tsx @@ -61,18 +61,9 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - privateKey: z - .string() - .min(1, t("access.form.ucloud_private_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - publicKey: z - .string() - .min(1, t("access.form.ucloud_public_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - projectId: z - .string() - .max(64, t("common.errmsg.string_max", { max: 64 })) - .nullish(), + privateKey: z.string().nonempty(t("access.form.ucloud_private_key.placeholder")), + publicKey: z.string().nonempty(t("access.form.ucloud_public_key.placeholder")), + projectId: z.string().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderUpyun.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderUpyun.tsx index 11c18ff45..346105caf 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderUpyun.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderUpyun.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - username: z - .string() - .min(1, t("access.form.upyun_username.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - password: z - .string() - .min(1, t("access.form.upyun_password.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + username: z.string().nonempty(t("access.form.upyun_username.placeholder")), + password: z.string().nonempty(t("access.form.upyun_password.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderVercel.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderVercel.tsx index 4963cfdf3..0adcb0651 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderVercel.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderVercel.tsx @@ -50,14 +50,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - apiAccessToken: z - .string() - .min(1, t("access.form.vercel_api_access_token.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - teamId: z - .string() - .max(256, t("common.errmsg.string_max", { max: 256 })) - .nullish(), + apiAccessToken: z.string().nonempty(t("access.form.vercel_api_access_token.placeholder")), + teamId: z.string().nullish(), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderVolcEngine.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderVolcEngine.tsx index a8330ff62..5798491a8 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderVolcEngine.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderVolcEngine.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKeyId: z - .string() - .min(1, t("access.form.volcengine_access_key_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - secretAccessKey: z - .string() - .min(1, t("access.form.volcengine_secret_access_key.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + accessKeyId: z.string().nonempty(t("access.form.volcengine_access_key_id.placeholder")), + secretAccessKey: z.string().nonempty(t("access.form.volcengine_secret_access_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderWangsu.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderWangsu.tsx index 803fb3c44..ce5ea96e7 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderWangsu.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderWangsu.tsx @@ -62,18 +62,9 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - accessKeyId: z - .string() - .min(1, t("access.form.wangsu_access_key_id.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - accessKeySecret: z - .string() - .min(1, t("access.form.wangsu_access_key_secret.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - apiKey: z - .string() - .min(1, t("access.form.wangsu_api_key.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + accessKeyId: z.string().nonempty(t("access.form.wangsu_access_key_id.placeholder")), + accessKeySecret: z.string().nonempty(t("access.form.wangsu_access_key_secret.placeholder")), + apiKey: z.string().nonempty(t("access.form.wangsu_api_key.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderWestcn.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderWestcn.tsx index 4b17fcc2b..9d613312b 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderWestcn.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderWestcn.tsx @@ -51,14 +51,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - username: z - .string() - .min(1, t("access.form.westcn_username.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), - apiPassword: z - .string() - .min(1, t("access.form.westcn_api_password.placeholder")) - .max(64, t("common.errmsg.string_max", { max: 64 })), + username: z.string().nonempty(t("access.form.westcn_username.placeholder")), + apiPassword: z.string().nonempty(t("access.form.westcn_api_password.placeholder")), }); }; diff --git a/ui/src/components/access/forms/AccessConfigFieldsProviderZeroSSL.tsx b/ui/src/components/access/forms/AccessConfigFieldsProviderZeroSSL.tsx index c324a7819..40520d4f6 100644 --- a/ui/src/components/access/forms/AccessConfigFieldsProviderZeroSSL.tsx +++ b/ui/src/components/access/forms/AccessConfigFieldsProviderZeroSSL.tsx @@ -50,14 +50,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n: ReturnType }) = const { t } = i18n; return z.object({ - eabKid: z - .string() - .min(1, t("access.form.shared_acme_eab_kid.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - eabHmacKey: z - .string() - .min(1, t("access.form.shared_acme_eab_hmac_key.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + eabKid: z.string().nonempty(t("access.form.shared_acme_eab_kid.placeholder")), + eabHmacKey: z.string().nonempty(t("access.form.shared_acme_eab_hmac_key.placeholder")), }); }; diff --git a/ui/src/components/workflow/designer/forms/BizApplyNodeConfigFieldsProvider.tsx b/ui/src/components/workflow/designer/forms/BizApplyNodeConfigFieldsProvider.tsx new file mode 100644 index 000000000..f46f38bb0 --- /dev/null +++ b/ui/src/components/workflow/designer/forms/BizApplyNodeConfigFieldsProvider.tsx @@ -0,0 +1,71 @@ +import { useEffect, useState } from "react"; + +import { type ACMEDns01ProviderType, type ACMEHttp01ProviderType, ACME_DNS01_PROVIDERS, ACME_HTTP01_PROVIDERS } from "@/domain/provider"; + +import BizApplyNodeConfigFieldsProviderAliyunESA from "./BizApplyNodeConfigFieldsProviderAliyunESA"; +import BizApplyNodeConfigFieldsProviderAWSRoute53 from "./BizApplyNodeConfigFieldsProviderAWSRoute53"; +import BizApplyNodeConfigFieldsProviderHuaweiCloudDNS from "./BizApplyNodeConfigFieldsProviderHuaweiCloudDNS"; +import BizApplyNodeConfigFieldsProviderJDCloudDNS from "./BizApplyNodeConfigFieldsProviderJDCloudDNS"; +import BizApplyNodeConfigFieldsProviderLocal from "./BizApplyNodeConfigFieldsProviderLocal"; +import BizApplyNodeConfigFieldsProviderSSH from "./BizApplyNodeConfigFieldsProviderSSH"; +import BizApplyNodeConfigFieldsProviderTencentCloudEO from "./BizApplyNodeConfigFieldsProviderTencentCloudEO"; + +const acmeDns01ProviderComponentMap: Partial>> = { + /* + 注意:如果追加新的子组件,请保持以 ASCII 排序。 + NOTICE: If you add new child component, please keep ASCII order. + */ + [ACME_DNS01_PROVIDERS.ALIYUN_ESA]: BizApplyNodeConfigFieldsProviderAliyunESA, + [ACME_DNS01_PROVIDERS.AWS]: BizApplyNodeConfigFieldsProviderAWSRoute53, + [ACME_DNS01_PROVIDERS.AWS_ROUTE53]: BizApplyNodeConfigFieldsProviderAWSRoute53, + [ACME_DNS01_PROVIDERS.HUAWEICLOUD]: BizApplyNodeConfigFieldsProviderHuaweiCloudDNS, + [ACME_DNS01_PROVIDERS.HUAWEICLOUD_DNS]: BizApplyNodeConfigFieldsProviderHuaweiCloudDNS, + [ACME_DNS01_PROVIDERS.JDCLOUD]: BizApplyNodeConfigFieldsProviderJDCloudDNS, + [ACME_DNS01_PROVIDERS.JDCLOUD_DNS]: BizApplyNodeConfigFieldsProviderJDCloudDNS, + [ACME_DNS01_PROVIDERS.TENCENTCLOUD_EO]: BizApplyNodeConfigFieldsProviderTencentCloudEO, +}; + +const acmeHttp01ProviderComponentMap: Partial>> = { + /* + 注意:如果追加新的子组件,请保持以 ASCII 排序。 + NOTICE: If you add new child component, please keep ASCII order. + */ + [ACME_HTTP01_PROVIDERS.LOCAL]: BizApplyNodeConfigFieldsProviderLocal, + [ACME_HTTP01_PROVIDERS.SSH]: BizApplyNodeConfigFieldsProviderSSH, +}; + +const useComponent = ( + challenge: "dns-01" | "http-01", + provider: string, + { initProps, deps = [] }: { initProps?: (provider: string) => any; deps?: unknown[] } +) => { + const initComponent = () => { + const Component = + challenge === "dns-01" + ? acmeDns01ProviderComponentMap[provider as ACMEDns01ProviderType] + : challenge === "http-01" + ? acmeHttp01ProviderComponentMap[provider as ACMEHttp01ProviderType] + : void 0; + if (!Component) return null; + + const props = initProps?.(provider); + if (props) { + return ; + } + + return ; + }; + + const [component, setComponent] = useState(() => initComponent()); + + useEffect(() => setComponent(initComponent()), [challenge, provider]); + useEffect(() => setComponent(initComponent()), deps); + + return component; +}; + +const _default = { + useComponent, +}; + +export default _default; diff --git a/ui/src/components/workflow/designer/forms/BizApplyNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BizApplyNodeConfigForm.tsx index 58d167b60..28b3c4026 100644 --- a/ui/src/components/workflow/designer/forms/BizApplyNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BizApplyNodeConfigForm.tsx @@ -1,7 +1,7 @@ import { memo, useEffect, useMemo, useState } from "react"; import { getI18n, useTranslation } from "react-i18next"; import { Link } from "react-router"; -import { type FlowNodeEntity, getNodeForm } from "@flowgram.ai/fixed-layout-editor"; +import { type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor"; import { IconChevronRight, IconCircleMinus, IconPlus } from "@tabler/icons-react"; import { useControllableValue, useMount } from "ahooks"; import { @@ -33,7 +33,7 @@ import CAProviderSelect from "@/components/provider/CAProviderSelect"; import Show from "@/components/Show"; import TextFileInput from "@/components/TextFileInput"; import { type AccessModel } from "@/domain/access"; -import { ACME_DNS01_PROVIDERS, ACME_HTTP01_PROVIDERS, acmeDns01ProvidersMap, acmeHttp01ProvidersMap, caProvidersMap } from "@/domain/provider"; +import { acmeDns01ProvidersMap, acmeHttp01ProvidersMap, caProvidersMap } from "@/domain/provider"; import { type WorkflowNodeConfigForBizApply, defaultNodeConfigForBizApply } from "@/domain/workflow"; import { useAntdForm, useZustandShallowSelector } from "@/hooks"; import { useAccessesStore } from "@/stores/access"; @@ -42,13 +42,7 @@ import { getErrMsg } from "@/utils/error"; import { validDomainName, validIPv4Address, validIPv6Address } from "@/utils/validators"; import { FormNestedFieldsContextProvider, NodeFormContextProvider } from "./_context"; -import BizApplyNodeConfigFieldsProviderAliyunESA from "./BizApplyNodeConfigFieldsProviderAliyunESA"; -import BizApplyNodeConfigFieldsProviderAWSRoute53 from "./BizApplyNodeConfigFieldsProviderAWSRoute53"; -import BizApplyNodeConfigFieldsProviderHuaweiCloudDNS from "./BizApplyNodeConfigFieldsProviderHuaweiCloudDNS"; -import BizApplyNodeConfigFieldsProviderJDCloudDNS from "./BizApplyNodeConfigFieldsProviderJDCloudDNS"; -import BizApplyNodeConfigFieldsProviderLocal from "./BizApplyNodeConfigFieldsProviderLocal"; -import BizApplyNodeConfigFieldsProviderSSH from "./BizApplyNodeConfigFieldsProviderSSH"; -import BizApplyNodeConfigFieldsProviderTencentCloudEO from "./BizApplyNodeConfigFieldsProviderTencentCloudEO"; +import BizApplyNodeConfigFieldsProvider from "./BizApplyNodeConfigFieldsProvider"; import { NodeType } from "../nodes/typings"; const MULTIPLE_INPUT_SEPARATOR = ";"; @@ -85,25 +79,28 @@ const BizApplyNodeConfigForm = ({ node, ...props }: BizApplyNodeConfigFormProps) }; const initialValues = useMemo(() => { - return getNodeForm(node)?.getValueIn("config") as WorkflowNodeConfigForBizApply | undefined; + return node.form?.getValueIn("config") as WorkflowNodeConfigForBizApply | undefined; }, [node]); const formSchema = getSchema({ i18n }); + type FormSchema = z.infer; const formRule = createSchemaFieldRule(formSchema); - const { form: formInst, formProps } = useAntdForm>({ + const { form: formInst, formProps } = useAntdForm({ form: props.form, name: "workflowNodeBizApplyConfigForm", initialValues: initialValues ?? getInitialValues(), }); - const fieldChallengeType = Form.useWatch("challengeType", { form: formInst, preserve: true }); + const fieldChallengeType = Form.useWatch("challengeType", { form: formInst, preserve: true }); const fieldProvider = Form.useWatch("provider", { form: formInst, preserve: true }); const fieldProviderAccessId = Form.useWatch("providerAccessId", { form: formInst, preserve: true }); const fieldKeySource = Form.useWatch("keySource", { form: formInst, preserve: true }); const fieldCAProvider = Form.useWatch("caProvider", { form: formInst, preserve: true }); const fieldCAProviderAccessId = Form.useWatch("caProviderAccessId", { form: formInst, preserve: true }); - const resetFieldIfInvalid = (field: keyof z.infer) => { + const renderNestedFieldProviderComponent = BizApplyNodeConfigFieldsProvider.useComponent(fieldChallengeType, fieldProvider, {}); + + const resetFieldIfInvalid = (field: keyof FormSchema) => { const fieldSchame = formSchema.pick({ [field]: true }); const fieldValue = formInst.getFieldValue(field); if (!fieldSchame.safeParse({ [field]: fieldValue }).success) { @@ -111,61 +108,14 @@ const BizApplyNodeConfigForm = ({ node, ...props }: BizApplyNodeConfigFormProps) } }; - const NestedProviderConfigFields = useMemo(() => { - /* - 注意:如果追加新的子组件,请保持以 ASCII 排序。 - NOTICE: If you add new child component, please keep ASCII order. - */ - switch (fieldChallengeType) { - case CHALLENGE_TYPE_DNS01: - { - switch (fieldProvider) { - case ACME_DNS01_PROVIDERS.ALIYUN_ESA: { - return BizApplyNodeConfigFieldsProviderAliyunESA; - } - case ACME_DNS01_PROVIDERS.AWS: - case ACME_DNS01_PROVIDERS.AWS_ROUTE53: { - return BizApplyNodeConfigFieldsProviderAWSRoute53; - } - case ACME_DNS01_PROVIDERS.HUAWEICLOUD: - case ACME_DNS01_PROVIDERS.HUAWEICLOUD_DNS: { - return BizApplyNodeConfigFieldsProviderHuaweiCloudDNS; - } - case ACME_DNS01_PROVIDERS.JDCLOUD: - case ACME_DNS01_PROVIDERS.JDCLOUD_DNS: { - return BizApplyNodeConfigFieldsProviderJDCloudDNS; - } - case ACME_DNS01_PROVIDERS.TENCENTCLOUD_EO: { - return BizApplyNodeConfigFieldsProviderTencentCloudEO; - } - } - } - break; - - case CHALLENGE_TYPE_HTTP01: - switch (fieldProvider) { - case ACME_HTTP01_PROVIDERS.LOCAL: { - return BizApplyNodeConfigFieldsProviderLocal; - } - case ACME_HTTP01_PROVIDERS.SSH: { - return BizApplyNodeConfigFieldsProviderSSH; - } - } - break; - } - }, [fieldChallengeType, fieldProvider]); - - const [showProviderAccess, setShowProviderAccess] = useState(false); - useEffect(() => { + const showProviderAccess = useMemo(() => { // 内置的质询提供商(如本地主机)无需显示授权信息字段 switch (fieldChallengeType) { case CHALLENGE_TYPE_DNS01: { if (fieldProvider) { const provider = acmeDns01ProvidersMap.get(fieldProvider); - setShowProviderAccess(!provider?.builtin); - } else { - setShowProviderAccess(false); + return !provider?.builtin; } } break; @@ -174,30 +124,23 @@ const BizApplyNodeConfigForm = ({ node, ...props }: BizApplyNodeConfigFormProps) { if (fieldProvider) { const provider = acmeHttp01ProvidersMap.get(fieldProvider); - setShowProviderAccess(!provider?.builtin); - } else { - setShowProviderAccess(false); + return !provider?.builtin; } } break; - - default: - { - setShowProviderAccess(false); - } - break; } + + return false; }, [fieldChallengeType, fieldProvider]); - const [showCAProviderAccess, setShowCAProviderAccess] = useState(false); - useEffect(() => { + const showCAProviderAccess = useMemo(() => { // 内置的 CA 提供商(如 Let's Encrypt)无需显示授权信息字段 if (fieldCAProvider) { const provider = caProvidersMap.get(fieldCAProvider); - setShowCAProviderAccess(!provider?.builtin); - } else { - setShowCAProviderAccess(false); + return !provider?.builtin; } + + return false; }, [fieldCAProvider]); useEffect(() => { @@ -460,7 +403,7 @@ const BizApplyNodeConfigForm = ({ node, ...props }: BizApplyNodeConfigFormProps) - {NestedProviderConfigFields && } + {renderNestedFieldProviderComponent && <>{renderNestedFieldProviderComponent}} @@ -700,7 +643,7 @@ const BizApplyNodeConfigForm = ({ node, ...props }: BizApplyNodeConfigFormProps) }) .every((e) => validDomainName(e, { allowWildcard: true })); }, t("common.errmsg.domain_invalid")), contactEmail: z.email(t("common.errmsg.email_invalid")), - challengeType: z.string(t("workflow_node.apply.form.challenge_type.placeholder")).nonempty(t("workflow_node.apply.form.challenge_type.placeholder")), + challengeType: z.enum([CHALLENGE_TYPE_DNS01, CHALLENGE_TYPE_HTTP01], t("workflow_node.apply.form.challenge_type.placeholder")), provider: z.string(t("workflow_node.apply.form.provider.placeholder")).nonempty(t("workflow_node.apply.form.provider.placeholder")), providerAccessId: z.string(t("workflow_node.apply.form.provider_access.placeholder")).nullish(), providerConfig: z.any().nullish(), @@ -944,13 +887,10 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) acmeProfile: z.string().nullish(), disableFollowCNAME: z.boolean().nullish(), disableARI: z.boolean().nullish(), - skipBeforeExpiryDays: z.preprocess( - (v) => Number(v), - z - .number() - .int(t("workflow_node.apply.form.skip_before_expiry_days.placeholder")) - .gte(1, t("workflow_node.apply.form.skip_before_expiry_days.placeholder")) - ), + skipBeforeExpiryDays: z.coerce + .number() + .int(t("workflow_node.apply.form.skip_before_expiry_days.placeholder")) + .nonnegative(t("workflow_node.apply.form.skip_before_expiry_days.placeholder")), }) .superRefine((values, ctx) => { if (values.domains) { diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProvider.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProvider.tsx new file mode 100644 index 000000000..b1278a1ae --- /dev/null +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProvider.tsx @@ -0,0 +1,228 @@ +import { useEffect, useState } from "react"; + +import { DEPLOYMENT_PROVIDERS, type DeploymentProviderType } from "@/domain/provider"; + +import BizDeployNodeConfigFieldsProvider1PanelConsole from "./BizDeployNodeConfigFieldsProvider1PanelConsole"; +import BizDeployNodeConfigFieldsProvider1PanelSite from "./BizDeployNodeConfigFieldsProvider1PanelSite"; +import BizDeployNodeConfigFieldsProviderAliyunALB from "./BizDeployNodeConfigFieldsProviderAliyunALB"; +import BizDeployNodeConfigFieldsProviderAliyunAPIGW from "./BizDeployNodeConfigFieldsProviderAliyunAPIGW"; +import BizDeployNodeConfigFieldsProviderAliyunCAS from "./BizDeployNodeConfigFieldsProviderAliyunCAS"; +import BizDeployNodeConfigFieldsProviderAliyunCASDeploy from "./BizDeployNodeConfigFieldsProviderAliyunCASDeploy"; +import BizDeployNodeConfigFieldsProviderAliyunCDN from "./BizDeployNodeConfigFieldsProviderAliyunCDN"; +import BizDeployNodeConfigFieldsProviderAliyunCLB from "./BizDeployNodeConfigFieldsProviderAliyunCLB"; +import BizDeployNodeConfigFieldsProviderAliyunDCDN from "./BizDeployNodeConfigFieldsProviderAliyunDCDN"; +import BizDeployNodeConfigFieldsProviderAliyunDDoS from "./BizDeployNodeConfigFieldsProviderAliyunDDoS"; +import BizDeployNodeConfigFieldsProviderAliyunESA from "./BizDeployNodeConfigFieldsProviderAliyunESA"; +import BizDeployNodeConfigFieldsProviderAliyunFC from "./BizDeployNodeConfigFieldsProviderAliyunFC"; +import BizDeployNodeConfigFieldsProviderAliyunGA from "./BizDeployNodeConfigFieldsProviderAliyunGA"; +import BizDeployNodeConfigFieldsProviderAliyunLive from "./BizDeployNodeConfigFieldsProviderAliyunLive"; +import BizDeployNodeConfigFieldsProviderAliyunNLB from "./BizDeployNodeConfigFieldsProviderAliyunNLB"; +import BizDeployNodeConfigFieldsProviderAliyunOSS from "./BizDeployNodeConfigFieldsProviderAliyunOSS"; +import BizDeployNodeConfigFieldsProviderAliyunVOD from "./BizDeployNodeConfigFieldsProviderAliyunVOD"; +import BizDeployNodeConfigFieldsProviderAliyunWAF from "./BizDeployNodeConfigFieldsProviderAliyunWAF"; +import BizDeployNodeConfigFieldsProviderAPISIX from "./BizDeployNodeConfigFieldsProviderAPISIX"; +import BizDeployNodeConfigFieldsProviderAWSACM from "./BizDeployNodeConfigFieldsProviderAWSACM"; +import BizDeployNodeConfigFieldsProviderAWSCloudFront from "./BizDeployNodeConfigFieldsProviderAWSCloudFront"; +import BizDeployNodeConfigFieldsProviderAWSIAM from "./BizDeployNodeConfigFieldsProviderAWSIAM"; +import BizDeployNodeConfigFieldsProviderAzureKeyVault from "./BizDeployNodeConfigFieldsProviderAzureKeyVault"; +import BizDeployNodeConfigFieldsProviderBaiduCloudAppBLB from "./BizDeployNodeConfigFieldsProviderBaiduCloudAppBLB"; +import BizDeployNodeConfigFieldsProviderBaiduCloudBLB from "./BizDeployNodeConfigFieldsProviderBaiduCloudBLB"; +import BizDeployNodeConfigFieldsProviderBaiduCloudCDN from "./BizDeployNodeConfigFieldsProviderBaiduCloudCDN"; +import BizDeployNodeConfigFieldsProviderBaishanCDN from "./BizDeployNodeConfigFieldsProviderBaishanCDN"; +import BizDeployNodeConfigFieldsProviderBaotaPanelConsole from "./BizDeployNodeConfigFieldsProviderBaotaPanelConsole"; +import BizDeployNodeConfigFieldsProviderBaotaPanelGoConsole from "./BizDeployNodeConfigFieldsProviderBaotaPanelGoConsole"; +import BizDeployNodeConfigFieldsProviderBaotaPanelGoSite from "./BizDeployNodeConfigFieldsProviderBaotaPanelGoSite"; +import BizDeployNodeConfigFieldsProviderBaotaPanelSite from "./BizDeployNodeConfigFieldsProviderBaotaPanelSite"; +import BizDeployNodeConfigFieldsProviderBaotaWAFSite from "./BizDeployNodeConfigFieldsProviderBaotaWAFSite"; +import BizDeployNodeConfigFieldsProviderBunnyCDN from "./BizDeployNodeConfigFieldsProviderBunnyCDN"; +import BizDeployNodeConfigFieldsProviderBytePlusCDN from "./BizDeployNodeConfigFieldsProviderBytePlusCDN"; +import BizDeployNodeConfigFieldsProviderCdnfly from "./BizDeployNodeConfigFieldsProviderCdnfly"; +import BizDeployNodeConfigFieldsProviderCTCCCloudAO from "./BizDeployNodeConfigFieldsProviderCTCCCloudAO"; +import BizDeployNodeConfigFieldsProviderCTCCCloudCDN from "./BizDeployNodeConfigFieldsProviderCTCCCloudCDN"; +import BizDeployNodeConfigFieldsProviderCTCCCloudELB from "./BizDeployNodeConfigFieldsProviderCTCCCloudELB"; +import BizDeployNodeConfigFieldsProviderCTCCCloudICDN from "./BizDeployNodeConfigFieldsProviderCTCCCloudICDN"; +import BizDeployNodeConfigFieldsProviderCTCCCloudLVDN from "./BizDeployNodeConfigFieldsProviderCTCCCloudLVDN"; +import BizDeployNodeConfigFieldsProviderDogeCloudCDN from "./BizDeployNodeConfigFieldsProviderDogeCloudCDN"; +import BizDeployNodeConfigFieldsProviderFlexCDN from "./BizDeployNodeConfigFieldsProviderFlexCDN"; +import BizDeployNodeConfigFieldsProviderGcoreCDN from "./BizDeployNodeConfigFieldsProviderGcoreCDN"; +import BizDeployNodeConfigFieldsProviderGoEdge from "./BizDeployNodeConfigFieldsProviderGoEdge"; +import BizDeployNodeConfigFieldsProviderHuaweiCloudCDN from "./BizDeployNodeConfigFieldsProviderHuaweiCloudCDN"; +import BizDeployNodeConfigFieldsProviderHuaweiCloudELB from "./BizDeployNodeConfigFieldsProviderHuaweiCloudELB"; +import BizDeployNodeConfigFieldsProviderHuaweiCloudOBS from "./BizDeployNodeConfigFieldsProviderHuaweiCloudOBS"; +import BizDeployNodeConfigFieldsProviderHuaweiCloudWAF from "./BizDeployNodeConfigFieldsProviderHuaweiCloudWAF"; +import BizDeployNodeConfigFieldsProviderJDCloudALB from "./BizDeployNodeConfigFieldsProviderJDCloudALB"; +import BizDeployNodeConfigFieldsProviderJDCloudCDN from "./BizDeployNodeConfigFieldsProviderJDCloudCDN"; +import BizDeployNodeConfigFieldsProviderJDCloudLive from "./BizDeployNodeConfigFieldsProviderJDCloudLive"; +import BizDeployNodeConfigFieldsProviderJDCloudVOD from "./BizDeployNodeConfigFieldsProviderJDCloudVOD"; +import BizDeployNodeConfigFieldsProviderKong from "./BizDeployNodeConfigFieldsProviderKong"; +import BizDeployNodeConfigFieldsProviderKubernetesSecret from "./BizDeployNodeConfigFieldsProviderKubernetesSecret"; +import BizDeployNodeConfigFieldsProviderLeCDN from "./BizDeployNodeConfigFieldsProviderLeCDN"; +import BizDeployNodeConfigFieldsProviderLocal from "./BizDeployNodeConfigFieldsProviderLocal"; +import BizDeployNodeConfigFieldsProviderNetlifySite from "./BizDeployNodeConfigFieldsProviderNetlifySite"; +import BizDeployNodeConfigFieldsProviderProxmoxVE from "./BizDeployNodeConfigFieldsProviderProxmoxVE"; +import BizDeployNodeConfigFieldsProviderQiniuCDN from "./BizDeployNodeConfigFieldsProviderQiniuCDN"; +import BizDeployNodeConfigFieldsProviderQiniuKodo from "./BizDeployNodeConfigFieldsProviderQiniuKodo"; +import BizDeployNodeConfigFieldsProviderQiniuPili from "./BizDeployNodeConfigFieldsProviderQiniuPili"; +import BizDeployNodeConfigFieldsProviderRainYunRCDN from "./BizDeployNodeConfigFieldsProviderRainYunRCDN"; +import BizDeployNodeConfigFieldsProviderRatPanelSite from "./BizDeployNodeConfigFieldsProviderRatPanelSite"; +import BizDeployNodeConfigFieldsProviderSafeLine from "./BizDeployNodeConfigFieldsProviderSafeLine"; +import BizDeployNodeConfigFieldsProviderSSH from "./BizDeployNodeConfigFieldsProviderSSH"; +import BizDeployNodeConfigFieldsProviderTencentCloudCDN from "./BizDeployNodeConfigFieldsProviderTencentCloudCDN"; +import BizDeployNodeConfigFieldsProviderTencentCloudCLB from "./BizDeployNodeConfigFieldsProviderTencentCloudCLB"; +import BizDeployNodeConfigFieldsProviderTencentCloudCOS from "./BizDeployNodeConfigFieldsProviderTencentCloudCOS"; +import BizDeployNodeConfigFieldsProviderTencentCloudCSS from "./BizDeployNodeConfigFieldsProviderTencentCloudCSS"; +import BizDeployNodeConfigFieldsProviderTencentCloudECDN from "./BizDeployNodeConfigFieldsProviderTencentCloudECDN"; +import BizDeployNodeConfigFieldsProviderTencentCloudEO from "./BizDeployNodeConfigFieldsProviderTencentCloudEO"; +import BizDeployNodeConfigFieldsProviderTencentCloudGAAP from "./BizDeployNodeConfigFieldsProviderTencentCloudGAAP"; +import BizDeployNodeConfigFieldsProviderTencentCloudSCF from "./BizDeployNodeConfigFieldsProviderTencentCloudSCF"; +import BizDeployNodeConfigFieldsProviderTencentCloudSSL from "./BizDeployNodeConfigFieldsProviderTencentCloudSSL"; +import BizDeployNodeConfigFieldsProviderTencentCloudSSLDeploy from "./BizDeployNodeConfigFieldsProviderTencentCloudSSLDeploy"; +import BizDeployNodeConfigFieldsProviderTencentCloudSSLUpdate from "./BizDeployNodeConfigFieldsProviderTencentCloudSSLUpdate"; +import BizDeployNodeConfigFieldsProviderTencentCloudVOD from "./BizDeployNodeConfigFieldsProviderTencentCloudVOD"; +import BizDeployNodeConfigFieldsProviderTencentCloudWAF from "./BizDeployNodeConfigFieldsProviderTencentCloudWAF"; +import BizDeployNodeConfigFieldsProviderUCloudUCDN from "./BizDeployNodeConfigFieldsProviderUCloudUCDN"; +import BizDeployNodeConfigFieldsProviderUCloudUS3 from "./BizDeployNodeConfigFieldsProviderUCloudUS3"; +import BizDeployNodeConfigFieldsProviderUniCloudWebHost from "./BizDeployNodeConfigFieldsProviderUniCloudWebHost"; +import BizDeployNodeConfigFieldsProviderUpyunCDN from "./BizDeployNodeConfigFieldsProviderUpyunCDN"; +import BizDeployNodeConfigFieldsProviderUpyunFile from "./BizDeployNodeConfigFieldsProviderUpyunFile"; +import BizDeployNodeConfigFieldsProviderVolcEngineALB from "./BizDeployNodeConfigFieldsProviderVolcEngineALB"; +import BizDeployNodeConfigFieldsProviderVolcEngineCDN from "./BizDeployNodeConfigFieldsProviderVolcEngineCDN"; +import BizDeployNodeConfigFieldsProviderVolcEngineCertCenter from "./BizDeployNodeConfigFieldsProviderVolcEngineCertCenter"; +import BizDeployNodeConfigFieldsProviderVolcEngineCLB from "./BizDeployNodeConfigFieldsProviderVolcEngineCLB"; +import BizDeployNodeConfigFieldsProviderVolcEngineDCDN from "./BizDeployNodeConfigFieldsProviderVolcEngineDCDN"; +import BizDeployNodeConfigFieldsProviderVolcEngineImageX from "./BizDeployNodeConfigFieldsProviderVolcEngineImageX"; +import BizDeployNodeConfigFieldsProviderVolcEngineLive from "./BizDeployNodeConfigFieldsProviderVolcEngineLive"; +import BizDeployNodeConfigFieldsProviderVolcEngineTOS from "./BizDeployNodeConfigFieldsProviderVolcEngineTOS"; +import BizDeployNodeConfigFieldsProviderWangsuCDN from "./BizDeployNodeConfigFieldsProviderWangsuCDN"; +import BizDeployNodeConfigFieldsProviderWangsuCDNPro from "./BizDeployNodeConfigFieldsProviderWangsuCDNPro"; +import BizDeployNodeConfigFieldsProviderWangsuCertificate from "./BizDeployNodeConfigFieldsProviderWangsuCertificate"; +import BizDeployNodeConfigFieldsProviderWebhook from "./BizDeployNodeConfigFieldsProviderWebhook"; + +const providerComponentMap: Partial>> = { + /* + 注意:如果追加新的子组件,请保持以 ASCII 排序。 + NOTICE: If you add new child component, please keep ASCII order. + */ + [DEPLOYMENT_PROVIDERS["1PANEL_CONSOLE"]]: BizDeployNodeConfigFieldsProvider1PanelConsole, + [DEPLOYMENT_PROVIDERS["1PANEL_SITE"]]: BizDeployNodeConfigFieldsProvider1PanelSite, + [DEPLOYMENT_PROVIDERS.ALIYUN_ALB]: BizDeployNodeConfigFieldsProviderAliyunALB, + [DEPLOYMENT_PROVIDERS.ALIYUN_APIGW]: BizDeployNodeConfigFieldsProviderAliyunAPIGW, + [DEPLOYMENT_PROVIDERS.ALIYUN_CAS]: BizDeployNodeConfigFieldsProviderAliyunCAS, + [DEPLOYMENT_PROVIDERS.ALIYUN_CAS_DEPLOY]: BizDeployNodeConfigFieldsProviderAliyunCASDeploy, + [DEPLOYMENT_PROVIDERS.ALIYUN_CLB]: BizDeployNodeConfigFieldsProviderAliyunCLB, + [DEPLOYMENT_PROVIDERS.ALIYUN_CDN]: BizDeployNodeConfigFieldsProviderAliyunCDN, + [DEPLOYMENT_PROVIDERS.ALIYUN_DCDN]: BizDeployNodeConfigFieldsProviderAliyunDCDN, + [DEPLOYMENT_PROVIDERS.ALIYUN_DDOS]: BizDeployNodeConfigFieldsProviderAliyunDDoS, + [DEPLOYMENT_PROVIDERS.ALIYUN_ESA]: BizDeployNodeConfigFieldsProviderAliyunESA, + [DEPLOYMENT_PROVIDERS.ALIYUN_FC]: BizDeployNodeConfigFieldsProviderAliyunFC, + [DEPLOYMENT_PROVIDERS.ALIYUN_GA]: BizDeployNodeConfigFieldsProviderAliyunGA, + [DEPLOYMENT_PROVIDERS.ALIYUN_LIVE]: BizDeployNodeConfigFieldsProviderAliyunLive, + [DEPLOYMENT_PROVIDERS.ALIYUN_NLB]: BizDeployNodeConfigFieldsProviderAliyunNLB, + [DEPLOYMENT_PROVIDERS.ALIYUN_OSS]: BizDeployNodeConfigFieldsProviderAliyunOSS, + [DEPLOYMENT_PROVIDERS.ALIYUN_VOD]: BizDeployNodeConfigFieldsProviderAliyunVOD, + [DEPLOYMENT_PROVIDERS.ALIYUN_WAF]: BizDeployNodeConfigFieldsProviderAliyunWAF, + [DEPLOYMENT_PROVIDERS.APISIX]: BizDeployNodeConfigFieldsProviderAPISIX, + [DEPLOYMENT_PROVIDERS.AWS_ACM]: BizDeployNodeConfigFieldsProviderAWSACM, + [DEPLOYMENT_PROVIDERS.AWS_CLOUDFRONT]: BizDeployNodeConfigFieldsProviderAWSCloudFront, + [DEPLOYMENT_PROVIDERS.AWS_IAM]: BizDeployNodeConfigFieldsProviderAWSIAM, + [DEPLOYMENT_PROVIDERS.AZURE_KEYVAULT]: BizDeployNodeConfigFieldsProviderAzureKeyVault, + [DEPLOYMENT_PROVIDERS.BAIDUCLOUD_APPBLB]: BizDeployNodeConfigFieldsProviderBaiduCloudAppBLB, + [DEPLOYMENT_PROVIDERS.BAIDUCLOUD_BLB]: BizDeployNodeConfigFieldsProviderBaiduCloudBLB, + [DEPLOYMENT_PROVIDERS.BAIDUCLOUD_CDN]: BizDeployNodeConfigFieldsProviderBaiduCloudCDN, + [DEPLOYMENT_PROVIDERS.BAISHAN_CDN]: BizDeployNodeConfigFieldsProviderBaishanCDN, + [DEPLOYMENT_PROVIDERS.BAOTAPANEL_CONSOLE]: BizDeployNodeConfigFieldsProviderBaotaPanelConsole, + [DEPLOYMENT_PROVIDERS.BAOTAPANEL_SITE]: BizDeployNodeConfigFieldsProviderBaotaPanelSite, + [DEPLOYMENT_PROVIDERS.BAOTAPANELGO_CONSOLE]: BizDeployNodeConfigFieldsProviderBaotaPanelGoConsole, + [DEPLOYMENT_PROVIDERS.BAOTAPANELGO_SITE]: BizDeployNodeConfigFieldsProviderBaotaPanelGoSite, + [DEPLOYMENT_PROVIDERS.BAOTAWAF_SITE]: BizDeployNodeConfigFieldsProviderBaotaWAFSite, + [DEPLOYMENT_PROVIDERS.BUNNY_CDN]: BizDeployNodeConfigFieldsProviderBunnyCDN, + [DEPLOYMENT_PROVIDERS.BYTEPLUS_CDN]: BizDeployNodeConfigFieldsProviderBytePlusCDN, + [DEPLOYMENT_PROVIDERS.CDNFLY]: BizDeployNodeConfigFieldsProviderCdnfly, + [DEPLOYMENT_PROVIDERS.CTCCCLOUD_AO]: BizDeployNodeConfigFieldsProviderCTCCCloudAO, + [DEPLOYMENT_PROVIDERS.CTCCCLOUD_CDN]: BizDeployNodeConfigFieldsProviderCTCCCloudCDN, + [DEPLOYMENT_PROVIDERS.CTCCCLOUD_ELB]: BizDeployNodeConfigFieldsProviderCTCCCloudELB, + [DEPLOYMENT_PROVIDERS.CTCCCLOUD_ICDN]: BizDeployNodeConfigFieldsProviderCTCCCloudICDN, + [DEPLOYMENT_PROVIDERS.CTCCCLOUD_LVDN]: BizDeployNodeConfigFieldsProviderCTCCCloudLVDN, + [DEPLOYMENT_PROVIDERS.DOGECLOUD_CDN]: BizDeployNodeConfigFieldsProviderDogeCloudCDN, + [DEPLOYMENT_PROVIDERS.FLEXCDN]: BizDeployNodeConfigFieldsProviderFlexCDN, + [DEPLOYMENT_PROVIDERS.GCORE_CDN]: BizDeployNodeConfigFieldsProviderGcoreCDN, + [DEPLOYMENT_PROVIDERS.GOEDGE]: BizDeployNodeConfigFieldsProviderGoEdge, + [DEPLOYMENT_PROVIDERS.HUAWEICLOUD_CDN]: BizDeployNodeConfigFieldsProviderHuaweiCloudCDN, + [DEPLOYMENT_PROVIDERS.HUAWEICLOUD_ELB]: BizDeployNodeConfigFieldsProviderHuaweiCloudELB, + [DEPLOYMENT_PROVIDERS.HUAWEICLOUD_OBS]: BizDeployNodeConfigFieldsProviderHuaweiCloudOBS, + [DEPLOYMENT_PROVIDERS.HUAWEICLOUD_WAF]: BizDeployNodeConfigFieldsProviderHuaweiCloudWAF, + [DEPLOYMENT_PROVIDERS.JDCLOUD_ALB]: BizDeployNodeConfigFieldsProviderJDCloudALB, + [DEPLOYMENT_PROVIDERS.JDCLOUD_CDN]: BizDeployNodeConfigFieldsProviderJDCloudCDN, + [DEPLOYMENT_PROVIDERS.JDCLOUD_LIVE]: BizDeployNodeConfigFieldsProviderJDCloudLive, + [DEPLOYMENT_PROVIDERS.JDCLOUD_VOD]: BizDeployNodeConfigFieldsProviderJDCloudVOD, + [DEPLOYMENT_PROVIDERS.KONG]: BizDeployNodeConfigFieldsProviderKong, + [DEPLOYMENT_PROVIDERS.KUBERNETES_SECRET]: BizDeployNodeConfigFieldsProviderKubernetesSecret, + [DEPLOYMENT_PROVIDERS.LECDN]: BizDeployNodeConfigFieldsProviderLeCDN, + [DEPLOYMENT_PROVIDERS.LOCAL]: BizDeployNodeConfigFieldsProviderLocal, + [DEPLOYMENT_PROVIDERS.NETLIFY_SITE]: BizDeployNodeConfigFieldsProviderNetlifySite, + [DEPLOYMENT_PROVIDERS.PROXMOXVE]: BizDeployNodeConfigFieldsProviderProxmoxVE, + [DEPLOYMENT_PROVIDERS.QINIU_CDN]: BizDeployNodeConfigFieldsProviderQiniuCDN, + [DEPLOYMENT_PROVIDERS.QINIU_KODO]: BizDeployNodeConfigFieldsProviderQiniuKodo, + [DEPLOYMENT_PROVIDERS.QINIU_PILI]: BizDeployNodeConfigFieldsProviderQiniuPili, + [DEPLOYMENT_PROVIDERS.RAINYUN_RCDN]: BizDeployNodeConfigFieldsProviderRainYunRCDN, + [DEPLOYMENT_PROVIDERS.RATPANEL_SITE]: BizDeployNodeConfigFieldsProviderRatPanelSite, + [DEPLOYMENT_PROVIDERS.SAFELINE]: BizDeployNodeConfigFieldsProviderSafeLine, + [DEPLOYMENT_PROVIDERS.SSH]: BizDeployNodeConfigFieldsProviderSSH, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CDN]: BizDeployNodeConfigFieldsProviderTencentCloudCDN, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CLB]: BizDeployNodeConfigFieldsProviderTencentCloudCLB, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_COS]: BizDeployNodeConfigFieldsProviderTencentCloudCOS, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CSS]: BizDeployNodeConfigFieldsProviderTencentCloudCSS, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_ECDN]: BizDeployNodeConfigFieldsProviderTencentCloudECDN, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_EO]: BizDeployNodeConfigFieldsProviderTencentCloudEO, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_GAAP]: BizDeployNodeConfigFieldsProviderTencentCloudGAAP, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SCF]: BizDeployNodeConfigFieldsProviderTencentCloudSCF, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SSL]: BizDeployNodeConfigFieldsProviderTencentCloudSSL, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SSL_DEPLOY]: BizDeployNodeConfigFieldsProviderTencentCloudSSLDeploy, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SSL_UPDATE]: BizDeployNodeConfigFieldsProviderTencentCloudSSLUpdate, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_VOD]: BizDeployNodeConfigFieldsProviderTencentCloudVOD, + [DEPLOYMENT_PROVIDERS.TENCENTCLOUD_WAF]: BizDeployNodeConfigFieldsProviderTencentCloudWAF, + [DEPLOYMENT_PROVIDERS.UCLOUD_UCDN]: BizDeployNodeConfigFieldsProviderUCloudUCDN, + [DEPLOYMENT_PROVIDERS.UCLOUD_US3]: BizDeployNodeConfigFieldsProviderUCloudUS3, + [DEPLOYMENT_PROVIDERS.UNICLOUD_WEBHOST]: BizDeployNodeConfigFieldsProviderUniCloudWebHost, + [DEPLOYMENT_PROVIDERS.UPYUN_CDN]: BizDeployNodeConfigFieldsProviderUpyunCDN, + [DEPLOYMENT_PROVIDERS.UPYUN_FILE]: BizDeployNodeConfigFieldsProviderUpyunFile, + [DEPLOYMENT_PROVIDERS.VOLCENGINE_ALB]: BizDeployNodeConfigFieldsProviderVolcEngineALB, + [DEPLOYMENT_PROVIDERS.VOLCENGINE_CDN]: BizDeployNodeConfigFieldsProviderVolcEngineCDN, + [DEPLOYMENT_PROVIDERS.VOLCENGINE_CERTCENTER]: BizDeployNodeConfigFieldsProviderVolcEngineCertCenter, + [DEPLOYMENT_PROVIDERS.VOLCENGINE_CLB]: BizDeployNodeConfigFieldsProviderVolcEngineCLB, + [DEPLOYMENT_PROVIDERS.VOLCENGINE_DCDN]: BizDeployNodeConfigFieldsProviderVolcEngineDCDN, + [DEPLOYMENT_PROVIDERS.VOLCENGINE_IMAGEX]: BizDeployNodeConfigFieldsProviderVolcEngineImageX, + [DEPLOYMENT_PROVIDERS.VOLCENGINE_LIVE]: BizDeployNodeConfigFieldsProviderVolcEngineLive, + [DEPLOYMENT_PROVIDERS.VOLCENGINE_TOS]: BizDeployNodeConfigFieldsProviderVolcEngineTOS, + [DEPLOYMENT_PROVIDERS.WANGSU_CDN]: BizDeployNodeConfigFieldsProviderWangsuCDN, + [DEPLOYMENT_PROVIDERS.WANGSU_CDNPRO]: BizDeployNodeConfigFieldsProviderWangsuCDNPro, + [DEPLOYMENT_PROVIDERS.WANGSU_CERTIFICATE]: BizDeployNodeConfigFieldsProviderWangsuCertificate, + [DEPLOYMENT_PROVIDERS.WEBHOOK]: BizDeployNodeConfigFieldsProviderWebhook, +}; + +const useComponent = (provider: string, { initProps, deps = [] }: { initProps?: (provider: string) => any; deps?: unknown[] }) => { + const initComponent = () => { + const Component = providerComponentMap[provider as DeploymentProviderType]; + if (!Component) return null; + + const props = initProps?.(provider); + if (props) { + return ; + } + + return ; + }; + + const [component, setComponent] = useState(() => initComponent()); + + useEffect(() => setComponent(initComponent()), [provider]); + useEffect(() => setComponent(initComponent()), deps); + + return component; +}; + +const _default = { + useComponent, +}; + +export default _default; diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderBaotaWAFSite.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderBaotaWAFSite.tsx index d604dc111..c21a77fd9 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderBaotaWAFSite.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderBaotaWAFSite.tsx @@ -53,13 +53,10 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) return z.object({ siteName: z.string().nonempty(t("workflow_node.deploy.form.baotawaf_site_name.placeholder")), - sitePort: z.preprocess( - (v) => Number(v), - z - .number() - .int(t("workflow_node.deploy.form.baotawaf_site_port.placeholder")) - .refine((v) => validPortNumber(v), t("common.errmsg.port_invalid")) - ), + sitePort: z.coerce + .number() + .int(t("workflow_node.deploy.form.baotawaf_site_port.placeholder")) + .refine((v) => validPortNumber(v), t("common.errmsg.port_invalid")), }); }; diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderLocal.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderLocal.tsx index e12ca8fd3..169fb5a80 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderLocal.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderLocal.tsx @@ -429,22 +429,10 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) .string() .max(256, t("common.errmsg.string_max", { max: 256 })) .nullish(), - pfxPassword: z - .string() - .max(64, t("common.errmsg.string_max", { max: 256 })) - .nullish(), - jksAlias: z - .string() - .max(64, t("common.errmsg.string_max", { max: 256 })) - .nullish(), - jksKeypass: z - .string() - .max(64, t("common.errmsg.string_max", { max: 256 })) - .nullish(), - jksStorepass: z - .string() - .max(64, t("common.errmsg.string_max", { max: 256 })) - .nullish(), + pfxPassword: z.string().nullish(), + jksAlias: z.string().nullish(), + jksKeypass: z.string().nullish(), + jksStorepass: z.string().nullish(), shellEnv: z.literal([SHELLENV_SH, SHELLENV_CMD, SHELLENV_POWERSHELL], t("workflow_node.deploy.form.local_shell_env.placeholder")), preCommand: z .string() diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderSSH.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderSSH.tsx index a6a57f68f..5f22c2950 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderSSH.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigFieldsProviderSSH.tsx @@ -471,22 +471,10 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) .string() .max(256, t("common.errmsg.string_max", { max: 256 })) .nullish(), - pfxPassword: z - .string() - .max(64, t("common.errmsg.string_max", { max: 256 })) - .nullish(), - jksAlias: z - .string() - .max(64, t("common.errmsg.string_max", { max: 256 })) - .nullish(), - jksKeypass: z - .string() - .max(64, t("common.errmsg.string_max", { max: 256 })) - .nullish(), - jksStorepass: z - .string() - .max(64, t("common.errmsg.string_max", { max: 256 })) - .nullish(), + pfxPassword: z.string().nullish(), + jksAlias: z.string().nullish(), + jksKeypass: z.string().nullish(), + jksStorepass: z.string().nullish(), preCommand: z .string() .max(20480, t("common.errmsg.string_max", { max: 20480 })) diff --git a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigForm.tsx index cc0699862..54d9def2e 100644 --- a/ui/src/components/workflow/designer/forms/BizDeployNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BizDeployNodeConfigForm.tsx @@ -1,6 +1,6 @@ -import { useEffect, useMemo, useState } from "react"; +import { useEffect, useMemo } from "react"; import { getI18n, useTranslation } from "react-i18next"; -import { type FlowNodeEntity, getNodeForm } from "@flowgram.ai/fixed-layout-editor"; +import { type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor"; import { IconPlus } from "@tabler/icons-react"; import { type AnchorProps, Button, Divider, Flex, Form, type FormInstance, Select, Switch, Typography, theme } from "antd"; import { createSchemaFieldRule } from "antd-zod"; @@ -12,108 +12,14 @@ import DeploymentProviderPicker from "@/components/provider/DeploymentProviderPi import DeploymentProviderSelect from "@/components/provider/DeploymentProviderSelect"; import Show from "@/components/Show"; import { type AccessModel } from "@/domain/access"; -import { DEPLOYMENT_PROVIDERS, deploymentProvidersMap } from "@/domain/provider"; +import { deploymentProvidersMap } from "@/domain/provider"; import { type WorkflowNodeConfigForBizDeploy, defaultNodeConfigForBizDeploy } from "@/domain/workflow"; import { useAntdForm, useZustandShallowSelector } from "@/hooks"; import { useAccessesStore } from "@/stores/access"; import { getAllPreviousNodes } from "../_util"; import { FormNestedFieldsContextProvider, NodeFormContextProvider } from "./_context"; -import BizDeployNodeConfigFieldsProvider1PanelConsole from "./BizDeployNodeConfigFieldsProvider1PanelConsole"; -import BizDeployNodeConfigFieldsProvider1PanelSite from "./BizDeployNodeConfigFieldsProvider1PanelSite"; -import BizDeployNodeConfigFieldsProviderAliyunALB from "./BizDeployNodeConfigFieldsProviderAliyunALB"; -import BizDeployNodeConfigFieldsProviderAliyunAPIGW from "./BizDeployNodeConfigFieldsProviderAliyunAPIGW"; -import BizDeployNodeConfigFieldsProviderAliyunCAS from "./BizDeployNodeConfigFieldsProviderAliyunCAS"; -import BizDeployNodeConfigFieldsProviderAliyunCASDeploy from "./BizDeployNodeConfigFieldsProviderAliyunCASDeploy"; -import BizDeployNodeConfigFieldsProviderAliyunCDN from "./BizDeployNodeConfigFieldsProviderAliyunCDN"; -import BizDeployNodeConfigFieldsProviderAliyunCLB from "./BizDeployNodeConfigFieldsProviderAliyunCLB"; -import BizDeployNodeConfigFieldsProviderAliyunDCDN from "./BizDeployNodeConfigFieldsProviderAliyunDCDN"; -import BizDeployNodeConfigFieldsProviderAliyunDDoS from "./BizDeployNodeConfigFieldsProviderAliyunDDoS"; -import BizDeployNodeConfigFieldsProviderAliyunESA from "./BizDeployNodeConfigFieldsProviderAliyunESA"; -import BizDeployNodeConfigFieldsProviderAliyunFC from "./BizDeployNodeConfigFieldsProviderAliyunFC"; -import BizDeployNodeConfigFieldsProviderAliyunGA from "./BizDeployNodeConfigFieldsProviderAliyunGA"; -import BizDeployNodeConfigFieldsProviderAliyunLive from "./BizDeployNodeConfigFieldsProviderAliyunLive"; -import BizDeployNodeConfigFieldsProviderAliyunNLB from "./BizDeployNodeConfigFieldsProviderAliyunNLB"; -import BizDeployNodeConfigFieldsProviderAliyunOSS from "./BizDeployNodeConfigFieldsProviderAliyunOSS"; -import BizDeployNodeConfigFieldsProviderAliyunVOD from "./BizDeployNodeConfigFieldsProviderAliyunVOD"; -import BizDeployNodeConfigFieldsProviderAliyunWAF from "./BizDeployNodeConfigFieldsProviderAliyunWAF"; -import BizDeployNodeConfigFieldsProviderAPISIX from "./BizDeployNodeConfigFieldsProviderAPISIX"; -import BizDeployNodeConfigFieldsProviderAWSACM from "./BizDeployNodeConfigFieldsProviderAWSACM"; -import BizDeployNodeConfigFieldsProviderAWSCloudFront from "./BizDeployNodeConfigFieldsProviderAWSCloudFront"; -import BizDeployNodeConfigFieldsProviderAWSIAM from "./BizDeployNodeConfigFieldsProviderAWSIAM"; -import BizDeployNodeConfigFieldsProviderAzureKeyVault from "./BizDeployNodeConfigFieldsProviderAzureKeyVault"; -import BizDeployNodeConfigFieldsProviderBaiduCloudAppBLB from "./BizDeployNodeConfigFieldsProviderBaiduCloudAppBLB"; -import BizDeployNodeConfigFieldsProviderBaiduCloudBLB from "./BizDeployNodeConfigFieldsProviderBaiduCloudBLB"; -import BizDeployNodeConfigFieldsProviderBaiduCloudCDN from "./BizDeployNodeConfigFieldsProviderBaiduCloudCDN"; -import BizDeployNodeConfigFieldsProviderBaishanCDN from "./BizDeployNodeConfigFieldsProviderBaishanCDN"; -import BizDeployNodeConfigFieldsProviderBaotaPanelConsole from "./BizDeployNodeConfigFieldsProviderBaotaPanelConsole"; -import BizDeployNodeConfigFieldsProviderBaotaPanelGoConsole from "./BizDeployNodeConfigFieldsProviderBaotaPanelGoConsole"; -import BizDeployNodeConfigFieldsProviderBaotaPanelGoSite from "./BizDeployNodeConfigFieldsProviderBaotaPanelGoSite"; -import BizDeployNodeConfigFieldsProviderBaotaPanelSite from "./BizDeployNodeConfigFieldsProviderBaotaPanelSite"; -import BizDeployNodeConfigFieldsProviderBaotaWAFSite from "./BizDeployNodeConfigFieldsProviderBaotaWAFSite"; -import BizDeployNodeConfigFieldsProviderBunnyCDN from "./BizDeployNodeConfigFieldsProviderBunnyCDN"; -import BizDeployNodeConfigFieldsProviderBytePlusCDN from "./BizDeployNodeConfigFieldsProviderBytePlusCDN"; -import BizDeployNodeConfigFieldsProviderCdnfly from "./BizDeployNodeConfigFieldsProviderCdnfly"; -import BizDeployNodeConfigFieldsProviderCTCCCloudAO from "./BizDeployNodeConfigFieldsProviderCTCCCloudAO"; -import BizDeployNodeConfigFieldsProviderCTCCCloudCDN from "./BizDeployNodeConfigFieldsProviderCTCCCloudCDN"; -import BizDeployNodeConfigFieldsProviderCTCCCloudELB from "./BizDeployNodeConfigFieldsProviderCTCCCloudELB"; -import BizDeployNodeConfigFieldsProviderCTCCCloudICDN from "./BizDeployNodeConfigFieldsProviderCTCCCloudICDN"; -import BizDeployNodeConfigFieldsProviderCTCCCloudLVDN from "./BizDeployNodeConfigFieldsProviderCTCCCloudLVDN"; -import BizDeployNodeConfigFieldsProviderDogeCloudCDN from "./BizDeployNodeConfigFieldsProviderDogeCloudCDN"; -import BizDeployNodeConfigFieldsProviderFlexCDN from "./BizDeployNodeConfigFieldsProviderFlexCDN"; -import BizDeployNodeConfigFieldsProviderGcoreCDN from "./BizDeployNodeConfigFieldsProviderGcoreCDN"; -import BizDeployNodeConfigFieldsProviderGoEdge from "./BizDeployNodeConfigFieldsProviderGoEdge"; -import BizDeployNodeConfigFieldsProviderHuaweiCloudCDN from "./BizDeployNodeConfigFieldsProviderHuaweiCloudCDN"; -import BizDeployNodeConfigFieldsProviderHuaweiCloudELB from "./BizDeployNodeConfigFieldsProviderHuaweiCloudELB"; -import BizDeployNodeConfigFieldsProviderHuaweiCloudOBS from "./BizDeployNodeConfigFieldsProviderHuaweiCloudOBS"; -import BizDeployNodeConfigFieldsProviderHuaweiCloudWAF from "./BizDeployNodeConfigFieldsProviderHuaweiCloudWAF"; -import BizDeployNodeConfigFieldsProviderJDCloudALB from "./BizDeployNodeConfigFieldsProviderJDCloudALB"; -import BizDeployNodeConfigFieldsProviderJDCloudCDN from "./BizDeployNodeConfigFieldsProviderJDCloudCDN"; -import BizDeployNodeConfigFieldsProviderJDCloudLive from "./BizDeployNodeConfigFieldsProviderJDCloudLive"; -import BizDeployNodeConfigFieldsProviderJDCloudVOD from "./BizDeployNodeConfigFieldsProviderJDCloudVOD"; -import BizDeployNodeConfigFieldsProviderKong from "./BizDeployNodeConfigFieldsProviderKong"; -import BizDeployNodeConfigFieldsProviderKubernetesSecret from "./BizDeployNodeConfigFieldsProviderKubernetesSecret"; -import BizDeployNodeConfigFieldsProviderLeCDN from "./BizDeployNodeConfigFieldsProviderLeCDN"; -import BizDeployNodeConfigFieldsProviderLocal from "./BizDeployNodeConfigFieldsProviderLocal"; -import BizDeployNodeConfigFieldsProviderNetlifySite from "./BizDeployNodeConfigFieldsProviderNetlifySite"; -import BizDeployNodeConfigFieldsProviderProxmoxVE from "./BizDeployNodeConfigFieldsProviderProxmoxVE"; -import BizDeployNodeConfigFieldsProviderQiniuCDN from "./BizDeployNodeConfigFieldsProviderQiniuCDN"; -import BizDeployNodeConfigFieldsProviderQiniuKodo from "./BizDeployNodeConfigFieldsProviderQiniuKodo"; -import BizDeployNodeConfigFieldsProviderQiniuPili from "./BizDeployNodeConfigFieldsProviderQiniuPili"; -import BizDeployNodeConfigFieldsProviderRainYunRCDN from "./BizDeployNodeConfigFieldsProviderRainYunRCDN"; -import BizDeployNodeConfigFieldsProviderRatPanelSite from "./BizDeployNodeConfigFieldsProviderRatPanelSite"; -import BizDeployNodeConfigFieldsProviderSafeLine from "./BizDeployNodeConfigFieldsProviderSafeLine"; -import BizDeployNodeConfigFieldsProviderSSH from "./BizDeployNodeConfigFieldsProviderSSH"; -import BizDeployNodeConfigFieldsProviderTencentCloudCDN from "./BizDeployNodeConfigFieldsProviderTencentCloudCDN"; -import BizDeployNodeConfigFieldsProviderTencentCloudCLB from "./BizDeployNodeConfigFieldsProviderTencentCloudCLB"; -import BizDeployNodeConfigFieldsProviderTencentCloudCOS from "./BizDeployNodeConfigFieldsProviderTencentCloudCOS"; -import BizDeployNodeConfigFieldsProviderTencentCloudCSS from "./BizDeployNodeConfigFieldsProviderTencentCloudCSS"; -import BizDeployNodeConfigFieldsProviderTencentCloudECDN from "./BizDeployNodeConfigFieldsProviderTencentCloudECDN"; -import BizDeployNodeConfigFieldsProviderTencentCloudEO from "./BizDeployNodeConfigFieldsProviderTencentCloudEO"; -import BizDeployNodeConfigFieldsProviderTencentCloudGAAP from "./BizDeployNodeConfigFieldsProviderTencentCloudGAAP"; -import BizDeployNodeConfigFieldsProviderTencentCloudSCF from "./BizDeployNodeConfigFieldsProviderTencentCloudSCF"; -import BizDeployNodeConfigFieldsProviderTencentCloudSSL from "./BizDeployNodeConfigFieldsProviderTencentCloudSSL"; -import BizDeployNodeConfigFieldsProviderTencentCloudSSLDeploy from "./BizDeployNodeConfigFieldsProviderTencentCloudSSLDeploy"; -import BizDeployNodeConfigFieldsProviderTencentCloudSSLUpdate from "./BizDeployNodeConfigFieldsProviderTencentCloudSSLUpdate"; -import BizDeployNodeConfigFieldsProviderTencentCloudVOD from "./BizDeployNodeConfigFieldsProviderTencentCloudVOD"; -import BizDeployNodeConfigFieldsProviderTencentCloudWAF from "./BizDeployNodeConfigFieldsProviderTencentCloudWAF"; -import BizDeployNodeConfigFieldsProviderUCloudUCDN from "./BizDeployNodeConfigFieldsProviderUCloudUCDN"; -import BizDeployNodeConfigFieldsProviderUCloudUS3 from "./BizDeployNodeConfigFieldsProviderUCloudUS3"; -import BizDeployNodeConfigFieldsProviderUniCloudWebHost from "./BizDeployNodeConfigFieldsProviderUniCloudWebHost"; -import BizDeployNodeConfigFieldsProviderUpyunCDN from "./BizDeployNodeConfigFieldsProviderUpyunCDN"; -import BizDeployNodeConfigFieldsProviderUpyunFile from "./BizDeployNodeConfigFieldsProviderUpyunFile"; -import BizDeployNodeConfigFieldsProviderVolcEngineALB from "./BizDeployNodeConfigFieldsProviderVolcEngineALB"; -import BizDeployNodeConfigFieldsProviderVolcEngineCDN from "./BizDeployNodeConfigFieldsProviderVolcEngineCDN"; -import BizDeployNodeConfigFieldsProviderVolcEngineCertCenter from "./BizDeployNodeConfigFieldsProviderVolcEngineCertCenter"; -import BizDeployNodeConfigFieldsProviderVolcEngineCLB from "./BizDeployNodeConfigFieldsProviderVolcEngineCLB"; -import BizDeployNodeConfigFieldsProviderVolcEngineDCDN from "./BizDeployNodeConfigFieldsProviderVolcEngineDCDN"; -import BizDeployNodeConfigFieldsProviderVolcEngineImageX from "./BizDeployNodeConfigFieldsProviderVolcEngineImageX"; -import BizDeployNodeConfigFieldsProviderVolcEngineLive from "./BizDeployNodeConfigFieldsProviderVolcEngineLive"; -import BizDeployNodeConfigFieldsProviderVolcEngineTOS from "./BizDeployNodeConfigFieldsProviderVolcEngineTOS"; -import BizDeployNodeConfigFieldsProviderWangsuCDN from "./BizDeployNodeConfigFieldsProviderWangsuCDN"; -import BizDeployNodeConfigFieldsProviderWangsuCDNPro from "./BizDeployNodeConfigFieldsProviderWangsuCDNPro"; -import BizDeployNodeConfigFieldsProviderWangsuCertificate from "./BizDeployNodeConfigFieldsProviderWangsuCertificate"; -import BizDeployNodeConfigFieldsProviderWebhook from "./BizDeployNodeConfigFieldsProviderWebhook"; +import BizDeployNodeConfigFieldsProvider from "./BizDeployNodeConfigFieldsProvider"; import { NodeType } from "../nodes/typings"; export interface BizDeployNodeConfigFormProps { @@ -137,7 +43,7 @@ const BizDeployNodeConfigForm = ({ node, ...props }: BizDeployNodeConfigFormProp }; const initialValues = useMemo(() => { - return getNodeForm(node)?.getValueIn("config") as WorkflowNodeConfigForBizDeploy | undefined; + return node.form?.getValueIn("config") as WorkflowNodeConfigForBizDeploy | undefined; }, [node]); const formSchema = getSchema({ i18n }).superRefine((values, ctx) => { @@ -166,315 +72,22 @@ const BizDeployNodeConfigForm = ({ node, ...props }: BizDeployNodeConfigFormProp .filter((node) => node.flowNodeType === NodeType.BizApply || node.flowNodeType === NodeType.BizUpload) .map((node) => { return { - label: getNodeForm(node)?.getValueIn("name"), + label: node.form?.getValueIn("name"), value: node.id, }; }); }, [node]); - const [showProviderAccess, setShowProviderAccess] = useState(false); - useEffect(() => { + const renderNestedFieldProviderComponent = BizDeployNodeConfigFieldsProvider.useComponent(fieldProvider, {}); + + const showProviderAccess = useMemo(() => { // 内置的部署提供商(如本地部署)无需显示授权信息字段 if (fieldProvider) { const provider = deploymentProvidersMap.get(fieldProvider); - setShowProviderAccess(!provider?.builtin); - } else { - setShowProviderAccess(false); + return !provider?.builtin; } - }, [fieldProvider]); - const NestedProviderConfigFields = useMemo(() => { - /* - 注意:如果追加新的子组件,请保持以 ASCII 排序。 - NOTICE: If you add new child component, please keep ASCII order. - */ - switch (fieldProvider) { - case DEPLOYMENT_PROVIDERS["1PANEL_CONSOLE"]: { - return BizDeployNodeConfigFieldsProvider1PanelConsole; - } - case DEPLOYMENT_PROVIDERS["1PANEL_SITE"]: { - return BizDeployNodeConfigFieldsProvider1PanelSite; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_ALB: { - return BizDeployNodeConfigFieldsProviderAliyunALB; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_APIGW: { - return BizDeployNodeConfigFieldsProviderAliyunAPIGW; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_CAS: { - return BizDeployNodeConfigFieldsProviderAliyunCAS; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_CAS_DEPLOY: { - return BizDeployNodeConfigFieldsProviderAliyunCASDeploy; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_CLB: { - return BizDeployNodeConfigFieldsProviderAliyunCLB; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_CDN: { - return BizDeployNodeConfigFieldsProviderAliyunCDN; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_DCDN: { - return BizDeployNodeConfigFieldsProviderAliyunDCDN; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_DDOS: { - return BizDeployNodeConfigFieldsProviderAliyunDDoS; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_ESA: { - return BizDeployNodeConfigFieldsProviderAliyunESA; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_FC: { - return BizDeployNodeConfigFieldsProviderAliyunFC; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_GA: { - return BizDeployNodeConfigFieldsProviderAliyunGA; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_LIVE: { - return BizDeployNodeConfigFieldsProviderAliyunLive; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_NLB: { - return BizDeployNodeConfigFieldsProviderAliyunNLB; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_OSS: { - return BizDeployNodeConfigFieldsProviderAliyunOSS; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_VOD: { - return BizDeployNodeConfigFieldsProviderAliyunVOD; - } - case DEPLOYMENT_PROVIDERS.ALIYUN_WAF: { - return BizDeployNodeConfigFieldsProviderAliyunWAF; - } - case DEPLOYMENT_PROVIDERS.APISIX: { - return BizDeployNodeConfigFieldsProviderAPISIX; - } - case DEPLOYMENT_PROVIDERS.AWS_ACM: { - return BizDeployNodeConfigFieldsProviderAWSACM; - } - case DEPLOYMENT_PROVIDERS.AWS_CLOUDFRONT: { - return BizDeployNodeConfigFieldsProviderAWSCloudFront; - } - case DEPLOYMENT_PROVIDERS.AWS_IAM: { - return BizDeployNodeConfigFieldsProviderAWSIAM; - } - case DEPLOYMENT_PROVIDERS.AZURE_KEYVAULT: { - return BizDeployNodeConfigFieldsProviderAzureKeyVault; - } - case DEPLOYMENT_PROVIDERS.BAIDUCLOUD_APPBLB: { - return BizDeployNodeConfigFieldsProviderBaiduCloudAppBLB; - } - case DEPLOYMENT_PROVIDERS.BAIDUCLOUD_BLB: { - return BizDeployNodeConfigFieldsProviderBaiduCloudBLB; - } - case DEPLOYMENT_PROVIDERS.BAIDUCLOUD_CDN: { - return BizDeployNodeConfigFieldsProviderBaiduCloudCDN; - } - case DEPLOYMENT_PROVIDERS.BAISHAN_CDN: { - return BizDeployNodeConfigFieldsProviderBaishanCDN; - } - case DEPLOYMENT_PROVIDERS.BAOTAPANEL_CONSOLE: { - return BizDeployNodeConfigFieldsProviderBaotaPanelConsole; - } - case DEPLOYMENT_PROVIDERS.BAOTAPANEL_SITE: { - return BizDeployNodeConfigFieldsProviderBaotaPanelSite; - } - case DEPLOYMENT_PROVIDERS.BAOTAPANELGO_CONSOLE: { - return BizDeployNodeConfigFieldsProviderBaotaPanelGoConsole; - } - case DEPLOYMENT_PROVIDERS.BAOTAPANELGO_SITE: { - return BizDeployNodeConfigFieldsProviderBaotaPanelGoSite; - } - case DEPLOYMENT_PROVIDERS.BAOTAWAF_SITE: { - return BizDeployNodeConfigFieldsProviderBaotaWAFSite; - } - case DEPLOYMENT_PROVIDERS.BUNNY_CDN: { - return BizDeployNodeConfigFieldsProviderBunnyCDN; - } - case DEPLOYMENT_PROVIDERS.BYTEPLUS_CDN: { - return BizDeployNodeConfigFieldsProviderBytePlusCDN; - } - case DEPLOYMENT_PROVIDERS.CDNFLY: { - return BizDeployNodeConfigFieldsProviderCdnfly; - } - case DEPLOYMENT_PROVIDERS.CTCCCLOUD_AO: { - return BizDeployNodeConfigFieldsProviderCTCCCloudAO; - } - case DEPLOYMENT_PROVIDERS.CTCCCLOUD_CDN: { - return BizDeployNodeConfigFieldsProviderCTCCCloudCDN; - } - case DEPLOYMENT_PROVIDERS.CTCCCLOUD_ELB: { - return BizDeployNodeConfigFieldsProviderCTCCCloudELB; - } - case DEPLOYMENT_PROVIDERS.CTCCCLOUD_ICDN: { - return BizDeployNodeConfigFieldsProviderCTCCCloudICDN; - } - case DEPLOYMENT_PROVIDERS.CTCCCLOUD_LVDN: { - return BizDeployNodeConfigFieldsProviderCTCCCloudLVDN; - } - case DEPLOYMENT_PROVIDERS.DOGECLOUD_CDN: { - return BizDeployNodeConfigFieldsProviderDogeCloudCDN; - } - case DEPLOYMENT_PROVIDERS.FLEXCDN: { - return BizDeployNodeConfigFieldsProviderFlexCDN; - } - case DEPLOYMENT_PROVIDERS.GCORE_CDN: { - return BizDeployNodeConfigFieldsProviderGcoreCDN; - } - case DEPLOYMENT_PROVIDERS.GOEDGE: { - return BizDeployNodeConfigFieldsProviderGoEdge; - } - case DEPLOYMENT_PROVIDERS.HUAWEICLOUD_CDN: { - return BizDeployNodeConfigFieldsProviderHuaweiCloudCDN; - } - case DEPLOYMENT_PROVIDERS.HUAWEICLOUD_ELB: { - return BizDeployNodeConfigFieldsProviderHuaweiCloudELB; - } - case DEPLOYMENT_PROVIDERS.HUAWEICLOUD_OBS: { - return BizDeployNodeConfigFieldsProviderHuaweiCloudOBS; - } - case DEPLOYMENT_PROVIDERS.HUAWEICLOUD_WAF: { - return BizDeployNodeConfigFieldsProviderHuaweiCloudWAF; - } - case DEPLOYMENT_PROVIDERS.JDCLOUD_ALB: { - return BizDeployNodeConfigFieldsProviderJDCloudALB; - } - case DEPLOYMENT_PROVIDERS.JDCLOUD_CDN: { - return BizDeployNodeConfigFieldsProviderJDCloudCDN; - } - case DEPLOYMENT_PROVIDERS.JDCLOUD_LIVE: { - return BizDeployNodeConfigFieldsProviderJDCloudLive; - } - case DEPLOYMENT_PROVIDERS.JDCLOUD_VOD: { - return BizDeployNodeConfigFieldsProviderJDCloudVOD; - } - case DEPLOYMENT_PROVIDERS.KONG: { - return BizDeployNodeConfigFieldsProviderKong; - } - case DEPLOYMENT_PROVIDERS.KUBERNETES_SECRET: { - return BizDeployNodeConfigFieldsProviderKubernetesSecret; - } - case DEPLOYMENT_PROVIDERS.LECDN: { - return BizDeployNodeConfigFieldsProviderLeCDN; - } - case DEPLOYMENT_PROVIDERS.LOCAL: { - return BizDeployNodeConfigFieldsProviderLocal; - } - case DEPLOYMENT_PROVIDERS.NETLIFY_SITE: { - return BizDeployNodeConfigFieldsProviderNetlifySite; - } - case DEPLOYMENT_PROVIDERS.PROXMOXVE: { - return BizDeployNodeConfigFieldsProviderProxmoxVE; - } - case DEPLOYMENT_PROVIDERS.QINIU_CDN: { - return BizDeployNodeConfigFieldsProviderQiniuCDN; - } - case DEPLOYMENT_PROVIDERS.QINIU_KODO: { - return BizDeployNodeConfigFieldsProviderQiniuKodo; - } - case DEPLOYMENT_PROVIDERS.QINIU_PILI: { - return BizDeployNodeConfigFieldsProviderQiniuPili; - } - case DEPLOYMENT_PROVIDERS.RAINYUN_RCDN: { - return BizDeployNodeConfigFieldsProviderRainYunRCDN; - } - case DEPLOYMENT_PROVIDERS.RATPANEL_SITE: { - return BizDeployNodeConfigFieldsProviderRatPanelSite; - } - case DEPLOYMENT_PROVIDERS.SAFELINE: { - return BizDeployNodeConfigFieldsProviderSafeLine; - } - case DEPLOYMENT_PROVIDERS.SSH: { - return BizDeployNodeConfigFieldsProviderSSH; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CDN: { - return BizDeployNodeConfigFieldsProviderTencentCloudCDN; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CLB: { - return BizDeployNodeConfigFieldsProviderTencentCloudCLB; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_COS: { - return BizDeployNodeConfigFieldsProviderTencentCloudCOS; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CSS: { - return BizDeployNodeConfigFieldsProviderTencentCloudCSS; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_ECDN: { - return BizDeployNodeConfigFieldsProviderTencentCloudECDN; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_EO: { - return BizDeployNodeConfigFieldsProviderTencentCloudEO; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_GAAP: { - return BizDeployNodeConfigFieldsProviderTencentCloudGAAP; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SCF: { - return BizDeployNodeConfigFieldsProviderTencentCloudSCF; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SSL: { - return BizDeployNodeConfigFieldsProviderTencentCloudSSL; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SSL_DEPLOY: { - return BizDeployNodeConfigFieldsProviderTencentCloudSSLDeploy; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SSL_UPDATE: { - return BizDeployNodeConfigFieldsProviderTencentCloudSSLUpdate; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_VOD: { - return BizDeployNodeConfigFieldsProviderTencentCloudVOD; - } - case DEPLOYMENT_PROVIDERS.TENCENTCLOUD_WAF: { - return BizDeployNodeConfigFieldsProviderTencentCloudWAF; - } - case DEPLOYMENT_PROVIDERS.UCLOUD_UCDN: { - return BizDeployNodeConfigFieldsProviderUCloudUCDN; - } - case DEPLOYMENT_PROVIDERS.UCLOUD_US3: { - return BizDeployNodeConfigFieldsProviderUCloudUS3; - } - case DEPLOYMENT_PROVIDERS.UNICLOUD_WEBHOST: { - return BizDeployNodeConfigFieldsProviderUniCloudWebHost; - } - case DEPLOYMENT_PROVIDERS.UPYUN_CDN: { - return BizDeployNodeConfigFieldsProviderUpyunCDN; - } - case DEPLOYMENT_PROVIDERS.UPYUN_FILE: { - return BizDeployNodeConfigFieldsProviderUpyunFile; - } - case DEPLOYMENT_PROVIDERS.VOLCENGINE_ALB: { - return BizDeployNodeConfigFieldsProviderVolcEngineALB; - } - case DEPLOYMENT_PROVIDERS.VOLCENGINE_CDN: { - return BizDeployNodeConfigFieldsProviderVolcEngineCDN; - } - case DEPLOYMENT_PROVIDERS.VOLCENGINE_CERTCENTER: { - return BizDeployNodeConfigFieldsProviderVolcEngineCertCenter; - } - case DEPLOYMENT_PROVIDERS.VOLCENGINE_CLB: { - return BizDeployNodeConfigFieldsProviderVolcEngineCLB; - } - case DEPLOYMENT_PROVIDERS.VOLCENGINE_DCDN: { - return BizDeployNodeConfigFieldsProviderVolcEngineDCDN; - } - case DEPLOYMENT_PROVIDERS.VOLCENGINE_IMAGEX: { - return BizDeployNodeConfigFieldsProviderVolcEngineImageX; - } - case DEPLOYMENT_PROVIDERS.VOLCENGINE_LIVE: { - return BizDeployNodeConfigFieldsProviderVolcEngineLive; - } - case DEPLOYMENT_PROVIDERS.VOLCENGINE_TOS: { - return BizDeployNodeConfigFieldsProviderVolcEngineTOS; - } - case DEPLOYMENT_PROVIDERS.WANGSU_CDN: { - return BizDeployNodeConfigFieldsProviderWangsuCDN; - } - case DEPLOYMENT_PROVIDERS.WANGSU_CDNPRO: { - return BizDeployNodeConfigFieldsProviderWangsuCDNPro; - } - case DEPLOYMENT_PROVIDERS.WANGSU_CERTIFICATE: { - return BizDeployNodeConfigFieldsProviderWangsuCertificate; - } - case DEPLOYMENT_PROVIDERS.WEBHOOK: { - return BizDeployNodeConfigFieldsProviderWebhook; - } - } + return false; }, [fieldProvider]); useEffect(() => { @@ -599,7 +212,7 @@ const BizDeployNodeConfigForm = ({ node, ...props }: BizDeployNodeConfigFormProp - {NestedProviderConfigFields && } + {renderNestedFieldProviderComponent && <>{renderNestedFieldProviderComponent}} diff --git a/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigForm.tsx index 97730063a..5c209ed97 100644 --- a/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BizMonitorNodeConfigForm.tsx @@ -1,6 +1,6 @@ import { useMemo } from "react"; import { getI18n, useTranslation } from "react-i18next"; -import { type FlowNodeEntity, getNodeForm } from "@flowgram.ai/fixed-layout-editor"; +import { type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor"; import { type AnchorProps, Form, type FormInstance, Input, InputNumber } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; @@ -26,7 +26,7 @@ const BizMonitorNodeConfigForm = ({ node, ...props }: BizMonitorNodeConfigFormPr const { i18n, t } = useTranslation(); const initialValues = useMemo(() => { - return getNodeForm(node)?.getValueIn("config") as WorkflowNodeConfigForBizMonitor | undefined; + return node.form?.getValueIn("config") as WorkflowNodeConfigForBizMonitor | undefined; }, [node]); const formSchema = getSchema({ i18n }); @@ -93,13 +93,10 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) host: z.string(t("workflow_node.monitor.form.host.placeholder")).refine((v) => { return validDomainName(v) || validIPv4Address(v) || validIPv6Address(v); }, t("common.errmsg.host_invalid")), - port: z.preprocess( - (v) => Number(v), - z - .number() - .int(t("workflow_node.monitor.form.port.placeholder")) - .refine((v) => validPortNumber(v), t("common.errmsg.port_invalid")) - ), + port: z.coerce + .number() + .int(t("workflow_node.monitor.form.port.placeholder")) + .refine((v) => validPortNumber(v), t("common.errmsg.port_invalid")), domain: z .string() .nullish() diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFieldsProvider.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFieldsProvider.tsx new file mode 100644 index 000000000..f62347aa8 --- /dev/null +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigFieldsProvider.tsx @@ -0,0 +1,50 @@ +import { useEffect, useState } from "react"; + +import { NOTIFICATION_PROVIDERS, type NotificationProviderType } from "@/domain/provider"; + +import BizNotifyNodeConfigFieldsProviderDiscordBot from "./BizNotifyNodeConfigFieldsProviderDiscordBot"; +import BizNotifyNodeConfigFieldsProviderEmail from "./BizNotifyNodeConfigFieldsProviderEmail"; +import BizNotifyNodeConfigFieldsProviderMattermost from "./BizNotifyNodeConfigFieldsProviderMattermost"; +import BizNotifyNodeConfigFieldsProviderSlackBot from "./BizNotifyNodeConfigFieldsProviderSlackBot"; +import BizNotifyNodeConfigFieldsProviderTelegramBot from "./BizNotifyNodeConfigFieldsProviderTelegramBot"; +import BizNotifyNodeConfigFieldsProviderWebhook from "./BizNotifyNodeConfigFieldsProviderWebhook"; + +const providerComponentMap: Partial>> = { + /* + 注意:如果追加新的子组件,请保持以 ASCII 排序。 + NOTICE: If you add new child component, please keep ASCII order. + */ + [NOTIFICATION_PROVIDERS.DISCORDBOT]: BizNotifyNodeConfigFieldsProviderDiscordBot, + [NOTIFICATION_PROVIDERS.EMAIL]: BizNotifyNodeConfigFieldsProviderEmail, + [NOTIFICATION_PROVIDERS.MATTERMOST]: BizNotifyNodeConfigFieldsProviderMattermost, + [NOTIFICATION_PROVIDERS.SLACKBOT]: BizNotifyNodeConfigFieldsProviderSlackBot, + [NOTIFICATION_PROVIDERS.TELEGRAMBOT]: BizNotifyNodeConfigFieldsProviderTelegramBot, + [NOTIFICATION_PROVIDERS.WEBHOOK]: BizNotifyNodeConfigFieldsProviderWebhook, +}; + +const useComponent = (provider: string, { initProps, deps = [] }: { initProps?: (provider: string) => any; deps?: unknown[] }) => { + const initComponent = () => { + const Component = providerComponentMap[provider as NotificationProviderType]; + if (!Component) return null; + + const props = initProps?.(provider); + if (props) { + return ; + } + + return ; + }; + + const [component, setComponent] = useState(() => initComponent()); + + useEffect(() => setComponent(initComponent()), [provider]); + useEffect(() => setComponent(initComponent()), deps); + + return component; +}; + +const _default = { + useComponent, +}; + +export default _default; diff --git a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx index 0cca99e74..962a98be0 100644 --- a/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BizNotifyNodeConfigForm.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo } from "react"; import { getI18n, useTranslation } from "react-i18next"; -import { type FlowNodeEntity, getNodeForm } from "@flowgram.ai/fixed-layout-editor"; +import { type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor"; import { IconPlus } from "@tabler/icons-react"; import { type AnchorProps, Button, Divider, Flex, Form, type FormInstance, Input, Switch, Typography } from "antd"; import { createSchemaFieldRule } from "antd-zod"; @@ -13,18 +13,13 @@ import NotificationProviderSelect from "@/components/provider/NotificationProvid import Show from "@/components/Show"; import Tips from "@/components/Tips"; import { type AccessModel } from "@/domain/access"; -import { NOTIFICATION_PROVIDERS, notificationProvidersMap } from "@/domain/provider"; +import { notificationProvidersMap } from "@/domain/provider"; import { type WorkflowNodeConfigForBizNotify, defaultNodeConfigForBizNotify } from "@/domain/workflow"; import { useAntdForm, useZustandShallowSelector } from "@/hooks"; import { useAccessesStore } from "@/stores/access"; import { FormNestedFieldsContextProvider, NodeFormContextProvider } from "./_context"; -import BizNotifyNodeConfigFieldsProviderDiscordBot from "./BizNotifyNodeConfigFieldsProviderDiscordBot"; -import BizNotifyNodeConfigFieldsProviderEmail from "./BizNotifyNodeConfigFieldsProviderEmail"; -import BizNotifyNodeConfigFieldsProviderMattermost from "./BizNotifyNodeConfigFieldsProviderMattermost"; -import BizNotifyNodeConfigFieldsProviderSlackBot from "./BizNotifyNodeConfigFieldsProviderSlackBot"; -import BizNotifyNodeConfigFieldsProviderTelegramBot from "./BizNotifyNodeConfigFieldsProviderTelegramBot"; -import BizNotifyNodeConfigFieldsProviderWebhook from "./BizNotifyNodeConfigFieldsProviderWebhook"; +import BizNotifyNodeConfigFieldsProvider from "./BizNotifyNodeConfigFieldsProvider"; import { NodeType } from "../nodes/typings"; export interface BizNotifyNodeConfigFormProps { @@ -46,7 +41,7 @@ const BizNotifyNodeConfigForm = ({ node, ...props }: BizNotifyNodeConfigFormProp }; const initialValues = useMemo(() => { - return getNodeForm(node)?.getValueIn("config") as WorkflowNodeConfigForBizNotify | undefined; + return node.form?.getValueIn("config") as WorkflowNodeConfigForBizNotify | undefined; }, [node]); const formSchema = getSchema({ i18n }); @@ -60,32 +55,7 @@ const BizNotifyNodeConfigForm = ({ node, ...props }: BizNotifyNodeConfigFormProp const fieldProvider = Form.useWatch("provider", { form: formInst, preserve: true }); const fieldProviderAccessId = Form.useWatch("providerAccessId", { form: formInst, preserve: true }); - const NestedProviderConfigFields = useMemo(() => { - /* - 注意:如果追加新的子组件,请保持以 ASCII 排序。 - NOTICE: If you add new child component, please keep ASCII order. - */ - switch (fieldProvider) { - case NOTIFICATION_PROVIDERS.DISCORDBOT: { - return BizNotifyNodeConfigFieldsProviderDiscordBot; - } - case NOTIFICATION_PROVIDERS.EMAIL: { - return BizNotifyNodeConfigFieldsProviderEmail; - } - case NOTIFICATION_PROVIDERS.MATTERMOST: { - return BizNotifyNodeConfigFieldsProviderMattermost; - } - case NOTIFICATION_PROVIDERS.SLACKBOT: { - return BizNotifyNodeConfigFieldsProviderSlackBot; - } - case NOTIFICATION_PROVIDERS.TELEGRAMBOT: { - return BizNotifyNodeConfigFieldsProviderTelegramBot; - } - case NOTIFICATION_PROVIDERS.WEBHOOK: { - return BizNotifyNodeConfigFieldsProviderWebhook; - } - } - }, [fieldProvider]); + const renderNestedFieldProviderComponent = BizNotifyNodeConfigFieldsProvider.useComponent(fieldProvider, {}); useEffect(() => { // 如果未选择通知渠道,则清空授权信息 @@ -199,7 +169,7 @@ const BizNotifyNodeConfigForm = ({ node, ...props }: BizNotifyNodeConfigFormProp - {NestedProviderConfigFields && } + {renderNestedFieldProviderComponent && <>{renderNestedFieldProviderComponent}} @@ -251,14 +221,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) const { t } = i18n; return z.object({ - subject: z - .string() - .min(1, t("workflow_node.notify.form.subject.placeholder")) - .max(20480, t("common.errmsg.string_max", { max: 20480 })), - message: z - .string() - .min(1, t("workflow_node.notify.form.message.placeholder")) - .max(20480, t("common.errmsg.string_max", { max: 20480 })), + subject: z.string().nonempty(t("workflow_node.notify.form.subject.placeholder")), + message: z.string().nonempty(t("workflow_node.notify.form.message.placeholder")), provider: z.string(t("workflow_node.notify.form.provider.placeholder")).nonempty(t("workflow_node.notify.form.provider.placeholder")), providerAccessId: z.string(t("workflow_node.notify.form.provider_access.placeholder")).nonempty(t("workflow_node.notify.form.provider_access.placeholder")), providerConfig: z.any().nullish(), diff --git a/ui/src/components/workflow/designer/forms/BizUploadNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BizUploadNodeConfigForm.tsx index 58876eed5..96da60f01 100644 --- a/ui/src/components/workflow/designer/forms/BizUploadNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BizUploadNodeConfigForm.tsx @@ -1,6 +1,6 @@ import { useMemo } from "react"; import { getI18n, useTranslation } from "react-i18next"; -import { type FlowNodeEntity, getNodeForm } from "@flowgram.ai/fixed-layout-editor"; +import { type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor"; import { type AnchorProps, Form, type FormInstance, Input, Radio } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; @@ -33,7 +33,7 @@ const BizUploadNodeConfigForm = ({ node, ...props }: BizUploadNodeConfigFormProp const { i18n, t } = useTranslation(); const initialValues = useMemo(() => { - return getNodeForm(node)?.getValueIn("config") as WorkflowNodeConfigForBizUpload | undefined; + return node.form?.getValueIn("config") as WorkflowNodeConfigForBizUpload | undefined; }, [node]); const formSchema = getSchema({ i18n }); @@ -197,8 +197,8 @@ const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType }) return z .object({ source: z.enum([UPLOAD_SOURCE_FORM, UPLOAD_SOURCE_LOCAL, UPLOAD_SOURCE_URL], t("workflow_node.upload.form.source.placeholder")), - certificate: z.string().max(20480, t("common.errmsg.string_max", { max: 20480 })), - privateKey: z.string().max(20480, t("common.errmsg.string_max", { max: 20480 })), + certificate: z.string().nonempty(), + privateKey: z.string().nonempty(), domains: z.string().nullish(), }) .superRefine((values, ctx) => { diff --git a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx index 870678404..6584956ff 100644 --- a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx +++ b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigExprInputBox.tsx @@ -1,6 +1,5 @@ import { forwardRef, useEffect, useImperativeHandle, useMemo, useState } from "react"; import { useTranslation } from "react-i18next"; -import { getNodeForm } from "@flowgram.ai/fixed-layout-editor"; import { IconCircleMinus, IconCirclePlus } from "@tabler/icons-react"; import { useControllableValue } from "ahooks"; import { Button, Form, Input, Radio, Select, theme } from "antd"; @@ -171,7 +170,7 @@ const BranchBlockNodeConfigExprInputBox = forwardRef node.flowNodeType === NodeType.BizApply || node.flowNodeType === NodeType.BizUpload || node.flowNodeType === NodeType.BizMonitor) .map((node) => { - const form = getNodeForm(node); + const form = node.form; const group = { data: { name: form?.getValueIn("name"), diff --git a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx index 6e6f23576..930b80185 100644 --- a/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/BranchBlockNodeConfigForm.tsx @@ -1,6 +1,6 @@ import { useMemo, useRef } from "react"; import { getI18n, useTranslation } from "react-i18next"; -import { type FlowNodeEntity, getNodeForm } from "@flowgram.ai/fixed-layout-editor"; +import { type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor"; import { type AnchorProps, Form, type FormInstance } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; @@ -35,7 +35,7 @@ const BranchBlockNodeConfigForm = ({ node, ...props }: BranchBlockNodeConfigForm const { i18n, t } = useTranslation(); const initialValues = useMemo(() => { - return getNodeForm(node)?.getValueIn("config") as WorkflowNodeConfigForBranchBlock | undefined; + return node.form?.getValueIn("config") as WorkflowNodeConfigForBranchBlock | undefined; }, [node]); const formSchema = getSchema({ i18n }).superRefine(async (values, ctx) => { diff --git a/ui/src/components/workflow/designer/forms/DelayNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/DelayNodeConfigForm.tsx index 6b5edb607..beba1f09e 100644 --- a/ui/src/components/workflow/designer/forms/DelayNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/DelayNodeConfigForm.tsx @@ -1,6 +1,6 @@ import { useMemo } from "react"; import { getI18n, useTranslation } from "react-i18next"; -import { type FlowNodeEntity, getNodeForm } from "@flowgram.ai/fixed-layout-editor"; +import { type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor"; import { type AnchorProps, Form, type FormInstance, InputNumber } from "antd"; import { createSchemaFieldRule } from "antd-zod"; import { z } from "zod"; @@ -24,7 +24,7 @@ const DelayNodeConfigForm = ({ node, ...props }: DelayNodeConfigFormProps) => { const { i18n, t } = useTranslation(); const initialValues = useMemo(() => { - return getNodeForm(node)?.getValueIn("config") as WorkflowNodeConfigForDelay | undefined; + return node.form?.getValueIn("config") as WorkflowNodeConfigForDelay | undefined; }, [node]); const formSchema = getSchema({ i18n }); @@ -74,13 +74,10 @@ 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")) - ), + wait: z.coerce + .number(t("workflow_node.delay.form.wait.placeholder")) + .int(t("workflow_node.delay.form.wait.placeholder")) + .positive(t("workflow_node.delay.form.wait.placeholder")), }); }; diff --git a/ui/src/components/workflow/designer/forms/StartNodeConfigForm.tsx b/ui/src/components/workflow/designer/forms/StartNodeConfigForm.tsx index 4ac3d5127..108de80b9 100644 --- a/ui/src/components/workflow/designer/forms/StartNodeConfigForm.tsx +++ b/ui/src/components/workflow/designer/forms/StartNodeConfigForm.tsx @@ -1,6 +1,6 @@ import { useEffect, useMemo, useState } from "react"; import { getI18n, useTranslation } from "react-i18next"; -import { type FlowNodeEntity, getNodeForm } from "@flowgram.ai/fixed-layout-editor"; +import { type FlowNodeEntity } from "@flowgram.ai/fixed-layout-editor"; import { IconDice6 } from "@tabler/icons-react"; import { type AnchorProps, Button, Form, type FormInstance, Input, Radio, Space } from "antd"; import { createSchemaFieldRule } from "antd-zod"; @@ -29,7 +29,7 @@ const StartNodeConfigForm = ({ node, ...props }: StartNodeConfigFormProps) => { const { i18n, t } = useTranslation(); const initialValues = useMemo(() => { - return getNodeForm(node)?.getValueIn("config") as WorkflowNodeConfigForStart | undefined; + return node.form?.getValueIn("config") as WorkflowNodeConfigForStart | undefined; }, [node]); const formSchema = getSchema({ i18n }); diff --git a/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx b/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx index 4e71ba6fa..3606820a2 100644 --- a/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx +++ b/ui/src/components/workflow/designer/nodes/BizApplyNodeRegistry.tsx @@ -31,6 +31,7 @@ export const BizApplyNodeRegistry: NodeRegistry = { ["config"]: ({ value }) => { const res = BizApplyNodeConfigForm.getSchema({}).safeParse(value); if (!res.success) { + console.log(res); return { message: res.error.message, level: FeedbackLevel.Error, diff --git a/ui/src/domain/provider.ts b/ui/src/domain/provider.ts index 50f716634..1e10f03ec 100644 --- a/ui/src/domain/provider.ts +++ b/ui/src/domain/provider.ts @@ -57,6 +57,7 @@ export const ACCESS_PROVIDERS = Object.freeze({ GOEDGE: "goedge", GOOGLETRUSTSERVICES: "googletrustservices", HETZNER: "hetzner", + HOSTINGDE: "hostingDE", HOSTINGER: "hostinger", HUAWEICLOUD: "huaweicloud", IONOS: "ionos", @@ -182,6 +183,7 @@ export const accessProvidersMap: Maphttps://docs.hetzner.com/cloud/api/getting-started/generating-api-token", + "access.form.hostingde_api_key.label": "hosting.de API key", + "access.form.hostingde_api_key.placeholder": "Please enter hosting.de API key", + "access.form.hostingde_api_key.tooltip": "For more information, see https://www.hosting.de/api/#requests-and-authentication", "access.form.hostinger_api_token.label": "Hostinger API token", "access.form.hostinger_api_token.placeholder": "Please enter Hostinger API token", "access.form.hostinger_api_token.tooltip": "For more information, see https://developers.hostinger.com/#description/authentication", diff --git a/ui/src/i18n/locales/en/nls.provider.json b/ui/src/i18n/locales/en/nls.provider.json index 7b3f7d0d9..06d0270ec 100644 --- a/ui/src/i18n/locales/en/nls.provider.json +++ b/ui/src/i18n/locales/en/nls.provider.json @@ -94,6 +94,7 @@ "provider.goedge": "GoEdge", "provider.googletrustservices": "Google Trust Services", "provider.hetzner": "Hetzner", + "provider.hostingde": "hosting.de", "provider.hostinger": "Hostinger", "provider.huaweicloud": "Huawei Cloud", "provider.huaweicloud.cdn": "Huawei Cloud - CDN (Content Delivery Network)", diff --git a/ui/src/i18n/locales/zh/nls.access.json b/ui/src/i18n/locales/zh/nls.access.json index d394d680f..38bef4dae 100644 --- a/ui/src/i18n/locales/zh/nls.access.json +++ b/ui/src/i18n/locales/zh/nls.access.json @@ -295,6 +295,9 @@ "access.form.hetzner_api_token.label": "Hetzner API Token", "access.form.hetzner_api_token.placeholder": "请输入 Hetzner API Token", "access.form.hetzner_api_token.tooltip": "这是什么?请参阅 https://docs.hetzner.com/cloud/api/getting-started/generating-api-token", + "access.form.hostingde_api_key.label": "hosting.de API Key", + "access.form.hostingde_api_key.placeholder": "请输入 hosting.de API Key", + "access.form.hostingde_api_key.tooltip": "这是什么?请参阅 https://www.hosting.de/api/#requests-and-authentication", "access.form.hostinger_api_token.label": "Hostinger API Token", "access.form.hostinger_api_token.placeholder": "请输入 Hostinger API Token", "access.form.hostinger_api_token.tooltip": "这是什么?请参阅 https://developers.hostinger.com/#description/authentication", diff --git a/ui/src/i18n/locales/zh/nls.provider.json b/ui/src/i18n/locales/zh/nls.provider.json index bf23ceca9..55d5af7b6 100644 --- a/ui/src/i18n/locales/zh/nls.provider.json +++ b/ui/src/i18n/locales/zh/nls.provider.json @@ -94,6 +94,7 @@ "provider.goedge": "GoEdge", "provider.googletrustservices": "Google Trust Services", "provider.hetzner": "Hetzner", + "provider.hostingde": "hosting.de", "provider.hostinger": "Hostinger", "provider.huaweicloud": "华为云", "provider.huaweicloud.cdn": "华为云 - 内容分发网络 CDN", diff --git a/ui/src/pages/settings/SettingsSSLProvider.tsx b/ui/src/pages/settings/SettingsSSLProvider.tsx index 342e62453..ebf1001cf 100644 --- a/ui/src/pages/settings/SettingsSSLProvider.tsx +++ b/ui/src/pages/settings/SettingsSSLProvider.tsx @@ -206,14 +206,8 @@ const InternalSharedFormEabFields = ({ i18nKey }: { i18nKey: string }) => { const formSchema = z.object({ endpoint: z.url(t("common.errmsg.url_invalid")), - eabKid: z - .string(t("access.form.shared_acme_eab_kid.label")) - .min(1, t("access.form.shared_acme_eab_kid.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), - eabHmacKey: z - .string(t("access.form.shared_acme_eab_hmac_key.label")) - .min(1, t("access.form.shared_acme_eab_hmac_key.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })), + eabKid: z.string(t("access.form.shared_acme_eab_kid.label")).nonempty(t("access.form.shared_acme_eab_kid.placeholder")), + eabHmacKey: z.string(t("access.form.shared_acme_eab_hmac_key.label")).nonempty(t("access.form.shared_acme_eab_hmac_key.placeholder")), }); const formRule = createSchemaFieldRule(formSchema); @@ -321,14 +315,8 @@ const InternalSettingsFormProviderACMECA = () => { const formSchema = z.object({ endpoint: z.url(t("common.errmsg.url_invalid")), - eabKid: z - .string(t("access.form.acmeca_eab_kid.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })) - .nullish(), - eabHmacKey: z - .string(t("access.form.acmeca_eab_hmac_key.placeholder")) - .max(256, t("common.errmsg.string_max", { max: 256 })) - .nullish(), + eabKid: z.string(t("access.form.acmeca_eab_kid.placeholder")).nullish(), + eabHmacKey: z.string(t("access.form.acmeca_eab_hmac_key.placeholder")).nullish(), }); const formRule = createSchemaFieldRule(formSchema); diff --git a/ui/src/repository/certificate.ts b/ui/src/repository/certificate.ts index 43447b89c..9c9e3e7f4 100644 --- a/ui/src/repository/certificate.ts +++ b/ui/src/repository/certificate.ts @@ -40,6 +40,7 @@ export const list = async (request: ListRequest) => { "keyAlgorithm", "validityNotBefore", "validityNotAfter", + "validityInterval", "isRenewed", "isRevoked", "workflowRef", @@ -61,6 +62,26 @@ export const listByWorkflowRunId = async (workflowRunId: string) => { const list = await pb.collection(COLLECTION_NAME_CERTIFICATE).getFullList({ batch: 65535, + fields: [ + "id", + "source", + "subjectAltNames", + "serialNumber", + "issuerOrg", + "keyAlgorithm", + "validityNotBefore", + "validityNotAfter", + "validityInterval", + "isRenewed", + "isRevoked", + "workflowRef", + "created", + "updated", + "deleted", + "expand.workflowRef.id", + "expand.workflowRef.name", + "expand.workflowRef.description", + ].join(","), filter: pb.filter("workflowRunRef={:workflowRunId}", { workflowRunId }), sort: "created", requestKey: null,