Skip to content

Commit

Permalink
fix(core): improve external node dependency mapping (#12996)
Browse files Browse the repository at this point in the history
(cherry picked from commit 2f20807)
  • Loading branch information
meeroslav authored and FrozenPandaz committed Nov 7, 2022
1 parent f1db9ce commit 0d5e4f9
Show file tree
Hide file tree
Showing 10 changed files with 7,085 additions and 1,165 deletions.
7,855 changes: 6,824 additions & 1,031 deletions packages/nx/src/utils/lock-file/__fixtures__/npm.lock.ts

Large diffs are not rendered by default.

Expand Up @@ -55,7 +55,7 @@ Array [
exports[`lock-file mapLockFileDataToExternalNodes npm should map lock file v2 data to external nodes 1`] = `
Object {
"data": Object {
"hash": "54342be9f4609650eba8e995881c5eb98c29b9d7bb95b9a699d9e9df68d6428e",
"hash": "c22918aa52c9fdce78bf82451d8114e00b6d4375a8e5b1d1d96c6cf4755dbe1a",
"packageName": "yargs",
"version": "17.5.1",
},
Expand Down Expand Up @@ -159,7 +159,7 @@ Array [
exports[`lock-file mapLockFileDataToExternalNodes npm should map successfully complex lock file v2 1`] = `
Object {
"data": Object {
"hash": "1e61b9db38c17534ce427d40ce84f9c03b4c439253f659e9a48513a10a52b465",
"hash": "8da365ef8d327d868461fda5c863f779c2f75acfe6a591e733b31a2882763af3",
"packageName": "nx",
"version": "14.7.5",
},
Expand Down Expand Up @@ -187,7 +187,7 @@ Array [
},
Object {
"source": "npm:nx",
"target": "npm:chalk",
"target": "npm:chalk@4.1.0",
"type": "static",
},
Object {
Expand Down Expand Up @@ -252,7 +252,7 @@ Array [
},
Object {
"source": "npm:nx",
"target": "npm:js-yaml@4.1.0",
"target": "npm:js-yaml",
"type": "static",
},
Object {
Expand All @@ -262,7 +262,7 @@ Array [
},
Object {
"source": "npm:nx",
"target": "npm:minimatch",
"target": "npm:minimatch@3.0.5",
"type": "static",
},
Object {
Expand Down Expand Up @@ -317,7 +317,7 @@ Array [
},
Object {
"source": "npm:nx",
"target": "npm:yargs-parser",
"target": "npm:yargs-parser@21.0.1",
"type": "static",
},
]
Expand All @@ -326,7 +326,7 @@ Array [
exports[`lock-file mapLockFileDataToExternalNodes npm should map successfully complex lock file v3 1`] = `
Object {
"data": Object {
"hash": "48388b2bf77ed12f2830273632c13c745854d63133c5c0466e229ef29ea074c0",
"hash": "8da365ef8d327d868461fda5c863f779c2f75acfe6a591e733b31a2882763af3",
"packageName": "nx",
"version": "14.7.5",
},
Expand Down Expand Up @@ -354,7 +354,7 @@ Array [
},
Object {
"source": "npm:nx",
"target": "npm:chalk",
"target": "npm:chalk@4.1.0",
"type": "static",
},
Object {
Expand Down Expand Up @@ -419,7 +419,7 @@ Array [
},
Object {
"source": "npm:nx",
"target": "npm:js-yaml@4.1.0",
"target": "npm:js-yaml",
"type": "static",
},
Object {
Expand All @@ -429,7 +429,7 @@ Array [
},
Object {
"source": "npm:nx",
"target": "npm:minimatch",
"target": "npm:minimatch@3.0.5",
"type": "static",
},
Object {
Expand Down Expand Up @@ -484,7 +484,7 @@ Array [
},
Object {
"source": "npm:nx",
"target": "npm:yargs-parser",
"target": "npm:yargs-parser@21.0.1",
"type": "static",
},
]
Expand All @@ -493,7 +493,7 @@ Array [
exports[`lock-file mapLockFileDataToExternalNodes npm should map successfully complex npm lock file v1 1`] = `
Object {
"data": Object {
"hash": "3e63cd88ec8f5eb00f37559c24caf47da1f45f6a3f607d013f148da8593e3a26",
"hash": "62016caa192e50e3af6e4730fa1427455ad431a0e11ad807215c56bee04a8c8e",
"packageName": "nx",
"version": "14.7.5",
},
Expand Down Expand Up @@ -521,7 +521,7 @@ Array [
},
Object {
"source": "npm:nx",
"target": "npm:chalk",
"target": "npm:chalk@4.1.0",
"type": "static",
},
Object {
Expand Down Expand Up @@ -596,7 +596,7 @@ Array [
},
Object {
"source": "npm:nx",
"target": "npm:minimatch",
"target": "npm:minimatch@3.0.5",
"type": "static",
},
Object {
Expand Down Expand Up @@ -651,7 +651,7 @@ Array [
},
Object {
"source": "npm:nx",
"target": "npm:yargs-parser",
"target": "npm:yargs-parser@21.0.1",
"type": "static",
},
]
Expand Down Expand Up @@ -958,7 +958,7 @@ Array [
exports[`lock-file mapLockFileDataToExternalNodes yarn should map successfully complex lock file 1`] = `
Object {
"data": Object {
"hash": "1e61b9db38c17534ce427d40ce84f9c03b4c439253f659e9a48513a10a52b465",
"hash": "6562d56c136e9e359c74fb6843da8deb66890de8e61e49ee766ad9cee2be6878",
"packageName": "nx",
"version": "14.7.5",
},
Expand Down
Expand Up @@ -70,7 +70,7 @@ Object {

exports[`npm LockFile utility v2 should parse lockfile correctly 2`] = `
Object {
"typescript@4.8.3": Object {
"typescript@4.8.4": Object {
"bin": Object {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver",
Expand All @@ -79,17 +79,17 @@ Object {
"engines": Object {
"node": ">=4.2.0",
},
"integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==",
"integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==",
"packageMeta": Array [
Object {
"dev": true,
"optional": undefined,
"path": "node_modules/typescript",
},
],
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz",
"rootVersion": true,
"version": "4.8.3",
"version": "4.8.4",
},
}
`;
Expand Down
96 changes: 67 additions & 29 deletions packages/nx/src/utils/lock-file/lock-file.spec.ts
Expand Up @@ -3,9 +3,9 @@ import { parseNpmLockFile } from './npm';
import { parsePnpmLockFile } from './pnpm';
import { parseYarnLockFile } from './yarn';
import {
lockFileV3YargsOnly as npmLockFileV3YargsOnly,
lockFileV2YargsOnly as npmLockFileV2YargsOnly,
lockFileV1YargsOnly as npmLockFileV1YargsOnly,
lockFileV3YargsAndDevkitOnly as npmLockFileV3YargsAndDevkit,
lockFileV2YargsAndDevkitOnly as npmLockFileV2YargsAndDevkit,
lockFileV1YargsAndDevkitOnly as npmLockFileV1YargsAndDevkit,
lockFileV3 as npmLockFileV3,
lockFileV2 as npmLockFileV2,
lockFileV1 as npmLockFileV1,
Expand All @@ -32,25 +32,28 @@ jest.mock('nx/src/utils/workspace-root', () => ({
}));

describe('lock-file', () => {
const fileSys = {
'node_modules/chalk/package.json': '{"version": "4.1.0"}',
'node_modules/glob/package.json': '{"version": "7.1.4"}',
'node_modules/js-yaml/package.json': '{"version": "4.1.0"}',
'node_modules/minimatch/package.json': '{"version": "3.0.5"}',
'node_modules/semver/package.json': '{"version": "7.3.4"}',
'node_modules/tslib/package.json': '{"version": "2.4.0"}',
'node_modules/yargs-parser/package.json': '{"version": "21.0.1"}',
};
beforeEach(() => {
vol.fromJSON(fileSys, '/root');
});

describe('mapLockFileDataToExternalNodes', () => {
describe('yarn', () => {
const fileSys = {
'node_modules/chalk/package.json': '{"version": "4.1.0"}',
'node_modules/glob/package.json': '{"version": "7.1.4"}',
'node_modules/js-yaml/package.json': '{"version": "4.1.0"}',
'node_modules/minimatch/package.json': '{"version": "3.0.5"}',
'node_modules/semver/package.json': '{"version": "7.3.4"}',
'node_modules/tslib/package.json': '{"version": "2.4.0"}',
'node_modules/yargs-parser/package.json': '{"version": "21.0.1"}',
};
beforeEach(() => {
vol.fromJSON(fileSys, '/root');
});

it('should map lock file data to external nodes', () => {
const lockFileData = parseYarnLockFile(yarnLockFileDevkitAndYargs);

const partialGraph = mapLockFileDataToPartialGraph(lockFileData);
const partialGraph = mapLockFileDataToPartialGraph(
lockFileData,
'yarn'
);

expect(partialGraph.externalNodes['npm:yargs']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:yargs']).toMatchSnapshot();
Expand All @@ -59,36 +62,52 @@ describe('lock-file', () => {
it('should map successfully complex lock file', () => {
const lockFileData = parseYarnLockFile(yarnLockFile);

const partialGraph = mapLockFileDataToPartialGraph(lockFileData);
const partialGraph = mapLockFileDataToPartialGraph(
lockFileData,
'yarn'
);

expect(partialGraph.externalNodes['npm:nx']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:nx']).toMatchSnapshot();
});
});

describe('npm', () => {
const fileSys = {
'node_modules/chalk/package.json': '{"version": "4.1.2"}',
'node_modules/glob/package.json': '{"version": "7.1.4"}',
'node_modules/js-yaml/package.json': '{"version": "4.1.0"}',
'node_modules/minimatch/package.json': '{"version": "4.0.5"}',
'node_modules/semver/package.json': '{"version": "7.3.4"}',
'node_modules/tslib/package.json': '{"version": "2.4.1"}',
'node_modules/yargs-parser/package.json': '{"version": "21.1.1"}',
};
beforeEach(() => {
vol.fromJSON(fileSys, '/root');
});

it('should map lock file v3 data to external nodes', () => {
const lockFileData = parseNpmLockFile(npmLockFileV3YargsOnly);
const lockFileData = parseNpmLockFile(npmLockFileV3YargsAndDevkit);

const partialGraph = mapLockFileDataToPartialGraph(lockFileData);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');

expect(partialGraph.externalNodes['npm:yargs']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:yargs']).toMatchSnapshot();
});

it('should map lock file v2 data to external nodes', () => {
const lockFileData = parseNpmLockFile(npmLockFileV2YargsOnly);
const lockFileData = parseNpmLockFile(npmLockFileV2YargsAndDevkit);

const partialGraph = mapLockFileDataToPartialGraph(lockFileData);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');

expect(partialGraph.externalNodes['npm:yargs']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:yargs']).toMatchSnapshot();
});

it('should map lock file v1 data to external nodes', () => {
const lockFileData = parseNpmLockFile(npmLockFileV1YargsOnly);
const lockFileData = parseNpmLockFile(npmLockFileV1YargsAndDevkit);

const partialGraph = mapLockFileDataToPartialGraph(lockFileData);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');

expect(partialGraph.externalNodes['npm:yargs']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:yargs']).toMatchSnapshot();
Expand All @@ -97,7 +116,7 @@ describe('lock-file', () => {
it('should map successfully complex lock file v3', () => {
const lockFileData = parseNpmLockFile(npmLockFileV3);

const partialGraph = mapLockFileDataToPartialGraph(lockFileData);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');

expect(partialGraph.externalNodes['npm:nx']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:nx']).toMatchSnapshot();
Expand All @@ -106,7 +125,7 @@ describe('lock-file', () => {
it('should map successfully complex lock file v2', () => {
const lockFileData = parseNpmLockFile(npmLockFileV2);

const partialGraph = mapLockFileDataToPartialGraph(lockFileData);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');

expect(partialGraph.externalNodes['npm:nx']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:nx']).toMatchSnapshot();
Expand All @@ -115,18 +134,34 @@ describe('lock-file', () => {
it('should map successfully complex npm lock file v1', () => {
const lockFileData = parseNpmLockFile(npmLockFileV1);

const partialGraph = mapLockFileDataToPartialGraph(lockFileData);
const partialGraph = mapLockFileDataToPartialGraph(lockFileData, 'npm');

expect(partialGraph.externalNodes['npm:nx']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:nx']).toMatchSnapshot();
});
});

describe('pnpm', () => {
const fileSys = {
'node_modules/chalk/package.json': '{"version": "4.1.0"}',
'node_modules/glob/package.json': '{"version": "7.1.4"}',
'node_modules/js-yaml/package.json': '{"version": "4.1.0"}',
'node_modules/minimatch/package.json': '{"version": "3.0.5"}',
'node_modules/semver/package.json': '{"version": "7.3.4"}',
'node_modules/tslib/package.json': '{"version": "2.4.0"}',
'node_modules/yargs-parser/package.json': '{"version": "21.0.1"}',
};
beforeEach(() => {
vol.fromJSON(fileSys, '/root');
});

it('should map lock file data to external nodes', () => {
const lockFileData = parsePnpmLockFile(pnpmLockFileYargsOnly);

const partialGraph = mapLockFileDataToPartialGraph(lockFileData);
const partialGraph = mapLockFileDataToPartialGraph(
lockFileData,
'pnpm'
);

expect(partialGraph.externalNodes['npm:yargs']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:yargs']).toMatchSnapshot();
Expand All @@ -135,7 +170,10 @@ describe('lock-file', () => {
it('should map successfully complex lock file', () => {
const lockFileData = parsePnpmLockFile(pnpmLockFile);

const partialGraph = mapLockFileDataToPartialGraph(lockFileData);
const partialGraph = mapLockFileDataToPartialGraph(
lockFileData,
'pnpm'
);

expect(partialGraph.externalNodes['npm:nx']).toMatchSnapshot();
expect(partialGraph.dependencies['npm:nx']).toMatchSnapshot();
Expand Down

0 comments on commit 0d5e4f9

Please sign in to comment.