148 lines
4.0 KiB
Bash
Executable File
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"
|
|
|