diff --git a/.chronus/changes/fix-js-option-forwarding-2026-08-17.md b/.chronus/changes/fix-js-option-forwarding-2026-08-17.md new file mode 100644 index 0000000000..b72519b27c --- /dev/null +++ b/.chronus/changes/fix-js-option-forwarding-2026-08-17.md @@ -0,0 +1,8 @@ +--- +changeKind: fix +packages: + - "@azure-tools/typespec-ts" +--- + +Forward legacy headers, credential scopes, and logging options in modular clients, including a +deprecated package-local `credentialScopes` alias for clients that use OAuth scopes. diff --git a/packages/typespec-ts/src/modular/build-client-context.ts b/packages/typespec-ts/src/modular/build-client-context.ts index 91cdd3ca5e..aa3c734494 100644 --- a/packages/typespec-ts/src/modular/build-client-context.ts +++ b/packages/typespec-ts/src/modular/build-client-context.ts @@ -135,6 +135,17 @@ export function buildClientContext( docs: getDocsWithKnownVersion(dpgContext, p), }; }); + if ( + emitterOptions.options.addCredentials && + emitterOptions.options.credentialScopes !== undefined + ) { + propertiesInOptions.push({ + name: "credentialScopes", + type: "string | string[]", + hasQuestionToken: true, + docs: ["@deprecated Use `credentials.scopes` instead."], + }); + } if (dpgContext.arm) { propertiesInOptions.push({ name: "cloudSetting", diff --git a/packages/typespec-ts/src/modular/helpers/client-helpers.ts b/packages/typespec-ts/src/modular/helpers/client-helpers.ts index 369c350743..59fdc61e7d 100644 --- a/packages/typespec-ts/src/modular/helpers/client-helpers.ts +++ b/packages/typespec-ts/src/modular/helpers/client-helpers.ts @@ -298,7 +298,9 @@ function buildCredentials( const scopesString = credentialScopes ? credentialScopes.map((cs) => `"${cs}"`).join(", ") || `\`\${${endpointParam}}/.default\`` : ""; - const scopes = scopesString ? `scopes: options.credentials?.scopes ?? [${scopesString}],` : ""; + const scopes = scopesString + ? `scopes: options.credentials?.scopes ?? (typeof options.credentialScopes === "string" ? [options.credentialScopes] : options.credentialScopes) ?? [${scopesString}],` + : ""; const apiKeyHeaderName = credentialKeyHeaderName ? `apiKeyHeaderName: options.credentials?.apiKeyHeaderName ?? "${credentialKeyHeaderName}",` @@ -312,7 +314,7 @@ function buildCredentials( } function buildLoggingOptions(): string | undefined { - return `{ logger: options.loggingOptions?.logger ?? logger.info }`; + return `{ ...options.loggingOptions, logger: options.loggingOptions?.logger ?? logger.info }`; } /** diff --git a/packages/typespec-ts/src/modular/helpers/operation-helpers.ts b/packages/typespec-ts/src/modular/helpers/operation-helpers.ts index 5de6b9629c..4aa550a68b 100644 --- a/packages/typespec-ts/src/modular/helpers/operation-helpers.ts +++ b/packages/typespec-ts/src/modular/helpers/operation-helpers.ts @@ -126,6 +126,7 @@ export function getSendPrivateFunction( const operationMethod = operation.operation.verb.toLowerCase(); const optionalParamName = getOptionalParamsName(parameters); const statements: string[] = []; + const parameterNames = new Set(parameters.map((p) => p.name)); let pathStr = `"${operationPath}"`; const urlTemplateParams = [ ...getPathParameters(operation), @@ -133,8 +134,7 @@ export function getSendPrivateFunction( ]; if (urlTemplateParams.length > 0) { // Generate a unique local variable name that doesn't conflict with parameter names - const paramNames = new Set(parameters.map((p) => p.name)); - const pathVarName = generateLocallyUniqueName("path", paramNames); + const pathVarName = generateLocallyUniqueName("path", parameterNames); const includeRootSlash = client ? getClientOptions(client, "includeRootSlash") !== false : true; const uriTemplate = includeRootSlash @@ -149,12 +149,26 @@ export function getSendPrivateFunction( pathStr = pathVarName; } + const requestParametersName = generateLocallyUniqueName("requestParameters", parameterNames); + const headerAndBodyParameters = getHeaderAndBodyParameters( + dpgContext, + operation, + optionalParamName, + requestParametersName, + ); + const operationOptionsExpression = `${resolveReference( + dependencies.operationOptionsToRequestParameters, + )}(${optionalParamName})`; + const requestParametersExpression = headerAndBodyParameters.hasHeaders + ? requestParametersName + : operationOptionsExpression; + + if (headerAndBodyParameters.hasHeaders) { + statements.push(`const ${requestParametersName} = ${operationOptionsExpression};`); + } + statements.push( - `return context.path(${pathStr}).${operationMethod}({...${resolveReference(dependencies.operationOptionsToRequestParameters)}(${optionalParamName}), ${getHeaderAndBodyParameters( - dpgContext, - operation, - optionalParamName, - )}});`, + `return context.path(${pathStr}).${operationMethod}({...${requestParametersExpression}, ${headerAndBodyParameters.value}});`, ); return { @@ -1413,9 +1427,10 @@ function getHeaderAndBodyParameters( dpgContext: SdkContext, operation: ServiceOperation, optionalParamName: string = "options", -): string { + requestParametersName: string = "requestParameters", +): { value: string; hasHeaders: boolean } { if (!operation.operation.parameters) { - return ""; + return { value: "", hasHeaders: false }; } const operationParameters = operation.operation.parameters.filter((p) => !isContentType(p)); @@ -1464,7 +1479,7 @@ function getHeaderAndBodyParameters( if (parametersImplementation.header.length) { paramStr = `${paramStr}\nheaders: {${parametersImplementation.header .map((i) => buildHeaderParameter(dpgContext.program, i.paramMap, i.param, i.paramAccessor)) - .join(",\n")}, ...${optionalParamName}.requestOptions?.headers },`; + .join(",\n")}, ...${requestParametersName}.headers },`; } if (operation.operation.bodyParam === undefined && parametersImplementation.body.length) { paramStr = `${paramStr}\nbody: {${parametersImplementation.body @@ -1473,7 +1488,7 @@ function getHeaderAndBodyParameters( } else if (operation.operation.bodyParam !== undefined) { paramStr = `${paramStr}${buildBodyParameter(dpgContext, operation.operation.bodyParam)}`; } - return paramStr; + return { value: paramStr, hasHeaders: parametersImplementation.header.length > 0 }; } // Specially handle the type for headers because we only allow string/number/boolean values diff --git a/packages/typespec-ts/test/azure-modular-integration/generated/authentication/oauth2/src/index.d.ts b/packages/typespec-ts/test/azure-modular-integration/generated/authentication/oauth2/src/index.d.ts index 9a0b3a4b40..a794aee7d3 100644 --- a/packages/typespec-ts/test/azure-modular-integration/generated/authentication/oauth2/src/index.d.ts +++ b/packages/typespec-ts/test/azure-modular-integration/generated/authentication/oauth2/src/index.d.ts @@ -23,6 +23,7 @@ export declare class OAuth2Client { } export declare interface OAuth2ClientOptionalParams extends ClientOptions { + credentialScopes?: string | string[]; } export { RestError } diff --git a/packages/typespec-ts/test/azure-modular-integration/generated/authentication/union/src/index.d.ts b/packages/typespec-ts/test/azure-modular-integration/generated/authentication/union/src/index.d.ts index 980ee6e5bf..82a3ee0ca8 100644 --- a/packages/typespec-ts/test/azure-modular-integration/generated/authentication/union/src/index.d.ts +++ b/packages/typespec-ts/test/azure-modular-integration/generated/authentication/union/src/index.d.ts @@ -19,6 +19,7 @@ export declare class UnionClient { } export declare interface UnionClientOptionalParams extends ClientOptions { + credentialScopes?: string | string[]; } export declare interface ValidKeyOptionalParams extends OperationOptions { diff --git a/packages/typespec-ts/test/modular-unit/client-options.test.ts b/packages/typespec-ts/test/modular-unit/client-options.test.ts new file mode 100644 index 0000000000..20be8f0e7c --- /dev/null +++ b/packages/typespec-ts/test/modular-unit/client-options.test.ts @@ -0,0 +1,120 @@ +import { afterAll, assert, describe, it } from "vitest"; + +import { Project } from "ts-morph"; +import { buildGetClientOptionsParam } from "../../src/modular/helpers/client-helpers.js"; +import type { ModularEmitterOptions } from "../../src/modular/interfaces.js"; +import { + emitModularClientContextFromTypeSpec, + emitModularOperationsFromTypeSpec, +} from "../util/emit-util.js"; +import { clearCompileCache } from "../util/test-util.js"; + +afterAll(clearCompileCache); + +describe("client option forwarding", () => { + const credentialSpec = ` + import "@typespec/http"; + import "@typespec/rest"; + import "@azure-tools/typespec-azure-core"; + + using TypeSpec.Http; + using TypeSpec.Rest; + using Azure.Core; + + @useAuth( + OAuth2Auth<[ + { + type: OAuth2FlowType.implicit, + authorizationUrl: "https://login.microsoftonline.com/common/oauth2/authorize", + scopes: ["https://example.com/.default"], + } + ]> + ) + @service(#{ title: "ScopeClient" }) + @server("{endpoint}", "Service endpoint", { endpoint: url }) + namespace ScopeService; + + @route("/read") + @get + op read(): void; + `; + + it("merges normalized operation headers with generated service headers", async () => { + const result = await emitModularOperationsFromTypeSpec(` + @route("/read") + @get + op read(@header("x-service-header") serviceHeader: string): void; + `); + const text = result![0]!.getFullText(); + + assert.include(text, "const requestParameters = operationOptionsToRequestParameters(options);"); + assert.include(text, '"x-service-header": serviceHeader'); + // The core helper folds deprecated customHeaders into this normalized headers bag. + assert.include(text, "...requestParameters.headers"); + assert.notInclude(text, "...options.requestOptions?.headers"); + }); + + it("normalizes legacy credential scopes after current credential options", () => { + const text = emitGetClientOptions(); + const currentScopes = text.indexOf("options.credentials?.scopes"); + const legacyStringScopes = text.indexOf('typeof options.credentialScopes === "string"'); + const legacyArrayScopes = text.indexOf(": options.credentialScopes"); + const generatedScopes = text.indexOf('"https://example.com/.default"'); + + assert.isAtLeast(currentScopes, 0); + assert.isAbove(legacyStringScopes, currentScopes); + assert.include(text, "? [options.credentialScopes]"); + assert.isAbove(legacyArrayScopes, legacyStringScopes); + assert.isAbove(generatedScopes, legacyArrayScopes); + }); + + it("declares the deprecated credential scopes alias on scoped client options only", async () => { + const scopedResult = await emitModularClientContextFromTypeSpec(credentialSpec, { + "add-credentials": true, + "credential-scopes": ["https://example.com/.default"], + }); + const scopedText = scopedResult!.getFullText(); + + assert.include( + scopedText, + "export interface ScopeServiceClientOptionalParams extends ClientOptions", + ); + assert.include(scopedText, "@deprecated Use `credentials.scopes` instead."); + assert.include(scopedText, "credentialScopes?: string | string[];"); + + const unscopedResult = await emitModularClientContextFromTypeSpec(` + @route("/read") + @get + op read(): void; + `); + assert.notInclude(unscopedResult!.getFullText(), "credentialScopes"); + }); + + it("preserves logging header and query allowlists while defaulting the logger", () => { + const text = emitGetClientOptions(); + + assert.include( + text, + "loggingOptions: { ...options.loggingOptions, logger: options.loggingOptions?.logger ?? logger.info }", + ); + }); +}); + +function emitGetClientOptions(): string { + const project = new Project({ useInMemoryFileSystem: true }); + const factory = project.createSourceFile("client.ts").addFunction({ name: "createClient" }); + const emitterOptions: ModularEmitterOptions = { + options: { + addCredentials: true, + credentialScopes: ["https://example.com/.default"], + }, + modularOptions: { + sourceRoot: "", + compatibilityMode: false, + experimentalExtensibleEnums: false, + }, + }; + + buildGetClientOptionsParam(factory, emitterOptions, "endpoint"); + return factory.getText(); +} diff --git a/packages/typespec-ts/test/modular-unit/scenarios/anonymous/anonymous.md b/packages/typespec-ts/test/modular-unit/scenarios/anonymous/anonymous.md index 8682671e94..746bcb30ab 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/anonymous/anonymous.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/anonymous/anonymous.md @@ -892,9 +892,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -962,9 +963,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -1049,9 +1051,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -1209,9 +1212,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -1424,9 +1428,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/api-operations/apiOperations.md b/packages/typespec-ts/test/modular-unit/scenarios/api-operations/apiOperations.md index 4076c937d8..5b0fe827f6 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/api-operations/apiOperations.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/api-operations/apiOperations.md @@ -321,9 +321,10 @@ export function _downloadFileSend( context: Client, options: DownloadFileOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/downloadFile").post({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/octet-stream", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/octet-stream", ...requestParameters.headers }, }); } @@ -378,9 +379,10 @@ export function _downloadFileSend( context: Client, options: DownloadFileOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/downloadFile").post({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/octet-stream", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/octet-stream", ...requestParameters.headers }, }); } @@ -500,9 +502,10 @@ export function _testSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "text/plain", ...requestParameters.headers }, }); } @@ -542,7 +545,10 @@ export function createTesting( const endpointUrl = options.endpoint ?? String(endpointParam); const { apiVersion: _, ...updatedOptions } = { ...options, - loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + loggingOptions: { + ...options.loggingOptions, + logger: options.loggingOptions?.logger ?? logger.info, + }, }; const clientContext = getClient(endpointUrl, undefined, updatedOptions); @@ -628,9 +634,10 @@ export function _testSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "text/plain", ...requestParameters.headers }, }); } @@ -670,7 +677,10 @@ export function createTesting( const endpointUrl = options.endpoint ?? String(endpointParam); const { apiVersion: _, ...updatedOptions } = { ...options, - loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + loggingOptions: { + ...options.loggingOptions, + logger: options.loggingOptions?.logger ?? logger.info, + }, }; const clientContext = getClient(endpointUrl, undefined, updatedOptions); @@ -740,9 +750,10 @@ export function _test1Send( context: Client, options: Test1OptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/test1").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "text/plain", ...requestParameters.headers }, }); } @@ -776,9 +787,10 @@ export function _testSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "text/plain", ...requestParameters.headers }, }); } @@ -818,7 +830,10 @@ export function createTesting( const endpointUrl = options.endpoint ?? String(endpointParam); const { apiVersion: _, ...updatedOptions } = { ...options, - loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + loggingOptions: { + ...options.loggingOptions, + logger: options.loggingOptions?.logger ?? logger.info, + }, }; const clientContext = getClient(endpointUrl, undefined, updatedOptions); @@ -1057,9 +1072,10 @@ export function _listSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/api-operations/azureCoreOperations.md b/packages/typespec-ts/test/modular-unit/scenarios/api-operations/azureCoreOperations.md index 2661f00223..c995dcb30a 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/api-operations/azureCoreOperations.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/api-operations/azureCoreOperations.md @@ -83,9 +83,10 @@ export function _getWidgetOperationStatusSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/api-operations/reservedWordOperations.md b/packages/typespec-ts/test/modular-unit/scenarios/api-operations/reservedWordOperations.md index 2287b92008..a810a0a5ce 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/api-operations/reservedWordOperations.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/api-operations/reservedWordOperations.md @@ -26,9 +26,10 @@ export function _$continueSend( context: Client, options: ContinueOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -82,9 +83,10 @@ export function _$returnSend( context: Client, options: ReturnOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -138,9 +140,10 @@ export function _globalSend( context: Client, options: GlobalOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/client-context/clientContext.md b/packages/typespec-ts/test/modular-unit/scenarios/client-context/clientContext.md index 11f56bae3e..2a341e1668 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/client-context/clientContext.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/client-context/clientContext.md @@ -79,7 +79,10 @@ export function createService( const endpointUrl = options.endpoint ?? `${endpointParam}/client/structure/${clientParam}`; const { apiVersion: _, ...updatedOptions } = { ...options, - loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + loggingOptions: { + ...options.loggingOptions, + logger: options.loggingOptions?.logger ?? logger.info, + }, }; const clientContext = getClient(endpointUrl, undefined, updatedOptions); @@ -173,7 +176,10 @@ export function createService(options: ServiceClientOptionalParams = {}): Servic const endpointUrl = options.endpoint ?? `${endpointParam}/client/structure/${clientParam}`; const { apiVersion: _, ...updatedOptions } = { ...options, - loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + loggingOptions: { + ...options.loggingOptions, + logger: options.loggingOptions?.logger ?? logger.info, + }, }; const clientContext = getClient(endpointUrl, undefined, updatedOptions); @@ -269,7 +275,10 @@ export function createTestService( const endpointUrl = options.endpoint ?? `${endpointParam}/client/structure/${clientParam}`; const { apiVersion: _, ...updatedOptions } = { ...options, - loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + loggingOptions: { + ...options.loggingOptions, + logger: options.loggingOptions?.logger ?? logger.info, + }, }; const clientContext = getClient(endpointUrl, undefined, updatedOptions); diff --git a/packages/typespec-ts/test/modular-unit/scenarios/client-context/optionalApiVersion.md b/packages/typespec-ts/test/modular-unit/scenarios/client-context/optionalApiVersion.md index 5cad458555..17bff8af45 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/client-context/optionalApiVersion.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/client-context/optionalApiVersion.md @@ -78,7 +78,10 @@ export function createDataMapService( const endpointUrl = options.endpoint ?? String(endpointParam); const { apiVersion: _, ...updatedOptions } = { ...options, - loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + loggingOptions: { + ...options.loggingOptions, + logger: options.loggingOptions?.logger ?? logger.info, + }, }; const clientContext = getClient(endpointUrl, undefined, updatedOptions); const apiVersion = options.apiVersion; diff --git a/packages/typespec-ts/test/modular-unit/scenarios/enum-union/enumUnion.md b/packages/typespec-ts/test/modular-unit/scenarios/enum-union/enumUnion.md index 62ff12bfba..5193423843 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/enum-union/enumUnion.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/enum-union/enumUnion.md @@ -528,10 +528,11 @@ export function _getSend( body: string, options: GetOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "text/plain", - headers: { "test-header": testHeader, ...options.requestOptions?.headers }, + headers: { "test-header": testHeader, ...requestParameters.headers }, body: body, }); } @@ -609,10 +610,11 @@ export function _getSend( body: string, options: GetOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "text/plain", - headers: { "test-header": testHeader, ...options.requestOptions?.headers }, + headers: { "test-header": testHeader, ...requestParameters.headers }, body: body, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/example/example.md b/packages/typespec-ts/test/modular-unit/scenarios/example/example.md index e985e6bf9a..c32c117c00 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/example/example.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/example/example.md @@ -116,9 +116,10 @@ export function _readSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/models-generator/modelsGenerator.md b/packages/typespec-ts/test/modular-unit/scenarios/models-generator/modelsGenerator.md index 10dfac7677..fdb4289651 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/models-generator/modelsGenerator.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/models-generator/modelsGenerator.md @@ -453,10 +453,11 @@ export function _readSend( body: Foo, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: fooSerializer(body), }); } @@ -504,9 +505,10 @@ export function _readSend( prop: Date, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { prop: prop.toUTCString(), ...options.requestOptions?.headers }, + ...requestParameters, + headers: { prop: prop.toUTCString(), ...requestParameters.headers }, }); } @@ -587,10 +589,11 @@ export function _readSend( body: Foo, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: fooSerializer(body), }); } @@ -672,10 +675,11 @@ export function _readSend( body: Foo, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: fooSerializer(body), }); } @@ -753,10 +757,11 @@ export function _readSend( body: Foo, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: fooSerializer(body), }); } @@ -825,10 +830,11 @@ export function _readSend( body: Foo, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: fooSerializer(body), }); } @@ -898,10 +904,11 @@ export function _readSend( body: Foo, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: fooSerializer(body), }); } @@ -975,10 +982,11 @@ export function _readSend( body: Foo, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: fooSerializer(body), }); } @@ -1062,10 +1070,11 @@ export function _readSend( body: Foo, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: fooSerializer(body), }); } @@ -1150,10 +1159,11 @@ export function _readSend( body: Foo, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: fooSerializer(body), }); } @@ -1238,10 +1248,11 @@ export function _readSend( body: Foo, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: fooSerializer(body), }); } @@ -1423,9 +1434,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -1531,9 +1543,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -1667,10 +1680,11 @@ export function _readSend( body: PSDog, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: psDogSerializer(body), }); } @@ -1805,9 +1819,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -1984,9 +1999,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -2078,9 +2094,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -2303,10 +2320,11 @@ export function _getSend( body: string, options: GetOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "text/plain", - headers: { "test-header": testHeader, ...options.requestOptions?.headers }, + headers: { "test-header": testHeader, ...requestParameters.headers }, body: body, }); } @@ -2880,10 +2898,11 @@ export function _readSend( body: Client_1, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: clientSerializer(body), }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/models/api-version/apiVersionAsFixedEnum.md b/packages/typespec-ts/test/modular-unit/scenarios/models/api-version/apiVersionAsFixedEnum.md index 0f71f13abf..9f5100c6a1 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/models/api-version/apiVersionAsFixedEnum.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/models/api-version/apiVersionAsFixedEnum.md @@ -65,11 +65,12 @@ export function _fooSend( context: Client, options: FooOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, headers: { "api-version": context.apiVersion ?? "2021-10-01-preview", - ...options.requestOptions?.headers, + ...requestParameters.headers, }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/models/azureCoreErrorModels.md b/packages/typespec-ts/test/modular-unit/scenarios/models/azureCoreErrorModels.md index 8b5f50633d..ed6e8e26d2 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/models/azureCoreErrorModels.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/models/azureCoreErrorModels.md @@ -396,10 +396,11 @@ export function _createOrUpdateSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).put({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: avsSummarySerializer(resource), }); } @@ -450,9 +451,10 @@ export function _listSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/models/missingErrorResponseModel.md b/packages/typespec-ts/test/modular-unit/scenarios/models/missingErrorResponseModel.md index 3bb104414c..bc740b53fd 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/models/missingErrorResponseModel.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/models/missingErrorResponseModel.md @@ -115,9 +115,10 @@ export function _getAssetChainSummarySend( context: Client, options: GetAssetChainSummaryOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/assetChainSummary").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/models/models.md b/packages/typespec-ts/test/modular-unit/scenarios/models/models.md index 022f269322..af6a5d3674 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/models/models.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/models/models.md @@ -79,10 +79,11 @@ export function _readSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: streamingChatCompletionOptionsSerializer(body), }); } @@ -145,10 +146,11 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + headers: { accept: "text/plain", ...requestParameters.headers }, body: { stream: true, messages: "aaaaa", index: 123 }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/models/nullable/nullableUnion.md b/packages/typespec-ts/test/modular-unit/scenarios/models/nullable/nullableUnion.md index 612d2c8e93..3867197660 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/models/nullable/nullableUnion.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/models/nullable/nullableUnion.md @@ -74,10 +74,11 @@ export function _postSend( body: A, options: PostOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: !body ? body : _postRequestSerializer(body), }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/models/response/headerCollectionPrefixRequiredSkipSignature.md b/packages/typespec-ts/test/modular-unit/scenarios/models/response/headerCollectionPrefixRequiredSkipSignature.md index 77e9e3edf9..e047d1ec81 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/models/response/headerCollectionPrefixRequiredSkipSignature.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/models/response/headerCollectionPrefixRequiredSkipSignature.md @@ -65,12 +65,13 @@ export function _getBlobSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, headers: { ...(options?.requestId !== undefined ? { "x-ms-request-id": options?.requestId } : {}), accept: "application/json", - ...options.requestOptions?.headers, + ...requestParameters.headers, }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/models/response/headerCollectionPrefixSkipSerialization.md b/packages/typespec-ts/test/modular-unit/scenarios/models/response/headerCollectionPrefixSkipSerialization.md index 80fc2f449d..bf55fb9caf 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/models/response/headerCollectionPrefixSkipSerialization.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/models/response/headerCollectionPrefixSkipSerialization.md @@ -82,12 +82,13 @@ export function _getBlobSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, headers: { ...(options?.requestId !== undefined ? { "x-ms-request-id": options?.requestId } : {}), accept: "application/json", - ...options.requestOptions?.headers, + ...requestParameters.headers, }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/models/treatUnknownAsRecord.md b/packages/typespec-ts/test/modular-unit/scenarios/models/treatUnknownAsRecord.md index 6cdb621b1e..64ede7f8a3 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/models/treatUnknownAsRecord.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/models/treatUnknownAsRecord.md @@ -101,9 +101,10 @@ export function _getAnySend( context: Client, options: GetAnyOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/any").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/armPatchWithUnionResponse.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/armPatchWithUnionResponse.md index 5f0c153599..3a099f2d54 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/armPatchWithUnionResponse.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/armPatchWithUnionResponse.md @@ -97,10 +97,11 @@ export function _updateSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).patch({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: partnerTopicUpdateParametersSerializer(properties), }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/body-param/bytesWithDifferentContentType.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/body-param/bytesWithDifferentContentType.md index c1eddde983..eb07a8c6c4 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/body-param/bytesWithDifferentContentType.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/body-param/bytesWithDifferentContentType.md @@ -36,10 +36,11 @@ export function _uploadFileSend( body: string, options: UploadFileOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "text/plain", - headers: { accept: "*/*", ...options.requestOptions?.headers }, + headers: { accept: "*/*", ...requestParameters.headers }, body: body, }); } @@ -128,10 +129,11 @@ export function _uploadFileSend( body: Uint8Array, options: UploadFileOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/octet-stream", - headers: { accept: "application/xml", ...options.requestOptions?.headers }, + headers: { accept: "application/xml", ...requestParameters.headers }, body: body, }); } @@ -221,10 +223,11 @@ export function _uploadFileSend( body: Uint8Array, options: UploadFileOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/octet-stream", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: body, }); } @@ -314,10 +317,11 @@ export function _uploadFileSend( body: Uint8Array, options: UploadFileOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/octet-stream", - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + headers: { accept: "text/plain", ...requestParameters.headers }, body: body, }); } @@ -403,10 +407,11 @@ export function _uploadFileSend( body: Uint8Array, options: UploadFileOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/octet-stream", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: body, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/bodyMetadataExtraction.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/bodyMetadataExtraction.md index 8cb02bbed3..29caf45471 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/bodyMetadataExtraction.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/bodyMetadataExtraction.md @@ -68,10 +68,11 @@ export function _bodyRootWithHeaderSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { foo: body.foo, ...options.requestOptions?.headers }, + headers: { foo: body.foo, ...requestParameters.headers }, body: requestBodySerializer(body), }); } @@ -256,12 +257,13 @@ export function _bodyRootWithOptionalHeaderSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", headers: { ...(body.foo !== undefined ? { foo: body.foo } : {}), - ...options.requestOptions?.headers, + ...requestParameters.headers, }, body: optionalHeaderBodySerializer(body), }); @@ -449,12 +451,13 @@ export function _createOptionalPathResourceSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", headers: { ...(options?.body?.foo !== undefined ? { foo: options?.body?.foo } : {}), - ...options.requestOptions?.headers, + ...requestParameters.headers, }, body: { body: !options?.body ? options?.body : optionalBodyWithHeaderSerializer(options?.body), diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/clientDefaultValue.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/clientDefaultValue.md index 65ff41c94e..57d44211c5 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/clientDefaultValue.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/clientDefaultValue.md @@ -74,10 +74,11 @@ export function _createSend( context: Client, options: CreateOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/api/create").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "text/plain", - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + headers: { accept: "text/plain", ...requestParameters.headers }, body: options?.body ?? "default-body", }); } @@ -115,12 +116,13 @@ export function _testQuerySend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, headers: { "custom-header": options?.customHeader ?? "application/json", accept: "application/json", - ...options.requestOptions?.headers, + ...requestParameters.headers, }, }); } @@ -201,10 +203,11 @@ export function _createRequiredSend( body: string, options: CreateRequiredOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/api/createRequired").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "text/plain", - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + headers: { accept: "text/plain", ...requestParameters.headers }, body: body, }); } @@ -243,12 +246,13 @@ export function _testRequiredSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, headers: { "custom-header": customHeader, accept: "application/json", - ...options.requestOptions?.headers, + ...requestParameters.headers, }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/cookie-param/ignoreCookieParam.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/cookie-param/ignoreCookieParam.md index d745a03e9a..00673f4af2 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/cookie-param/ignoreCookieParam.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/cookie-param/ignoreCookieParam.md @@ -36,9 +36,10 @@ export function _testSend( context: Client, options: TestOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "text/plain", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/deserializeEmptyBody.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/deserializeEmptyBody.md index 2729daa372..bc6dd9cd8a 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/deserializeEmptyBody.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/deserializeEmptyBody.md @@ -52,9 +52,10 @@ export function _deleteKeyValueSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).delete({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -134,9 +135,10 @@ export function _getResourceSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -224,9 +226,10 @@ export function _deleteKeyValueSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).delete({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/error-deserialization/xmlErrorDeserialization.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/error-deserialization/xmlErrorDeserialization.md index abd6f497ad..afc815ab3d 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/error-deserialization/xmlErrorDeserialization.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/error-deserialization/xmlErrorDeserialization.md @@ -51,9 +51,10 @@ export function _getWidgetSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -148,9 +149,10 @@ export function _getDocumentSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json, application/xml", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json, application/xml", ...requestParameters.headers }, }); } @@ -251,9 +253,10 @@ export function _getItemSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/header-param/headerParamWithClientInitialization.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/header-param/headerParamWithClientInitialization.md index 36cd3c638a..12f63e6f30 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/header-param/headerParamWithClientInitialization.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/header-param/headerParamWithClientInitialization.md @@ -130,7 +130,10 @@ export function createBillingBenefits( const endpointUrl = options.endpoint ?? String(endpointParam); const { apiVersion: _, ...updatedOptions } = { ...options, - loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + loggingOptions: { + ...options.loggingOptions, + logger: options.loggingOptions?.logger ?? logger.info, + }, }; const clientContext = getClient(endpointUrl, undefined, updatedOptions); @@ -183,12 +186,13 @@ export function _getSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, headers: { ...(context.expand !== undefined ? { $expand: context.expand } : {}), accept: "application/json", - ...options.requestOptions?.headers, + ...requestParameters.headers, }, }); } @@ -359,7 +363,10 @@ export function createBillingBenefits( const endpointUrl = options.endpoint ?? String(endpointParam); const { apiVersion: _, ...updatedOptions } = { ...options, - loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + loggingOptions: { + ...options.loggingOptions, + logger: options.loggingOptions?.logger ?? logger.info, + }, }; const clientContext = getClient(endpointUrl, undefined, updatedOptions); @@ -412,12 +419,13 @@ export function _getSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, headers: { ...(context.expand !== undefined ? { $expand: context.expand } : {}), accept: "application/json", - ...options.requestOptions?.headers, + ...requestParameters.headers, }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/header-param/optionalConstantHeaderParam.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/header-param/optionalConstantHeaderParam.md index 70d613d770..2047d76762 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/header-param/optionalConstantHeaderParam.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/header-param/optionalConstantHeaderParam.md @@ -28,8 +28,9 @@ export function _readSend( parameters: string, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "text/plain", headers: { "required-header": "requiredValue", @@ -41,7 +42,7 @@ export function _readSend( ...(options?.optionalStringHeader !== undefined ? { "optional-string-header": options?.optionalStringHeader } : {}), - ...options.requestOptions?.headers, + ...requestParameters.headers, }, body: parameters, }); diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/lroPaging.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/lroPaging.md index 91190f977e..84cb3abae7 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/lroPaging.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/lroPaging.md @@ -313,9 +313,10 @@ export function _suspendSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).post({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/operations.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/operations.md index 43f53b9f89..fd29aad5a9 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/operations.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/operations.md @@ -151,8 +151,9 @@ export function _readSend( prop2: number, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", headers: { "required-header": requiredHeader, @@ -195,7 +196,7 @@ export function _readSend( : options?.nullableDateHeader.toUTCString(), } : {}), - ...options.requestOptions?.headers, + ...requestParameters.headers, }, body: { prop1: prop1, prop2: prop2 }, }); @@ -266,11 +267,12 @@ export function _readSend( nullableRequiredHeader: string | null, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, headers: { "nullable-required-header": nullableRequiredHeader, - ...options.requestOptions?.headers, + ...requestParameters.headers, }, }); } @@ -434,9 +436,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -494,10 +497,11 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: !options?.bars ? options?.bars : barArraySerializer(options?.bars), }); } @@ -615,9 +619,10 @@ export function _readSend( context: Client, options: ReadOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -685,9 +690,10 @@ export function _testSend( context: Client, options: TestOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -773,9 +779,10 @@ export function _testSend( context: Client, options: TestOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").post({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -875,9 +882,10 @@ export function _getSend( context: Client, options: GetOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -969,9 +977,10 @@ export function _getSend( context: Client, options: GetOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -1062,10 +1071,11 @@ export function _createOrUpdateEndpointSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: endpointSerializer(endpointParam), }); } @@ -1196,9 +1206,10 @@ export function _fooSend( context: Client, options: FooOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/list-post").post({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -1227,9 +1238,10 @@ export function _barSend( context: Client, options: BarOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/list-get").post({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/override.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/override.md index f35bdd6692..66253a2070 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/override.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/override.md @@ -301,11 +301,12 @@ export function _removeOptionalOriginalSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, headers: { ...(options?.param4 !== undefined ? { param4: options?.param4 } : {}), - ...options.requestOptions?.headers, + ...requestParameters.headers, }, }); } @@ -415,13 +416,14 @@ export function _changeOptionalityOriginalSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, headers: { ...(options?.requiredHeader !== undefined ? { "required-header": options?.requiredHeader } : {}), - ...options.requestOptions?.headers, + ...requestParameters.headers, }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/pagination/disablePagination.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/pagination/disablePagination.md index 13549be79b..5d2765be3e 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/pagination/disablePagination.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/pagination/disablePagination.md @@ -101,9 +101,10 @@ export function _fooSend( context: Client, options: FooOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/list-post").post({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -127,9 +128,10 @@ export function _barSend( context: Client, options: BarOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/list-get").post({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/path-param/pathParamUrlTemplate.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/path-param/pathParamUrlTemplate.md index 6aa3d2bd80..49594e683a 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/path-param/pathParamUrlTemplate.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/path-param/pathParamUrlTemplate.md @@ -79,10 +79,11 @@ export function _updateKeySend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).patch({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "text/plain", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: parameters, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/path-param/pathParameterNamedPath.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/path-param/pathParameterNamedPath.md index c998c291fb..6a0cabc2ca 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/path-param/pathParameterNamedPath.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/path-param/pathParameterNamedPath.md @@ -38,9 +38,10 @@ export function _getResultFileSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path_1).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "text/plain", ...requestParameters.headers }, }); } ``` diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/query-param/queryParamWithClientInitialization.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/query-param/queryParamWithClientInitialization.md index 86fa2fe1ba..cd7428f72a 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/query-param/queryParamWithClientInitialization.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/query-param/queryParamWithClientInitialization.md @@ -130,7 +130,10 @@ export function createBillingBenefits( const endpointUrl = options.endpoint ?? String(endpointParam); const { apiVersion: _, ...updatedOptions } = { ...options, - loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + loggingOptions: { + ...options.loggingOptions, + logger: options.loggingOptions?.logger ?? logger.info, + }, }; const clientContext = getClient(endpointUrl, undefined, updatedOptions); @@ -184,9 +187,10 @@ export function _getSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -356,7 +360,10 @@ export function createBillingBenefits( const endpointUrl = options.endpoint ?? String(endpointParam); const { apiVersion: _, ...updatedOptions } = { ...options, - loggingOptions: { logger: options.loggingOptions?.logger ?? logger.info }, + loggingOptions: { + ...options.loggingOptions, + logger: options.loggingOptions?.logger ?? logger.info, + }, }; const clientContext = getClient(endpointUrl, undefined, updatedOptions); @@ -410,9 +417,10 @@ export function _getSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/operations/wrapNonModelReturn.md b/packages/typespec-ts/test/modular-unit/scenarios/operations/wrapNonModelReturn.md index 7bd17b6436..47de69474a 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/operations/wrapNonModelReturn.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/operations/wrapNonModelReturn.md @@ -39,9 +39,10 @@ export function _getSend( context: Client, options: GetOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/dns").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "text/plain", ...requestParameters.headers }, }); } @@ -99,9 +100,10 @@ export function _listDomainsSend( context: Client, options: ListDomainsOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/domains").post({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -184,9 +186,10 @@ export function _getLogsSend( context: Client, options: GetLogsOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/logs").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/octet-stream", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/octet-stream", ...requestParameters.headers }, }); } @@ -244,9 +247,10 @@ export function _getSend( context: Client, options: GetOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/dns").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "text/plain", ...requestParameters.headers }, }); } @@ -306,9 +310,10 @@ export function _listSend( context: Client, options: ListOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/resources").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -366,9 +371,10 @@ export function _getModelSend( context: Client, options: GetModelOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/models").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -626,9 +632,10 @@ export function _getAnyObjectSend( context: Client, options: GetAnyObjectOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/anyObject").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -655,9 +662,10 @@ export function _getModelArraySend( context: Client, options: GetModelArrayOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/modelArray").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -712,9 +720,10 @@ export function _getAnySend( context: Client, options: GetAnyOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/any").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -739,9 +748,10 @@ export function _getStringArraySend( context: Client, options: GetStringArrayOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/stringArray").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "application/json", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "application/json", ...requestParameters.headers }, }); } @@ -772,9 +782,10 @@ export function _getBooleanSend( context: Client, options: GetBooleanOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/boolean").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "text/plain", ...requestParameters.headers }, }); } @@ -801,9 +812,10 @@ export function _getStringSend( context: Client, options: GetStringOptionalParams = { requestOptions: {} }, ): StreamableMethod { + const requestParameters = operationOptionsToRequestParameters(options); return context.path("/string").get({ - ...operationOptionsToRequestParameters(options), - headers: { accept: "text/plain", ...options.requestOptions?.headers }, + ...requestParameters, + headers: { accept: "text/plain", ...requestParameters.headers }, }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyOptionalCheck.md b/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyOptionalCheck.md index 7c07fc941e..d4625300f5 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyOptionalCheck.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyOptionalCheck.md @@ -104,10 +104,11 @@ export function _readSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: !options?.widget ? options?.widget : bodyParameterSerializer(options?.widget), }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyOptionalParameterName.md b/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyOptionalParameterName.md index 64c764abc8..ca52269102 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyOptionalParameterName.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyOptionalParameterName.md @@ -167,10 +167,11 @@ export function _backupSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: !options?.backupRequestProperties ? options?.backupRequestProperties : backupRequestPropertiesSerializer(options?.backupRequestProperties), diff --git a/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyReadonlyOptionalCheck.md b/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyReadonlyOptionalCheck.md index 03e9b293db..37fb0b75e2 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyReadonlyOptionalCheck.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/bodyReadonlyOptionalCheck.md @@ -115,10 +115,11 @@ export function _readSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", - headers: { accept: "application/json", ...options.requestOptions?.headers }, + headers: { accept: "application/json", ...requestParameters.headers }, body: bodyParameterSerializer(widget), }); } diff --git a/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/parameterNormalization.md b/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/parameterNormalization.md index 18b43b69a3..22119aa3ad 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/parameterNormalization.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/parameterNormalization.md @@ -76,12 +76,13 @@ export function _postSend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", headers: { ...(options?.headerParam !== undefined ? { header_param: options?.headerParam } : {}), - ...options.requestOptions?.headers, + ...requestParameters.headers, }, body: !options?.listCredentialsRequest ? options?.listCredentialsRequest diff --git a/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/parameterOrdering.md b/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/parameterOrdering.md index 4bc2f20e1a..829d161788 100644 --- a/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/parameterOrdering.md +++ b/packages/typespec-ts/test/modular-unit/scenarios/samples/parameters/parameterOrdering.md @@ -96,8 +96,9 @@ export function _verifySend( allowReserved: options?.requestOptions?.skipUrlEncoding, }, ); + const requestParameters = operationOptionsToRequestParameters(options); return context.path(path).post({ - ...operationOptionsToRequestParameters(options), + ...requestParameters, contentType: "application/json", headers: { ...(options?.clientRequestId !== undefined @@ -105,7 +106,7 @@ export function _verifySend( : {}), "apc-gateway-id": apcGatewayId, accept: "application/json", - ...options.requestOptions?.headers, + ...requestParameters.headers, }, body: testVerificationContentSerializer(body), }); diff --git a/packages/typespec-ts/test/util/emit-util.ts b/packages/typespec-ts/test/util/emit-util.ts index 3759aa0e16..7172d702b8 100644 --- a/packages/typespec-ts/test/util/emit-util.ts +++ b/packages/typespec-ts/test/util/emit-util.ts @@ -25,6 +25,7 @@ import { buildRootIndex } from "../../src/modular/build-root-index.js"; import { buildSubpathIndexFile } from "../../src/modular/build-subpath-index.js"; import { emitSamples } from "../../src/modular/emit-samples.js"; import { emitTests } from "../../src/modular/emit-tests.js"; +import { getCredentialInfo } from "../../src/transform/transform-client-options.js"; import { getClientHierarchyMap } from "../../src/utils/client-utils.js"; export interface ModelConfigOptions extends ClientOptions { @@ -254,6 +255,16 @@ export async function emitModularClientContextFromTypeSpec( withVersionedApiVersion: options.withVersionedApiVersion ? true : false, }); const dpgContext = await createDpgContextTestHelper(context.program); + Object.assign( + dpgContext.emitterOptions!, + getCredentialInfo(dpgContext.program, { + "add-credentials": options["add-credentials"], + "credential-scopes": options["credential-scopes"], + "credential-key-header-name": options["credential-key-header-name"], + "custom-http-auth-header-name": options["custom-http-auth-header-name"], + "custom-http-auth-shared-key-prefix": options["custom-http-auth-shared-key-prefix"], + }), + ); if (options.packageDetails) { dpgContext.emitterOptions!.packageDetails = options.packageDetails; }