#!/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"