An experimental TypeSpec syntax for Lexicon

sort

Changed files
+63 -9
scripts
+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"