From 94d3e9bda35d2ba75584d9ff4eff60afb41a7f88 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Thu, 6 Mar 2025 10:17:06 -0500 Subject: [PATCH 1/4] feat: add packageManager back to package.json --- package.json | 1 + src/base.test.ts | 1 + src/base.ts | 14 ++++++++++++++ src/blocks/blockPackageJson.test.ts | 28 ++++++++++++++++++++++++++++ src/blocks/blockPackageJson.ts | 3 +++ src/types.ts | 1 + 6 files changed, 48 insertions(+) diff --git a/package.json b/package.json index c77167718..f80200831 100644 --- a/package.json +++ b/package.json @@ -108,6 +108,7 @@ "typescript-eslint": "8.26.0", "vitest": "3.0.7" }, + "packageManager": "pnpm@10.4.0", "engines": { "node": ">=18.3.0" }, diff --git a/src/base.test.ts b/src/base.test.ts index aaa16a80e..678427db2 100644 --- a/src/base.test.ts +++ b/src/base.test.ts @@ -47,6 +47,7 @@ describe("base", () => { }, owner: "JoshuaKGoldberg", packageData: expect.any(Object), + pnpm: expect.any(String), repository: "create-typescript-app", title: "Create TypeScript App", usage: expect.any(String), diff --git a/src/base.ts b/src/base.ts index 530748b69..6ba8c437d 100644 --- a/src/base.ts +++ b/src/base.ts @@ -8,6 +8,7 @@ import lazyValue from "lazy-value"; import npmUser from "npm-user"; import { z } from "zod"; +import { packageData as ctaPackageData } from "./data/packageData.js"; import { inputFromOctokit } from "./inputs/inputFromOctokit.js"; import { parsePackageAuthor } from "./options/parsePackageAuthor.js"; import { readAllContributors } from "./options/readAllContributors.js"; @@ -122,6 +123,10 @@ export const base = createBase({ }) .optional() .describe("additional properties to include in `package.json`"), + pnpm: z + .string() + .optional() + .describe("pnpm version for package.json's packageManager field"), repository: z .string() .describe("'kebab-case' or 'PascalCase' title of the repository"), @@ -207,6 +212,14 @@ export const base = createBase({ }; }); + const pnpm = lazyValue(async () => { + const { packageManager } = await packageData(); + + return packageManager?.startsWith("pnpm@") + ? packageManager.slice("pnpm@".length) + : "10.4.0"; + }); + const version = lazyValue(async () => (await packageData()).version); const owner = lazyValue( @@ -248,6 +261,7 @@ export const base = createBase({ scripts: original.scripts, }; }, + pnpm, repository, rulesetId, ...readDefaultsFromReadme(readme, repository), diff --git a/src/blocks/blockPackageJson.test.ts b/src/blocks/blockPackageJson.test.ts index 3ec7da672..009b215f3 100644 --- a/src/blocks/blockPackageJson.test.ts +++ b/src/blocks/blockPackageJson.test.ts @@ -126,4 +126,32 @@ describe("blockPackageJson", () => { } `); }); + + test("with node and pnpm versions", () => { + const creation = testBlock(blockPackageJson, { + options: { + ...options, + node: { + minimum: "22.0.0", + }, + pnpm: "10.4.0", + }, + }); + + expect(creation).toMatchInlineSnapshot(` + { + "files": { + "package.json": "{"name":"test-repository","version":"0.0.0","description":"A very very very very very very very very very very very very very very very very long HTML-ish description ending with an emoji. 🧵","repository":{"type":"git","url":"git+https://github.com/test-owner/test-repository.git"},"license":"MIT","author":{"email":"npm@email.com"},"type":"module","main":"lib/index.js","files":["README.md","package.json"],"packageManager":"pnpm@10.4.0","engines":{"node":">=22.0.0"}}", + }, + "scripts": [ + { + "commands": [ + "pnpm install", + ], + "phase": 1, + }, + ], + } + `); + }); }); diff --git a/src/blocks/blockPackageJson.ts b/src/blocks/blockPackageJson.ts index 69e304b47..04d781aa0 100644 --- a/src/blocks/blockPackageJson.ts +++ b/src/blocks/blockPackageJson.ts @@ -59,6 +59,9 @@ export const blockPackageJson = base.createBlock({ node: `>=${options.node.minimum}`, }, }), + ...(options.pnpm && { + packageManager: `pnpm@${options.pnpm}`, + }), files: [ options.bin?.replace(/^\.\//, ""), ...(addons.properties.files ?? []), diff --git a/src/types.ts b/src/types.ts index e4f372994..4dc2aed0f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -19,6 +19,7 @@ export interface PartialPackageData { email?: string; engines?: { node?: string }; name?: string; + packageManager?: string; repository?: string | { type: string; url: string }; scripts?: Record; version?: string; From 4a9f6b7cabe9afa36f81f145eb9f455993f5e5f8 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Thu, 6 Mar 2025 10:20:01 -0500 Subject: [PATCH 2/4] Also update prepare.yml --- .github/actions/prepare/action.yml | 2 -- src/blocks/blockGitHubActionsCI.test.ts | 6 ------ src/blocks/blockGitHubActionsCI.ts | 1 - 3 files changed, 9 deletions(-) diff --git a/.github/actions/prepare/action.yml b/.github/actions/prepare/action.yml index e8b953c1b..edf107ccc 100644 --- a/.github/actions/prepare/action.yml +++ b/.github/actions/prepare/action.yml @@ -5,8 +5,6 @@ name: Prepare runs: steps: - uses: pnpm/action-setup@v4 - with: - version: 9 - uses: actions/setup-node@v4 with: cache: pnpm diff --git a/src/blocks/blockGitHubActionsCI.test.ts b/src/blocks/blockGitHubActionsCI.test.ts index acd93a7df..6f1bd6472 100644 --- a/src/blocks/blockGitHubActionsCI.test.ts +++ b/src/blocks/blockGitHubActionsCI.test.ts @@ -31,8 +31,6 @@ describe("blockGitHubActionsCI", () => { runs: steps: - uses: pnpm/action-setup@v4 - with: - version: 9 - uses: actions/setup-node@v4 with: cache: pnpm @@ -128,8 +126,6 @@ describe("blockGitHubActionsCI", () => { runs: steps: - uses: pnpm/action-setup@v4 - with: - version: 9 - uses: actions/setup-node@v4 with: cache: pnpm @@ -250,8 +246,6 @@ describe("blockGitHubActionsCI", () => { runs: steps: - uses: pnpm/action-setup@v4 - with: - version: 9 - uses: actions/setup-node@v4 with: cache: pnpm diff --git a/src/blocks/blockGitHubActionsCI.ts b/src/blocks/blockGitHubActionsCI.ts index 6f96396e6..240a366dc 100644 --- a/src/blocks/blockGitHubActionsCI.ts +++ b/src/blocks/blockGitHubActionsCI.ts @@ -51,7 +51,6 @@ export const blockGitHubActionsCI = base.createBlock({ steps: [ { uses: "pnpm/action-setup@v4", - with: { version: 9 }, }, { uses: "actions/setup-node@v4", From 3a9f548e4efdbe04486e285970015e98bc1b66c6 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Thu, 6 Mar 2025 10:25:00 -0500 Subject: [PATCH 3/4] Extract and unit test --- src/base.ts | 10 ++-------- src/options/readPnpm.test.ts | 31 +++++++++++++++++++++++++++++++ src/options/readPnpm.ts | 9 +++++++++ 3 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 src/options/readPnpm.test.ts create mode 100644 src/options/readPnpm.ts diff --git a/src/base.ts b/src/base.ts index 6ba8c437d..85e77e626 100644 --- a/src/base.ts +++ b/src/base.ts @@ -8,7 +8,6 @@ import lazyValue from "lazy-value"; import npmUser from "npm-user"; import { z } from "zod"; -import { packageData as ctaPackageData } from "./data/packageData.js"; import { inputFromOctokit } from "./inputs/inputFromOctokit.js"; import { parsePackageAuthor } from "./options/parsePackageAuthor.js"; import { readAllContributors } from "./options/readAllContributors.js"; @@ -20,6 +19,7 @@ import { readFileSafe } from "./options/readFileSafe.js"; import { readFunding } from "./options/readFunding.js"; import { readGuide } from "./options/readGuide.js"; import { readPackageData } from "./options/readPackageData.js"; +import { readPnpm } from "./options/readPnpm.js"; import { swallowError } from "./utils/swallowError.js"; import { tryCatchLazyValueAsync } from "./utils/tryCatchLazyValueAsync.js"; @@ -212,13 +212,7 @@ export const base = createBase({ }; }); - const pnpm = lazyValue(async () => { - const { packageManager } = await packageData(); - - return packageManager?.startsWith("pnpm@") - ? packageManager.slice("pnpm@".length) - : "10.4.0"; - }); + const pnpm = lazyValue(async () => readPnpm(packageData)); const version = lazyValue(async () => (await packageData()).version); diff --git a/src/options/readPnpm.test.ts b/src/options/readPnpm.test.ts new file mode 100644 index 000000000..de3f960da --- /dev/null +++ b/src/options/readPnpm.test.ts @@ -0,0 +1,31 @@ +import { describe, expect, it, vi } from "vitest"; + +import { readPnpm } from "./readPnpm.js"; + +describe(readPnpm, () => { + it("returns 10.4.0 when there is no existing packageManager", async () => { + const actual = await readPnpm(() => Promise.resolve({})); + + expect(actual).toEqual("10.4.0"); + }); + + it("returns 10.4.0 when an existing packageManager is not pnpm", async () => { + const actual = await readPnpm(() => + Promise.resolve({ + packageManager: "yarn@1.2.3", + }), + ); + + expect(actual).toEqual("10.4.0"); + }); + + it("returns the existing pnpm version when an existing packageManager is pnpm", async () => { + const actual = await readPnpm(() => + Promise.resolve({ + packageManager: "pnpm@10.11.12", + }), + ); + + expect(actual).toEqual("10.11.12"); + }); +}); diff --git a/src/options/readPnpm.ts b/src/options/readPnpm.ts new file mode 100644 index 000000000..0fed6745a --- /dev/null +++ b/src/options/readPnpm.ts @@ -0,0 +1,9 @@ +import { PartialPackageData } from "../types.js"; + +export async function readPnpm(packageData: () => Promise) { + const { packageManager } = await packageData(); + + return packageManager?.startsWith("pnpm@") + ? packageManager.slice("pnpm@".length) + : "10.4.0"; +} From c41af50e878b8da81ab8a13df1f75e767f491ed9 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Thu, 6 Mar 2025 10:25:05 -0500 Subject: [PATCH 4/4] Extract and unit test --- src/options/readPnpm.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/options/readPnpm.test.ts b/src/options/readPnpm.test.ts index de3f960da..36e2592a1 100644 --- a/src/options/readPnpm.test.ts +++ b/src/options/readPnpm.test.ts @@ -1,4 +1,4 @@ -import { describe, expect, it, vi } from "vitest"; +import { describe, expect, it } from "vitest"; import { readPnpm } from "./readPnpm.js";