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 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/, + ); +});