diff --git a/.chronus/changes/tcgc-api-version-optional-2026-01-20.md b/.chronus/changes/tcgc-api-version-optional-2026-01-20.md new file mode 100644 index 0000000000..c2502ab695 --- /dev/null +++ b/.chronus/changes/tcgc-api-version-optional-2026-01-20.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@azure-tools/typespec-client-generator-core" +--- + +The `apiVersion` parameter in client initialization is now correctly marked as `optional: true` for all client-level API version parameters, including both single-service and multi-service scenarios. diff --git a/packages/typespec-client-generator-core/src/clients.ts b/packages/typespec-client-generator-core/src/clients.ts index d07b48e6f4..fe6c7fd112 100644 --- a/packages/typespec-client-generator-core/src/clients.ts +++ b/packages/typespec-client-generator-core/src/clients.ts @@ -257,8 +257,12 @@ function addDefaultClientParameters< multipleServiceApiVersionParam.apiVersions = []; multipleServiceApiVersionParam.clientDefaultValue = undefined; multipleServiceApiVersionParam.type = getTypeSpecBuiltInType(context, "string"); + // API version parameters at the client level should always be optional + multipleServiceApiVersionParam.optional = true; defaultClientParamters.push(multipleServiceApiVersionParam); } else { + // API version parameters at the client level should always be optional + apiVersionParam.optional = true; defaultClientParamters.push(apiVersionParam); } } diff --git a/packages/typespec-client-generator-core/test/clients/params.test.ts b/packages/typespec-client-generator-core/test/clients/params.test.ts index 66d5858096..df02f8e325 100644 --- a/packages/typespec-client-generator-core/test/clients/params.test.ts +++ b/packages/typespec-client-generator-core/test/clients/params.test.ts @@ -599,7 +599,7 @@ it("service with default api version, method with api version param", async () = const clientApiVersionParam = client.clientInitialization.parameters[1]; strictEqual(clientApiVersionParam.name, "apiVersion"); strictEqual(clientApiVersionParam.onClient, true); - strictEqual(clientApiVersionParam.optional, false); + strictEqual(clientApiVersionParam.optional, true); strictEqual(clientApiVersionParam.kind, "method"); strictEqual(clientApiVersionParam.clientDefaultValue, "v1"); strictEqual(clientApiVersionParam.isApiVersionParam, true); @@ -646,7 +646,7 @@ it("service with default api version, method with path api version param", async const clientApiVersionParam = client.clientInitialization.parameters[1]; strictEqual(clientApiVersionParam.name, "apiVersion"); strictEqual(clientApiVersionParam.onClient, true); - strictEqual(clientApiVersionParam.optional, false); + strictEqual(clientApiVersionParam.optional, true); strictEqual(clientApiVersionParam.kind, "method"); strictEqual(clientApiVersionParam.clientDefaultValue, "v1"); strictEqual(clientApiVersionParam.isApiVersionParam, true); diff --git a/packages/typespec-client-generator-core/test/clients/structure.test.ts b/packages/typespec-client-generator-core/test/clients/structure.test.ts index da93b9f8a0..1197132a9f 100644 --- a/packages/typespec-client-generator-core/test/clients/structure.test.ts +++ b/packages/typespec-client-generator-core/test/clients/structure.test.ts @@ -498,7 +498,7 @@ it("single with core", async () => { )[0]; strictEqual(apiVersionParam.name, "apiVersion"); strictEqual(apiVersionParam.onClient, true); - strictEqual(apiVersionParam.optional, false); + strictEqual(apiVersionParam.optional, true); strictEqual(apiVersionParam.kind, "method"); strictEqual(apiVersionParam.clientDefaultValue, "2022-12-01-preview"); }); @@ -564,7 +564,7 @@ it("multiple with core", async () => { )[0]; strictEqual(apiVersionParam.name, "apiVersion"); strictEqual(apiVersionParam.onClient, true); - strictEqual(apiVersionParam.optional, false); + strictEqual(apiVersionParam.optional, true); strictEqual(apiVersionParam.kind, "method"); strictEqual(apiVersionParam.clientDefaultValue, "2022-12-01"); }); @@ -816,6 +816,7 @@ it("one client from multiple services", async () => { strictEqual(apiVersionParam.clientDefaultValue, undefined); // For multi-service clients, the api version param type should be string strictEqual(apiVersionParam.type.kind, "string"); + strictEqual(apiVersionParam.optional, true); const aiClient = client.children!.find((c) => c.name === "AI"); ok(aiClient); @@ -999,6 +1000,7 @@ it("one client from multiple services without version dependency", async () => { strictEqual(apiVersionParam.clientDefaultValue, undefined); // For multi-service clients, the api version param type should be string strictEqual(apiVersionParam.type.kind, "string"); + strictEqual(apiVersionParam.optional, true); const aiClient = client.children!.find((c) => c.name === "AI"); ok(aiClient); @@ -1121,6 +1123,7 @@ it("one client from multiple services with `@clientLocation`", async () => { strictEqual(apiVersionParam.clientDefaultValue, undefined); // For multi-service clients, the api version param type should be string strictEqual(apiVersionParam.type.kind, "string"); + strictEqual(apiVersionParam.optional, true); const aiClient = client.children!.find((c) => c.name === "AI"); ok(aiClient);