Skip to content

fix: don't pnpm remove an empty list of packages #727

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Aug 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions src/shared/packages.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
import { describe, expect, it, vi } from "vitest";

import { removeDependencies } from "./packages.js";

const mockExecaCommand = vi.fn();

vi.mock("execa", () => ({
get execaCommand() {
return mockExecaCommand;
},
}));

describe("removeDependencies", () => {
it("removes all packages that already exist when all already exist", async () => {
await removeDependencies(["one", "two"], {
one: "1.2.3",
two: "4.5.6",
});

expect(mockExecaCommand.mock.calls).toMatchInlineSnapshot(`
[
[
"pnpm remove one two",
],
]
`);
});

it("removes only packages that already exist when some don't exist", async () => {
await removeDependencies(["exists", "missing"], {
exists: "1.2.3",
});

expect(mockExecaCommand.mock.calls).toMatchInlineSnapshot(`
[
[
"pnpm remove exists",
],
]
`);
});

it("adds a flag to removing packages when one is provided", async () => {
await removeDependencies(
["exists", "missing"],
{
exists: "1.2.3",
},
"-D",
);

expect(mockExecaCommand.mock.calls).toMatchInlineSnapshot(`
[
[
"pnpm remove exists -D",
],
]
`);
});

it("does nothing when no packages already exist", async () => {
await removeDependencies(["missing"]);

expect(mockExecaCommand.mock.calls).toMatchInlineSnapshot("[]");
});
});
26 changes: 9 additions & 17 deletions src/shared/packages.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { $ } from "execa";
import { execaCommand } from "execa";

import { readFileSafe } from "./readFileSafe.js";
import { PartialPackageData } from "./types.js";
Expand All @@ -11,22 +11,14 @@ export async function readPackageData() {

export async function removeDependencies(
packageNames: string[],
packageData: PartialPackageData,
existing: Record<string, string> = {},
flags = "",
) {
await $`pnpm remove ${packageNames.filter(
packageExists(packageData.dependencies),
)}`;
}

export async function removeDevDependencies(
packageNames: string[],
packageData: PartialPackageData,
) {
await $`pnpm remove ${packageNames.filter(
packageExists(packageData.devDependencies),
)} -D`;
}
const present = packageNames.filter((packageName) => packageName in existing);

function packageExists(listing: Record<string, string> = {}) {
return (packageName: string) => packageName in listing;
if (present.length) {
await execaCommand(
`pnpm remove ${present.join(" ")}${flags ? ` ${flags}` : ""}`,
);
}
}
6 changes: 1 addition & 5 deletions src/steps/finalizeDependencies.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,9 @@ vi.mock("execa", () => ({
},
}));

const mockRemoveDevDependencies = vi.fn();

vi.mock("../shared/packages.js", () => ({
readPackageData: () => [],
get removeDevDependencies() {
return mockRemoveDevDependencies;
},
removeDependencies: vi.fn(),
}));

const options = {
Expand Down
7 changes: 4 additions & 3 deletions src/steps/finalizeDependencies.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { execaCommand } from "execa";

import { readPackageData, removeDevDependencies } from "../shared/packages.js";
import { readPackageData, removeDependencies } from "../shared/packages.js";
import { Options } from "../shared/types.js";

export async function finalizeDependencies(options: Options) {
Expand Down Expand Up @@ -68,9 +68,10 @@ export async function finalizeDependencies(options: Options) {

if (!options.excludeContributors) {
await execaCommand(`npx all-contributors-cli generate`);
await removeDevDependencies(
await removeDependencies(
["all-contributors-cli", "all-contributors-for-repository"],
await readPackageData(),
(await readPackageData()).devDependencies,
"-D",
);
}

Expand Down
13 changes: 5 additions & 8 deletions src/steps/uninstallPackages.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
import { $ } from "execa";

import {
readPackageData,
removeDependencies,
removeDevDependencies,
} from "../shared/packages.js";
import { readPackageData, removeDependencies } from "../shared/packages.js";

export async function uninstallPackages() {
const packageData = await readPackageData();
Expand All @@ -24,10 +20,10 @@ export async function uninstallPackages() {
"replace-in-file",
"title-case",
],
packageData,
packageData.dependencies,
);

await removeDevDependencies(
await removeDependencies(
[
"@octokit/request-error",
"@types/git-url-parse",
Expand All @@ -38,7 +34,8 @@ export async function uninstallPackages() {
"globby",
"tsx",
],
packageData,
packageData.devDependencies,
"-D",
);

await $`pnpm add prettier -D`;
Expand Down