Skip to content

Commit fb83095

Browse files
committed
fix(eslint): reject raw retired provider identifiers
1 parent 23b97bc commit fb83095

10 files changed

Lines changed: 80 additions & 28 deletions

src/core/config/__tests__/ContextProxy.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import { clearAllMocks } from "../../../test-utils/reset"
88
import { makeExtensionContext, makeUri } from "../../../test-utils/vscode"
99

1010
import { ContextProxy } from "../ContextProxy"
11-
import { providerIdentifiers } from "@roo-code/types/provider-identifiers"
11+
import { providerIdentifiers, retiredProviderIdentifiers } from "@roo-code/types/provider-identifiers"
1212

1313
vi.mock("vscode", () => ({
1414
Uri: {
@@ -566,7 +566,7 @@ describe("ContextProxy", () => {
566566

567567
it("should preserve retired apiProvider and provider fields", async () => {
568568
await proxy.setValues({
569-
apiProvider: "groq",
569+
apiProvider: retiredProviderIdentifiers.groq,
570570
apiModelId: "llama3-70b",
571571
openAiBaseUrl: "https://api.retired-provider.example/v1",
572572
apiKey: "retired-provider-key",

src/core/config/__tests__/ProviderSettingsManager.spec.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
OPEN_AI_CODEX_SERVICE_TIER_KEY,
55
OpenAiCodexServiceTier,
66
providerIdentifiers,
7+
retiredProviderIdentifiers,
78
type ProviderSettings,
89
} from "@roo-code/types"
910

@@ -266,15 +267,15 @@ describe("ProviderSettingsManager", () => {
266267
default: {
267268
config: {},
268269
id: "default",
269-
apiProvider: "roo",
270+
apiProvider: retiredProviderIdentifiers.roo,
270271
apiModelId: "roo/code-supernova", // Old model ID
271272
},
272273
test: {
273-
apiProvider: "roo",
274+
apiProvider: retiredProviderIdentifiers.roo,
274275
apiModelId: "roo/code-supernova", // Old model ID
275276
},
276277
existing: {
277-
apiProvider: "roo",
278+
apiProvider: retiredProviderIdentifiers.roo,
278279
apiModelId: "roo/code-supernova-1-million", // Already migrated
279280
},
280281
otherProvider: {
@@ -329,7 +330,7 @@ describe("ProviderSettingsManager", () => {
329330

330331
await providerSettingsManager.saveConfig("router-profile", {
331332
id: "router-id",
332-
apiProvider: "roo",
333+
apiProvider: retiredProviderIdentifiers.roo,
333334
apiModelId: "roo/code-supernova",
334335
rooApiKey: "router-key",
335336
} as any)
@@ -614,7 +615,7 @@ describe("ProviderSettingsManager", () => {
614615
// Include a legacy provider-specific field (groqApiKey) that is no
615616
// longer in the schema — passthrough() must keep it.
616617
const retiredConfig = {
617-
apiProvider: "groq",
618+
apiProvider: retiredProviderIdentifiers.groq,
618619
apiKey: "legacy-key",
619620
apiModelId: "legacy-model",
620621
openAiBaseUrl: "https://legacy.example/v1",
@@ -822,7 +823,7 @@ describe("ProviderSettingsManager", () => {
822823
apiConfigs: {
823824
retiredProvider: {
824825
id: "retired-id",
825-
apiProvider: "groq",
826+
apiProvider: retiredProviderIdentifiers.groq,
826827
apiKey: "legacy-key",
827828
apiModelId: "legacy-model",
828829
openAiBaseUrl: "https://legacy.example/v1",
@@ -916,7 +917,7 @@ describe("ProviderSettingsManager", () => {
916917
apiConfigs: {
917918
retired: {
918919
id: "retired-id",
919-
apiProvider: "groq",
920+
apiProvider: retiredProviderIdentifiers.groq,
920921
apiKey: "legacy-key",
921922
apiModelId: "legacy-model",
922923
openAiBaseUrl: "https://legacy.example/v1",

src/core/config/__tests__/importExport.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { CustomModesManager } from "../CustomModesManager"
1818
import { safeWriteJson } from "../../../utils/safeWriteJson"
1919

2020
import type { Mock } from "vitest"
21-
import { providerIdentifiers } from "@roo-code/types/provider-identifiers"
21+
import { providerIdentifiers, retiredProviderIdentifiers } from "@roo-code/types/provider-identifiers"
2222

2323
vi.mock("vscode", () => ({
2424
workspace: {
@@ -932,7 +932,7 @@ describe("importExport", () => {
932932
currentApiConfigName: "router-profile",
933933
apiConfigs: {
934934
"router-profile": {
935-
apiProvider: "roo",
935+
apiProvider: retiredProviderIdentifiers.roo,
936936
apiModelId: "roo/code-supernova",
937937
rooApiKey: "router-key",
938938
id: "router-id",
@@ -1155,7 +1155,7 @@ describe("importExport", () => {
11551155
},
11561156
},
11571157
globalSettings: {
1158-
imageGenerationProvider: "roo",
1158+
imageGenerationProvider: retiredProviderIdentifiers.roo,
11591159
openRouterImageGenerationSelectedModel: "openrouter/model-1",
11601160
customInstructions: "Keep this setting",
11611161
},

src/core/webview/__tests__/webviewMessageHandler.routerModels.spec.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { describe, it, expect, vi, beforeEach } from "vitest"
22

3-
import { kimiCodeAuthMethodSchema, providerIdentifiers, RouterModelsMessageType } from "@roo-code/types"
3+
import {
4+
kimiCodeAuthMethodSchema,
5+
providerIdentifiers,
6+
retiredProviderIdentifiers,
7+
RouterModelsMessageType,
8+
} from "@roo-code/types"
49

510
import { webviewMessageHandler } from "../webviewMessageHandler"
611
import type { ClineProvider } from "../ClineProvider"
@@ -104,7 +109,7 @@ describe("webviewMessageHandler - requestRouterModels provider filter", () => {
104109
type: RouterModelsMessageType.singleRouterModelFetchResponse,
105110
success: false,
106111
error: "Roo Code Router has been removed. Please select and configure a different provider.",
107-
values: { provider: "roo" },
112+
values: { provider: retiredProviderIdentifiers.roo },
108113
})
109114
})
110115

src/core/webview/__tests__/webviewMessageHandler.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ vi.mock("../../mentions/resolveImageMentions", () => ({
197197
import { resolveImageMentions } from "../../mentions/resolveImageMentions"
198198
import { Terminal } from "../../../integrations/terminal/Terminal"
199199
import { TerminalRegistry } from "../../../integrations/terminal/TerminalRegistry"
200-
import { providerIdentifiers } from "@roo-code/types/provider-identifiers"
200+
import { providerIdentifiers, retiredProviderIdentifiers } from "@roo-code/types/provider-identifiers"
201201

202202
describe("webviewMessageHandler - requestLmStudioModels", () => {
203203
beforeEach(() => {
@@ -894,7 +894,7 @@ describe("webviewMessageHandler - requestRouterModels", () => {
894894
type: "singleRouterModelFetchResponse",
895895
success: false,
896896
error: "Roo Code Router has been removed. Please select and configure a different provider.",
897-
values: { provider: "roo" },
897+
values: { provider: retiredProviderIdentifiers.roo },
898898
})
899899
})
900900

src/core/webview/webviewMessageHandler.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
checkoutRestorePayloadSchema,
2424
getCompletionCheckpoint,
2525
providerIdentifiers,
26+
retiredProviderIdentifiers,
2627
LmStudioModelsMessageType,
2728
OllamaModelsMessageType,
2829
OpenAiModelsMessageType,
@@ -1412,7 +1413,7 @@ export const webviewMessageHandler = async (
14121413
type: RouterModelsMessageType.singleRouterModelFetchResponse,
14131414
success: false,
14141415
error: getRouterRemovalMessage(),
1415-
values: { provider: "roo" },
1416+
values: { provider: retiredProviderIdentifiers.roo },
14161417
})
14171418
break
14181419
}

src/eslint-rules/no-raw-provider-identifiers.mjs

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
1-
import { providerIdentifiers } from "@roo-code/types/provider-identifiers"
1+
import { providerIdentifiers, retiredProviderIdentifiers } from "@roo-code/types/provider-identifiers"
22

3-
const providerMembersByValue = new Map(Object.entries(providerIdentifiers).map(([member, value]) => [value, member]))
3+
const providerReplacementsByValue = new Map([
4+
...Object.entries(providerIdentifiers).map(([member, value]) => [value, `providerIdentifiers.${member}`]),
5+
...Object.entries(retiredProviderIdentifiers).map(([member, value]) => [
6+
value,
7+
`retiredProviderIdentifiers.${member}`,
8+
]),
9+
])
410
const typescriptExpressionWrappers = new Set([
511
"TSAsExpression",
612
"TSNonNullExpression",
@@ -40,14 +46,14 @@ function getRawProvider(node) {
4046
}
4147

4248
if (node?.type === "Literal" && typeof node.value === "string") {
43-
const member = providerMembersByValue.get(node.value)
44-
return member ? { member, value: node.value } : undefined
49+
const replacement = providerReplacementsByValue.get(node.value)
50+
return replacement ? { replacement, value: node.value } : undefined
4551
}
4652

4753
if (node?.type === "TemplateLiteral" && node.expressions.length === 0) {
4854
const value = node.quasis[0]?.value.cooked
49-
const member = value ? providerMembersByValue.get(value) : undefined
50-
return member ? { member, value } : undefined
55+
const replacement = value ? providerReplacementsByValue.get(value) : undefined
56+
return replacement ? { replacement, value } : undefined
5157
}
5258

5359
return undefined
@@ -60,7 +66,7 @@ export const noRawProviderIdentifiers = {
6066
schema: [],
6167
messages: {
6268
useCanonical:
63-
'Use providerIdentifiers.{{member}} instead of the raw provider identifier "{{value}}".',
69+
'Use {{replacement}} instead of the raw provider identifier "{{value}}".',
6470
},
6571
},
6672
create(context) {
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { RuleTester } from "eslint"
2+
3+
import { noRawProviderIdentifiers } from "./no-raw-provider-identifiers.mjs"
4+
5+
const ruleTester = new RuleTester({
6+
languageOptions: {
7+
ecmaVersion: 2022,
8+
sourceType: "module",
9+
},
10+
})
11+
12+
ruleTester.run("no-raw-provider-identifiers", noRawProviderIdentifiers, {
13+
valid: [
14+
"const apiProvider = retiredProviderIdentifiers.roo",
15+
"const provider = retiredProviderIdentifiers.groq",
16+
],
17+
invalid: [
18+
{
19+
code: 'const apiProvider = "roo"',
20+
errors: [
21+
{
22+
message:
23+
'Use retiredProviderIdentifiers.roo instead of the raw provider identifier "roo".',
24+
type: "Literal",
25+
},
26+
],
27+
},
28+
{
29+
code: "const persistedProvider = `groq`",
30+
errors: [
31+
{
32+
message:
33+
'Use retiredProviderIdentifiers.groq instead of the raw provider identifier "groq".',
34+
type: "TemplateLiteral",
35+
},
36+
],
37+
},
38+
],
39+
})

src/shared/__tests__/checkExistApiConfig.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// npx vitest run src/shared/__tests__/checkExistApiConfig.spec.ts
22

3-
import { providerIdentifiers, type ProviderSettings } from "@roo-code/types"
3+
import { providerIdentifiers, retiredProviderIdentifiers, type ProviderSettings } from "@roo-code/types"
44

55
import { checkExistKey } from "../checkExistApiConfig"
66

@@ -86,7 +86,7 @@ describe("checkExistKey", () => {
8686

8787
it("should return false for roo provider without API key", () => {
8888
const config: ProviderSettings = {
89-
apiProvider: "roo",
89+
apiProvider: retiredProviderIdentifiers.roo,
9090
}
9191
expect(checkExistKey(config)).toBe(false)
9292
})

src/utils/__tests__/autoImportSettings.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ import { autoImportSettings } from "../autoImportSettings"
7777
import * as vscode from "vscode"
7878
import fsPromises from "fs/promises"
7979
import { fileExistsAtPath } from "../fs"
80-
import { providerIdentifiers } from "@roo-code/types/provider-identifiers"
80+
import { providerIdentifiers, retiredProviderIdentifiers } from "@roo-code/types/provider-identifiers"
8181

8282
describe("autoImportSettings", () => {
8383
let mockProviderSettingsManager: any
@@ -242,7 +242,7 @@ describe("autoImportSettings", () => {
242242
},
243243
},
244244
globalSettings: {
245-
imageGenerationProvider: "roo",
245+
imageGenerationProvider: retiredProviderIdentifiers.roo,
246246
customInstructions: "Test instructions",
247247
},
248248
}

0 commit comments

Comments
 (0)