feat(providers): group presets into sponsors and non-sponsors

- Original sort mode now shows official > prime partner > sponsors
  (preset file order, aligned with the README sponsor table) >
  non-sponsors sorted by display name
- Physically reorder sponsor entries in all 8 preset files to match
  the README sponsor table order; add group marker comments
- Drop stale section comments in openclaw/hermes preset files
- Update ProviderPresetSelector tests for the new ordering
This commit is contained in:
Jason
2026-07-21 21:10:54 +08:00
parent b3f3aee3ee
commit f3108bf754
10 changed files with 4644 additions and 4591 deletions
@@ -61,6 +61,7 @@ type TestPresetEntry = {
settingsConfig: Record<string, never>;
category: ProviderCategory;
primePartner?: boolean;
isPartner?: boolean;
};
};
@@ -207,8 +208,9 @@ describe("ProviderPresetSelector pure helpers", () => {
const original = sortPresetEntries(presetEntries, originalMode, t);
expect(original).not.toBe(presetEntries);
// original 模式置顶官方分类(alpha)其余保持传入顺序。
expect(getIds(original)).toEqual(["alpha", "gamma", "beta", "delta"]);
// original 模式置顶官方分类(alpha)其余均非赞助商,按显示名排序
// Beta Gateway < Delta Mirror < Gamma 本地名)。
expect(getIds(original)).toEqual(["alpha", "beta", "delta", "gamma"]);
expect(getIds(sortPresetEntries(presetEntries, nameAscMode, t))).toEqual([
"alpha",
@@ -229,30 +231,44 @@ describe("ProviderPresetSelector pure helpers", () => {
).toEqual(["alpha", "beta", "delta", "gamma"]);
});
it("original 模式按「官方 → 尊享伙伴 → 其余」三段排序,各组内部保序且双重身份不重复", () => {
it("original 模式按「官方 → 尊享伙伴 → 赞助商 → 非赞助商」四段排序,前三组保序、末组按显示名,双重身份不重复", () => {
// 故意打乱传入顺序,验证:
// - official 组置顶(officialOnly、officialPrime 按出现顺序);
// - 非官方且 primePartner 的预设居中primeOnly);
// - 其余保持传入顺序(restFirst、restLast);
// - 既是 official 又是 primePartner 的预设只归入官方组、不在 prime 组重复。
// - 非官方且 primePartner 的预设次之primeAndPartner);
// - 赞助商(isPartner)第三段,保持传入(预设文件)顺序:
// partnerZeta 在 partnerAlpha 前,不按字母重排;
// - 非赞助商按显示名排序:restAlpha 排到 restZulu 前;
// - 既是 official 又是 primePartner 的只归入官方组;
// 既是 primePartner 又是 isPartner 的只归入 prime 组、不在赞助商组重复。
const mixed: TestPresetEntry[] = [
{
id: "restFirst",
id: "restZulu",
preset: {
name: "Rest First",
websiteUrl: "https://rest-first.example.com",
name: "Zulu Rest",
websiteUrl: "https://rest-zulu.example.com",
settingsConfig: {},
category: "third_party",
},
},
{
id: "primeOnly",
id: "partnerZeta",
preset: {
name: "Prime Only",
websiteUrl: "https://prime-only.example.com",
name: "Zeta Partner",
websiteUrl: "https://partner-zeta.example.com",
settingsConfig: {},
category: "aggregator",
isPartner: true,
},
},
{
id: "primeAndPartner",
preset: {
name: "Prime And Partner",
websiteUrl: "https://prime-and-partner.example.com",
settingsConfig: {},
category: "cn_official",
primePartner: true,
isPartner: true,
},
},
{
@@ -275,10 +291,20 @@ describe("ProviderPresetSelector pure helpers", () => {
},
},
{
id: "restLast",
id: "partnerAlpha",
preset: {
name: "Rest Last",
websiteUrl: "https://rest-last.example.com",
name: "Alpha Partner",
websiteUrl: "https://partner-alpha.example.com",
settingsConfig: {},
category: "third_party",
isPartner: true,
},
},
{
id: "restAlpha",
preset: {
name: "Alpha Rest",
websiteUrl: "https://rest-alpha.example.com",
settingsConfig: {},
category: "aggregator",
},
@@ -288,23 +314,27 @@ describe("ProviderPresetSelector pure helpers", () => {
expect(getIds(sortPresetEntries(mixed, "original", t))).toEqual([
"officialOnly",
"officialPrime",
"primeOnly",
"restFirst",
"restLast",
"primeAndPartner",
"partnerZeta",
"partnerAlpha",
"restAlpha",
"restZulu",
]);
});
});
describe("ProviderPresetSelector", () => {
it("默认(original 模式)将官方分类置顶,其余保持传入顺序", () => {
it("默认(original 模式)将官方分类置顶,非赞助商按显示名排序", () => {
renderSelector();
// 组件内 t() 未配置翻译资源,显示名回退为 key 字面量:
// Beta Gateway < Delta Mirror < preset.gamma。
expect(getPresetButtonTexts()).toEqual([
"providerPreset.custom",
"preset.alpha",
"preset.gamma",
"Beta Gateway",
"Delta Mirror",
"preset.gamma",
]);
});
@@ -327,9 +357,9 @@ describe("ProviderPresetSelector", () => {
expect(getPresetButtonTexts()).toEqual([
"providerPreset.custom",
"preset.alpha",
"preset.gamma",
"Beta Gateway",
"Delta Mirror",
"preset.gamma",
]);
});