mirror of
https://github.com/pnpm/pnpm.git
synced 2026-01-09 23:48:28 -05:00
fix: read package manifest when verifyStoreIntegrity is false (#5157)
* fix: read package manifest when verifyStoreIntegrity is false * fixup: add test * fixup: resolve manifest even if no package.json was found * fixup: relocate function to read manifest from store * fixup: add changeset
This commit is contained in:
7
.changeset/silent-turtles-suffer.md
Normal file
7
.changeset/silent-turtles-suffer.md
Normal file
@@ -0,0 +1,7 @@
|
||||
---
|
||||
"@pnpm/cafs": minor
|
||||
"@pnpm/package-requester": patch
|
||||
"pnpm": patch
|
||||
---
|
||||
|
||||
Fix bug where the package manifest was not resolved if `verifyStoreIntegrity` is set to `false`.
|
||||
@@ -11,6 +11,7 @@ import checkFilesIntegrity, {
|
||||
PackageFilesIndex,
|
||||
verifyFileIntegrity,
|
||||
} from './checkFilesIntegrity'
|
||||
import readManifestFromStore from './readManifestFromStore'
|
||||
import getFilePathInCafs, {
|
||||
contentPathFromHex,
|
||||
FileType,
|
||||
@@ -21,6 +22,7 @@ import writeFile from './writeFile'
|
||||
|
||||
export {
|
||||
checkFilesIntegrity,
|
||||
readManifestFromStore,
|
||||
FileType,
|
||||
getFilePathByModeInCafs,
|
||||
getFilePathInCafs,
|
||||
|
||||
23
packages/cafs/src/readManifestFromStore.ts
Normal file
23
packages/cafs/src/readManifestFromStore.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
import { DeferredManifestPromise, PackageFileInfo } from '@pnpm/fetcher-base'
|
||||
import gfs from '@pnpm/graceful-fs'
|
||||
import { getFilePathByModeInCafs } from './getFilePathInCafs'
|
||||
import { parseJsonBuffer } from './parseJson'
|
||||
|
||||
export default async function readManifestFromStore (
|
||||
cafsDir: string,
|
||||
pkgIndex: Record<string, PackageFileInfo>,
|
||||
deferredManifest?: DeferredManifestPromise
|
||||
) {
|
||||
const pkg = pkgIndex['package.json']
|
||||
|
||||
if (deferredManifest) {
|
||||
if (pkg) {
|
||||
const fileName = getFilePathByModeInCafs(cafsDir, pkg.integrity, pkg.mode)
|
||||
parseJsonBuffer(await gfs.readFile(fileName), deferredManifest)
|
||||
} else {
|
||||
deferredManifest.resolve(undefined)
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
@@ -2,6 +2,7 @@ import { createReadStream, promises as fs } from 'fs'
|
||||
import path from 'path'
|
||||
import {
|
||||
checkFilesIntegrity as _checkFilesIntegrity,
|
||||
readManifestFromStore as _readManifestFromStore,
|
||||
FileType,
|
||||
getFilePathByModeInCafs as _getFilePathByModeInCafs,
|
||||
getFilePathInCafs as _getFilePathInCafs,
|
||||
@@ -110,8 +111,12 @@ export default function (
|
||||
const getFilePathInCafs = _getFilePathInCafs.bind(null, cafsDir)
|
||||
const fetch = fetcher.bind(null, opts.fetchers, opts.cafs)
|
||||
const fetchPackageToStore = fetchToStore.bind(null, {
|
||||
// If verifyStoreIntegrity is false we skip the integrity checks of all files
|
||||
// and only read the package manifest.
|
||||
// eslint-disable-next-line @typescript-eslint/no-unnecessary-boolean-literal-compare
|
||||
checkFilesIntegrity: opts.verifyStoreIntegrity === false ? async () => true : _checkFilesIntegrity.bind(null, cafsDir),
|
||||
checkFilesIntegrity: opts.verifyStoreIntegrity === false
|
||||
? _readManifestFromStore.bind(null, cafsDir)
|
||||
: _checkFilesIntegrity.bind(null, cafsDir),
|
||||
fetch,
|
||||
fetchingLocker: new Map(),
|
||||
getFilePathByModeInCafs: _getFilePathByModeInCafs.bind(null, cafsDir),
|
||||
|
||||
@@ -1044,3 +1044,67 @@ test('the version in the bundled manifest should be normalized', async () => {
|
||||
}))
|
||||
await pkgResponse.finishing!()
|
||||
})
|
||||
|
||||
test('should skip store integrity check and resolve manifest if fetchRawManifest is true', async () => {
|
||||
const storeDir = tempy.directory()
|
||||
const cafs = createCafsStore(storeDir)
|
||||
|
||||
let pkgResponse!: PackageResponse
|
||||
|
||||
{
|
||||
const requestPackage = createPackageRequester({
|
||||
resolve,
|
||||
fetchers,
|
||||
cafs,
|
||||
networkConcurrency: 1,
|
||||
storeDir,
|
||||
verifyStoreIntegrity: false,
|
||||
})
|
||||
|
||||
const projectDir = tempy.directory()
|
||||
|
||||
pkgResponse = await requestPackage({ alias: 'is-positive', pref: '1.0.0' }, {
|
||||
downloadPriority: 0,
|
||||
lockfileDir: projectDir,
|
||||
preferredVersions: {},
|
||||
projectDir,
|
||||
registry,
|
||||
})
|
||||
|
||||
await pkgResponse.finishing!()
|
||||
}
|
||||
|
||||
{
|
||||
const requestPackage = createPackageRequester({
|
||||
resolve,
|
||||
fetchers,
|
||||
cafs,
|
||||
networkConcurrency: 1,
|
||||
storeDir,
|
||||
verifyStoreIntegrity: false,
|
||||
})
|
||||
|
||||
const fetchResult = requestPackage.fetchPackageToStore({
|
||||
force: false,
|
||||
fetchRawManifest: true,
|
||||
lockfileDir: tempy.directory(),
|
||||
pkg: {
|
||||
name: 'is-positive',
|
||||
version: '1.0.0',
|
||||
id: pkgResponse.body.id,
|
||||
resolution: pkgResponse.body.resolution,
|
||||
},
|
||||
expectedPkg: {
|
||||
name: 'is-positive',
|
||||
version: '1.0.0',
|
||||
},
|
||||
})
|
||||
|
||||
await fetchResult.finishing()
|
||||
|
||||
await expect(fetchResult.bundledManifest!()).resolves.toStrictEqual(expect.objectContaining({
|
||||
name: 'is-positive',
|
||||
version: '1.0.0',
|
||||
}))
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user