From 2885991f0ae5d49c9943184fa12fdc49f4873236 Mon Sep 17 00:00:00 2001 From: jaxx2104 Date: Sun, 15 Mar 2026 21:11:50 +0900 Subject: [PATCH 1/2] fix: improve error message when createTester base directory lacks package.json Previously, createTester would throw a generic file-not-found error when the base directory did not contain a package.json. This adds a clear, actionable error message indicating that the first argument must be the library root directory. --- packages/compiler/src/testing/tester.ts | 11 ++++++++++- .../test/testing/tester-library-discovery.test.ts | 13 ++++++++++++- 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/packages/compiler/src/testing/tester.ts b/packages/compiler/src/testing/tester.ts index dd50e0082a1..50474fb1dde 100644 --- a/packages/compiler/src/testing/tester.ts +++ b/packages/compiler/src/testing/tester.ts @@ -72,7 +72,16 @@ async function createTesterFs(base: string, options: TesterOptions) { }; const sl = await createSourceLoader(host); - const selfName = JSON.parse((await host.readFile(resolvePath(base, "package.json"))).text).name; + const packageJsonPath = resolvePath(base, "package.json"); + let packageJsonContent: string; + try { + packageJsonContent = (await host.readFile(packageJsonPath)).text; + } catch (e) { + throw new Error( + `createTester failed to read '${packageJsonPath}'. The first argument to createTester must be the library root directory containing a package.json. Got: '${base}'`, + ); + } + const selfName = JSON.parse(packageJsonContent).name; const moduleHost: ResolveModuleHost = { realpath: async (x) => x, stat: host.stat, diff --git a/packages/compiler/test/testing/tester-library-discovery.test.ts b/packages/compiler/test/testing/tester-library-discovery.test.ts index 14c5cf01ddd..a63faee6c5a 100644 --- a/packages/compiler/test/testing/tester-library-discovery.test.ts +++ b/packages/compiler/test/testing/tester-library-discovery.test.ts @@ -1,4 +1,4 @@ -import { it } from "vitest"; +import { expect, it } from "vitest"; import { CompilerHost } from "../../src/core/types.js"; import { createTestFileSystem, mockFile } from "../../src/testing/fs.js"; import { resolveVirtualPath } from "../../src/testing/test-utils.js"; @@ -50,3 +50,14 @@ it("subpath typespec export get added to the test host", async () => { }); await Tester.compile(`import "mylib/subpath";`); }); + +it("throws a clear error when base does not contain a package.json", async () => { + const fs = mkFs({}); + const Tester = createTester(resolveVirtualPath("not-a-library-root"), { + host: fs, + libraries: [], + }); + await expect(Tester.compile(``)).rejects.toThrowError( + /createTester failed to read.*package\.json.*first argument to createTester must be the library root/, + ); +}); From db8652ac824b96bfd5d08c339ece88b662a36da7 Mon Sep 17 00:00:00 2001 From: jaxx2104 Date: Sun, 15 Mar 2026 21:13:38 +0900 Subject: [PATCH 2/2] chore: add changeset for createTester error message fix --- .../changes/fix-create-tester-error-message-2026-03-15.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .chronus/changes/fix-create-tester-error-message-2026-03-15.md diff --git a/.chronus/changes/fix-create-tester-error-message-2026-03-15.md b/.chronus/changes/fix-create-tester-error-message-2026-03-15.md new file mode 100644 index 00000000000..2111da50d53 --- /dev/null +++ b/.chronus/changes/fix-create-tester-error-message-2026-03-15.md @@ -0,0 +1,7 @@ +--- +changeKind: fix +packages: + - "@typespec/compiler" +--- + +Improve error message when `createTester` base directory does not contain a package.json