From 7d63a7a811ebf249165280aa2c96de4b33aeb649 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 5 May 2026 14:08:14 -0400 Subject: [PATCH 1/5] feat: add common package ref test for @alternateType with ExternalType Add azure-http-specs test scenario that demonstrates using @alternateType with ExternalType to reference types from a pre-existing typespec-defined common package. Each language emitter specifies its own generated package coordinates for the Address model type. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../common-package-ref/client.tsp | 54 ++++++++++ .../common-package-ref/main.tsp | 98 +++++++++++++++++++ .../common-package-ref/mockapi.ts | 63 ++++++++++++ 3 files changed, 215 insertions(+) create mode 100644 packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/client.tsp create mode 100644 packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/main.tsp create mode 100644 packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/mockapi.ts diff --git a/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/client.tsp b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/client.tsp new file mode 100644 index 0000000000..b4c56220e9 --- /dev/null +++ b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/client.tsp @@ -0,0 +1,54 @@ +import "@azure-tools/typespec-client-generator-core"; +import "./main.tsp"; + +using Azure.ClientGenerator.Core; + +// Python: reference from the generated common-types package +@@alternateType(_Specs_.Azure.ClientGenerator.Core.AlternateType.CommonPackageRef.Address, + { + identity: "common_types.models.Address", + package: "common-types", + minVersion: "1.0.0", + }, + "python" +); + +// Java: reference from the generated common-types package +@@alternateType(_Specs_.Azure.ClientGenerator.Core.AlternateType.CommonPackageRef.Address, + { + identity: "com.azure.common.types.models.Address", + package: "com.azure.common-types", + minVersion: "1.0.0", + }, + "java" +); + +// C#: reference from the generated common-types package +@@alternateType(_Specs_.Azure.ClientGenerator.Core.AlternateType.CommonPackageRef.Address, + { + identity: "CommonTypes.Models.Address", + package: "CommonTypes", + minVersion: "1.0.0", + }, + "csharp" +); + +// TypeScript: reference from the generated common-types package +@@alternateType(_Specs_.Azure.ClientGenerator.Core.AlternateType.CommonPackageRef.Address, + { + identity: "Address", + package: "common-types", + minVersion: "1.0.0", + }, + "typescript" +); + +// Go: reference from the generated common-types package +@@alternateType(_Specs_.Azure.ClientGenerator.Core.AlternateType.CommonPackageRef.Address, + { + identity: "commontypes.Address", + package: "github.com/Azure/azure-sdk-for-go/sdk/common-types", + minVersion: "1.0.0", + }, + "go" +); diff --git a/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/main.tsp b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/main.tsp new file mode 100644 index 0000000000..170872d12e --- /dev/null +++ b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/main.tsp @@ -0,0 +1,98 @@ +import "@typespec/http"; +import "@typespec/spector"; +import "@azure-tools/typespec-client-generator-core"; + +using Http; +using Azure.ClientGenerator.Core; +using Spector; + +@doc(""" + Test using @alternateType with ExternalType to reference a pre-existing + typespec-defined common package. Instead of generating types inline, + language emitters should reference the types from the common package. + """) +@scenarioService("/azure/client-generator-core/alternate-type/common-package-ref") +@service +namespace _Specs_.Azure.ClientGenerator.Core.AlternateType.CommonPackageRef; + +/** Address model that mirrors the common package's Address type on the wire. */ +model Address { + city: string; + state: string; +} + +/** Model that has a property referencing the common package type. */ +model ModelWithAddressProperty { + address: Address; + name: string; +} + +@scenario +@scenarioDoc(""" + Input: None + Output: Address object. + Example response: + ```json + { + "city": "Seattle", + "state": "WA" + } + ``` + """) +@route("/model") +@get +op getModel(): Address; + +@scenario +@scenarioDoc(""" + Input: Address object in request body. + Example input: + ```json + { + "city": "Seattle", + "state": "WA" + } + ``` + Output: None (204/empty response) + """) +@route("/model") +@put +op putModel(@body body: Address): void; + +@scenario +@scenarioDoc(""" + Input: None + Output: ModelWithAddressProperty object. + Example response: + ```json + { + "address": { + "city": "Seattle", + "state": "WA" + }, + "name": "test" + } + ``` + """) +@route("/property") +@get +op getProperty(): ModelWithAddressProperty; + +@scenario +@scenarioDoc(""" + Input: ModelWithAddressProperty object in request body. + Example input: + ```json + { + "address": { + "city": "Seattle", + "state": "WA" + }, + "name": "test" + } + ``` + Output: None (204/empty response) + """) +@route("/property") +@put +op putProperty(@body body: ModelWithAddressProperty): void; diff --git a/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/mockapi.ts b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/mockapi.ts new file mode 100644 index 0000000000..d1c97e926e --- /dev/null +++ b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/mockapi.ts @@ -0,0 +1,63 @@ +import { + json, + MockApiDefinition, + MockBody, + passOnSuccess, + ScenarioMockApi, +} from "@typespec/spec-api"; + +export const Scenarios: Record = {}; + +function createMockApiDefinitions( + route: string, + body: MockBody, +): [MockApiDefinition, MockApiDefinition] { + return [ + { + uri: `/azure/client-generator-core/alternate-type/common-package-ref/${route}`, + method: "get", + response: { + status: 200, + body: body, + }, + kind: "MockApiDefinition", + }, + { + uri: `/azure/client-generator-core/alternate-type/common-package-ref/${route}`, + method: "put", + request: { + body, + }, + response: { status: 204 }, + kind: "MockApiDefinition", + }, + ]; +} + +const address = { + city: "Seattle", + state: "WA", +}; + +const modelScenarioTypes = createMockApiDefinitions("model", json(address)); + +Scenarios.Azure_ClientGenerator_Core_AlternateType_CommonPackageRef_getModel = passOnSuccess( + modelScenarioTypes[0], +); +Scenarios.Azure_ClientGenerator_Core_AlternateType_CommonPackageRef_putModel = passOnSuccess( + modelScenarioTypes[1], +); + +const modelWithAddressProperty = { + address, + name: "test", +}; + +const modelPropertyScenarioTypes = createMockApiDefinitions("property", json(modelWithAddressProperty)); + +Scenarios.Azure_ClientGenerator_Core_AlternateType_CommonPackageRef_getProperty = passOnSuccess( + modelPropertyScenarioTypes[0], +); +Scenarios.Azure_ClientGenerator_Core_AlternateType_CommonPackageRef_putProperty = passOnSuccess( + modelPropertyScenarioTypes[1], +); From fdc54838e9dadf7cd3f209d2d395d5cc8c6f9026 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 5 May 2026 14:11:54 -0400 Subject: [PATCH 2/5] feat: add common-types TypeSpec package definition Add a models-only TypeSpec package outside the specs/ directory that defines the shared Address model. This represents the pre-existing typespec-defined package that the common-package-ref test references via @alternateType with ExternalType. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- packages/azure-http-specs/common-types/main.tsp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 packages/azure-http-specs/common-types/main.tsp diff --git a/packages/azure-http-specs/common-types/main.tsp b/packages/azure-http-specs/common-types/main.tsp new file mode 100644 index 0000000000..c5085cceb9 --- /dev/null +++ b/packages/azure-http-specs/common-types/main.tsp @@ -0,0 +1,14 @@ +/** + * A models-only TypeSpec package representing pre-generated common/shared types. + * + * Language emitters should generate this package independently, then services + * that use `@alternateType` with `ExternalType` can reference the generated + * package instead of re-generating these types inline. + */ +namespace CommonTypes; + +/** A postal address. */ +model Address { + city: string; + state: string; +} From 5019420911de41d38b4e42783bd5af9dfc675f38 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 5 May 2026 14:29:03 -0400 Subject: [PATCH 3/5] refactor: move common-types into specs as a models-only spector package Move the common-types TypeSpec definition inside the specs/ directory as a proper spector package with @service and @scenarioService but no operations. Add an empty mockapi.ts to satisfy spector validation. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../common-package-ref}/common-types/main.tsp | 12 +++++++++++- .../common-package-ref/common-types/mockapi.ts | 4 ++++ 2 files changed, 15 insertions(+), 1 deletion(-) rename packages/azure-http-specs/{ => specs/azure/client-generator-core/alternate-type/common-package-ref}/common-types/main.tsp (57%) create mode 100644 packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/common-types/mockapi.ts diff --git a/packages/azure-http-specs/common-types/main.tsp b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/common-types/main.tsp similarity index 57% rename from packages/azure-http-specs/common-types/main.tsp rename to packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/common-types/main.tsp index c5085cceb9..c0711e0bee 100644 --- a/packages/azure-http-specs/common-types/main.tsp +++ b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/common-types/main.tsp @@ -1,3 +1,9 @@ +import "@typespec/http"; +import "@typespec/spector"; + +using Http; +using Spector; + /** * A models-only TypeSpec package representing pre-generated common/shared types. * @@ -5,7 +11,11 @@ * that use `@alternateType` with `ExternalType` can reference the generated * package instead of re-generating these types inline. */ -namespace CommonTypes; +@scenarioService( + "/azure/client-generator-core/alternate-type/common-package-ref/common-types" +) +@service +namespace _Specs_.Azure.ClientGenerator.Core.AlternateType.CommonPackageRef.CommonTypes; /** A postal address. */ model Address { diff --git a/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/common-types/mockapi.ts b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/common-types/mockapi.ts new file mode 100644 index 0000000000..c6976d33d2 --- /dev/null +++ b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/common-types/mockapi.ts @@ -0,0 +1,4 @@ +import { ScenarioMockApi } from "@typespec/spec-api"; + +// Models-only package — no operations, no scenarios. +export const Scenarios: Record = {}; From 0196bf243d4ef3431aed177632faed77690c310f Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Tue, 5 May 2026 14:52:16 -0400 Subject: [PATCH 4/5] chore: add changeset for common package ref test Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../add-common-package-ref-test-2026-5-5-14-51-0.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .chronus/changes/add-common-package-ref-test-2026-5-5-14-51-0.md diff --git a/.chronus/changes/add-common-package-ref-test-2026-5-5-14-51-0.md b/.chronus/changes/add-common-package-ref-test-2026-5-5-14-51-0.md new file mode 100644 index 0000000000..4dc6cdd8dc --- /dev/null +++ b/.chronus/changes/add-common-package-ref-test-2026-5-5-14-51-0.md @@ -0,0 +1,7 @@ +--- +changeKind: feature +packages: + - "@azure-tools/azure-http-specs" +--- + +Add common package reference test for `@alternateType` with `ExternalType`. This test demonstrates using `@alternateType` to reference types from a pre-existing typespec-defined common package, where each language emitter specifies its own generated package coordinates. Includes a models-only `common-types` spector package defining an `Address` model. From 7f751f5860b4ae4d510c171d49dc17b8c820ca80 Mon Sep 17 00:00:00 2001 From: iscai-msft Date: Mon, 11 May 2026 10:01:56 -0700 Subject: [PATCH 5/5] format --- .../alternate-type/common-package-ref/common-types/main.tsp | 4 +--- .../alternate-type/common-package-ref/mockapi.ts | 5 ++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/common-types/main.tsp b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/common-types/main.tsp index c0711e0bee..e3e61960ab 100644 --- a/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/common-types/main.tsp +++ b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/common-types/main.tsp @@ -11,9 +11,7 @@ using Spector; * that use `@alternateType` with `ExternalType` can reference the generated * package instead of re-generating these types inline. */ -@scenarioService( - "/azure/client-generator-core/alternate-type/common-package-ref/common-types" -) +@scenarioService("/azure/client-generator-core/alternate-type/common-package-ref/common-types") @service namespace _Specs_.Azure.ClientGenerator.Core.AlternateType.CommonPackageRef.CommonTypes; diff --git a/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/mockapi.ts b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/mockapi.ts index d1c97e926e..5b39a504e6 100644 --- a/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/mockapi.ts +++ b/packages/azure-http-specs/specs/azure/client-generator-core/alternate-type/common-package-ref/mockapi.ts @@ -53,7 +53,10 @@ const modelWithAddressProperty = { name: "test", }; -const modelPropertyScenarioTypes = createMockApiDefinitions("property", json(modelWithAddressProperty)); +const modelPropertyScenarioTypes = createMockApiDefinitions( + "property", + json(modelWithAddressProperty), +); Scenarios.Azure_ClientGenerator_Core_AlternateType_CommonPackageRef_getProperty = passOnSuccess( modelPropertyScenarioTypes[0],