diff --git a/.changeset/six-mice-perform.md b/.changeset/six-mice-perform.md new file mode 100644 index 0000000000..887880f5f5 --- /dev/null +++ b/.changeset/six-mice-perform.md @@ -0,0 +1,5 @@ +--- +"@pnpm/headless": patch +--- + +Frozen install should not fail if the lockfile contains references to directories with no `package.json` file. diff --git a/packages/headless/src/index.ts b/packages/headless/src/index.ts index be52b2c552..9a7adced42 100644 --- a/packages/headless/src/index.ts +++ b/packages/headless/src/index.ts @@ -488,8 +488,13 @@ async function linkRootPackages ( if (importerManifestsByImporterId[importerId]) { return importerManifestsByImporterId[importerId] } - // TODO: cover this case with a test - return await readProjectManifestOnly(packageDir) as DependencyManifest + try { + // TODO: cover this case with a test + return await readProjectManifestOnly(packageDir) as DependencyManifest + } catch (err) { + if (err['code'] !== 'ERR_PNPM_NO_IMPORTER_MANIFEST_FOUND') throw err + return { name: alias, version: '0.0.0' } + } })() as DependencyManifest await symlinkDirectRootDependency(packageDir, opts.importerModulesDir, alias, { fromDependenciesField: isDev && 'devDependencies' || diff --git a/packages/supi/test/install/local.ts b/packages/supi/test/install/local.ts index 1cd04aa0ac..ce08a97dd2 100644 --- a/packages/supi/test/install/local.ts +++ b/packages/supi/test/install/local.ts @@ -57,6 +57,11 @@ test('local directory with no package.json', async () => { const expectedSpecs = { pkg: 'link:pkg' } expect(manifest.dependencies).toStrictEqual(expectedSpecs) await project.has('pkg') + + await rimraf('node_modules') + + await install(manifest, await testDefaults({ frozenLockfile: true })) + await project.has('pkg') }) test('local file via link:', async () => {