mirror of
https://github.com/certimate-go/certimate.git
synced 2026-09-24 23:10:13 +08:00
feat(provider): new deployment provider: tencentcloud eomakers
This commit is contained in:
@@ -110,6 +110,7 @@ import BizDeployNodeConfigFieldsProviderTencentCloudCOS from "./BizDeployNodeCon
|
||||
import BizDeployNodeConfigFieldsProviderTencentCloudCSS from "./BizDeployNodeConfigFieldsProviderTencentCloudCSS";
|
||||
import BizDeployNodeConfigFieldsProviderTencentCloudECDN from "./BizDeployNodeConfigFieldsProviderTencentCloudECDN";
|
||||
import BizDeployNodeConfigFieldsProviderTencentCloudEO from "./BizDeployNodeConfigFieldsProviderTencentCloudEO";
|
||||
import BizDeployNodeConfigFieldsProviderTencentCloudEOMakers from "./BizDeployNodeConfigFieldsProviderTencentCloudEOMakers";
|
||||
import BizDeployNodeConfigFieldsProviderTencentCloudGA2 from "./BizDeployNodeConfigFieldsProviderTencentCloudGA2";
|
||||
import BizDeployNodeConfigFieldsProviderTencentCloudGAAP from "./BizDeployNodeConfigFieldsProviderTencentCloudGAAP";
|
||||
import BizDeployNodeConfigFieldsProviderTencentCloudSCF from "./BizDeployNodeConfigFieldsProviderTencentCloudSCF";
|
||||
@@ -259,6 +260,7 @@ const providerComponentMap: Partial<Record<DeploymentProviderType, React.Compone
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CSS]: BizDeployNodeConfigFieldsProviderTencentCloudCSS,
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_ECDN]: BizDeployNodeConfigFieldsProviderTencentCloudECDN,
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_EO]: BizDeployNodeConfigFieldsProviderTencentCloudEO,
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_EOMAKERS]: BizDeployNodeConfigFieldsProviderTencentCloudEOMakers,
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_GAAP]: BizDeployNodeConfigFieldsProviderTencentCloudGAAP,
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_GA2]: BizDeployNodeConfigFieldsProviderTencentCloudGA2,
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_SCF]: BizDeployNodeConfigFieldsProviderTencentCloudSCF,
|
||||
|
||||
+170
@@ -0,0 +1,170 @@
|
||||
import { getI18n, useTranslation } from "react-i18next";
|
||||
import { Form, Input, Radio, Switch } from "antd";
|
||||
import { createSchemaFieldRule } from "antd-zod";
|
||||
import { z } from "zod";
|
||||
|
||||
import MultipleSplitValueInput from "@/components/MultipleSplitValueInput";
|
||||
import Show from "@/components/Show";
|
||||
import { isDomain } from "@/utils/validator";
|
||||
|
||||
import { useFormNestedFieldsContext } from "./_context";
|
||||
|
||||
const MULTIPLE_INPUT_SEPARATOR = ";";
|
||||
|
||||
const DOMAIN_MATCH_PATTERN_EXACT = "exact" as const;
|
||||
const DOMAIN_MATCH_PATTERN_WILDCARD = "wildcard" as const;
|
||||
const DOMAIN_MATCH_PATTERN_CERTSAN = "certsan" as const;
|
||||
|
||||
const BizDeployNodeConfigFieldsProviderTencentCloudEOMakers = () => {
|
||||
const { i18n, t } = useTranslation();
|
||||
|
||||
const { parentNamePath } = useFormNestedFieldsContext();
|
||||
const formSchema = z.object({
|
||||
[parentNamePath]: getSchema({ i18n }),
|
||||
});
|
||||
const formRule = createSchemaFieldRule(formSchema);
|
||||
const formInst = Form.useFormInstance();
|
||||
const initialValues = getInitialValues();
|
||||
|
||||
const fieldDomainMatchPattern = Form.useWatch([parentNamePath, "domainMatchPattern"], { form: formInst, preserve: true });
|
||||
|
||||
return (
|
||||
<>
|
||||
<Form.Item
|
||||
name={[parentNamePath, "endpoint"]}
|
||||
initialValue={initialValues.endpoint}
|
||||
label={t("workflow_node.deploy.form.tencentcloud_eomakers_endpoint.label")}
|
||||
rules={[formRule]}
|
||||
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.tencentcloud_eomakers_endpoint.tooltip") }}></span>}
|
||||
>
|
||||
<Input allowClear placeholder={t("workflow_node.deploy.form.tencentcloud_eomakers_endpoint.placeholder")} />
|
||||
</Form.Item>
|
||||
|
||||
<Form.Item
|
||||
name={[parentNamePath, "apiToken"]}
|
||||
initialValue={initialValues.apiToken}
|
||||
label={t("workflow_node.deploy.form.tencentcloud_eomakers_api_token.label")}
|
||||
rules={[formRule]}
|
||||
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.tencentcloud_eomakers_api_token.tooltip") }}></span>}
|
||||
>
|
||||
<Input.Password autoComplete="new-password" placeholder={t("workflow_node.deploy.form.tencentcloud_eomakers_api_token.placeholder")} />
|
||||
</Form.Item>
|
||||
|
||||
<Form.Item
|
||||
name={[parentNamePath, "projectId"]}
|
||||
initialValue={initialValues.projectId}
|
||||
label={t("workflow_node.deploy.form.tencentcloud_eomakers_project_id.label")}
|
||||
rules={[formRule]}
|
||||
tooltip={<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.tencentcloud_eomakers_project_id.tooltip") }}></span>}
|
||||
>
|
||||
<Input placeholder={t("workflow_node.deploy.form.tencentcloud_eomakers_project_id.placeholder")} />
|
||||
</Form.Item>
|
||||
|
||||
<Form.Item
|
||||
name={[parentNamePath, "domainMatchPattern"]}
|
||||
initialValue={initialValues.domainMatchPattern}
|
||||
label={t("workflow_node.deploy.form.shared_domain_match_pattern.label")}
|
||||
extra={
|
||||
fieldDomainMatchPattern === DOMAIN_MATCH_PATTERN_EXACT ? (
|
||||
<span dangerouslySetInnerHTML={{ __html: t("workflow_node.deploy.form.shared_domain_match_pattern.option.exact.help.wildcard") }}></span>
|
||||
) : (
|
||||
void 0
|
||||
)
|
||||
}
|
||||
rules={[formRule]}
|
||||
>
|
||||
<Radio.Group
|
||||
options={[DOMAIN_MATCH_PATTERN_EXACT, DOMAIN_MATCH_PATTERN_WILDCARD, DOMAIN_MATCH_PATTERN_CERTSAN].map((s) => ({
|
||||
label: t(`workflow_node.deploy.form.shared_domain_match_pattern.option.${s}.label`),
|
||||
value: s,
|
||||
}))}
|
||||
/>
|
||||
</Form.Item>
|
||||
|
||||
<Show when={fieldDomainMatchPattern !== DOMAIN_MATCH_PATTERN_CERTSAN}>
|
||||
<Form.Item
|
||||
name={[parentNamePath, "domains"]}
|
||||
initialValue={initialValues.domains}
|
||||
label={t("workflow_node.deploy.form.tencentcloud_eomakers_domains.label")}
|
||||
extra={t("workflow_node.deploy.form.tencentcloud_eomakers_domains.help")}
|
||||
rules={[formRule]}
|
||||
>
|
||||
<MultipleSplitValueInput
|
||||
modalTitle={t("workflow_node.deploy.form.tencentcloud_eomakers_domains.multiple_input_modal.title")}
|
||||
placeholder={t("workflow_node.deploy.form.tencentcloud_eomakers_domains.placeholder")}
|
||||
placeholderInModal={t("workflow_node.deploy.form.tencentcloud_eomakers_domains.multiple_input_modal.placeholder")}
|
||||
splitOptions={{ removeEmpty: true, trimSpace: true }}
|
||||
/>
|
||||
</Form.Item>
|
||||
</Show>
|
||||
|
||||
<Form.Item
|
||||
label={t("workflow_node.deploy.form.tencentcloud_eomakers_enable_multiple_ssl.label")}
|
||||
extra={t("workflow_node.deploy.form.tencentcloud_eomakers_enable_multiple_ssl.help")}
|
||||
>
|
||||
<span className="inline-block">
|
||||
<Form.Item name={[parentNamePath, "enableMultipleSSL"]} initialValue={initialValues.enableMultipleSSL} noStyle rules={[formRule]}>
|
||||
<Switch
|
||||
checkedChildren={t("workflow_node.deploy.form.tencentcloud_eomakers_enable_multiple_ssl.switch.on")}
|
||||
unCheckedChildren={t("workflow_node.deploy.form.tencentcloud_eomakers_enable_multiple_ssl.switch.off")}
|
||||
/>
|
||||
</Form.Item>
|
||||
</span>
|
||||
<span className="ms-2 inline-block">{t("workflow_node.deploy.form.tencentcloud_eomakers_enable_multiple_ssl.switch.suffix")}</span>
|
||||
</Form.Item>
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
const getInitialValues = (): Nullish<z.infer<ReturnType<typeof getSchema>>> => {
|
||||
return {
|
||||
apiToken: "",
|
||||
projectId: "",
|
||||
domainMatchPattern: DOMAIN_MATCH_PATTERN_EXACT,
|
||||
domains: "",
|
||||
};
|
||||
};
|
||||
|
||||
const getSchema = ({ i18n = getI18n() }: { i18n?: ReturnType<typeof getI18n> }) => {
|
||||
const { t } = i18n;
|
||||
|
||||
return z
|
||||
.object({
|
||||
endpoint: z.string().nullish(),
|
||||
apiToken: z.string().nonempty(),
|
||||
projectId: z.string().nonempty(),
|
||||
domainMatchPattern: z.string().nonempty().default(DOMAIN_MATCH_PATTERN_EXACT),
|
||||
domains: z.string().nullish(),
|
||||
enableMultipleSSL: z.boolean().nullish(),
|
||||
})
|
||||
.superRefine((values, ctx) => {
|
||||
if (values.domainMatchPattern) {
|
||||
switch (values.domainMatchPattern) {
|
||||
case DOMAIN_MATCH_PATTERN_EXACT:
|
||||
case DOMAIN_MATCH_PATTERN_WILDCARD:
|
||||
{
|
||||
const scDomains = z
|
||||
.string()
|
||||
.nonempty()
|
||||
.refine((v) => v.split(MULTIPLE_INPUT_SEPARATOR).every((e) => isDomain(e, { allowWildcard: true })), t("common.errmsg.domain_invalid"));
|
||||
const spDomains = scDomains.safeParse(values.domains);
|
||||
if (!spDomains.success) {
|
||||
ctx.addIssue({
|
||||
code: "custom",
|
||||
message: z.treeifyError(spDomains.error).errors.join(),
|
||||
path: ["domains"],
|
||||
});
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
const _default = Object.assign(BizDeployNodeConfigFieldsProviderTencentCloudEOMakers, {
|
||||
getInitialValues,
|
||||
getSchema,
|
||||
});
|
||||
|
||||
export default _default;
|
||||
@@ -719,6 +719,7 @@ export const DEPLOYMENT_PROVIDERS = Object.freeze({
|
||||
TENCENTCLOUD_CSS: `${ACCESS_PROVIDERS.TENCENTCLOUD}-css`,
|
||||
TENCENTCLOUD_ECDN: `${ACCESS_PROVIDERS.TENCENTCLOUD}-ecdn`,
|
||||
TENCENTCLOUD_EO: `${ACCESS_PROVIDERS.TENCENTCLOUD}-eo`,
|
||||
TENCENTCLOUD_EOMAKERS: `${ACCESS_PROVIDERS.TENCENTCLOUD}-eomakers`,
|
||||
TENCENTCLOUD_GAAP: `${ACCESS_PROVIDERS.TENCENTCLOUD}-gaap`,
|
||||
TENCENTCLOUD_GA2: `${ACCESS_PROVIDERS.TENCENTCLOUD}-ga2`,
|
||||
TENCENTCLOUD_SCF: `${ACCESS_PROVIDERS.TENCENTCLOUD}-scf`,
|
||||
@@ -814,6 +815,7 @@ export const deploymentProvidersMap: Map<DeploymentProvider["type"] | string, De
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CDN, "provider.tencentcloud_cdn", DEPLOYMENT_CATEGORIES.CDN],
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_ECDN, "provider.tencentcloud_ecdn", DEPLOYMENT_CATEGORIES.CDN],
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_EO, "provider.tencentcloud_eo", DEPLOYMENT_CATEGORIES.CDN],
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_EOMAKERS, "provider.tencentcloud_eomakers", DEPLOYMENT_CATEGORIES.CDN],
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CLB, "provider.tencentcloud_clb", DEPLOYMENT_CATEGORIES.LOADBALANCE],
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_WAF, "provider.tencentcloud_waf", DEPLOYMENT_CATEGORIES.FIREWALL],
|
||||
[DEPLOYMENT_PROVIDERS.TENCENTCLOUD_CSS, "provider.tencentcloud_css", DEPLOYMENT_CATEGORIES.AV],
|
||||
|
||||
@@ -251,6 +251,7 @@
|
||||
"tencentcloud_dns": "Tencent Cloud - DNS",
|
||||
"tencentcloud_ecdn": "Tencent Cloud - ECDN (Enterprise Content Delivery Network)",
|
||||
"tencentcloud_eo": "Tencent Cloud - EdgeOne",
|
||||
"tencentcloud_eomakers": "Tencent Cloud - EdgeOne Makers (formerly EdgeOne Pages)",
|
||||
"tencentcloud_ga2": "Tencent Cloud - GA2 (Global Accelerator 2.0)",
|
||||
"tencentcloud_gaap": "Tencent Cloud - GAAP (Global Application Acceleration Platform)",
|
||||
"tencentcloud_scf": "Tencent Cloud - SCF (Serverless Cloud Function)",
|
||||
|
||||
@@ -2318,6 +2318,39 @@
|
||||
"off": "Disallow"
|
||||
}
|
||||
},
|
||||
"tencentcloud_eomakers_endpoint": {
|
||||
"label": "Tencent Cloud API endpoint (Optional)",
|
||||
"placeholder": "Please enter Tencent Cloud EdgeOne API endpoint (e.g. teo.intl.tencentcloudapi.com)",
|
||||
"tooltip": "<ul style=\"list-style: disc;\"><li><strong>teo.intl.tencentcloudapi.com</strong> for Tencent Cloud International</li><li><strong>teo.tencentcloudapi.com</strong> for Tencent Cloud in China</li></ul>"
|
||||
},
|
||||
"tencentcloud_eomakers_api_token": {
|
||||
"label": "Tencent Cloud EdgeOne Makers API Token",
|
||||
"placeholder": "Please enter Tencent Cloud EdgeOne Makers API Token",
|
||||
"tooltip": "For more information, see <a href=\"https://pages.edgeone.ai/document/api-token\" target=\"_blank\">https://pages.edgeone.ai/document/api-token</a>"
|
||||
},
|
||||
"tencentcloud_eomakers_project_id": {
|
||||
"label": "Tencent Cloud EdgeOne Makers project ID",
|
||||
"placeholder": "Please enter Tencent Cloud EdgeOne Makers project ID",
|
||||
"tooltip": "For more information, see <a href=\"https://console.tencentcloud.com/edgeone/makers\" target=\"_blank\">https://console.tencentcloud.com/edgeone/makers</a>"
|
||||
},
|
||||
"tencentcloud_eomakers_domains": {
|
||||
"label": "Tencent Cloud EdgeOne Makers custom domains",
|
||||
"placeholder": "Please enter Tencent Cloud EdgeOne Makers custom domain names (separated by semicolons)",
|
||||
"help": "Notes: Multiple domains should be separated by semicolons.",
|
||||
"multiple_input_modal": {
|
||||
"title": "Change Tencent Cloud EdgeOne Makers custom domain",
|
||||
"placeholder": "Please enter Tencent Cloud EdgeOne Makers custom domain name"
|
||||
}
|
||||
},
|
||||
"tencentcloud_eomakers_enable_multiple_ssl": {
|
||||
"label": "Multiple SSL certificates",
|
||||
"help": "Notes: Each domain name supports one RSA certificate and one ECC certificate at most.",
|
||||
"switch": {
|
||||
"suffix": "to retain other certificates with different algorithms.",
|
||||
"on": "Allow",
|
||||
"off": "Disallow"
|
||||
}
|
||||
},
|
||||
"tencentcloud_ga2_endpoint": {
|
||||
"label": "Tencent Cloud API endpoint (Optional)",
|
||||
"placeholder": "Please enter Tencent Cloud GA2 API endpoint (e.g. ga2.intl.tencentcloudapi.com)",
|
||||
|
||||
@@ -251,6 +251,7 @@
|
||||
"tencentcloud_dns": "腾讯云 - 云解析 DNS",
|
||||
"tencentcloud_ecdn": "腾讯云 - 全站加速网络 ECDN",
|
||||
"tencentcloud_eo": "腾讯云 - 边缘安全加速平台 EdgeOne",
|
||||
"tencentcloud_eomakers": "腾讯云 - 边缘安全加速平台 EdgeOne Makers(原 EdgeOne Pages)",
|
||||
"tencentcloud_ga2": "腾讯云 - 全球加速 2.0 GA2",
|
||||
"tencentcloud_gaap": "腾讯云 - 全球应用加速 GAAP",
|
||||
"tencentcloud_scf": "腾讯云 - 云函数 SCF",
|
||||
|
||||
@@ -2317,6 +2317,39 @@
|
||||
"off": "不"
|
||||
}
|
||||
},
|
||||
"tencentcloud_eomakers_endpoint": {
|
||||
"label": "腾讯云接口端点(可选)",
|
||||
"placeholder": "请输入腾讯云 EdgeOne 接口端点(例如:teo.tencentcloudapi.com)",
|
||||
"tooltip": "这是什么?请参阅 <a href=\"https://cloud.tencent.com/document/product/1552/80723\" target=\"_blank\">https://cloud.tencent.com/document/product/1552/80723</a><br>国际站用户请填写 <em>teo.intl.tencentcloudapi.com</em>。"
|
||||
},
|
||||
"tencentcloud_eomakers_api_token": {
|
||||
"label": "腾讯云 EdgeOne Makers API Token",
|
||||
"placeholder": "请输入腾讯云 EdgeOne Makers API Token",
|
||||
"tooltip": "这是什么?请参阅 <a href=\"https://cloud.tencent.com/document/product/1552/127422\" target=\"_blank\">https://cloud.tencent.com/document/product/1552/127422</a>"
|
||||
},
|
||||
"tencentcloud_eomakers_project_id": {
|
||||
"label": "腾讯云 EdgeOne Makers 项目 ID",
|
||||
"placeholder": "请输入腾讯云 EdgeOne Makers 项目 ID",
|
||||
"tooltip": "这是什么?请参阅 <a href=\"https://console.cloud.tencent.com/edgeone/makers\" target=\"_blank\">https://console.cloud.tencent.com/edgeone/makers</a>"
|
||||
},
|
||||
"tencentcloud_eomakers_domains": {
|
||||
"label": "腾讯云 EdgeOne Makers 自定义域名",
|
||||
"placeholder": "请输入腾讯云 EdgeOne Makers 自定义域名(多个值请用半角分号隔开)",
|
||||
"help": "提示:支持多个域名,以半角分号隔开。",
|
||||
"multiple_input_modal": {
|
||||
"title": "修改腾讯云 EdgeOne Makers 自定义域名",
|
||||
"placeholder": "请输入腾讯云 EdgeOne Makers 自定义域名"
|
||||
}
|
||||
},
|
||||
"tencentcloud_eomakers_enable_multiple_ssl": {
|
||||
"label": "多证书模式",
|
||||
"help": "提示:每个域名最多支持一个 RSA 证书、一个 ECC 证书。",
|
||||
"switch": {
|
||||
"suffix": "保留与待部署证书算法不一致的其他有效证书。",
|
||||
"on": "",
|
||||
"off": "不"
|
||||
}
|
||||
},
|
||||
"tencentcloud_ga2_endpoint": {
|
||||
"label": "腾讯云接口端点(可选)",
|
||||
"placeholder": "请输入腾讯云 GA2 接口端点(例如:ga2.tencentcloudapi.com)",
|
||||
|
||||
Reference in New Issue
Block a user