diff --git a/packages/http-client-csharp/emitter/src/options.ts b/packages/http-client-csharp/emitter/src/options.ts index 952a756cf04..6978e355f9b 100644 --- a/packages/http-client-csharp/emitter/src/options.ts +++ b/packages/http-client-csharp/emitter/src/options.ts @@ -1,4 +1,7 @@ -import { CreateSdkContextOptions } from "@azure-tools/typespec-client-generator-core"; +import { + CreateSdkContextOptions, + UnbrandedSdkEmitterOptions, +} from "@azure-tools/typespec-client-generator-core"; import { EmitContext, JSONSchemaType } from "@typespec/compiler"; import { _defaultGeneratorName } from "./constants.js"; import { DYNAMIC_MODEL_DECORATOR_PATTERN } from "./lib/decorators.js"; @@ -8,8 +11,10 @@ import { LoggerLevel } from "./lib/logger-level.js"; * The emitter options for the CSharp emitter. * @beta */ +type ApiVersionSelection = string | Record; + export interface CSharpEmitterOptions { - "api-version"?: string; + "api-version"?: ApiVersionSelection; "unreferenced-types-handling"?: "removeOrInternalize" | "internalize" | "keepAll"; "new-project"?: boolean; "save-inputs"?: boolean; @@ -41,13 +46,7 @@ export const CSharpEmitterOptionsSchema: JSONSchemaType = type: "object", additionalProperties: false, properties: { - "api-version": { - type: "string", - nullable: true, - description: - "For TypeSpec files using the [`@versioned`](https://typespec.io/docs/libraries/versioning/reference/decorators/#@TypeSpec.Versioning.versioned) decorator, " + - "set this option to the version that should be used to generate against.", - }, + ...UnbrandedSdkEmitterOptions["api-version"], "generate-protocol-methods": { type: "boolean", nullable: true, diff --git a/packages/http-client-csharp/emitter/test/Unit/emitter.test.ts b/packages/http-client-csharp/emitter/test/Unit/emitter.test.ts index 2f5839eb997..b7eb8071e89 100644 --- a/packages/http-client-csharp/emitter/test/Unit/emitter.test.ts +++ b/packages/http-client-csharp/emitter/test/Unit/emitter.test.ts @@ -43,16 +43,21 @@ describe("$onEmit tests", () => { }), }; }); - vi.mock("@azure-tools/typespec-client-generator-core", () => ({ - createSdkContext: vi.fn().mockImplementation(async (...args) => { - return { - sdkPackage: {}, - emitContext: args[0], - program: args[0].program, - diagnostics: [], - }; - }), - })); + vi.mock("@azure-tools/typespec-client-generator-core", async (importOriginal) => { + const actual = + await importOriginal(); + return { + ...actual, + createSdkContext: vi.fn().mockImplementation(async (...args) => { + return { + sdkPackage: {}, + emitContext: args[0], + program: args[0].program, + diagnostics: [], + }; + }), + }; + }); vi.mock("../../src/lib/exec-utils.js", () => ({ execCSharpGenerator: vi.fn(), diff --git a/packages/http-client-csharp/emitter/test/Unit/options.test.ts b/packages/http-client-csharp/emitter/test/Unit/options.test.ts index c5abbecc77b..be8603adeb0 100644 --- a/packages/http-client-csharp/emitter/test/Unit/options.test.ts +++ b/packages/http-client-csharp/emitter/test/Unit/options.test.ts @@ -1,10 +1,11 @@ vi.resetModules(); +import { UnbrandedSdkEmitterOptions } from "@azure-tools/typespec-client-generator-core"; import { EmitContext, Program } from "@typespec/compiler"; import { ok, strictEqual } from "assert"; import { beforeEach, describe, expect, it, vi } from "vitest"; import { createConfiguration } from "../../src/emitter.js"; -import { CSharpEmitterOptions } from "../../src/options.js"; +import { CSharpEmitterOptions, CSharpEmitterOptionsSchema } from "../../src/options.js"; import { createCSharpSdkContext, createEmitterContext, @@ -187,4 +188,14 @@ describe("Configuration tests", async () => { expect(config["plugins"]).toBeUndefined(); }); + + it("api-version schema accepts a string or namespace-to-version map", () => { + const schema = CSharpEmitterOptionsSchema.properties["api-version"]; + const tcgcSchema = UnbrandedSdkEmitterOptions["api-version"]["api-version"] as { + oneOf?: unknown[]; + }; + + expect(schema).toBe(tcgcSchema); + expect(tcgcSchema.oneOf).toBeDefined(); + }); }); diff --git a/packages/http-client-csharp/package-lock.json b/packages/http-client-csharp/package-lock.json index c586240d276..2f78a795ade 100644 --- a/packages/http-client-csharp/package-lock.json +++ b/packages/http-client-csharp/package-lock.json @@ -14,7 +14,7 @@ "devDependencies": { "@azure-tools/azure-http-specs": "0.1.0-alpha.42", "@azure-tools/typespec-azure-core": "0.69.0", - "@azure-tools/typespec-client-generator-core": "0.69.0", + "@azure-tools/typespec-client-generator-core": "0.69.1", "@microsoft/api-extractor": "^7.52.2", "@types/node": "~22.12.0", "@typespec/compiler": "1.13.0", @@ -39,7 +39,7 @@ }, "peerDependencies": { "@azure-tools/typespec-azure-core": ">=0.69.0 <0.70.0 || ~0.70.0-0", - "@azure-tools/typespec-client-generator-core": ">=0.69.0 <0.70.0 || ~0.70.0-0", + "@azure-tools/typespec-client-generator-core": ">=0.69.1 <0.70.0 || ~0.70.0-0", "@typespec/compiler": "^1.13.0", "@typespec/http": "^1.13.0", "@typespec/openapi": "^1.13.0", @@ -127,9 +127,9 @@ } }, "node_modules/@azure-tools/typespec-client-generator-core": { - "version": "0.69.0", - "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.69.0.tgz", - "integrity": "sha512-ro8zzOeiN/74r0wM19R77gzLtbfjIFgKgr1Rusii/vhCfJIoVC7IcqLxhbJl0RVkjyhRFKt4GCRAw4iurnrDnw==", + "version": "0.69.1", + "resolved": "https://registry.npmjs.org/@azure-tools/typespec-client-generator-core/-/typespec-client-generator-core-0.69.1.tgz", + "integrity": "sha512-v84ZTh9lffTyjUSfMzZMDPv+fHjXJO/LpYT+V73Zco9YL8fC6o7ou2hvSlWTnMW2KIIrymdM3AyXONxSIZUEBw==", "dev": true, "license": "MIT", "dependencies": { diff --git a/packages/http-client-csharp/package.json b/packages/http-client-csharp/package.json index f90454931af..1446d9f7d6e 100644 --- a/packages/http-client-csharp/package.json +++ b/packages/http-client-csharp/package.json @@ -59,7 +59,7 @@ ], "peerDependencies": { "@azure-tools/typespec-azure-core": ">=0.69.0 <0.70.0 || ~0.70.0-0", - "@azure-tools/typespec-client-generator-core": ">=0.69.0 <0.70.0 || ~0.70.0-0", + "@azure-tools/typespec-client-generator-core": ">=0.69.1 <0.70.0 || ~0.70.0-0", "@typespec/compiler": "^1.13.0", "@typespec/http": "^1.13.0", "@typespec/openapi": "^1.13.0", @@ -71,7 +71,7 @@ "devDependencies": { "@azure-tools/azure-http-specs": "0.1.0-alpha.42", "@azure-tools/typespec-azure-core": "0.69.0", - "@azure-tools/typespec-client-generator-core": "0.69.0", + "@azure-tools/typespec-client-generator-core": "0.69.1", "@microsoft/api-extractor": "^7.52.2", "@types/node": "~22.12.0", "@typespec/compiler": "1.13.0", diff --git a/packages/http-client-csharp/readme.md b/packages/http-client-csharp/readme.md index ea48d690c25..6dcfdea3555 100644 --- a/packages/http-client-csharp/readme.md +++ b/packages/http-client-csharp/readme.md @@ -55,9 +55,14 @@ See [Configuring output directory for more info](https://typespec.io/docs/handbo ### `api-version` -**Type:** `string` +**Type:** `string | object` + +Use this flag if you would like to generate the sdk only for a specific version. Default value is the latest version. Also accepts values `latest` and `all`. For multi-service packages, provide a map from each service namespace's full name to its desired version; services not listed default to their latest version. + +**Options:** -For TypeSpec files using the [`@versioned`](https://typespec.io/docs/libraries/versioning/reference/decorators/#@TypeSpec.Versioning.versioned) decorator, set this option to the version that should be used to generate against. +- `string` +- `object` ### `generate-protocol-methods` diff --git a/website/src/content/docs/docs/emitters/clients/http-client-csharp/reference/emitter.md b/website/src/content/docs/docs/emitters/clients/http-client-csharp/reference/emitter.md index c3868941aa5..ad1da10028b 100644 --- a/website/src/content/docs/docs/emitters/clients/http-client-csharp/reference/emitter.md +++ b/website/src/content/docs/docs/emitters/clients/http-client-csharp/reference/emitter.md @@ -38,9 +38,14 @@ See [Configuring output directory for more info](https://typespec.io/docs/handbo ### `api-version` -**Type:** `string` +**Type:** `string | object` + +Use this flag if you would like to generate the sdk only for a specific version. Default value is the latest version. Also accepts values `latest` and `all`. For multi-service packages, provide a map from each service namespace's full name to its desired version; services not listed default to their latest version. + +**Options:** -For TypeSpec files using the [`@versioned`](https://typespec.io/docs/libraries/versioning/reference/decorators/#@TypeSpec.Versioning.versioned) decorator, set this option to the version that should be used to generate against. +- `string` +- `object` ### `generate-protocol-methods`