Skip to content

Commit 566b4c0

Browse files
authored
chore(scripts): discover unused packages (#6364)
1 parent e52cc35 commit 566b4c0

File tree

1 file changed

+85
-20
lines changed

1 file changed

+85
-20
lines changed
Lines changed: 85 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,98 @@
11
const fs = require("node:fs");
2-
const fse = require("fs-extra");
32
const path = require("node:path");
43

54
const root = path.join(__dirname, "..", "..");
65
const packages = path.join(root, "packages");
6+
const libs = path.join(root, "lib");
7+
const clients = path.join(root, "clients");
78

8-
const excluded = [];
9+
/**
10+
* Throw and Error if any deprecated package is not marked private.
11+
*/
12+
{
13+
const excluded = [];
914

10-
for (const folder of fs.readdirSync(packages)) {
11-
const pkgJson = require(path.join(packages, folder, "package.json"));
12-
if (excluded.includes(pkgJson.name)) {
13-
continue;
14-
}
15-
if (pkgJson.private === true) {
16-
fse.moveSync(path.join(packages, folder), path.join(root, "deprecated", "packages", folder));
15+
const deprecatedPackages = path.join(root, "deprecated", "packages");
16+
for (const folder of fs.readdirSync(deprecatedPackages)) {
17+
const pkgJson = require(path.join(deprecatedPackages, folder, "package.json"));
18+
19+
if (excluded.includes(pkgJson.name)) {
20+
continue;
21+
}
22+
23+
if (pkgJson.private !== true) {
24+
throw new Error("package in deprecated folder is not marked private:", folder);
25+
} else {
26+
}
1727
}
1828
}
1929

20-
const deprecatedPackages = path.join(root, "deprecated", "packages");
21-
for (const folder of fs.readdirSync(deprecatedPackages)) {
22-
const pkgJson = require(path.join(deprecatedPackages, folder, "package.json"));
30+
/**
31+
* Analyze package dependency graph.
32+
*/
33+
{
34+
const packagesData = fs.readdirSync(packages).map((pkg) => require(path.join(packages, pkg, "package.json")));
35+
const libsData = fs.readdirSync(libs).map((pkg) => require(path.join(libs, pkg, "package.json")));
36+
const clientsData = fs.readdirSync(clients).map((pkg) => require(path.join(clients, pkg, "package.json")));
2337

24-
if (excluded.includes(pkgJson.name)) {
25-
continue;
26-
}
38+
const allPackages = [...packagesData, ...libsData, ...clientsData];
2739

28-
if (pkgJson.private !== true) {
29-
throw new Error("package in deprecated folder is not marked private:", folder);
30-
} else {
31-
console.log(`"${pkgJson.name}"`);
32-
}
40+
const graph = new (class PackageGraph {
41+
/**
42+
* @param graph - map of pkg name to pkg.json objects.
43+
*/
44+
constructor(graph) {
45+
this.graph = graph;
46+
for (const md of Object.values(graph)) {
47+
md.dependents = md.dependents ?? {};
48+
for (const dependency of Object.keys({ ...md.dependencies, ...md.devDependencies })) {
49+
if (!graph[dependency]) {
50+
// is external.
51+
continue;
52+
}
53+
graph[dependency].dependents = graph[dependency].dependents ?? {};
54+
graph[dependency].dependents[md.name] = 1;
55+
}
56+
}
57+
}
58+
59+
entryPoints() {
60+
const { graph } = this;
61+
return Object.values(graph)
62+
.filter((p) => {
63+
if (p.name.startsWith("@aws-sdk/client-")) {
64+
return false;
65+
}
66+
// return Object.keys(p.dependents).length === 0;
67+
return true;
68+
})
69+
.sort((a, b) => {
70+
return Object.keys(a.dependents).length - Object.keys(b.dependents).length;
71+
})
72+
.map((p) => {
73+
const deps = Object.keys(p.dependents);
74+
switch (p.name) {
75+
case "@aws-sdk/karma-credential-loader":
76+
return p.name + ": -- devtool --";
77+
}
78+
if (deps.length === 0) {
79+
return p.name + ": ---- NONE ----";
80+
}
81+
if (deps.length > 100) {
82+
return p.name + `: ** ${deps.length} packages (clients) **`;
83+
}
84+
if (deps.length > 5) {
85+
return p.name + `: ** ${deps.length} packages **`;
86+
}
87+
return p.name + ": \n\t" + deps.join("\n\t");
88+
});
89+
}
90+
})(
91+
allPackages.reduce((gr, pkg) => {
92+
gr[pkg.name] = pkg;
93+
return gr;
94+
}, {})
95+
);
96+
97+
console.log(graph.entryPoints().join("\n"));
3398
}

0 commit comments

Comments
 (0)