Files
scripts/utils/deps-analyze.sh
2026-02-09 21:51:52 -08:00

148 lines
4.0 KiB
Bash
Executable File

#!/bin/bash
# Load shared libraries
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/init.sh"
# Dependency Analysis Script
# Analyzes all package.json files and identifies common dependencies
set -e
echo "🔍 Analyzing dependencies across all projects..."
OUTPUT_DIR="reports"
OUTPUT_FILE="$OUTPUT_DIR/dependency-analysis.md"
mkdir -p "$OUTPUT_DIR"
# Temporary files
TEMP_DEPS="/tmp/all-deps.txt"
TEMP_DEV_DEPS="/tmp/all-dev-deps.txt"
# Clear temp files
> "$TEMP_DEPS"
> "$TEMP_DEV_DEPS"
# Extract dependencies from all package.json files
echo "📋 Extracting dependencies..."
find . -name "package.json" -type f ! -path "*/node_modules/*" ! -path "*/.git/*" ! -path "*/dist/*" ! -path "*/build/*" | while read -r file; do
project=$(dirname "$file" | sed 's|^\./||')
# Extract dependencies
if command -v jq &> /dev/null; then
jq -r '.dependencies // {} | keys[]' "$file" 2>/dev/null | while read -r dep; do
echo "$dep|$project" >> "$TEMP_DEPS"
done
jq -r '.devDependencies // {} | keys[]' "$file" 2>/dev/null | while read -r dep; do
echo "$dep|$project" >> "$TEMP_DEV_DEPS"
done
else
# Fallback: basic grep extraction (less accurate)
grep -o '"[^"]*":\s*"[^"]*"' "$file" | grep -v ":" | sed 's/"//g' | while read -r dep; do
echo "$dep|$project" >> "$TEMP_DEPS"
done
fi
done
# Generate report
cat > "$OUTPUT_FILE" << 'EOF'
# Dependency Analysis Report
**Generated**: $(date)
**Purpose**: Identify common dependencies across all projects
## Summary
This report analyzes dependencies across all projects in the workspace.
## Common Dependencies
### Most Frequently Used Dependencies
EOF
# Count and sort dependencies
echo "📊 Generating dependency statistics..."
if [ -f "$TEMP_DEPS" ]; then
echo "### Production Dependencies" >> "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"
echo "| Dependency | Usage Count | Projects |" >> "$OUTPUT_FILE"
echo "|------------|-------------|----------|" >> "$OUTPUT_FILE"
sort "$TEMP_DEPS" | cut -d'|' -f1 | uniq -c | sort -rn | head -20 | while read -r count dep; do
projects=$(grep "^$dep|" "$TEMP_DEPS" | cut -d'|' -f2 | sort -u | tr '\n' ', ' | sed 's/,$//')
echo "| $dep | $count | $projects |" >> "$OUTPUT_FILE"
done
echo "" >> "$OUTPUT_FILE"
fi
if [ -f "$TEMP_DEV_DEPS" ]; then
echo "### Development Dependencies" >> "$OUTPUT_FILE"
echo "" >> "$OUTPUT_FILE"
echo "| Dependency | Usage Count | Projects |" >> "$OUTPUT_FILE"
echo "|------------|-------------|----------|" >> "$OUTPUT_FILE"
sort "$TEMP_DEV_DEPS" | cut -d'|' -f1 | uniq -c | sort -rn | head -20 | while read -r count dep; do
projects=$(grep "^$dep|" "$TEMP_DEV_DEPS" | cut -d'|' -f2 | sort -u | tr '\n' ', ' | sed 's/,$//')
echo "| $dep | $count | $projects |" >> "$OUTPUT_FILE"
done
echo "" >> "$OUTPUT_FILE"
fi
cat >> "$OUTPUT_FILE" << EOF
## Recommendations
### Candidates for Shared Packages
Based on usage frequency, these dependencies are good candidates for hoisting to workspace root or shared packages:
1. **TypeScript/JavaScript Tooling**:
- typescript
- eslint
- prettier
- @typescript-eslint/*
2. **Testing**:
- vitest / jest
- @testing-library/*
3. **Utilities**:
- zod (validation)
- dotenv (configuration)
- date-fns (date handling)
4. **Blockchain/Solidity**:
- ethers / viem
- @openzeppelin/contracts
- foundry (dev dependency)
### Version Consolidation
Review and consolidate versions for:
- Common dependencies with version mismatches
- Outdated dependencies
- Security vulnerabilities
## Next Steps
1. Create shared packages for common utilities
2. Hoist common devDependencies to workspace root
3. Consolidate dependency versions
4. Set up automated dependency updates (Dependabot)
---
**Generated**: $(date)
EOF
echo "✅ Dependency analysis complete!"
echo "📄 Report saved to: $OUTPUT_FILE"
# Cleanup
rm -f "$TEMP_DEPS" "$TEMP_DEV_DEPS"