From d0f9ba2162f1c38424ccd910071414b67670ef03 Mon Sep 17 00:00:00 2001 From: Hovhannes Babayan Date: Mon, 20 Dec 2021 19:43:00 +0400 Subject: [PATCH 1/3] fix: make cli skip private packages without version field --- .changeset/rotten-crabs-rest.md | 5 ++++ .../cli/src/commands/add/createChangeset.ts | 24 ++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 .changeset/rotten-crabs-rest.md diff --git a/.changeset/rotten-crabs-rest.md b/.changeset/rotten-crabs-rest.md new file mode 100644 index 000000000..50c8d840a --- /dev/null +++ b/.changeset/rotten-crabs-rest.md @@ -0,0 +1,5 @@ +--- +"@changesets/cli": patch +--- + +Cli will skip private packages without "version" field. diff --git a/packages/cli/src/commands/add/createChangeset.ts b/packages/cli/src/commands/add/createChangeset.ts index 87aa9fe1f..3f43ab8bd 100644 --- a/packages/cli/src/commands/add/createChangeset.ts +++ b/packages/cli/src/commands/add/createChangeset.ts @@ -58,6 +58,16 @@ async function getPackagesToRelease( ); } + const pkgJsonsByName = getPkgJsonByName(allPackages); + + // filter out private packages without 'version' field + allPackages = allPackages.filter( + pkg => !isNonVersionablePackage(pkg.packageJson) + ); + changedPackages = changedPackages.filter( + pkgName => !isNonVersionablePackage(pkgJsonsByName.get(pkgName)!) + ); + if (allPackages.length > 1) { const unchangedPackagesNames = allPackages .map(({ packageJson }) => packageJson.name) @@ -96,6 +106,16 @@ function formatPkgNameAndVersion(pkgName: string, version: string) { return `${bold(pkgName)}@${bold(version)}`; } +function getPkgJsonByName(packages: Package[]) { + return new Map( + packages.map(({ packageJson }) => [packageJson.name, packageJson]) + ); +} + +function isNonVersionablePackage(packageJson: PackageJSON) { + return packageJson.private && !packageJson.version; +} + export default async function createChangeset( changedPackages: Array, allPackages: Package[] @@ -108,9 +128,7 @@ export default async function createChangeset( allPackages ); - let pkgJsonsByName = new Map( - allPackages.map(({ packageJson }) => [packageJson.name, packageJson]) - ); + let pkgJsonsByName = getPkgJsonByName(allPackages); let pkgsLeftToGetBumpTypeFor = new Set(packagesToRelease); From 22b0feffc941843d9b2aefe1cd6f1526f29c5289 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Fri, 5 Aug 2022 10:58:36 +0200 Subject: [PATCH 2/3] juggle code and add a test --- .../.changeset/config.json | 1 + .../package.json | 9 +++++++ .../packages/pkg-a/package.json | 4 ++++ .../packages/pkg-b/package.json | 4 ++++ .../packages/pkg-c/package.json | 4 ++++ .../cli/src/commands/add/__tests__/add.ts | 10 ++++++++ .../cli/src/commands/add/createChangeset.ts | 14 ----------- packages/cli/src/commands/add/index.ts | 24 +++++++++++-------- 8 files changed, 46 insertions(+), 24 deletions(-) create mode 100644 __fixtures__/private-package-without-version-field/.changeset/config.json create mode 100644 __fixtures__/private-package-without-version-field/package.json create mode 100644 __fixtures__/private-package-without-version-field/packages/pkg-a/package.json create mode 100644 __fixtures__/private-package-without-version-field/packages/pkg-b/package.json create mode 100644 __fixtures__/private-package-without-version-field/packages/pkg-c/package.json diff --git a/__fixtures__/private-package-without-version-field/.changeset/config.json b/__fixtures__/private-package-without-version-field/.changeset/config.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/__fixtures__/private-package-without-version-field/.changeset/config.json @@ -0,0 +1 @@ +{} diff --git a/__fixtures__/private-package-without-version-field/package.json b/__fixtures__/private-package-without-version-field/package.json new file mode 100644 index 000000000..b245108a3 --- /dev/null +++ b/__fixtures__/private-package-without-version-field/package.json @@ -0,0 +1,9 @@ +{ + "private": true, + "name": "private-package-without-version-field", + "description": "Base yarn workspace work", + "version": "1.0.0", + "workspaces": [ + "packages/*" + ] +} diff --git a/__fixtures__/private-package-without-version-field/packages/pkg-a/package.json b/__fixtures__/private-package-without-version-field/packages/pkg-a/package.json new file mode 100644 index 000000000..ee09b194d --- /dev/null +++ b/__fixtures__/private-package-without-version-field/packages/pkg-a/package.json @@ -0,0 +1,4 @@ +{ + "name": "pkg-a", + "version": "1.0.0" +} diff --git a/__fixtures__/private-package-without-version-field/packages/pkg-b/package.json b/__fixtures__/private-package-without-version-field/packages/pkg-b/package.json new file mode 100644 index 000000000..1a17612fe --- /dev/null +++ b/__fixtures__/private-package-without-version-field/packages/pkg-b/package.json @@ -0,0 +1,4 @@ +{ + "name": "pkg-b", + "private": true +} diff --git a/__fixtures__/private-package-without-version-field/packages/pkg-c/package.json b/__fixtures__/private-package-without-version-field/packages/pkg-c/package.json new file mode 100644 index 000000000..888ba5c7e --- /dev/null +++ b/__fixtures__/private-package-without-version-field/packages/pkg-c/package.json @@ -0,0 +1,4 @@ +{ + "name": "pkg-c", + "version": "1.0.0" +} diff --git a/packages/cli/src/commands/add/__tests__/add.ts b/packages/cli/src/commands/add/__tests__/add.ts index d63be8326..b12d4260e 100644 --- a/packages/cli/src/commands/add/__tests__/add.ts +++ b/packages/cli/src/commands/add/__tests__/add.ts @@ -214,6 +214,16 @@ describe("Changesets", () => { { ...defaultConfig, ignore: ["pkg-b"] } ); + // @ts-ignore + const { choices } = askCheckboxPlus.mock.calls[0][1][0]; + expect(choices).toEqual(["pkg-a", "pkg-c"]); + }); + it("should not include private packages without a version in the prompt", async () => { + const cwd = await f.copy("private-package-without-version-field"); + + mockUserResponses({ releases: { "pkg-a": "patch" } }); + await addChangeset(cwd, { empty: false }, defaultConfig); + // @ts-ignore const { choices } = askCheckboxPlus.mock.calls[0][1][0]; expect(choices).toEqual(["pkg-a", "pkg-c"]); diff --git a/packages/cli/src/commands/add/createChangeset.ts b/packages/cli/src/commands/add/createChangeset.ts index 3f43ab8bd..3f6aab493 100644 --- a/packages/cli/src/commands/add/createChangeset.ts +++ b/packages/cli/src/commands/add/createChangeset.ts @@ -58,16 +58,6 @@ async function getPackagesToRelease( ); } - const pkgJsonsByName = getPkgJsonByName(allPackages); - - // filter out private packages without 'version' field - allPackages = allPackages.filter( - pkg => !isNonVersionablePackage(pkg.packageJson) - ); - changedPackages = changedPackages.filter( - pkgName => !isNonVersionablePackage(pkgJsonsByName.get(pkgName)!) - ); - if (allPackages.length > 1) { const unchangedPackagesNames = allPackages .map(({ packageJson }) => packageJson.name) @@ -112,10 +102,6 @@ function getPkgJsonByName(packages: Package[]) { ); } -function isNonVersionablePackage(packageJson: PackageJSON) { - return packageJson.private && !packageJson.version; -} - export default async function createChangeset( changedPackages: Array, allPackages: Package[] diff --git a/packages/cli/src/commands/add/index.ts b/packages/cli/src/commands/add/index.ts index eee5d8f3f..7a128791b 100644 --- a/packages/cli/src/commands/add/index.ts +++ b/packages/cli/src/commands/add/index.ts @@ -13,22 +13,26 @@ import { getCommitFunctions } from "../../commit/getCommitFunctions"; import createChangeset from "./createChangeset"; import printConfirmationMessage from "./messages"; import { ExternalEditor } from "external-editor"; +import { PackageJSON } from "@changesets/types"; -type UnwrapPromise> = T extends Promise - ? R - : never; +function isListablePackage(config: Config, packageJson: PackageJSON) { + return ( + !config.ignore.includes(packageJson.name) && + (packageJson.version || !packageJson.private) + ); +} export default async function add( cwd: string, { empty, open }: { empty?: boolean; open?: boolean }, config: Config ) { - const packages = (await getPackages(cwd)).packages.filter( - pkg => !config.ignore.includes(pkg.packageJson.name) + const packages = (await getPackages(cwd)).packages.filter(pkg => + isListablePackage(config, pkg.packageJson) ); const changesetBase = path.resolve(cwd, ".changeset"); - let newChangeset: UnwrapPromise>; + let newChangeset: Awaited>; if (empty) { newChangeset = { confirmed: true, @@ -40,11 +44,11 @@ export default async function add( cwd, ref: config.baseBranch }); - const changePackagesName = changedPackages - .map(pkg => pkg.packageJson.name) - .filter(pkgName => !config.ignore.includes(pkgName)); + const changedPackagesName = changedPackages + .filter(pkg => isListablePackage(config, pkg.packageJson)) + .map(pkg => pkg.packageJson.name); - newChangeset = await createChangeset(changePackagesName, packages); + newChangeset = await createChangeset(changedPackagesName, packages); printConfirmationMessage(newChangeset, packages.length > 1); if (!newChangeset.confirmed) { From ede6c65ddaa00b61c8e63740375d63a45046be4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mateusz=20Burzy=C5=84ski?= Date: Fri, 5 Aug 2022 11:00:00 +0200 Subject: [PATCH 3/3] add changeset --- .changeset/rotten-crabs-rest.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/rotten-crabs-rest.md b/.changeset/rotten-crabs-rest.md index 50c8d840a..841007847 100644 --- a/.changeset/rotten-crabs-rest.md +++ b/.changeset/rotten-crabs-rest.md @@ -2,4 +2,4 @@ "@changesets/cli": patch --- -Cli will skip private packages without "version" field. +Private packages without a `version` field are no longer listed when adding a changeset.