+63
-9
scripts/publish-all.sh
+63
-9
scripts/publish-all.sh
···
36
36
# Find all package.json files in packages/*
37
37
ALL_PACKAGES=($(find packages -maxdepth 2 -name "package.json" -not -path "*/node_modules/*" | sort))
38
38
39
-
# Filter out private packages
40
-
PACKAGES=()
41
-
for pkg in "${ALL_PACKAGES[@]}"; do
42
-
IS_PRIVATE=$(node -p "require('./$pkg').private || false")
43
-
if [ "$IS_PRIVATE" != "true" ]; then
44
-
PACKAGES+=("$pkg")
45
-
fi
46
-
done
39
+
# Filter out private packages and topologically sort by dependencies
40
+
PACKAGES=($(node -e "
41
+
const fs = require('fs');
42
+
const allPackages = process.argv.slice(1);
43
+
44
+
// Filter out private packages
45
+
const packages = allPackages.filter(path => {
46
+
const pkg = JSON.parse(fs.readFileSync(path, 'utf-8'));
47
+
return !pkg.private;
48
+
});
49
+
50
+
// Build dependency graph
51
+
const graph = new Map();
52
+
const pkgNames = new Map();
53
+
54
+
packages.forEach(path => {
55
+
const pkg = JSON.parse(fs.readFileSync(path, 'utf-8'));
56
+
pkgNames.set(pkg.name, path);
57
+
58
+
const deps = new Set();
59
+
[pkg.dependencies, pkg.devDependencies, pkg.peerDependencies].forEach(depObj => {
60
+
if (depObj) {
61
+
Object.keys(depObj).forEach(dep => {
62
+
if (dep.startsWith('@typelex/')) {
63
+
deps.add(dep);
64
+
}
65
+
});
66
+
}
67
+
});
68
+
69
+
graph.set(pkg.name, deps);
70
+
});
71
+
72
+
// Topological sort - packages with more dependents first
73
+
const sorted = [];
74
+
const processed = new Set();
75
+
76
+
function visit(pkgName) {
77
+
if (processed.has(pkgName)) return;
78
+
processed.add(pkgName);
79
+
80
+
// Visit all dependencies first
81
+
const deps = graph.get(pkgName) || new Set();
82
+
deps.forEach(dep => {
83
+
if (graph.has(dep)) {
84
+
visit(dep);
85
+
}
86
+
});
87
+
88
+
sorted.push(pkgName);
89
+
}
90
+
91
+
// Visit all packages
92
+
graph.forEach((_, pkgName) => visit(pkgName));
93
+
94
+
// Output sorted package paths
95
+
sorted.forEach(name => {
96
+
if (pkgNames.has(name)) {
97
+
console.log(pkgNames.get(name));
98
+
}
99
+
});
100
+
" "${ALL_PACKAGES[@]}"))
47
101
48
102
if [ ${#PACKAGES[@]} -eq 0 ]; then
49
103
echo "Error: No publishable packages found in packages/"
50
104
exit 1
51
105
fi
52
106
53
-
echo "Found ${#PACKAGES[@]} publishable packages:"
107
+
echo "Found ${#PACKAGES[@]} publishable packages (topologically sorted):"
54
108
for pkg in "${PACKAGES[@]}"; do
55
109
PKG_NAME=$(node -p "require('./$pkg').name")
56
110
echo " - $PKG_NAME"