From 99740479dfab13cb90b4820af38f7fd6008c11c7 Mon Sep 17 00:00:00 2001 From: Tugrul Ates Date: Fri, 28 Feb 2025 10:26:16 +0100 Subject: [PATCH] fix(forge): simplify `workspace()` options to use a single directory parameter (#77) --- tool/forge/package.test.ts | 6 +++--- tool/forge/package.ts | 24 +++++++++--------------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/tool/forge/package.test.ts b/tool/forge/package.test.ts index 2a99b8e..1397577 100644 --- a/tool/forge/package.test.ts +++ b/tool/forge/package.test.ts @@ -276,7 +276,7 @@ Deno.test("packageInfo() returns update at initial version", async () => { Deno.test("workspace() returns simple package", async () => { await using directory = await tempDirectory(); await createPackage(directory.path(), { name: "name", version: "version" }); - const packages = await workspace({ directories: [directory.path()] }); + const packages = await workspace({ directory: directory.path() }); assertEquals(packages, [{ directory: directory.path(), module: "name", @@ -296,7 +296,7 @@ Deno.test("workspace() returns monorepo packages", async () => { name: "second", version: "second_version", }); - const packages = await workspace({ directories: [directory.path()] }); + const packages = await workspace({ directory: directory.path() }); assertEquals(packages, [pkg1, pkg2]); }); @@ -312,6 +312,6 @@ Deno.test("workspace() does not return nested workspace packages", async () => { name: "second", version: "second_version", }); - const packages = await workspace({ directories: [directory.path()] }); + const packages = await workspace({ directory: directory.path() }); assertEquals(packages, [pkg1]); }); diff --git a/tool/forge/package.ts b/tool/forge/package.ts index 42c7e96..6db5a95 100644 --- a/tool/forge/package.ts +++ b/tool/forge/package.ts @@ -19,7 +19,6 @@ import { git, GitError, type Tag } from "@roka/git"; import { conventional, type ConventionalCommit } from "@roka/git/conventional"; import { assert } from "@std/assert"; -import { distinctBy } from "@std/collections"; import { basename, dirname, fromFileUrl, join, normalize } from "@std/path"; import { canParse as canParseVersion, @@ -140,7 +139,7 @@ export type PermissionDescriptor = /** Options for {@linkcode packageInfo}. */ export interface PackageOptions { /** - * Package directory to analyze + * Directory to return package from. * * If a directory is not defined, the package of the main module is returned. */ @@ -150,10 +149,10 @@ export interface PackageOptions { /** Options for {@linkcode workspace}. */ export interface WorkspaceOptions { /** - * List of directories to fetch packages from. + * Directory to return packages from. * @default {["."]} */ - directories?: string[]; + directory?: string; } /** Returns information about a package. */ @@ -198,17 +197,12 @@ export async function packageInfo(options?: PackageOptions): Promise { export async function workspace( options?: WorkspaceOptions, ): Promise { - const directories = options?.directories ?? ["."]; - const packages = await Promise.all( - directories?.map(async (directory) => { - const pkg = await packageInfo({ directory, ...options }); - if (pkg.config.workspace === undefined) return pkg; - return await Promise.all(pkg.config.workspace.map(async (child) => { - return await packageInfo({ directory: join(pkg.directory, child) }); - })); - }), - ); - return distinctBy(packages.flat(), (pkg) => pkg.directory); + const directory = options?.directory ?? "."; + const pkg = await packageInfo({ directory, ...options }); + if (pkg.config.workspace === undefined) return [pkg]; + return await Promise.all(pkg.config.workspace.map(async (child) => { + return await packageInfo({ directory: join(pkg.directory, child) }); + })); } async function readConfig(directory: string): Promise {