mirror of
https://github.com/pnpm/pnpm.git
synced 2026-05-24 16:46:06 -04: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,
|
PackageFilesIndex,
|
||||||
verifyFileIntegrity,
|
verifyFileIntegrity,
|
||||||
} from './checkFilesIntegrity'
|
} from './checkFilesIntegrity'
|
||||||
|
import readManifestFromStore from './readManifestFromStore'
|
||||||
import getFilePathInCafs, {
|
import getFilePathInCafs, {
|
||||||
contentPathFromHex,
|
contentPathFromHex,
|
||||||
FileType,
|
FileType,
|
||||||
@@ -21,6 +22,7 @@ import writeFile from './writeFile'
|
|||||||
|
|
||||||
export {
|
export {
|
||||||
checkFilesIntegrity,
|
checkFilesIntegrity,
|
||||||
|
readManifestFromStore,
|
||||||
FileType,
|
FileType,
|
||||||
getFilePathByModeInCafs,
|
getFilePathByModeInCafs,
|
||||||
getFilePathInCafs,
|
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 path from 'path'
|
||||||
import {
|
import {
|
||||||
checkFilesIntegrity as _checkFilesIntegrity,
|
checkFilesIntegrity as _checkFilesIntegrity,
|
||||||
|
readManifestFromStore as _readManifestFromStore,
|
||||||
FileType,
|
FileType,
|
||||||
getFilePathByModeInCafs as _getFilePathByModeInCafs,
|
getFilePathByModeInCafs as _getFilePathByModeInCafs,
|
||||||
getFilePathInCafs as _getFilePathInCafs,
|
getFilePathInCafs as _getFilePathInCafs,
|
||||||
@@ -110,8 +111,12 @@ export default function (
|
|||||||
const getFilePathInCafs = _getFilePathInCafs.bind(null, cafsDir)
|
const getFilePathInCafs = _getFilePathInCafs.bind(null, cafsDir)
|
||||||
const fetch = fetcher.bind(null, opts.fetchers, opts.cafs)
|
const fetch = fetcher.bind(null, opts.fetchers, opts.cafs)
|
||||||
const fetchPackageToStore = fetchToStore.bind(null, {
|
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
|
// 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,
|
fetch,
|
||||||
fetchingLocker: new Map(),
|
fetchingLocker: new Map(),
|
||||||
getFilePathByModeInCafs: _getFilePathByModeInCafs.bind(null, cafsDir),
|
getFilePathByModeInCafs: _getFilePathByModeInCafs.bind(null, cafsDir),
|
||||||
|
|||||||
@@ -1044,3 +1044,67 @@ test('the version in the bundled manifest should be normalized', async () => {
|
|||||||
}))
|
}))
|
||||||
await pkgResponse.finishing!()
|
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