fix: don't abort appprove-builds or err when manifest doesn't exist (#9198)

close: #9202
This commit is contained in:
R.P. Pedraza
2025-03-02 10:05:49 +08:00
committed by GitHub
parent 5e78da2d57
commit 8b3cfe24fe
5 changed files with 66 additions and 17 deletions

View File

@@ -0,0 +1,5 @@
---
"@pnpm/exec.build-commands": patch
---
fix: don't abort approve-builds command or err when manifest doesn't exist [#9198](https://github.com/pnpm/pnpm/pull/9198)

View File

@@ -53,7 +53,10 @@
"@pnpm/types": "workspace:*",
"@types/ramda": "catalog:",
"load-json-file": "catalog:",
"ramda": "catalog:"
"ramda": "catalog:",
"read-yaml-file": "catalog:",
"write-pkg": "catalog:",
"write-yaml-file": "catalog:"
},
"engines": {
"node": ">=18.12"

View File

@@ -1,6 +1,6 @@
import { type Config } from '@pnpm/config'
import { globalInfo } from '@pnpm/logger'
import { readProjectManifest } from '@pnpm/read-project-manifest'
import { tryReadProjectManifest } from '@pnpm/read-project-manifest'
import { lexCompare } from '@pnpm/util.lex-comparator'
import renderHelp from 'render-help'
import { prompt } from 'enquirer'
@@ -44,7 +44,6 @@ export function rcOptionsTypes (): Record<string, unknown> {
}
export async function handler (opts: ApproveBuildsCommandOpts & RebuildCommandOpts): Promise<void> {
if (opts.rootProjectManifest == null) return
const automaticallyIgnoredBuilds = await getAutomaticallyIgnoredBuilds(opts)
if (!automaticallyIgnoredBuilds?.length) {
globalInfo('There are no packages awaiting approval')
@@ -122,16 +121,17 @@ Do you approve?`,
return
}
}
const { writeProjectManifest } = await readProjectManifest(opts.rootProjectManifestDir)
if (opts.rootProjectManifest.pnpm?.ignoredBuiltDependencies != null || opts.rootProjectManifest.pnpm?.onlyBuiltDependencies != null || opts.workspaceDir == null) {
opts.rootProjectManifest.pnpm = opts.rootProjectManifest.pnpm ?? {}
let { manifest, writeProjectManifest } = await tryReadProjectManifest(opts.rootProjectManifestDir)
manifest ??= {}
if (opts.workspaceDir == null || manifest.pnpm?.onlyBuiltDependencies != null || manifest.pnpm?.onlyBuiltDependencies != null) {
manifest.pnpm ??= {}
if (updatedOnlyBuiltDependencies) {
opts.rootProjectManifest.pnpm.onlyBuiltDependencies = updatedOnlyBuiltDependencies
manifest.pnpm.onlyBuiltDependencies = updatedOnlyBuiltDependencies
}
if (updatedIgnoredBuiltDependencies) {
opts.rootProjectManifest.pnpm.ignoredBuiltDependencies = updatedIgnoredBuiltDependencies
manifest.pnpm.ignoredBuiltDependencies = updatedIgnoredBuiltDependencies
}
await writeProjectManifest(opts.rootProjectManifest)
await writeProjectManifest(manifest)
} else {
await updateWorkspaceManifest(opts.workspaceDir, {
onlyBuiltDependencies: updatedOnlyBuiltDependencies,

View File

@@ -9,19 +9,17 @@ import { getConfig } from '@pnpm/config'
import { REGISTRY_MOCK_PORT } from '@pnpm/registry-mock'
import { sync as loadJsonFile } from 'load-json-file'
import omit from 'ramda/src/omit'
import { tempDir } from '@pnpm/prepare-temp-dir'
import writePkg from 'write-pkg'
import { sync as readYamlFile } from 'read-yaml-file'
import { sync as writeYamlFile } from 'write-yaml-file'
jest.mock('enquirer', () => ({ prompt: jest.fn() }))
// eslint-disable-next-line
const prompt = enquirer.prompt as any
test('approve selected build', async () => {
prepare({
dependencies: {
'@pnpm.e2e/pre-and-postinstall-scripts-example': '1.0.0',
'@pnpm.e2e/install-script-example': '*',
},
})
const runApproveBuilds = async (opts = {}) => {
const cliOptions = {
argv: [],
dir: process.cwd(),
@@ -48,7 +46,18 @@ test('approve selected build', async () => {
build: true,
})
await approveBuilds.handler(config)
await approveBuilds.handler({ ...config, ...opts })
}
test('approve selected build', async () => {
prepare({
dependencies: {
'@pnpm.e2e/pre-and-postinstall-scripts-example': '1.0.0',
'@pnpm.e2e/install-script-example': '*',
},
})
await runApproveBuilds()
const manifest = loadJsonFile<ProjectManifest>(path.resolve('package.json'))
expect(manifest.pnpm?.onlyBuiltDependencies).toStrictEqual(['@pnpm.e2e/pre-and-postinstall-scripts-example'])
@@ -58,3 +67,26 @@ test('approve selected build', async () => {
expect(fs.existsSync('node_modules/@pnpm.e2e/pre-and-postinstall-scripts-example/generated-by-postinstall.js')).toBeTruthy()
expect(fs.existsSync('node_modules/@pnpm.e2e/install-script-example/generated-by-install.js')).toBeFalsy()
})
test("works when root project manifest doesn't exist in a workspace", async () => {
tempDir()
await writePkg('workspace/packages/project', {
dependencies: {
'@pnpm.e2e/pre-and-postinstall-scripts-example': '1.0.0',
'@pnpm.e2e/install-script-example': '*',
},
})
const workspaceDir = path.resolve('workspace')
const workspaceManifestFile = path.join(workspaceDir, 'pnpm-workspace.yaml')
writeYamlFile(workspaceManifestFile, { packages: ['packages/*'] })
process.chdir('workspace/packages/project')
await runApproveBuilds({ workspaceDir, rootProjectManifestDir: workspaceDir })
expect(readYamlFile(workspaceManifestFile)).toStrictEqual({
packages: ['packages/*'],
onlyBuiltDependencies: ['@pnpm.e2e/pre-and-postinstall-scripts-example'],
ignoredBuiltDependencies: ['@pnpm.e2e/install-script-example'],
})
})

9
pnpm-lock.yaml generated
View File

@@ -2142,6 +2142,15 @@ importers:
ramda:
specifier: 'catalog:'
version: '@pnpm/ramda@0.28.1'
read-yaml-file:
specifier: 'catalog:'
version: 2.1.0
write-pkg:
specifier: 'catalog:'
version: 4.0.0
write-yaml-file:
specifier: 'catalog:'
version: 5.0.0
exec/build-modules:
dependencies: