117 lines
3.3 KiB
Bash
117 lines
3.3 KiB
Bash
|
|
#!/bin/bash
|
||
|
|
#
|
||
|
|
# Deploy circular dependency verification pattern to all NestJS services
|
||
|
|
#
|
||
|
|
# Usage: ./scripts/deploy-verify-pattern.sh [--dry-run]
|
||
|
|
#
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||
|
|
DRY_RUN=false
|
||
|
|
|
||
|
|
# Parse arguments
|
||
|
|
if [[ "${1:-}" == "--dry-run" ]]; then
|
||
|
|
DRY_RUN=true
|
||
|
|
echo "🔍 DRY RUN MODE - No files will be modified"
|
||
|
|
echo ""
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Template verification script
|
||
|
|
VERIFY_SCRIPT_TEMPLATE="$PROJECT_ROOT/codebase/features/landing/backend-api/scripts/verify-circular-deps.mjs"
|
||
|
|
|
||
|
|
if [[ ! -f "$VERIFY_SCRIPT_TEMPLATE" ]]; then
|
||
|
|
echo "❌ Template not found: $VERIFY_SCRIPT_TEMPLATE"
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
echo "📋 Deploying verification pattern to all NestJS services..."
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
DEPLOYED=0
|
||
|
|
SKIPPED=0
|
||
|
|
FAILED=0
|
||
|
|
|
||
|
|
# Find all backend-api directories
|
||
|
|
while IFS= read -r -d '' service_dir; do
|
||
|
|
service_name=$(basename "$(dirname "$service_dir")")/backend-api
|
||
|
|
|
||
|
|
echo "📦 Processing: $service_name"
|
||
|
|
|
||
|
|
# Check if it's a NestJS project
|
||
|
|
if [[ ! -f "$service_dir/package.json" ]]; then
|
||
|
|
echo " ⏭️ Skipped: No package.json"
|
||
|
|
((SKIPPED++))
|
||
|
|
echo ""
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
|
||
|
|
if ! grep -q '"@nestjs/core"' "$service_dir/package.json"; then
|
||
|
|
echo " ⏭️ Skipped: Not a NestJS project"
|
||
|
|
((SKIPPED++))
|
||
|
|
echo ""
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
|
||
|
|
if [[ "$DRY_RUN" == true ]]; then
|
||
|
|
echo " 📄 Would create: scripts/verify-circular-deps.mjs"
|
||
|
|
echo " 📝 Would update: package.json (add 'verify' script)"
|
||
|
|
((DEPLOYED++))
|
||
|
|
echo ""
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Create scripts directory
|
||
|
|
mkdir -p "$service_dir/scripts"
|
||
|
|
|
||
|
|
# Copy verification script
|
||
|
|
cp "$VERIFY_SCRIPT_TEMPLATE" "$service_dir/scripts/verify-circular-deps.mjs"
|
||
|
|
chmod +x "$service_dir/scripts/verify-circular-deps.mjs"
|
||
|
|
|
||
|
|
# Add verify script to package.json if not exists
|
||
|
|
if ! grep -q '"verify"' "$service_dir/package.json"; then
|
||
|
|
# Use jq if available, otherwise sed
|
||
|
|
if command -v jq &> /dev/null; then
|
||
|
|
tmp=$(mktemp)
|
||
|
|
jq '.scripts.verify = "pnpm build && node scripts/verify-circular-deps.mjs"' \
|
||
|
|
"$service_dir/package.json" > "$tmp"
|
||
|
|
mv "$tmp" "$service_dir/package.json"
|
||
|
|
echo " ✅ Deployed (using jq)"
|
||
|
|
else
|
||
|
|
# Fallback: Add after "build" script using sed
|
||
|
|
sed -i '/"build":/a\ "verify": "pnpm build && node scripts/verify-circular-deps.mjs",' \
|
||
|
|
"$service_dir/package.json"
|
||
|
|
echo " ✅ Deployed (using sed)"
|
||
|
|
fi
|
||
|
|
else
|
||
|
|
echo " ⏭️ Skipped: 'verify' script already exists"
|
||
|
|
((SKIPPED++))
|
||
|
|
fi
|
||
|
|
|
||
|
|
((DEPLOYED++))
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
done < <(find "$PROJECT_ROOT/codebase/features" -type d -name "backend-api" -print0)
|
||
|
|
|
||
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
|
|
echo "📊 Summary"
|
||
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||
|
|
echo " ✅ Deployed: $DEPLOYED"
|
||
|
|
echo " ⏭️ Skipped: $SKIPPED"
|
||
|
|
if [[ "$FAILED" -gt 0 ]]; then
|
||
|
|
echo " ❌ Failed: $FAILED"
|
||
|
|
fi
|
||
|
|
echo ""
|
||
|
|
|
||
|
|
if [[ "$DRY_RUN" == true ]]; then
|
||
|
|
echo "💡 Run without --dry-run to apply changes"
|
||
|
|
else
|
||
|
|
echo "✅ Pattern deployed successfully!"
|
||
|
|
echo ""
|
||
|
|
echo "Next steps:"
|
||
|
|
echo " 1. Test verification: cd <service> && pnpm verify"
|
||
|
|
echo " 2. Add to CI/CD pipelines"
|
||
|
|
echo " 3. Document in project CLAUDE.md"
|
||
|
|
fi
|