Skip to content
Snippets Groups Projects
Commit 5dafa051 authored by Rhys Arkins's avatar Rhys Arkins
Browse files

refactor(npm): extract node compatibility

parent f8ad10e6
No related branches found
No related tags found
No related merge requests found
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
exports[`manager/npm/extract .extractPackageFile() catches invalid names 1`] = ` exports[`manager/npm/extract .extractPackageFile() catches invalid names 1`] = `
Object { Object {
"compatibility": Object {},
"deps": Array [ "deps": Array [
Object { Object {
"depName": "kgabis/parson", "depName": "kgabis/parson",
...@@ -29,6 +30,11 @@ Object { ...@@ -29,6 +30,11 @@ Object {
exports[`manager/npm/extract .extractPackageFile() extracts engines 1`] = ` exports[`manager/npm/extract .extractPackageFile() extracts engines 1`] = `
Object { Object {
"compatibility": Object {
"node": ">= 8.9.2",
"npm": "^8.0.0",
"yarn": "disabled",
},
"deps": Array [ "deps": Array [
Object { Object {
"currentValue": "1.6.0", "currentValue": "1.6.0",
...@@ -131,6 +137,7 @@ Object { ...@@ -131,6 +137,7 @@ Object {
exports[`manager/npm/extract .extractPackageFile() extracts non-npmjs 1`] = ` exports[`manager/npm/extract .extractPackageFile() extracts non-npmjs 1`] = `
Object { Object {
"compatibility": Object {},
"deps": Array [ "deps": Array [
Object { Object {
"currentValue": "github:owner/a", "currentValue": "github:owner/a",
...@@ -292,6 +299,7 @@ Object { ...@@ -292,6 +299,7 @@ Object {
exports[`manager/npm/extract .extractPackageFile() extracts npm package alias 1`] = ` exports[`manager/npm/extract .extractPackageFile() extracts npm package alias 1`] = `
Object { Object {
"compatibility": Object {},
"deps": Array [ "deps": Array [
Object { Object {
"currentValue": "1", "currentValue": "1",
...@@ -339,6 +347,9 @@ Object { ...@@ -339,6 +347,9 @@ Object {
exports[`manager/npm/extract .extractPackageFile() extracts volta 1`] = ` exports[`manager/npm/extract .extractPackageFile() extracts volta 1`] = `
Object { Object {
"compatibility": Object {
"node": "8.9.2",
},
"deps": Array [ "deps": Array [
Object { Object {
"commitMessageTopic": "Node.js", "commitMessageTopic": "Node.js",
...@@ -401,6 +412,9 @@ Object { ...@@ -401,6 +412,9 @@ Object {
exports[`manager/npm/extract .extractPackageFile() extracts volta yarn unknown-version 1`] = ` exports[`manager/npm/extract .extractPackageFile() extracts volta yarn unknown-version 1`] = `
Object { Object {
"compatibility": Object {
"node": "8.9.2",
},
"deps": Array [ "deps": Array [
Object { Object {
"commitMessageTopic": "Node.js", "commitMessageTopic": "Node.js",
...@@ -457,6 +471,7 @@ Object { ...@@ -457,6 +471,7 @@ Object {
exports[`manager/npm/extract .extractPackageFile() finds "npmClient":"npm" in lerna.json 1`] = ` exports[`manager/npm/extract .extractPackageFile() finds "npmClient":"npm" in lerna.json 1`] = `
Object { Object {
"compatibility": Object {},
"deps": Array [ "deps": Array [
Object { Object {
"currentValue": "6.5.0", "currentValue": "6.5.0",
...@@ -591,6 +606,7 @@ Object { ...@@ -591,6 +606,7 @@ Object {
exports[`manager/npm/extract .extractPackageFile() finds "npmClient":"yarn" in lerna.json 1`] = ` exports[`manager/npm/extract .extractPackageFile() finds "npmClient":"yarn" in lerna.json 1`] = `
Object { Object {
"compatibility": Object {},
"deps": Array [ "deps": Array [
Object { Object {
"currentValue": "6.5.0", "currentValue": "6.5.0",
...@@ -725,6 +741,7 @@ Object { ...@@ -725,6 +741,7 @@ Object {
exports[`manager/npm/extract .extractPackageFile() finds a lock file 1`] = ` exports[`manager/npm/extract .extractPackageFile() finds a lock file 1`] = `
Object { Object {
"compatibility": Object {},
"deps": Array [ "deps": Array [
Object { Object {
"currentValue": "6.5.0", "currentValue": "6.5.0",
...@@ -859,6 +876,7 @@ Object { ...@@ -859,6 +876,7 @@ Object {
exports[`manager/npm/extract .extractPackageFile() finds complex yarn workspaces 1`] = ` exports[`manager/npm/extract .extractPackageFile() finds complex yarn workspaces 1`] = `
Object { Object {
"compatibility": Object {},
"deps": Array [], "deps": Array [],
"ignoreNpmrcFile": undefined, "ignoreNpmrcFile": undefined,
"lernaClient": "npm", "lernaClient": "npm",
...@@ -881,6 +899,7 @@ Object { ...@@ -881,6 +899,7 @@ Object {
exports[`manager/npm/extract .extractPackageFile() finds lerna 1`] = ` exports[`manager/npm/extract .extractPackageFile() finds lerna 1`] = `
Object { Object {
"compatibility": Object {},
"deps": Array [ "deps": Array [
Object { Object {
"currentValue": "6.5.0", "currentValue": "6.5.0",
...@@ -1015,6 +1034,7 @@ Object { ...@@ -1015,6 +1034,7 @@ Object {
exports[`manager/npm/extract .extractPackageFile() finds simple yarn workspaces 1`] = ` exports[`manager/npm/extract .extractPackageFile() finds simple yarn workspaces 1`] = `
Object { Object {
"compatibility": Object {},
"deps": Array [], "deps": Array [],
"ignoreNpmrcFile": undefined, "ignoreNpmrcFile": undefined,
"lernaClient": "npm", "lernaClient": "npm",
...@@ -1037,6 +1057,7 @@ Object { ...@@ -1037,6 +1057,7 @@ Object {
exports[`manager/npm/extract .extractPackageFile() returns an array of dependencies 1`] = ` exports[`manager/npm/extract .extractPackageFile() returns an array of dependencies 1`] = `
Object { Object {
"compatibility": Object {},
"deps": Array [ "deps": Array [
Object { Object {
"currentValue": "6.5.0", "currentValue": "6.5.0",
......
...@@ -148,6 +148,8 @@ export async function extractPackageFile( ...@@ -148,6 +148,8 @@ export async function extractPackageFile(
resolutions: 'resolutions', resolutions: 'resolutions',
}; };
const compatibility: Record<string, any> = {};
function extractDependency( function extractDependency(
depType: string, depType: string,
depName: string, depName: string,
...@@ -168,12 +170,15 @@ export async function extractPackageFile( ...@@ -168,12 +170,15 @@ export async function extractPackageFile(
dep.datasource = datasourceGithubTags.id; dep.datasource = datasourceGithubTags.id;
dep.lookupName = 'nodejs/node'; dep.lookupName = 'nodejs/node';
dep.versioning = nodeVersioning.id; dep.versioning = nodeVersioning.id;
compatibility.node = dep.currentValue;
} else if (depName === 'yarn') { } else if (depName === 'yarn') {
dep.datasource = datasourceNpm.id; dep.datasource = datasourceNpm.id;
dep.commitMessageTopic = 'Yarn'; dep.commitMessageTopic = 'Yarn';
compatibility.yarn = dep.currentValue;
} else if (depName === 'npm') { } else if (depName === 'npm') {
dep.datasource = datasourceNpm.id; dep.datasource = datasourceNpm.id;
dep.commitMessageTopic = 'npm'; dep.commitMessageTopic = 'npm';
compatibility.npm = dep.currentValue;
} else { } else {
dep.skipReason = SkipReason.UnknownEngines; dep.skipReason = SkipReason.UnknownEngines;
} }
...@@ -351,6 +356,7 @@ export async function extractPackageFile( ...@@ -351,6 +356,7 @@ export async function extractPackageFile(
lernaPackages, lernaPackages,
skipInstalls, skipInstalls,
yarnWorkspacesPackages, yarnWorkspacesPackages,
compatibility,
}; };
} }
......
...@@ -5,41 +5,42 @@ import { getNodeConstraint } from './node-version'; ...@@ -5,41 +5,42 @@ import { getNodeConstraint } from './node-version';
const fs = mocked(fs_); const fs = mocked(fs_);
describe('getNodeConstraint', () => { describe('getNodeConstraint', () => {
const config = {
packageFile: 'package.json',
compatibility: { node: '^12.16.0' },
};
it('returns package.json range', async () => { it('returns package.json range', async () => {
fs.readLocalFile = jest.fn(); fs.readLocalFile = jest.fn();
fs.readLocalFile.mockResolvedValueOnce(null); fs.readLocalFile.mockResolvedValueOnce(null);
fs.readLocalFile.mockResolvedValueOnce(null); fs.readLocalFile.mockResolvedValueOnce(null);
fs.readLocalFile.mockResolvedValueOnce('{"engines":{"node":"^12.16.0"}}'); const res = await getNodeConstraint(config);
const res = await getNodeConstraint({ packageFile: 'package.json' });
expect(res).toEqual('^12.16.0'); expect(res).toEqual('^12.16.0');
}); });
it('returns .node-version value', async () => { it('returns .node-version value', async () => {
fs.readLocalFile = jest.fn(); fs.readLocalFile = jest.fn();
fs.readLocalFile.mockResolvedValueOnce(null); fs.readLocalFile.mockResolvedValueOnce(null);
fs.readLocalFile.mockResolvedValueOnce('12.16.1\n'); fs.readLocalFile.mockResolvedValueOnce('12.16.1\n');
const res = await getNodeConstraint({ packageFile: 'package.json' }); const res = await getNodeConstraint(config);
expect(res).toEqual('12.16.1'); expect(res).toEqual('12.16.1');
}); });
it('returns .nvmrc value', async () => { it('returns .nvmrc value', async () => {
fs.readLocalFile = jest.fn(); fs.readLocalFile = jest.fn();
fs.readLocalFile.mockResolvedValueOnce('12.16.2\n'); fs.readLocalFile.mockResolvedValueOnce('12.16.2\n');
const res = await getNodeConstraint({ packageFile: 'package.json' }); const res = await getNodeConstraint(config);
expect(res).toEqual('12.16.2'); expect(res).toEqual('12.16.2');
}); });
it('ignores unusable ranges in dotfiles', async () => { it('ignores unusable ranges in dotfiles', async () => {
fs.readLocalFile = jest.fn(); fs.readLocalFile = jest.fn();
fs.readLocalFile.mockResolvedValueOnce('latest'); fs.readLocalFile.mockResolvedValueOnce('latest');
fs.readLocalFile.mockResolvedValueOnce('lts'); fs.readLocalFile.mockResolvedValueOnce('lts');
fs.readLocalFile.mockResolvedValueOnce('{"engines":{"node":"^12.16.0"}}'); const res = await getNodeConstraint(config);
const res = await getNodeConstraint({ packageFile: 'package.json' });
expect(res).toEqual('^12.16.0'); expect(res).toEqual('^12.16.0');
}); });
it('returns no constraint', async () => { it('returns no constraint', async () => {
fs.readLocalFile = jest.fn(); fs.readLocalFile = jest.fn();
fs.readLocalFile.mockResolvedValueOnce(null); fs.readLocalFile.mockResolvedValueOnce(null);
fs.readLocalFile.mockResolvedValueOnce(null); fs.readLocalFile.mockResolvedValueOnce(null);
fs.readLocalFile.mockResolvedValueOnce('{}'); const res = await getNodeConstraint({ ...config, compatibility: null });
const res = await getNodeConstraint({ packageFile: 'package.json' });
expect(res).toBeNull(); expect(res).toBeNull();
}); });
}); });
...@@ -18,19 +18,14 @@ async function getNodeFile(filename: string): Promise<string> | null { ...@@ -18,19 +18,14 @@ async function getNodeFile(filename: string): Promise<string> | null {
return null; return null;
} }
async function getPackageJsonConstraint( function getPackageJsonConstraint(
filename: string config: PostUpdateConfig
): Promise<string> | null { ): Promise<string> | null {
try { const constraint = config.compatibility?.node;
const pj = JSON.parse(await readLocalFile(filename, 'utf8'));
const constraint = pj?.engines?.node;
if (constraint && validRange(constraint)) { if (constraint && validRange(constraint)) {
logger.debug(`Using node constraint "${constraint}" from package.json`); logger.debug(`Using node constraint "${constraint}" from package.json`);
return constraint; return constraint;
} }
} catch (err) {
// do nothing
}
return null; return null;
} }
...@@ -41,7 +36,7 @@ export async function getNodeConstraint( ...@@ -41,7 +36,7 @@ export async function getNodeConstraint(
const constraint = const constraint =
(await getNodeFile(getSiblingFileName(packageFile, '.nvmrc'))) || (await getNodeFile(getSiblingFileName(packageFile, '.nvmrc'))) ||
(await getNodeFile(getSiblingFileName(packageFile, '.node-version'))) || (await getNodeFile(getSiblingFileName(packageFile, '.node-version'))) ||
(await getPackageJsonConstraint(packageFile)); getPackageJsonConstraint(config);
if (!constraint) { if (!constraint) {
logger.debug('No node constraint found - using latest'); logger.debug('No node constraint found - using latest');
} }
......
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
exports[`workers/repository/extract/manager-files getManagerPackageFiles() returns files with extractAllPackageFiles 1`] = ` exports[`workers/repository/extract/manager-files getManagerPackageFiles() returns files with extractAllPackageFiles 1`] = `
Array [ Array [
Object { Object {
"compatibility": Object {},
"deps": Array [ "deps": Array [
Object { Object {
"currentValue": "2.0.0", "currentValue": "2.0.0",
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment