From db67beebd24a2366a9aa61781f1185bf554b059d Mon Sep 17 00:00:00 2001 From: Alitzel Mendez <6895254+AlitzelMendez@users.noreply.github.com> Date: Thu, 23 Jan 2025 18:07:46 -0800 Subject: [PATCH] Exclude template instances from the `no-response-body` rule. (#2085) issue: https://github.com/Azure/typespec-azure/issues/1785 --- ...ix-duplicate-warning-2025-0-15-11-39-29.md | 7 ++++ .../src/rules/no-response-body.ts | 9 ++++- .../test/rules/no-response-body.test.ts | 38 +++++++++++++++++++ 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 .chronus/changes/fix-duplicate-warning-2025-0-15-11-39-29.md diff --git a/.chronus/changes/fix-duplicate-warning-2025-0-15-11-39-29.md b/.chronus/changes/fix-duplicate-warning-2025-0-15-11-39-29.md new file mode 100644 index 0000000000..add103601c --- /dev/null +++ b/.chronus/changes/fix-duplicate-warning-2025-0-15-11-39-29.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@azure-tools/typespec-azure-resource-manager" +--- + +Exclude template instances from the `no-response-body` rule. diff --git a/packages/typespec-azure-resource-manager/src/rules/no-response-body.ts b/packages/typespec-azure-resource-manager/src/rules/no-response-body.ts index c518ef1502..33f39743db 100644 --- a/packages/typespec-azure-resource-manager/src/rules/no-response-body.ts +++ b/packages/typespec-azure-resource-manager/src/rules/no-response-body.ts @@ -1,4 +1,4 @@ -import { createRule, Operation } from "@typespec/compiler"; +import { createRule, isTemplateInstance, Operation } from "@typespec/compiler"; import { getHttpOperation, getResponsesForOperation, HttpOperationResponse } from "@typespec/http"; import { isTemplatedInterfaceOperation } from "./utils.js"; /** @@ -20,7 +20,12 @@ export const noResponseBodyRule = createRule({ return { operation: (op: Operation) => { const [httpOperation] = getHttpOperation(context.program, op); - if (isTemplatedInterfaceOperation(op) || httpOperation.verb === "head") return; + if ( + isTemplateInstance(op) || + isTemplatedInterfaceOperation(op) || + httpOperation.verb === "head" + ) + return; const responses = getResponsesForOperation(context.program, op)[0].find( (v) => v.statusCodes !== 204 && v.statusCodes !== 202, diff --git a/packages/typespec-azure-resource-manager/test/rules/no-response-body.test.ts b/packages/typespec-azure-resource-manager/test/rules/no-response-body.test.ts index 957a919511..6c75757f78 100644 --- a/packages/typespec-azure-resource-manager/test/rules/no-response-body.test.ts +++ b/packages/typespec-azure-resource-manager/test/rules/no-response-body.test.ts @@ -153,4 +153,42 @@ describe("typespec-azure-resource-manager: no response body rule", () => { ) .toBeValid(); }); + + it("allows templates but emit on use of the template ", async () => { + await tester + .expect( + ` + @armProviderNamespace + @useDependency(Azure.ResourceManager.Versions.v1_0_Preview_1) + namespace Microsoft.ContosoProviderHub; + + op SampleTemplate< + Resource extends Foundations.Resource, + Response extends {} = ArmResponse + > is ArmCustomPatchAsync; + + model Image is Azure.ResourceManager.TrackedResource<{name: string}> { + ...ResourceNameParameter< + Resource = Image + >; + } + + @armResourceOperations + interface Images { + @parameterVisibility + update is SampleTemplate< + Image, + Response = (ArmAcceptedLroResponse> & { + @body _: Image; + }) + >; + } + `, + ) + .toEmitDiagnostics({ + code: "@azure-tools/typespec-azure-resource-manager/no-response-body", + message: `The body of 202 response should be empty.`, + }); + }); });