Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions lib/manager/npm/__fixtures__/yarn2.2/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "yarn2",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"chalk": "^2.4.1"
}
}
73 changes: 73 additions & 0 deletions lib/manager/npm/__fixtures__/yarn2.2/yarn.lock
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!

__metadata:
version: 4
cacheKey: 6

"ansi-styles@npm:^3.2.1":
version: 3.2.1
resolution: "ansi-styles@npm:3.2.1"
dependencies:
color-convert: ^1.9.0
checksum: 456e1c23d9277512a47718da75e7fbb0a5ee215ef893c2f76d6b3efe8fceabc861121b80b0362146f5f995d21a1633f05a19bbf6283ae66ac11dc3b9c0bed779
languageName: node
linkType: hard

"chalk@npm:^2.4.1":
version: 2.4.2
resolution: "chalk@npm:2.4.2"
dependencies:
ansi-styles: ^3.2.1
escape-string-regexp: ^1.0.5
supports-color: ^5.3.0
checksum: 22c7b7b5bc761c882bb6516454a1a671923f1c53ff972860065aa0b28a195f230163c1d46ee88bcc7a03e5539177d896457d8bc727de7f244c6e87032743038e
languageName: node
linkType: hard

"color-convert@npm:^1.9.0":
version: 1.9.3
resolution: "color-convert@npm:1.9.3"
dependencies:
color-name: 1.1.3
checksum: 5f244daa3d1fe1f216d48878c550465067d15268688308554e613b7640a068f96588096d51f0b98b68f15d6ff6bb8ad24e172582ac8c0ad43fa4d3da60fd1b79
languageName: node
linkType: hard

"color-name@npm:1.1.3":
version: 1.1.3
resolution: "color-name@npm:1.1.3"
checksum: d8b91bb90aefc05b6ff568cf8889566dcc6269824df6f3c9b8ca842b18d7f4d089c07dc166808d33f22092d4a79167aa56a96a5ff0d21efab548bf44614db43b
languageName: node
linkType: hard

"escape-string-regexp@npm:^1.0.5":
version: 1.0.5
resolution: "escape-string-regexp@npm:1.0.5"
checksum: f9484b8b4c8827d816e0fd905c25ed4b561376a9c220e1430403ea84619bf680c76a883a48cff8b8e091daf55d6a497e37479f9787b9f15f3c421b6054289744
languageName: node
linkType: hard

"has-flag@npm:^3.0.0":
version: 3.0.0
resolution: "has-flag@npm:3.0.0"
checksum: 63aade480d27aeedb3b5b63a2e069d47d0006bf182338d662e7941cdc024e68a28418e0efa8dc5df30db9c4ee2407f39e6ea3f16cfbc6b83848b450826a28aa0
languageName: node
linkType: hard

"supports-color@npm:^5.3.0":
version: 5.5.0
resolution: "supports-color@npm:5.5.0"
dependencies:
has-flag: ^3.0.0
checksum: edacee6425498440744c418be94b0660181aad2a1828bcf2be85c42bd385da2fd8b2b358d9b62b0c5b03ff5cd3e992458d7b8f879d9fb42f2201fe05a4848a29
languageName: node
linkType: hard

"yarn2@workspace:.":
version: 0.0.0-use.local
resolution: "yarn2@workspace:."
dependencies:
chalk: ^2.4.1
languageName: unknown
linkType: soft
24 changes: 24 additions & 0 deletions lib/manager/npm/extract/__snapshots__/locked-versions.spec.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -83,3 +83,27 @@ Array [
},
]
`;

exports[`manager/npm/extract/locked-versions .getLockedVersions() uses yarn.lock with yarn v2.2.0 1`] = `
Array [
Object {
"compatibility": Object {
"yarn": ">= 2.2.0",
},
"deps": Array [
Object {
"currentValue": "1.0.0",
"depName": "a",
"lockedVersion": "1.0.0",
},
Object {
"currentValue": "2.0.0",
"depName": "b",
"lockedVersion": "2.0.0",
},
],
"npmLock": "package-lock.json",
"yarnLock": "yarn.lock",
},
]
`;
13 changes: 13 additions & 0 deletions lib/manager/npm/extract/__snapshots__/yarn.spec.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -24,3 +24,16 @@ Object {
"yarn2@.": "0.0.0-use.local",
}
`;

exports[`manager/npm/extract/yarn .getYarnLock() extracts yarn 2 cache version 1`] = `
Object {
"ansi-styles@^3.2.1": "3.2.1",
"chalk@^2.4.1": "2.4.2",
"color-convert@^1.9.0": "1.9.3",
"[email protected]": "1.1.3",
"escape-string-regexp@^1.0.5": "1.0.5",
"has-flag@^3.0.0": "3.0.0",
"supports-color@^5.3.0": "5.5.0",
"yarn2@.": "0.0.0-use.local",
}
`;
3 changes: 2 additions & 1 deletion lib/manager/npm/extract/locked-versions.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,12 @@ jest.mock('./yarn');

