From ce07e4e24b1d1d80f256876ab6823853bbb207ce Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 18:50:21 +0000 Subject: [PATCH 1/2] Initial plan From 7bc98036127348eebae32a63566a34e7f3c3d90a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 25 Mar 2026 19:17:09 +0000 Subject: [PATCH 2/2] fix: ensure output directory exists before writing files in http-client-csharp emitter Add mkdirp calls to writeCodeModel and writeConfiguration to create the output directory before writing files, preventing ENOENT errors when the output directory does not exist. This follows the same pattern as the compiler's emitFile utility. Co-authored-by: JoshLove-msft <54595583+JoshLove-msft@users.noreply.github.com> Agent-Logs-Url: https://github.com/microsoft/typespec/sessions/9fd1ce42-8ee7-4871-bcb0-b02cca563152 --- .../http-client-csharp/emitter/src/code-model-writer.ts | 2 ++ .../http-client-csharp/emitter/test/Unit/emitter.test.ts | 8 ++++++++ 2 files changed, 10 insertions(+) diff --git a/packages/http-client-csharp/emitter/src/code-model-writer.ts b/packages/http-client-csharp/emitter/src/code-model-writer.ts index 994d0bad2e7..5693d2bf253 100644 --- a/packages/http-client-csharp/emitter/src/code-model-writer.ts +++ b/packages/http-client-csharp/emitter/src/code-model-writer.ts @@ -20,6 +20,7 @@ export async function writeCodeModel( codeModel: CodeModel, outputFolder: string, ) { + await context.program.host.mkdirp(outputFolder); await context.program.host.writeFile( resolvePath(outputFolder, tspOutputFileName), prettierOutput(JSON.stringify(buildJson(context, codeModel), transformJSONProperties, 2)), @@ -104,6 +105,7 @@ export async function writeConfiguration( configurations: Configuration, outputFolder: string, ) { + await context.program.host.mkdirp(outputFolder); await context.program.host.writeFile( resolvePath(outputFolder, configurationFileName), prettierOutput(JSON.stringify(configurations, null, 2)), diff --git a/packages/http-client-csharp/emitter/test/Unit/emitter.test.ts b/packages/http-client-csharp/emitter/test/Unit/emitter.test.ts index 6755c79fde1..e9314af1a39 100644 --- a/packages/http-client-csharp/emitter/test/Unit/emitter.test.ts +++ b/packages/http-client-csharp/emitter/test/Unit/emitter.test.ts @@ -66,6 +66,7 @@ describe("$onEmit tests", () => { hasError: () => false, host: { writeFile: vi.fn(), + mkdirp: vi.fn(), rm: vi.fn(), }, tracer: { @@ -84,6 +85,13 @@ describe("$onEmit tests", () => { $onEmit = (await import("../../src/emitter.js")).$onEmit; }); + it("should ensure output folder exists before writing files", async () => { + const context: EmitContext = createEmitterContext(program); + await $onEmit(context); + // writeCodeModel and writeConfiguration each call mkdirp with the output folder + expect(program.host.mkdirp).toHaveBeenCalledWith(context.emitterOutputDir); + }); + it("should apply the update-code-model callback just once", async () => { const context: EmitContext = createEmitterContext(program); const updateCallback = vi.fn().mockImplementation((model: CodeModel) => {