Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(core): improve external node dependency mapping #12996

Merged
merged 5 commits into from Nov 7, 2022
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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