diff --git a/.changeset/fix-bun-object-workspaces.md b/.changeset/fix-bun-object-workspaces.md new file mode 100644 index 00000000..de9c5ee9 --- /dev/null +++ b/.changeset/fix-bun-object-workspaces.md @@ -0,0 +1,5 @@ +--- +"@manypkg/tools": patch +--- + +Support object-form workspaces in `BunTool` to handle `catalog` usage diff --git a/__fixtures__/basic-bun-object-workspaces/bun.lock b/__fixtures__/basic-bun-object-workspaces/bun.lock new file mode 100644 index 00000000..669d511a --- /dev/null +++ b/__fixtures__/basic-bun-object-workspaces/bun.lock @@ -0,0 +1,4 @@ +{ + "version": "lockfile/5", + "lockfile": {} +} \ No newline at end of file diff --git a/__fixtures__/basic-bun-object-workspaces/package.json b/__fixtures__/basic-bun-object-workspaces/package.json new file mode 100644 index 00000000..ac66bee0 --- /dev/null +++ b/__fixtures__/basic-bun-object-workspaces/package.json @@ -0,0 +1,13 @@ +{ + "name": "basic-bun-object-workspaces", + "version": "1.0.0", + "private": true, + "workspaces": { + "packages": [ + "packages/*" + ], + "catalog": { + "some-dep": "^1.0.0" + } + } +} diff --git a/__fixtures__/basic-bun-object-workspaces/packages/package-one/package.json b/__fixtures__/basic-bun-object-workspaces/packages/package-one/package.json new file mode 100644 index 00000000..80acbd05 --- /dev/null +++ b/__fixtures__/basic-bun-object-workspaces/packages/package-one/package.json @@ -0,0 +1,4 @@ +{ + "name": "package-one", + "version": "1.0.0" +} diff --git a/__fixtures__/basic-bun-object-workspaces/packages/package-one/src/index.js b/__fixtures__/basic-bun-object-workspaces/packages/package-one/src/index.js new file mode 100644 index 00000000..8b1a3937 --- /dev/null +++ b/__fixtures__/basic-bun-object-workspaces/packages/package-one/src/index.js @@ -0,0 +1 @@ +// empty diff --git a/__fixtures__/bun-object-workspace-base/bun.lock b/__fixtures__/bun-object-workspace-base/bun.lock new file mode 100644 index 00000000..e69de29b diff --git a/__fixtures__/bun-object-workspace-base/package.json b/__fixtures__/bun-object-workspace-base/package.json new file mode 100644 index 00000000..3447a9ed --- /dev/null +++ b/__fixtures__/bun-object-workspace-base/package.json @@ -0,0 +1,13 @@ +{ + "name": "bun-object-workspace-base", + "version": "1.0.0", + "private": true, + "workspaces": { + "packages": [ + "packages/*" + ], + "catalog": { + "some-dep": "^1.0.0" + } + } +} diff --git a/__fixtures__/bun-object-workspace-base/packages/pkg-a/package.json b/__fixtures__/bun-object-workspace-base/packages/pkg-a/package.json new file mode 100644 index 00000000..68c0c900 --- /dev/null +++ b/__fixtures__/bun-object-workspace-base/packages/pkg-a/package.json @@ -0,0 +1,5 @@ +{ + "name": "bun-object-workspace-base-pkg-a", + "version": "1.0.0", + "main": "src/index.js" +} diff --git a/__fixtures__/bun-object-workspace-base/packages/pkg-b/package.json b/__fixtures__/bun-object-workspace-base/packages/pkg-b/package.json new file mode 100644 index 00000000..5f68c4b7 --- /dev/null +++ b/__fixtures__/bun-object-workspace-base/packages/pkg-b/package.json @@ -0,0 +1,5 @@ +{ + "name": "bun-object-workspace-base-pkg-b", + "version": "1.0.0", + "main": "src/index.js" +} diff --git a/packages/find-root/src/index.test.ts b/packages/find-root/src/index.test.ts index 0b599809..8a9b77e6 100644 --- a/packages/find-root/src/index.test.ts +++ b/packages/find-root/src/index.test.ts @@ -97,6 +97,17 @@ const runTests = (findRoot: FindRoot) => { }); }); + test("it returns the root of a bun monorepo with object-form workspaces", async () => { + let tmpPath = f.copy("basic-bun-object-workspaces"); + let monorepoRoot = await findRoot( + path.join(tmpPath, "packages", "package-one", "src") + ); + expect(monorepoRoot).toEqual({ + tool: BunTool.type, + rootDir: tmpPath, + }); + }); + test("it does not detect bun monorepo without lock file", async () => { let tmpPath = f.copy("bun-no-lock"); let monorepoRoot = await findRoot( diff --git a/packages/get-packages/src/index.test.ts b/packages/get-packages/src/index.test.ts index 53b89fab..0f24bb6c 100644 --- a/packages/get-packages/src/index.test.ts +++ b/packages/get-packages/src/index.test.ts @@ -141,6 +141,27 @@ let runTests = (getPackages: GetPackages) => { } }); + it("should resolve workspaces for bun with object-form workspaces", async () => { + const dir = f.copy("bun-object-workspace-base"); + + // Test for both root and subdirectories + for (const location of [".", "packages", "packages/pkg-a"]) { + const allPackages = await getPackages(path.join(dir, location)); + + if (allPackages.packages === null) { + return expect(allPackages.packages).not.toBeNull(); + } + + expect(allPackages.packages[0].packageJson.name).toEqual( + "bun-object-workspace-base-pkg-a" + ); + expect(allPackages.packages[1].packageJson.name).toEqual( + "bun-object-workspace-base-pkg-b" + ); + expect(allPackages.tool.type).toEqual("bun"); + } + }); + it("should resolve workspaces for lerna", async () => { const dir = f.copy("lerna-workspace-base"); diff --git a/packages/tools/src/BunTool.ts b/packages/tools/src/BunTool.ts index 7981ec4b..542e4b1a 100644 --- a/packages/tools/src/BunTool.ts +++ b/packages/tools/src/BunTool.ts @@ -16,7 +16,9 @@ import { import { readJson, readJsonSync } from "./utils.ts"; interface BunPackageJSON extends PackageJSON { - workspaces?: string[]; + workspaces?: + | string[] + | { packages: string[]; catalog?: Record }; } async function hasBunLockFile(directory: string): Promise { @@ -55,7 +57,10 @@ export const BunTool: Tool = { hasBunLockFile(directory), ]); if (pkgJson.workspaces && hasLockFile) { - if (Array.isArray(pkgJson.workspaces)) { + if ( + Array.isArray(pkgJson.workspaces) || + Array.isArray(pkgJson.workspaces.packages) + ) { return true; } } @@ -76,7 +81,10 @@ export const BunTool: Tool = { } const pkgJson = readJsonSync(directory, "package.json") as BunPackageJSON; if (pkgJson.workspaces) { - if (Array.isArray(pkgJson.workspaces)) { + if ( + Array.isArray(pkgJson.workspaces) || + Array.isArray(pkgJson.workspaces.packages) + ) { return true; } } @@ -97,7 +105,9 @@ export const BunTool: Tool = { rootDir, "package.json" )) as BunPackageJSON; - const packageGlobs: string[] = pkgJson.workspaces || []; + const packageGlobs: string[] = Array.isArray(pkgJson.workspaces) + ? pkgJson.workspaces + : pkgJson.workspaces?.packages || []; return { tool: BunTool, @@ -124,7 +134,9 @@ export const BunTool: Tool = { try { const pkgJson = readJsonSync(rootDir, "package.json") as BunPackageJSON; - const packageGlobs: string[] = pkgJson.workspaces || []; + const packageGlobs: string[] = Array.isArray(pkgJson.workspaces) + ? pkgJson.workspaces + : pkgJson.workspaces?.packages || []; return { tool: BunTool,