-
Notifications
You must be signed in to change notification settings - Fork 201
/
Copy pathworkspace-dependencies.js
87 lines (75 loc) · 2.4 KB
/
workspace-dependencies.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
'use strict';
const path = require('path');
const { runInDir } = require('./run-in-dir');
const ROOT_DIR = path.resolve(__dirname, '..');
const LERNA_BIN = path.join(ROOT_DIR, 'node_modules', '.bin', 'lerna');
async function collectWorkspacesMeta() {
const workspaces = JSON.parse(
(await runInDir(`${LERNA_BIN} list --all --json --toposort`)).stdout
);
return new Map(
workspaces
.concat({ location: ROOT_DIR })
.map(({ location }) => [
location,
{ ...require(path.join(location, 'package.json')), location },
])
);
}
const DepTypes = {
Prod: 'prod',
Dev: 'dev',
Optional: 'optional',
Peer: 'peer',
};
function getDepType(dependency, version, pkgJson) {
return pkgJson.devDependencies &&
pkgJson.devDependencies[dependency] === version
? DepTypes.Dev
: pkgJson.peerDependencies &&
pkgJson.peerDependencies[dependency] === version
? DepTypes.Peer
: pkgJson.optionalDependencies &&
pkgJson.optionalDependencies[dependency] === version
? DepTypes.Optional
: pkgJson.dependencies && pkgJson.dependencies[dependency] === version
? DepTypes.Prod
: null;
}
/**
*
* @param {Map<string, { dependencies?: any, devDependencies?: any, peerDependencies?: any, optionalDependencies?: any }>} workspaces
* @returns {Map<string, { version: string, from: string, workspace: string, type: 'prod' | 'dev' | 'optional' | 'peer' }[]>}
*/
function collectWorkspacesDependencies(workspaces) {
const dependencies = new Map();
for (const [location, pkgJson] of workspaces) {
for (const [dependency, versionRange] of [
...Object.entries(pkgJson.dependencies || {}),
...Object.entries(pkgJson.devDependencies || {}),
...filterOutStarDeps(Object.entries(pkgJson.peerDependencies || {})),
...filterOutStarDeps(Object.entries(pkgJson.optionalDependencies || {})),
]) {
const item = {
version: versionRange,
workspace: pkgJson.name,
from: location,
type: getDepType(dependency, versionRange, pkgJson),
};
if (dependencies.has(dependency)) {
dependencies.get(dependency).push(item);
} else {
dependencies.set(dependency, [item]);
}
}
}
return dependencies;
}
function filterOutStarDeps(entries) {
return entries.filter(([, v]) => v !== '*');
}
module.exports = {
DepTypes,
collectWorkspacesMeta,
collectWorkspacesDependencies,
};