Skip to content

Commit

Permalink
fix(pnpm): locked version extraction logic (#23342)
Browse files Browse the repository at this point in the history
  • Loading branch information
Obi-Dann committed Jul 13, 2023
1 parent 4506232 commit 562b745
Show file tree
Hide file tree
Showing 2 changed files with 145 additions and 4 deletions.
139 changes: 139 additions & 0 deletions lib/modules/manager/npm/extract/locked-versions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -552,6 +552,145 @@ describe('modules/manager/npm/extract/locked-versions', () => {
]);
});

it('uses pnpm-lock in subfolder', async () => {
pnpm.getPnpmLock.mockReturnValue({
lockedVersionsWithPath: {
'.': {
dependencies: {
a: '1.0.0',
b: '2.0.0',
c: '3.0.0',
},
},
},
lockfileVersion: 6.0,
});
const packageFiles = [
{
managerData: {
pnpmShrinkwrap: 'subfolder/pnpm-lock.yaml',
},
extractedConstraints: {
pnpm: '>=6.0.0',
},
deps: [
{
depName: 'a',
depType: 'dependencies',
currentValue: '1.0.0',
},
{
depName: 'b',
depType: 'dependencies',
currentValue: '2.0.0',
},
],
packageFile: 'subfolder/package.json',
},
];
await getLockedVersions(packageFiles);
expect(packageFiles).toEqual([
{
extractedConstraints: { pnpm: '>=6.0.0' },
deps: [
{
currentValue: '1.0.0',
depName: 'a',
lockedVersion: '1.0.0',
depType: 'dependencies',
},
{
currentValue: '2.0.0',
depName: 'b',
lockedVersion: '2.0.0',
depType: 'dependencies',
},
],
lockFiles: ['subfolder/pnpm-lock.yaml'],
managerData: { pnpmShrinkwrap: 'subfolder/pnpm-lock.yaml' },
packageFile: 'subfolder/package.json',
},
]);
});

it('uses pnpm-lock with workspaces', async () => {
pnpm.getPnpmLock.mockReturnValue({
lockedVersionsWithPath: {
'workspace-package': {
dependencies: {
a: '1.0.0',
b: '2.0.0',
c: '3.0.0',
},
},
},
lockfileVersion: 6.0,
});
const packageFiles = [
{
managerData: {
pnpmShrinkwrap: 'subfolder/pnpm-lock.yaml',
},
extractedConstraints: {
pnpm: '>=6.0.0',
},
deps: [],
packageFile: 'subfolder/package.json',
},
{
managerData: {
pnpmShrinkwrap: 'subfolder/pnpm-lock.yaml',
},
extractedConstraints: {
pnpm: '>=6.0.0',
},
deps: [
{
depName: 'a',
depType: 'dependencies',
currentValue: '1.0.0',
},
{
depName: 'b',
depType: 'dependencies',
currentValue: '2.0.0',
},
],
packageFile: 'subfolder/workspace-package/package.json',
},
];
await getLockedVersions(packageFiles);
expect(packageFiles).toEqual([
{
extractedConstraints: { pnpm: '>=6.0.0' },
deps: [],
lockFiles: ['subfolder/pnpm-lock.yaml'],
managerData: { pnpmShrinkwrap: 'subfolder/pnpm-lock.yaml' },
packageFile: 'subfolder/package.json',
},
{
extractedConstraints: { pnpm: '>=6.0.0' },
deps: [
{
currentValue: '1.0.0',
depName: 'a',
lockedVersion: '1.0.0',
depType: 'dependencies',
},
{
currentValue: '2.0.0',
depName: 'b',
lockedVersion: '2.0.0',
depType: 'dependencies',
},
],
lockFiles: ['subfolder/pnpm-lock.yaml'],
managerData: { pnpmShrinkwrap: 'subfolder/pnpm-lock.yaml' },
packageFile: 'subfolder/workspace-package/package.json',
},
]);
});

it('should log warning if unsupported lockfileVersion is found', async () => {
npm.getNpmLock.mockReturnValue({
lockedVersions: {},
Expand Down
10 changes: 6 additions & 4 deletions lib/modules/manager/npm/extract/locked-versions.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import is from '@sindresorhus/is';
import semver from 'semver';
import { dirname, relative } from 'upath';
import { logger } from '../../../../logger';
import type { PackageFile } from '../../types';
import type { NpmManagerData } from '../types';
Expand Down Expand Up @@ -124,14 +125,15 @@ export async function getLockedVersions(
lockFileCache[pnpmShrinkwrap] = await getPnpmLock(pnpmShrinkwrap);
}

const parentDir = packageFile.packageFile
.replace(/\/package\.json$/, '')
.replace(/^package\.json$/, '.');
const packageDir = dirname(packageFile.packageFile);
const pnpmRootDir = dirname(pnpmShrinkwrap);
const relativeDir = relative(pnpmRootDir, packageDir) || '.';

for (const dep of packageFile.deps) {
const { depName, depType } = dep;
// TODO: types (#7154)
const lockedVersion = semver.valid(
lockFileCache[pnpmShrinkwrap].lockedVersionsWithPath?.[parentDir]?.[
lockFileCache[pnpmShrinkwrap].lockedVersionsWithPath?.[relativeDir]?.[
depType!
]?.[depName!]
);
Expand Down

0 comments on commit 562b745

Please sign in to comment.