feat(provider): new deployment provider: tencentcloud eomakers

This commit is contained in:
Bigsk
2026-07-14 00:32:39 +08:00
committed by GitHub
parent 4c5ee94517
commit 77ef8677f9
20 changed files with 1038 additions and 26 deletions
@@ -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,
@@ -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;
+2
View File
@@ -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)",