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:
Dominic Elm
2022-08-04 15:52:19 +02:00
committed by GitHub
parent 1e5482da4c
commit c191ca7bf0
5 changed files with 102 additions and 1 deletions

View 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`.

View File

@@ -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,

View 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
}

View File

@@ -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),

View File

@@ -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',
}))
}
})