describe('manager/npm/extract/locked-versions', () => {
describe('.getLockedVersions()', () => {
it.each([['1.22.0'], ['2.1.0']])(
it.each([['1.22.0'], ['2.1.0'], ['2.2.0']])(
'uses yarn.lock with yarn v%s',
async (yarnVersion) => {
yarn.getYarnLock.mockReturnValue({
isYarn1: yarnVersion === '1.22.0',
cacheVersion: yarnVersion === '2.2.0' ? 6 : NaN,
lockedVersions: {
'[email protected]': '1.0.0',
'[email protected]': '2.0.0',
Expand Down
11 changes: 9 additions & 2 deletions lib/manager/npm/extract/locked-versions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,17 @@ export async function getLockedVersions(
logger.trace('Found yarnLock');
if (!lockFileCache[yarnLock]) {
logger.trace('Retrieving/parsing ' + yarnLock);
const { lockedVersions, isYarn1 } = await getYarnLock(yarnLock);
const { lockedVersions, cacheVersion, isYarn1 } = await getYarnLock(
yarnLock
);
lockFileCache[yarnLock] = lockedVersions;
if (!isYarn1) {
packageFile.compatibility.yarn = '>= 2.0.0';
if (cacheVersion >= 6) {
// https://github.com/yarnpkg/berry/commit/f753790380cbda5b55d028ea84b199445129f9ba
packageFile.compatibility.yarn = '>= 2.2.0';
} else {
packageFile.compatibility.yarn = '>= 2.0.0';
}
}
}
for (const dep of packageFile.deps) {
Expand Down
15 changes: 15 additions & 0 deletions lib/manager/npm/extract/yarn.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ describe('manager/npm/extract/yarn', () => {
fs.readLocalFile.mockResolvedValueOnce(plocktest1Lock);
const res = await getYarnLock('package.json');
expect(res.isYarn1).toBe(true);
expect(res.cacheVersion).toBe(NaN);
expect(res.lockedVersions).toMatchSnapshot();
expect(Object.keys(res.lockedVersions)).toHaveLength(7);
});
Expand All @@ -33,6 +34,20 @@ describe('manager/npm/extract/yarn', () => {
fs.readLocalFile.mockResolvedValueOnce(plocktest1Lock);
const res = await getYarnLock('package.json');
expect(res.isYarn1).toBe(false);
expect(res.cacheVersion).toBe(NaN);
expect(res.lockedVersions).toMatchSnapshot();
expect(Object.keys(res.lockedVersions)).toHaveLength(8);
});

it('extracts yarn 2 cache version', async () => {
const plocktest1Lock = readFileSync(
'lib/manager/npm/__fixtures__/yarn2.2/yarn.lock',
'utf8'
);
fs.readLocalFile.mockResolvedValueOnce(plocktest1Lock);
const res = await getYarnLock('package.json');
expect(res.isYarn1).toBe(false);
expect(res.cacheVersion).toBe(6);
expect(res.lockedVersions).toMatchSnapshot();
expect(Object.keys(res.lockedVersions)).toHaveLength(8);
});
Expand Down
11 changes: 9 additions & 2 deletions lib/manager/npm/extract/yarn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,21 @@ import { readLocalFile } from '../../../util/fs';

export async function getYarnLock(
filePath: string
): Promise<{ isYarn1: boolean; lockedVersions: Record<string, string> }> {
): Promise<{
isYarn1: boolean;
cacheVersion: number;
lockedVersions: Record<string, string>;
}> {
const yarnLockRaw = await readLocalFile(filePath, 'utf8');
try {
const parsed = parseSyml(yarnLockRaw);
const lockFile: Record<string, string> = {};
let cacheVersion = NaN;

for (const [key, val] of Object.entries(parsed)) {
if (key === '__metadata') {
// yarn 2
cacheVersion = parseInt(val.cacheKey, 10);
} else {
for (const entry of key.split(', ')) {
const { scope, name, range } = structUtils.parseDescriptor(entry);
Expand All @@ -27,10 +33,11 @@ export async function getYarnLock(
}
return {
isYarn1: !('__metadata' in parsed),
cacheVersion,
lockedVersions: lockFile,
};
} catch (err) {
logger.debug({ filePath, err }, 'Warning: Exception parsing yarn.lock');
return { isYarn1: true, lockedVersions: {} };
return { isYarn1: true, cacheVersion: NaN, lockedVersions: {} };
}
}