diff --git a/packages/typespec-ts/src/transform/transformParameters.ts b/packages/typespec-ts/src/transform/transformParameters.ts index cb03e411bc..6b5dc44a3f 100644 --- a/packages/typespec-ts/src/transform/transformParameters.ts +++ b/packages/typespec-ts/src/transform/transformParameters.ts @@ -126,15 +126,19 @@ function getParameterMetadata( paramType: "query" | "path" | "header", parameter: HttpOperationParameter ): ParameterMetadata { + const schemaContext = [SchemaContext.Exception, SchemaContext.Input]; const schema = getSchemaForType( program, dpgContext, parameter.param.type, - [SchemaContext.Exception, SchemaContext.Input], + schemaContext, false, parameter.param ) as Schema; - let type = getTypeName(schema); + let type = + paramType === "query" + ? getTypeName(schema, schemaContext) + : getTypeName(schema); const name = getParameterName(parameter.name); let description = getFormattedPropertyDoc(program, parameter.param, schema) ?? ""; diff --git a/packages/typespec-ts/test/unit/parametersGenerator.spec.ts b/packages/typespec-ts/test/unit/parametersGenerator.spec.ts index 81cb36a7b2..242484b6f0 100644 --- a/packages/typespec-ts/test/unit/parametersGenerator.spec.ts +++ b/packages/typespec-ts/test/unit/parametersGenerator.spec.ts @@ -3,92 +3,153 @@ import { emitParameterFromCadl } from "./util/emitUtil.js"; import { assertEqualContent } from "./util/testUtil.js"; describe("Parameters.ts", () => { - describe("handle query apiVersion", () => { - it("should't generate apiVersion if there's a client level apiVersion", async () => { - const parameters = await emitParameterFromCadl( - ` - model ApiVersionParameter { - @query - "api-version": string; - } - op test(...ApiVersionParameter): string; - ` - ); - assert.ok(parameters); - assertEqualContent( - parameters?.content!, - ` - import { RequestParameters } from "@azure-rest/core-client"; - - export type TestParameters = RequestParameters; + describe("query parameters", () => { + describe("apiVersion in query", () => { + it("should't generate apiVersion if there's a client level apiVersion", async () => { + const parameters = await emitParameterFromCadl( ` - ); + model ApiVersionParameter { + @query + "api-version": string; + } + op test(...ApiVersionParameter): string; + ` + ); + assert.ok(parameters); + assertEqualContent( + parameters?.content!, + ` + import { RequestParameters } from "@azure-rest/core-client"; + + export type TestParameters = RequestParameters; + ` + ); + }); + + it("should generate apiVersion if there's no client level apiVersion", async () => { + const parameters = await emitParameterFromCadl( + ` + model ApiVersionParameter { + @query + "api-version": string; + } + op test(...ApiVersionParameter): string; + `, + false, + true + ); + assert.ok(parameters); + assertEqualContent( + parameters?.content!, + ` + import { RequestParameters } from "@azure-rest/core-client"; + + export interface TestQueryParamProperties { + "api-version": string; + } + + export interface TestQueryParam { + queryParameters: TestQueryParamProperties; + } + + export type TestParameters = TestQueryParam & RequestParameters; + ` + ); + }); }); - - it("should generate apiVersion if there's no client level apiVersion", async () => { - const parameters = await emitParameterFromCadl( - ` - model ApiVersionParameter { - @query - "api-version": string; - } - op test(...ApiVersionParameter): string; - `, - false, - true - ); - assert.ok(parameters); - assertEqualContent( - parameters?.content!, - ` + describe("other parameters in query", () => { + it("should generate user-custom-query ", async () => { + const parameters = await emitParameterFromCadl( + ` + model CustomParameter { + @query + "user-custom-query": string; + } + op test(...CustomParameter): string; + ` + ); + assert.ok(parameters); + assertEqualContent( + parameters?.content!, + ` import { RequestParameters } from "@azure-rest/core-client"; export interface TestQueryParamProperties { - "api-version": string; + "user-custom-query": string; } export interface TestQueryParam { - queryParameters: TestQueryParamProperties; + queryParameters: TestQueryParamProperties; } export type TestParameters = TestQueryParam & RequestParameters; ` - ); + ); + }); + + it("should generate offsetDateTime as Date | string", async () => { + const parameters = await emitParameterFromCadl( + ` + model QueryParameter { + @query + executionTo?: offsetDateTime; + } + op test(...QueryParameter): string; + ` + ); + assert.ok(parameters); + assertEqualContent( + parameters?.content!, + ` + import { RequestParameters } from "@azure-rest/core-client"; + + export interface TestQueryParamProperties { + executionTo?: Date | string; + } + + export interface TestQueryParam { + queryParameters?: TestQueryParamProperties; + } + + export type TestParameters = TestQueryParam & RequestParameters; + ` + ); + }); }); }); - describe("query parameters generation", () => { - it("should generate user-custom-query ", async () => { + describe("header parameters", () => { + it("should generate offsetDateTime as string", async () => { const parameters = await emitParameterFromCadl( ` - model CustomParameter { - @query - "user-custom-query": string; - } - op test(...CustomParameter): string; - ` + model QueryParameter { + @header + executionTo?: offsetDateTime; + } + op test(...QueryParameter): string; + ` ); assert.ok(parameters); assertEqualContent( parameters?.content!, - ` - import { RequestParameters } from "@azure-rest/core-client"; - - export interface TestQueryParamProperties { - "user-custom-query": string; - } - - export interface TestQueryParam { - queryParameters: TestQueryParamProperties; - } - - export type TestParameters = TestQueryParam & RequestParameters; - ` + ` import { RawHttpHeadersInput } from "@azure/core-rest-pipeline"; + import { RequestParameters } from "@azure-rest/core-client"; + + export interface TestHeaders { + "execution-to"?: string; + } + + export interface TestHeaderParam { + headers?: RawHttpHeadersInput & TestHeaders; + } + + export type TestParameters = TestHeaderParam & RequestParameters; + ` ); }); }); - describe("binary request generation", () => { + describe("binary request", () => { it("bytes request with application/json will be treated as string", async () => { const parameters = await emitParameterFromCadl( ` @@ -294,7 +355,7 @@ describe("Parameters.ts", () => { }); }); - describe("Array in body generation", () => { + describe("array as request body", () => { it("unknown array request generation", async () => { const parameters = await emitParameterFromCadl(` @post op read(@body body: unknown[]): void; @@ -533,7 +594,7 @@ describe("Parameters.ts", () => { }); }); - describe("Dictionary in body generation", () => { + describe("dictionary as request body", () => { it("Simple model dictionary request generation", async () => { const parameters = await emitParameterFromCadl(` model SimpleModel {