Skip to content
Snippets Groups Projects
Unverified Commit 07792310 authored by Rhys Arkins's avatar Rhys Arkins Committed by GitHub
Browse files

feat: add purl to npm packages (#2053)

parent d37eb1d6
No related branches found
Tags v10.15.2
No related merge requests found
...@@ -3,6 +3,7 @@ const upath = require('upath'); ...@@ -3,6 +3,7 @@ const upath = require('upath');
const { getLockedVersions } = require('./locked-versions'); const { getLockedVersions } = require('./locked-versions');
const { detectMonorepos } = require('./monorepo'); const { detectMonorepos } = require('./monorepo');
const { mightBeABrowserLibrary } = require('./type'); const { mightBeABrowserLibrary } = require('./type');
const semver = require('../../../versioning/semver');
module.exports = { module.exports = {
extractDependencies, extractDependencies,
...@@ -103,11 +104,32 @@ async function extractDependencies(content, packageFile, config) { ...@@ -103,11 +104,32 @@ async function extractDependencies(content, packageFile, config) {
if (packageJson[depType]) { if (packageJson[depType]) {
try { try {
for (const [depName, version] of Object.entries(packageJson[depType])) { for (const [depName, version] of Object.entries(packageJson[depType])) {
deps.push({ const dep = {
depName,
depType, depType,
currentVersion: version.trim().replace(/^=/, ''), depName,
}); };
// TODO: do we need to remove the equals?
dep.currentVersion = version.trim().replace(/^=/, '');
if (dep.currentVersion.startsWith('file:')) {
dep.skipReason = 'file';
} else if (depType === 'engines' && depName === 'node') {
dep.purl = 'pkg:github/nodejs/node';
} else if (depType === 'engines' && depName === 'yarn') {
dep.purl = 'pkg:github/yarnpkg/yarn';
dep.commitMessageTopic = 'Yarn';
} else if (semver.isValid(dep.currentVersion)) {
dep.purl = `pkg:npm/${depName.replace('@', '%40')}`;
if (dep.currentVersion === '*') {
dep.skipReason = 'any-version';
}
} else {
dep.skipReason = 'unknown-version';
}
if (depName === 'node') {
// This is a special case for Node.js to group it together with other managers
dep.commitMessageTopic = 'Node.js';
}
deps.push(dep);
} }
} catch (err) /* istanbul ignore next */ { } catch (err) /* istanbul ignore next */ {
logger.info( logger.info(
......
// Jest Snapshot v1, https://goo.gl/fbAQLP // Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`manager/npm/extract .extractDependencies() extracts engines 1`] = `
Object {
"deps": Array [
Object {
"currentVersion": "1.6.0",
"depName": "angular",
"depType": "dependencies",
"purl": "pkg:npm/angular",
},
Object {
"currentVersion": "1.6.0",
"depName": "@angular/cli",
"depType": "devDependencies",
"purl": "pkg:npm/%40angular/cli",
},
Object {
"currentVersion": "*",
"depName": "foo",
"depType": "devDependencies",
"purl": "pkg:npm/foo",
"skipReason": "any-version",
},
Object {
"currentVersion": "file:../foo/bar",
"depName": "bar",
"depType": "devDependencies",
"skipReason": "file",
},
Object {
"currentVersion": "latest",
"depName": "other",
"depType": "devDependencies",
"skipReason": "unknown-version",
},
Object {
"commitMessageTopic": "Node.js",
"currentVersion": ">= 8.9.2",
"depName": "node",
"depType": "engines",
"purl": "pkg:github/nodejs/node",
},
Object {
"commitMessageTopic": "Yarn",
"currentVersion": "1.7.0",
"depName": "yarn",
"depType": "engines",
"purl": "pkg:github/yarnpkg/yarn",
},
],
"lernaClient": undefined,
"lernaDir": undefined,
"lernaPackages": undefined,
"npmLock": undefined,
"npmrc": undefined,
"packageJsonName": undefined,
"packageJsonType": "app",
"packageJsonVersion": undefined,
"pnpmShrinkwrap": undefined,
"yarnLock": undefined,
"yarnWorkspacesPackages": undefined,
"yarnrc": undefined,
}
`;
exports[`manager/npm/extract .extractDependencies() finds a lock file 1`] = ` exports[`manager/npm/extract .extractDependencies() finds a lock file 1`] = `
Object { Object {
"deps": Array [ "deps": Array [
...@@ -7,51 +71,61 @@ Object { ...@@ -7,51 +71,61 @@ Object {
"currentVersion": "6.5.0", "currentVersion": "6.5.0",
"depName": "autoprefixer", "depName": "autoprefixer",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/autoprefixer",
}, },
Object { Object {
"currentVersion": "~1.6.0", "currentVersion": "~1.6.0",
"depName": "bower", "depName": "bower",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/bower",
}, },
Object { Object {
"currentVersion": "13.1.0", "currentVersion": "13.1.0",
"depName": "browserify", "depName": "browserify",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/browserify",
}, },
Object { Object {
"currentVersion": "0.9.2", "currentVersion": "0.9.2",
"depName": "browserify-css", "depName": "browserify-css",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/browserify-css",
}, },
Object { Object {
"currentVersion": "0.22.0", "currentVersion": "0.22.0",
"depName": "cheerio", "depName": "cheerio",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/cheerio",
}, },
Object { Object {
"currentVersion": "1.21.0", "currentVersion": "1.21.0",
"depName": "config", "depName": "config",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/config",
}, },
Object { Object {
"currentVersion": "^1.5.8", "currentVersion": "^1.5.8",
"depName": "angular", "depName": "angular",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/angular",
}, },
Object { Object {
"currentVersion": "1.5.8", "currentVersion": "1.5.8",
"depName": "angular-touch", "depName": "angular-touch",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/angular-touch",
}, },
Object { Object {
"currentVersion": "1.5.8", "currentVersion": "1.5.8",
"depName": "angular-sanitize", "depName": "angular-sanitize",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/angular-sanitize",
}, },
Object { Object {
"currentVersion": "4.0.0-beta.1", "currentVersion": "4.0.0-beta.1",
"depName": "@angular/core", "depName": "@angular/core",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/%40angular/core",
}, },
], ],
"lernaClient": undefined, "lernaClient": undefined,
...@@ -96,51 +170,61 @@ Object { ...@@ -96,51 +170,61 @@ Object {
"currentVersion": "6.5.0", "currentVersion": "6.5.0",
"depName": "autoprefixer", "depName": "autoprefixer",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/autoprefixer",
}, },
Object { Object {
"currentVersion": "~1.6.0", "currentVersion": "~1.6.0",
"depName": "bower", "depName": "bower",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/bower",
}, },
Object { Object {
"currentVersion": "13.1.0", "currentVersion": "13.1.0",
"depName": "browserify", "depName": "browserify",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/browserify",
}, },
Object { Object {
"currentVersion": "0.9.2", "currentVersion": "0.9.2",
"depName": "browserify-css", "depName": "browserify-css",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/browserify-css",
}, },
Object { Object {
"currentVersion": "0.22.0", "currentVersion": "0.22.0",
"depName": "cheerio", "depName": "cheerio",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/cheerio",
}, },
Object { Object {
"currentVersion": "1.21.0", "currentVersion": "1.21.0",
"depName": "config", "depName": "config",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/config",
}, },
Object { Object {
"currentVersion": "^1.5.8", "currentVersion": "^1.5.8",
"depName": "angular", "depName": "angular",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/angular",
}, },
Object { Object {
"currentVersion": "1.5.8", "currentVersion": "1.5.8",
"depName": "angular-touch", "depName": "angular-touch",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/angular-touch",
}, },
Object { Object {
"currentVersion": "1.5.8", "currentVersion": "1.5.8",
"depName": "angular-sanitize", "depName": "angular-sanitize",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/angular-sanitize",
}, },
Object { Object {
"currentVersion": "4.0.0-beta.1", "currentVersion": "4.0.0-beta.1",
"depName": "@angular/core", "depName": "@angular/core",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/%40angular/core",
}, },
], ],
"lernaClient": "npm", "lernaClient": "npm",
...@@ -165,51 +249,61 @@ Object { ...@@ -165,51 +249,61 @@ Object {
"currentVersion": "6.5.0", "currentVersion": "6.5.0",
"depName": "autoprefixer", "depName": "autoprefixer",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/autoprefixer",
}, },
Object { Object {
"currentVersion": "~1.6.0", "currentVersion": "~1.6.0",
"depName": "bower", "depName": "bower",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/bower",
}, },
Object { Object {
"currentVersion": "13.1.0", "currentVersion": "13.1.0",
"depName": "browserify", "depName": "browserify",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/browserify",
}, },
Object { Object {
"currentVersion": "0.9.2", "currentVersion": "0.9.2",
"depName": "browserify-css", "depName": "browserify-css",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/browserify-css",
}, },
Object { Object {
"currentVersion": "0.22.0", "currentVersion": "0.22.0",
"depName": "cheerio", "depName": "cheerio",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/cheerio",
}, },
Object { Object {
"currentVersion": "1.21.0", "currentVersion": "1.21.0",
"depName": "config", "depName": "config",
"depType": "dependencies", "depType": "dependencies",
"purl": "pkg:npm/config",
}, },
Object { Object {
"currentVersion": "^1.5.8", "currentVersion": "^1.5.8",
"depName": "angular", "depName": "angular",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/angular",
}, },
Object { Object {
"currentVersion": "1.5.8", "currentVersion": "1.5.8",
"depName": "angular-touch", "depName": "angular-touch",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/angular-touch",
}, },
Object { Object {
"currentVersion": "1.5.8", "currentVersion": "1.5.8",
"depName": "angular-sanitize", "depName": "angular-sanitize",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/angular-sanitize",
}, },
Object { Object {
"currentVersion": "4.0.0-beta.1", "currentVersion": "4.0.0-beta.1",
"depName": "@angular/core", "depName": "@angular/core",
"depType": "devDependencies", "depType": "devDependencies",
"purl": "pkg:npm/%40angular/core",
}, },
], ],
"lernaClient": undefined, "lernaClient": undefined,
......
...@@ -119,6 +119,30 @@ describe('manager/npm/extract', () => { ...@@ -119,6 +119,30 @@ describe('manager/npm/extract', () => {
); );
expect(res).toMatchSnapshot(); expect(res).toMatchSnapshot();
}); });
it('extracts engines', async () => {
const pJson = {
dependencies: {
angular: '1.6.0',
},
devDependencies: {
'@angular/cli': '1.6.0',
foo: '*',
bar: 'file:../foo/bar',
other: 'latest',
},
engines: {
node: '>= 8.9.2',
yarn: '1.7.0',
},
};
const pJsonStr = JSON.stringify(pJson);
const res = await npmExtract.extractDependencies(
pJsonStr,
'package.json',
{}
);
expect(res).toMatchSnapshot();
});
}); });
describe('.postExtract()', () => { describe('.postExtract()', () => {
it('runs', async () => { it('runs', async () => {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment