From 863584924241e243475038dca0fb20664aad1af0 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Thu, 29 Aug 2024 15:37:04 -0700 Subject: [PATCH] Fix: Validating cross namespace (#4304) --- ...sioning-cross-ns-ref-2024-7-29-18-19-44.md | 6 +++++ packages/versioning/src/validate.ts | 12 ++++++++- .../test/versioned-dependencies.test.ts | 26 +++++++++++++++++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 .chronus/changes/fix-versioning-cross-ns-ref-2024-7-29-18-19-44.md diff --git a/.chronus/changes/fix-versioning-cross-ns-ref-2024-7-29-18-19-44.md b/.chronus/changes/fix-versioning-cross-ns-ref-2024-7-29-18-19-44.md new file mode 100644 index 0000000000..65426bb013 --- /dev/null +++ b/.chronus/changes/fix-versioning-cross-ns-ref-2024-7-29-18-19-44.md @@ -0,0 +1,6 @@ +--- +changeKind: internal +packages: + - "@typespec/versioning" +--- + diff --git a/packages/versioning/src/validate.ts b/packages/versioning/src/validate.ts index 5ce80dac3e..7114b13539 100644 --- a/packages/versioning/src/validate.ts +++ b/packages/versioning/src/validate.ts @@ -605,7 +605,17 @@ function validateTargetVersionCompatible( ) { const sourceAvailability = resolveAvailabilityForStack(program, source); const [sourceNamespace] = getVersions(program, sourceAvailability.type); - + // If we cannot get source availability check if there is some different versioning across the stack which would mean we verify across namespace and is causing issues. + if (sourceAvailability.map === undefined) { + const sources = Array.isArray(source) ? source : [source]; + const baseNs = getVersions(program, sources[0]); + for (const type of sources) { + const ns = getVersions(program, type); + if (ns !== baseNs) { + return undefined; + } + } + } const targetAvailability = resolveAvailabilityForStack(program, target); const [targetNamespace] = getVersions(program, targetAvailability.type); if (!targetAvailability.map || !targetNamespace) return; diff --git a/packages/versioning/test/versioned-dependencies.test.ts b/packages/versioning/test/versioned-dependencies.test.ts index cb1fa7ac14..e1f6cafd48 100644 --- a/packages/versioning/test/versioned-dependencies.test.ts +++ b/packages/versioning/test/versioned-dependencies.test.ts @@ -551,6 +551,32 @@ describe("versioning: dependencies", () => { runner = await createVersioningTestRunner(); }); + it("cross namespace operation", async () => { + const diagnostics = await runner.diagnose(` + @versioned(Versions) + namespace Service { + enum Versions { + v1, + v2, + } + + @added(Versions.v2) + op test(purpose: FilePurpose): void; + + @added(Versions.v2) + model FilePurpose { + a: string; + } + } + + @useDependency(Service.Versions.v2) + namespace Client { + op testClient is Service.test; + } + `); + expectDiagnosticEmpty(diagnostics); + }); + it("use model defined in non versioned library spreading properties", async () => { const { MyService, Test } = (await runner.compile(` namespace NonVersionedLib {