|
1 | 1 | const fs = require("node:fs"); |
2 | | -const fse = require("fs-extra"); |
3 | 2 | const path = require("node:path"); |
4 | 3 |
|
5 | 4 | const root = path.join(__dirname, "..", ".."); |
6 | 5 | const packages = path.join(root, "packages"); |
| 6 | +const libs = path.join(root, "lib"); |
| 7 | +const clients = path.join(root, "clients"); |
7 | 8 |
|
8 | | -const excluded = []; |
| 9 | +/** |
| 10 | + * Throw and Error if any deprecated package is not marked private. |
| 11 | + */ |
| 12 | +{ |
| 13 | + const excluded = []; |
9 | 14 |
|
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 | + } |
17 | 27 | } |
18 | 28 | } |
19 | 29 |
|
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"))); |
23 | 37 |
|
24 | | - if (excluded.includes(pkgJson.name)) { |
25 | | - continue; |
26 | | - } |
| 38 | + const allPackages = [...packagesData, ...libsData, ...clientsData]; |
27 | 39 |
|
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")); |
33 | 98 | } |
0 commit comments