diff --git a/.changeset/lovely-parts-give.md b/.changeset/lovely-parts-give.md new file mode 100644 index 0000000000..cee8a4445a --- /dev/null +++ b/.changeset/lovely-parts-give.md @@ -0,0 +1,6 @@ +--- +"@pnpm/exec.build-commands": patch +"pnpm": patch +--- + +When executing the `approve-builds` command, if package.json contains `onlyBuiltDependencies` or `ignoredBuiltDependencies`, the selected dependency package will continue to be written into `package.json`. diff --git a/exec/build-commands/src/approveBuilds.ts b/exec/build-commands/src/approveBuilds.ts index 4da00fa924..69c22fc3f6 100644 --- a/exec/build-commands/src/approveBuilds.ts +++ b/exec/build-commands/src/approveBuilds.ts @@ -123,7 +123,7 @@ Do you approve?`, } let { manifest, writeProjectManifest } = await tryReadProjectManifest(opts.rootProjectManifestDir) manifest ??= {} - if (opts.workspaceDir == null || manifest.pnpm?.onlyBuiltDependencies != null || manifest.pnpm?.onlyBuiltDependencies != null) { + if (opts.workspaceDir == null || manifest.pnpm?.onlyBuiltDependencies != null || manifest.pnpm?.ignoredBuiltDependencies != null) { manifest.pnpm ??= {} if (updatedOnlyBuiltDependencies) { manifest.pnpm.onlyBuiltDependencies = updatedOnlyBuiltDependencies diff --git a/exec/build-commands/test/approveBuilds.test.ts b/exec/build-commands/test/approveBuilds.test.ts index 38b640449b..23b9f2e833 100644 --- a/exec/build-commands/test/approveBuilds.test.ts +++ b/exec/build-commands/test/approveBuilds.test.ts @@ -90,3 +90,81 @@ test("works when root project manifest doesn't exist in a workspace", async () = ignoredBuiltDependencies: ['@pnpm.e2e/install-script-example'], }) }) + +test('should update onlyBuiltDependencies when package.json exists with ignoredBuiltDependencies defined', async () => { + const temp = tempDir() + + prepare({ + dependencies: { + '@pnpm.e2e/pre-and-postinstall-scripts-example': '1.0.0', + '@pnpm.e2e/install-script-example': '*', + }, + pnpm: { + ignoredBuiltDependencies: ['@pnpm.e2e/install-script-example'], + }, + }, { + tempDir: temp, + }) + + const workspaceManifestFile = path.join(temp, 'pnpm-workspace.yaml') + writeYamlFile(workspaceManifestFile, { packages: ['packages/*'] }) + await runApproveBuilds({ workspaceDir: temp, rootProjectManifestDir: temp }) + + expect(readYamlFile(workspaceManifestFile)).toStrictEqual({ + packages: ['packages/*'], + }) + expect(loadJsonFile(path.join(temp, 'package.json'))!.pnpm).toStrictEqual({ + ignoredBuiltDependencies: ['@pnpm.e2e/install-script-example'], + onlyBuiltDependencies: ['@pnpm.e2e/pre-and-postinstall-scripts-example'], + }) +}) + +test('should approve builds when package.json exists with onlyBuiltDependencies defined', async () => { + const temp = tempDir() + + prepare({ + dependencies: { + '@pnpm.e2e/pre-and-postinstall-scripts-example': '1.0.0', + '@pnpm.e2e/install-script-example': '*', + }, + pnpm: { + onlyBuiltDependencies: ['@pnpm.e2e/install-script-example'], + }, + }, { + tempDir: temp, + }) + + const workspaceManifestFile = path.join(temp, 'pnpm-workspace.yaml') + writeYamlFile(workspaceManifestFile, { packages: ['packages/*'] }) + await runApproveBuilds({ workspaceDir: temp, rootProjectManifestDir: temp }) + + expect(readYamlFile(workspaceManifestFile)).toStrictEqual({ + packages: ['packages/*'], + }) + expect(loadJsonFile(path.join(temp, 'package.json'))!.pnpm).toStrictEqual({ + onlyBuiltDependencies: ['@pnpm.e2e/install-script-example', '@pnpm.e2e/pre-and-postinstall-scripts-example'], + }) +}) + +test('should approve builds with package.json that has no onlyBuiltDependencies and ignoredBuiltDependencies fields defined', async () => { + const temp = tempDir() + + prepare({ + dependencies: { + '@pnpm.e2e/pre-and-postinstall-scripts-example': '1.0.0', + '@pnpm.e2e/install-script-example': '*', + }, + }, { + tempDir: temp, + }) + + const workspaceManifestFile = path.join(temp, 'pnpm-workspace.yaml') + writeYamlFile(workspaceManifestFile, { packages: ['packages/*'] }) + await runApproveBuilds({ workspaceDir: temp, rootProjectManifestDir: temp }) + + expect(readYamlFile(workspaceManifestFile)).toStrictEqual({ + packages: ['packages/*'], + onlyBuiltDependencies: ['@pnpm.e2e/pre-and-postinstall-scripts-example'], + ignoredBuiltDependencies: ['@pnpm.e2e/install-script-example'], + }) +})