Skip to content

Commit eaaff2d

Browse files
fix(npm): locked version extraction logic (renovatebot#37407)
1 parent 4e764fb commit eaaff2d

File tree

2 files changed

+60
-1
lines changed

2 files changed

+60
-1
lines changed

lib/modules/manager/npm/extract/post/locked-versions.spec.ts

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,56 @@ describe('modules/manager/npm/extract/post/locked-versions', () => {
295295
]);
296296
});
297297

298+
it('uses locked version corresponding to workspace', async () => {
299+
npm.getNpmLock.mockResolvedValue({
300+
lockedVersions: {
301+
a: '1.0.0',
302+
'workspace/node_modules/a': '2.0.0',
303+
c: '3.0.0',
304+
},
305+
lockfileVersion: 1,
306+
});
307+
const packageFiles = [
308+
{
309+
managerData: { npmLock: 'package-lock.json' },
310+
extractedConstraints: {},
311+
deps: [
312+
{ depName: 'a', currentValue: '1.0.0' },
313+
{ depName: 'c', currentValue: '3.0.0' },
314+
],
315+
packageFile: 'some-file',
316+
},
317+
{
318+
managerData: { npmLock: 'package-lock.json' },
319+
extractedConstraints: {},
320+
deps: [{ depName: 'a', currentValue: '2.0.0' }],
321+
packageFile: 'workspace/some-file',
322+
},
323+
];
324+
await getLockedVersions(packageFiles);
325+
expect(packageFiles).toEqual([
326+
{
327+
extractedConstraints: { npm: '<7' },
328+
deps: [
329+
{ currentValue: '1.0.0', depName: 'a', lockedVersion: '1.0.0' },
330+
{ currentValue: '3.0.0', depName: 'c', lockedVersion: '3.0.0' },
331+
],
332+
lockFiles: ['package-lock.json'],
333+
managerData: { npmLock: 'package-lock.json' },
334+
packageFile: 'some-file',
335+
},
336+
{
337+
extractedConstraints: { npm: '<7' },
338+
deps: [
339+
{ currentValue: '2.0.0', depName: 'a', lockedVersion: '2.0.0' },
340+
],
341+
lockFiles: ['package-lock.json'],
342+
managerData: { npmLock: 'package-lock.json' },
343+
packageFile: 'workspace/some-file',
344+
},
345+
]);
346+
});
347+
298348
it('does nothing if managerData is not present', async () => {
299349
npm.getNpmLock.mockResolvedValue({
300350
lockedVersions: { a: '1.0.0', b: '2.0.0', c: '3.0.0' },

lib/modules/manager/npm/extract/post/locked-versions.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,10 +104,19 @@ export async function getLockedVersions(
104104
packageFile.extractedConstraints.npm = npm;
105105
}
106106

107+
const packageDir = upath.dirname(packageFile.packageFile);
108+
const npmRootDir = upath.dirname(npmLock);
109+
const relativeDir = upath.relative(npmRootDir, packageDir);
110+
107111
for (const dep of packageFile.deps) {
108112
// TODO: types (#22198)
113+
let lockedDepName = dep.depName!;
114+
if (relativeDir && relativeDir !== '.') {
115+
lockedDepName = `${relativeDir}/node_modules/${dep.depName}`;
116+
}
117+
109118
dep.lockedVersion = semver.valid(
110-
lockFileCache[npmLock].lockedVersions?.[dep.depName!],
119+
lockFileCache[npmLock].lockedVersions?.[lockedDepName],
111120
)!;
112121
}
113122
} else if (pnpmShrinkwrap) {

0 commit comments

Comments
 (0)