#!/usr/bin/env ruby # configure_xcode.rb — stamped fresh from template on every build (see gitea.service.ts) # # 1. Adds GoogleService-Info.plist to the Xcode target if present (xcodeproj gem) # 2. Scans Swift sources for Firebase imports and injects matching products into # CapApp-SPM/Package.swift — the correct approach for Capacitor SPM projects # where all native linking goes through CapApp-SPM, not App.xcodeproj directly. require 'xcodeproj' PROJECT_PATH = 'ios/App/App.xcodeproj' TARGET_NAME = 'App' PLIST_SRC = 'ios/App/App/GoogleService-Info.plist' CAP_APP_SPM = 'ios/App/CapApp-SPM/Package.swift' FIREBASE_SDK_URL = 'https://github.com/firebase/firebase-ios-sdk' FIREBASE_SDK_PKG = 'firebase-ios-sdk' FIREBASE_SDK_VER = '11.0.0' # ── 1. GoogleService-Info.plist ─────────────────────────────────────────────── if File.exist?(PLIST_SRC) project = Xcodeproj::Project.open(PROJECT_PATH) target = project.targets.find { |t| t.name == TARGET_NAME } if target app_group = project.main_group['App'] unless app_group&.files&.find { |f| f.path == 'GoogleService-Info.plist' } file_ref = app_group.new_reference('GoogleService-Info.plist') target.resources_build_phase.add_file_reference(file_ref) project.save puts "Added GoogleService-Info.plist to target" end end end # ── 2. Scan Swift sources for Firebase imports ──────────────────────────────── swift_files = Dir['ios/App/App/**/*.swift'] firebase_imports = swift_files .flat_map { |f| File.readlines(f) rescue [] } .grep(/^\s*import\s+Firebase\w+/) .map { |l| l.strip.split(/\s+/).last } .uniq .sort if firebase_imports.empty? puts "No Firebase imports found — skipping CapApp-SPM update" exit 0 end puts "Firebase imports detected: #{firebase_imports.join(', ')}" unless File.exist?(CAP_APP_SPM) warn "WARNING: #{CAP_APP_SPM} not found — was cap sync run?" exit 0 end lines = File.read(CAP_APP_SPM).split("\n") # ── 3. Inject firebase-ios-sdk as a direct package dependency if missing ────── unless lines.any? { |l| l.include?(FIREBASE_SDK_URL) } last_pkg_idx = lines.rindex { |l| l.include?('.package(') } if last_pkg_idx lines[last_pkg_idx] = lines[last_pkg_idx].rstrip lines[last_pkg_idx] += ',' unless lines[last_pkg_idx].end_with?(',') lines.insert(last_pkg_idx + 1, " .package(url: \"#{FIREBASE_SDK_URL}\", from: \"#{FIREBASE_SDK_VER}\")") puts "Added #{FIREBASE_SDK_PKG} to CapApp-SPM package dependencies" else warn "WARNING: could not find a .package( line to insert after in #{CAP_APP_SPM}" end end # ── 4. Inject each detected product into the target dependencies if missing ─── firebase_imports.each do |product| next if product == 'Firebase' # umbrella import — not a linkable SPM product product_str = ".product(name: \"#{product}\", package: \"#{FIREBASE_SDK_PKG}\")" next if lines.any? { |l| l.include?(product_str) } last_prod_idx = lines.rindex { |l| l.include?('.product(') } if last_prod_idx lines[last_prod_idx] = lines[last_prod_idx].rstrip lines[last_prod_idx] += ',' unless lines[last_prod_idx].end_with?(',') lines.insert(last_prod_idx + 1, " #{product_str}") puts "Added #{product} to CapApp-SPM target dependencies" else warn "WARNING: could not find a .product( line to insert after in #{CAP_APP_SPM}" end end File.write(CAP_APP_SPM, lines.join("\n")) puts "CapApp-SPM/Package.swift updated"