Skip to content

Commit 7bf5c16

Browse files
authored
Improves "yarn workspaces info" (#5389)
* Improves "yarn workspaces info" to include data about how workspaces depend on each other * Update workspaces.js * Update workspaces.js * Update workspaces.js
1 parent 4676389 commit 7bf5c16

File tree

3 files changed

+33
-1
lines changed

3 files changed

+33
-1
lines changed

__tests__/commands/workspaces.js

+4
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,13 @@ test('workspaces info should list the workspaces', (): Promise<void> => {
3131
expect(reporter.getBufferJson()).toEqual({
3232
'workspace-1': {
3333
location: 'packages/workspace-child-1',
34+
workspaceDependencies: [],
35+
mismatchedWorkspaceDependencies: [],
3436
},
3537
'workspace-2': {
3638
location: 'packages/workspace-child-2',
39+
workspaceDependencies: ['workspace-1'],
40+
mismatchedWorkspaceDependencies: [],
3741
},
3842
});
3943
});

__tests__/fixtures/workspace/run-basic/packages/workspace-child-2/package.json

+3
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,8 @@
55
"prescript": "echo workspace-2 prescript",
66
"script": "echo workspace-2 script",
77
"postscript": "echo workspace-2 postscript"
8+
},
9+
"dependencies": {
10+
"workspace-1": "1.0.0"
811
}
912
}

src/cli/commands/workspaces.js

+26-1
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@ import type Config from '../../config.js';
44
import {MessageError} from '../../errors.js';
55
import type {Reporter} from '../../reporters/index.js';
66
import buildSubCommands from './_build-sub-commands.js';
7+
import {DEPENDENCY_TYPES} from '../../constants.js';
78

89
const invariant = require('invariant');
910
const path = require('path');
11+
const semver = require('semver');
1012

1113
export function hasWrapper(commander: Object, args: Array<string>): boolean {
1214
return true;
@@ -27,8 +29,31 @@ export async function info(config: Config, reporter: Reporter, flags: Object, ar
2729
const publicData = {};
2830

2931
for (const workspaceName of Object.keys(workspaces)) {
32+
const {loc, manifest} = workspaces[workspaceName];
33+
34+
const workspaceDependencies = new Set();
35+
const mismatchedWorkspaceDependencies = new Set();
36+
37+
for (const dependencyType of DEPENDENCY_TYPES) {
38+
if (dependencyType !== 'peerDependencies') {
39+
for (const dependencyName of Object.keys(manifest[dependencyType] || {})) {
40+
if (Object.prototype.hasOwnProperty.call(workspaces, dependencyName)) {
41+
invariant(manifest && manifest[dependencyType], 'The request should exist');
42+
const requestedRange = manifest[dependencyType][dependencyName];
43+
if (semver.satisfies(workspaces[dependencyName].manifest.version, requestedRange)) {
44+
workspaceDependencies.add(dependencyName);
45+
} else {
46+
mismatchedWorkspaceDependencies.add(dependencyName);
47+
}
48+
}
49+
}
50+
}
51+
}
52+
3053
publicData[workspaceName] = {
31-
location: path.relative(config.lockfileFolder, workspaces[workspaceName].loc).replace(/\\/g, '/'),
54+
location: path.relative(config.lockfileFolder, loc).replace(/\\/g, '/'),
55+
workspaceDependencies: Array.from(workspaceDependencies),
56+
mismatchedWorkspaceDependencies: Array.from(mismatchedWorkspaceDependencies),
3257
};
3358
}
3459

0 commit comments

Comments
 (0)