#!/bin/bash # Exit immediately if a command exits with a non-zero status set -e # ========================================== # 1. Identify Candidate Packages & Dependents # ========================================== PACKAGES=("wolf_3d_data" "wolf_3d_data_types" "wolf_3d_engine" "wolf_3d_entities" "wolf_3d_input" "wolf_3d_synth") DEPENDENTS=("apps/wolf_3d_cli" "apps/wolf_3d_gui" "packages/wolf_3d_flutter" "packages/wolf_3d_renderer") NEW_PKG="wolf_3d_dart" echo "Starting migration to $NEW_PKG..." # ========================================== # 2. Create the New Package wolf_3d_dart # ========================================== echo "Creating new package structure..." mkdir -p "packages/$NEW_PKG/lib/src" # Initialize a base pubspec.yaml cat < "packages/$NEW_PKG/pubspec.yaml" name: $NEW_PKG description: A combined package for all non-Flutter components of wolf 3D version: 0.0.1 resolution: workspace environment: sdk: ^3.11.1 dependencies: EOF # Carefully extract dependencies from source packages (ignoring the wolf_3d packages themselves) touch temp_deps.txt for pkg in "${PACKAGES[@]}"; do if [ -f "packages/$pkg/pubspec.yaml" ]; then # Use awk to extract lines under 'dependencies:' until a new unindented section starts awk '/^dependencies:/{flag=1; next} /^[a-zA-Z]/{flag=0} flag && /^[ \t]+[a-zA-Z0-9_]+:/ {print}' "packages/$pkg/pubspec.yaml" >> temp_deps.txt fi done # Deduplicate dependencies, filter out the old packages, and append to pubspec.yaml sort -u temp_deps.txt | grep -v "wolf_3d_" >> "packages/$NEW_PKG/pubspec.yaml" || true rm temp_deps.txt cat <> "packages/$NEW_PKG/pubspec.yaml" dev_dependencies: lints: ^3.0.0 test: ^1.24.0 EOF # ========================================== # 3 & 4. Migrate Code, Entry Points & Refactor Internal Imports # ========================================== echo "Migrating code and updating imports..." for pkg in "${PACKAGES[@]}"; do SUFFIX="${pkg#wolf_3d_}" # Removes the 'wolf_3d_' prefix # 3.1 & 3.2 Move Internal Code and Entry Point mkdir -p "packages/$NEW_PKG/lib/src/$SUFFIX" # Copy instead of move for safety during script execution (we delete originals at the end) if [ -d "packages/$pkg/lib/src" ] && [ "$(ls -A "packages/$pkg/lib/src")" ]; then cp -R "packages/$pkg/lib/src/"* "packages/$NEW_PKG/lib/src/$SUFFIX/" fi if [ -f "packages/$pkg/lib/$pkg.dart" ]; then cp "packages/$pkg/lib/$pkg.dart" "packages/$NEW_PKG/lib/$pkg.dart" # 3.3 Update Entry Point Paths (export 'src/... -> export 'src/suffix/...) sed -i "s|export 'src/|export 'src/$SUFFIX/|g" "packages/$NEW_PKG/lib/$pkg.dart" sed -i "s|export \"src/|export \"src/$SUFFIX/|g" "packages/$NEW_PKG/lib/$pkg.dart" fi done # 4.1 & 4.2 Refactor Internal Imports (Run this globally on the new package) for pkg in "${PACKAGES[@]}"; do SUFFIX="${pkg#wolf_3d_}" # Find all Dart files in the new package find "packages/$NEW_PKG/lib" -name "*.dart" -type f | while read -r file; do # 1st Pass: Fix deep paths (package:wolf_3d_data/src/... -> package:wolf_3d_dart/src/data/...) sed -i "s|package:$pkg/src/|package:$NEW_PKG/src/$SUFFIX/|g" "$file" # 2nd Pass: Fix root imports (package:wolf_3d_data/... -> package:wolf_3d_dart/...) sed -i "s|package:$pkg/|package:$NEW_PKG/|g" "$file" done done # ========================================== # 5. Update Dependents (Apps and Other Packages) # ========================================== echo "Updating dependent apps and packages..." for target in "${DEPENDENTS[@]}"; do if [ -d "$target" ]; then # 5.1 Update pubspec.yaml Files if [ -f "$target/pubspec.yaml" ]; then # Remove old dependencies for pkg in "${PACKAGES[@]}"; do sed -i "/^[[:space:]]*$pkg:/d" "$target/pubspec.yaml" done # Add new dependency under dependencies block if not present if ! grep -q "$NEW_PKG:" "$target/pubspec.yaml"; then sed -i "/^dependencies:/a\\ $NEW_PKG:" "$target/pubspec.yaml" fi fi # 5.2 Update Imports in dependent dart files for pkg in "${PACKAGES[@]}"; do SUFFIX="${pkg#wolf_3d_}" find "$target" -name "*.dart" -type f | while read -r file; do # Match user requirement: package:wolf_3d_/wolf_3d_.dart -> package:wolf_3d_dart/wolf_3d_.dart sed -i "s|package:$pkg/$pkg.dart|package:$NEW_PKG/$pkg.dart|g" "$file" # Catch any stray deep imports just in case sed -i "s|package:$pkg/src/|package:$NEW_PKG/src/$SUFFIX/|g" "$file" sed -i "s|package:$pkg/|package:$NEW_PKG/|g" "$file" done done fi done # ========================================== # 6. Cleanup and Validation # ========================================== echo "Cleaning up old packages..." for pkg in "${PACKAGES[@]}"; do rm -rf "packages/$pkg" done echo "Running workspace refresh and tests..." dart pub get || echo "⚠️ 'dart pub get' failed. Check your new pubspec.yaml." dart test || echo "⚠️ Tests failed. Please review the output." echo "Migration complete!"