// swift-tools-version:5.6 import PackageDescription // MARK: - Helpers struct Feature { var product: Product var targets: [Target] var targetDependency: Target.Dependency static func library( name: String, dependencies: [Target.Dependency] = [], testDependencies: [Target.Dependency] = [], swiftSettings: [SwiftSetting] = [ .unsafeFlags( [ "-Xfrontend", "-debug-time-function-bodies", "-Xfrontend", "-debug-time-expression-type-checking", ], .when(configuration: .debug) ) ] ) -> Feature { .init( product: .library(name: name, targets: [name]), targets: [ .target( name: name, dependencies: dependencies, swiftSettings: swiftSettings ), .testTarget( name: "\(name)Tests", dependencies: [.target(name: name)] + testDependencies, swiftSettings: swiftSettings ), ], targetDependency: .target(name: name) ) } } struct Dependency { var packageDependency: Package.Dependency var targetDependency: Target.Dependency static func local( path: String, name: String, package: String ) -> Dependency { .init( packageDependency: .package(path: path), targetDependency: .product(name: name, package: package) ) } static func external( url: String, version: Range<Version>, name: String, package: String ) -> Dependency { .init( packageDependency: .package(url: url, version), targetDependency: .product(name: name, package: package) ) } } // MARK: - Manifest extension Dependency { static let all: [Dependency] = [ .retry, .quick, .shout, .nimble, .snapkit, .firebase, .chatLayout, .googleDrive, .googleSignIn, .fileProvider, .swiftyBeaver, .swiftyDropbox, .differenceKit, .swiftProtobuf, .clientDatabase, .keychainAccess, .swiftCustomDump, .combineSchedulers, .xcTestDynamicOverlay, .scrollViewController, .composableArchitecture ] static let keychainAccess = Dependency.external( url: "https://github.com/kishikawakatsumi/KeychainAccess.git", version: .upToNextMajor(from: "4.2.2"), name: "KeychainAccess", package: "KeychainAccess" ) static let combineSchedulers = Dependency.external( url: "https://github.com/pointfreeco/combine-schedulers", version: .upToNextMajor(from: "0.5.0"), name: "CombineSchedulers", package: "CombineSchedulers" ) static let quick = Dependency.external( url: "https://github.com/Quick/Quick", version: .upToNextMajor(from: "3.0.0"), name: "Quick", package: "Quick" ) static let nimble = Dependency.external( url: "https://github.com/Quick/Nimble", version: .upToNextMajor(from: "9.0.0"), name: "Nimble", package: "Nimble" ) static let snapkit = Dependency.external( url: "https://github.com/SnapKit/SnapKit", version: .upToNextMajor(from: "5.0.1"), name: "SnapKit", package: "SnapKit" ) static let retry = Dependency.external( url: "https://github.com/icanzilb/Retry.git", version: .upToNextMajor(from: "0.6.3"), name: "Retry", package: "Retry" ) static let chatLayout = Dependency.external( url: "https://github.com/ekazaev/ChatLayout", version: .upToNextMajor(from: "1.1.14"), name: "ChatLayout", package: "ChatLayout" ) static let differenceKit = Dependency.external( url: "https://github.com/ra1028/DifferenceKit", version: .upToNextMajor(from: "1.2.0"), name: "DifferenceKit", package: "DifferenceKit" ) static let swiftProtobuf = Dependency.external( url: "https://github.com/apple/swift-protobuf", version: .upToNextMajor(from: "1.14.0"), name: "SwiftProtobuf", package: "SwiftProtobuf" ) static let googleSignIn = Dependency.external( url: "https://github.com/google/GoogleSignIn-iOS", version: .upToNextMajor(from: "6.1.0"), name: "GoogleSignIn-iOS", package: "GoogleSignIn-iOS" ) static let swiftyDropbox = Dependency.external( url: "https://github.com/dropbox/SwiftyDropbox.git", version: .upToNextMajor(from: "8.2.1"), name: "SwiftyDropbox", package: "SwiftyDropbox" ) static let fileProvider = Dependency.external( url: "https://github.com/amosavian/FileProvider.git", version: .upToNextMajor(from: "0.26.0"), name: "FileProvider", package: "FileProvider" ) static let swiftyBeaver = Dependency.external( url: "https://github.com/SwiftyBeaver/SwiftyBeaver.git", version: .upToNextMajor(from: "1.9.5"), name: "SwiftyBeaver", package: "SwiftyBeaver" ) static let scrollViewController = Dependency.external( url: "https://github.com/darrarski/ScrollViewController", version: .upToNextMajor(from: "1.2.0"), name: "ScrollViewController", package: "ScrollViewController" ) static let swiftCustomDump = Dependency.external( url: "https://github.com/pointfreeco/swift-custom-dump.git", version: .upToNextMajor(from: "0.5.0"), name: "SwiftCustomDump", package: "SwiftCustomDump" ) static let xcTestDynamicOverlay = Dependency.external( url: "https://github.com/pointfreeco/xctest-dynamic-overlay.git", version: .upToNextMajor(from: "0.3.3"), name: "XCTestDynamicOverlay", package: "xctest-dynamic-overlay" ) static let composableArchitecture = Dependency.external( url: "https://github.com/pointfreeco/swift-composable-architecture.git", version: .upToNextMajor(from: "0.32.0"), name: "ComposableArchitecture", package: "swift-composable-architecture" ) static let shout = Dependency.external( url: "https://github.com/darrarski/Shout.git", version: .upToNextMajor(from: ""), // revision: df5a662293f0ac15eeb4f2fd3ffd0c07b73d0de0 name: "Shout", package: "Shout" ) static let firebase = Dependency.external( url: "https://github.com/firebase/firebase-ios-sdk.git", version: .upToNextMajor(from: "8.10.0"), name: "Firebase", package: "Firebase" ) static let clientDatabase = Dependency.external( url: "https://git.xx.network/elixxir/client-ios-db.git", version: .upToNextMajor(from: "1.0.8"), name: "", package: "" ) static let googleDrive = Dependency.external( url: "https://github.com/google/google-api-objectivec-client-for-rest", version: .upToNextMajor(from: "1.6.0"), name: "GoogleDrive", package: "GoogleDrive" ) } extension Feature { static let all: [Feature] = [ .app ] static let app = Feature.library( name: "App", dependencies: [ Feature.scan.targetDependency, Feature.chat.targetDependency, Feature.menu.targetDependency, Feature.push.targetDependency, Feature.sftp.targetDependency, Feature.drive.targetDependency, Feature.toast.targetDependency, Feature.backup.targetDependency, Feature.search.targetDependency, Feature.launch.targetDependency, Feature.icloud.targetDependency, Feature.dropbox.targetDependency, Feature.contact.targetDependency, Feature.restore.targetDependency, Feature.profile.targetDependency, Feature.chatList.targetDependency, Feature.settings.targetDependency, Feature.requests.targetDependency, Feature.keychain.targetDependency, Feature.voxophone.targetDependency, Feature.onboarding.targetDependency, Feature.permissions.targetDependency, Feature.contactList.targetDependency, Feature.crashReporting.targetDependency ] ) static let permissions = Feature.library( name: "Permissions", dependencies: [ Feature.theme.targetDependency, Feature.shared.targetDependency, Feature.dependencyInjection.targetDependency ] ) static let crashReporting = Feature.library( name: "CrashReporting" ) static let networkMonitor = Feature.library( name: "NetworkMonitor" ) static let versionChecking = Feature.library( name: "VersionChecking" ) static let dependencyInjection = Feature.library( name: "DependencyInjection" ) static let inputField = Feature.library( name: "InputField", dependencies: [ Feature.shared.targetDependency ] ) static let push = Feature.library( name: "PushFeature", dependencies: [ Feature.models.targetDependency, Feature.defaults.targetDependency, Feature.integration.targetDependency, Feature.dependencyInjection.targetDependency ] ) static let testHelpers = Feature.library( name: "TestHelpers", dependencies: [ Feature.models.targetDependency, Feature.presentation.targetDependency ] ) static let keychain = Feature.library( name: "Keychain", dependencies: [ Dependency.keychainAccess.targetDependency ] ) static let voxophone = Feature.library( name: "Voxophone", dependencies: [ Feature.shared.targetDependency ] ) static let models = Feature.library( name: "Models", dependencies: [ Dependency.differenceKit.targetDependency, Dependency.swiftProtobuf.targetDependency ] ) static let defaults = Feature.library( name: "Defaults", dependencies: [ Feature.dependencyInjection.targetDependency ] ) static let toast = Feature.library( name: "ToastFeature", dependencies: [ Feature.shared.targetDependency ] ) static let crashService = Feature.library( name: "CrashService", dependencies: [ Dependency.firebase.targetDependency, Feature.crashReporting.targetDependency ] ) static let sftp = Feature.library( name: "SFTPFeature", dependencies: [ Feature.hud.targetDependency, Feature.models.targetDependency, Feature.shared.targetDependency, Dependency.shout.targetDependency, Feature.keychain.targetDependency, Feature.inputField.targetDependency, Feature.presentation.targetDependency, Feature.dependencyInjection.targetDependency ] ) static let drive = library( name: "GoogleDriveFeature", dependencies: [ Dependency.googleDrive.targetDependency, Dependency.googleSignIn.targetDependency ] // resources: [.process("Resources")] ) static let icloud = library( name: "iCloudFeature", dependencies: [ Dependency.fileProvider.targetDependency ] ) static let dropbox = library( name: "DropboxFeature", dependencies: [ Dependency.swiftyDropbox.targetDependency ] // resources: [.process("Resources")] ) static let countries = library( name: "Countries", dependencies: [ Feature.theme.targetDependency, Feature.shared.targetDependency, Feature.dependencyInjection.targetDependency, ] // resources: [.process("Resources")] ) static let theme = library( name: "Theme", dependencies: [ Feature.defaults.targetDependency, Feature.dependencyInjection.targetDependency ] ) static let drawer = library( name: "DrawerFeature", dependencies: [ Feature.shared.targetDependency, Feature.inputField.targetDependency, Dependency.scrollViewController.targetDependency ] ) static let hud = library( name: "HUD", dependencies: [ Feature.theme.targetDependency, Feature.shared.targetDependency, Dependency.snapkit.targetDependency ] ) static let logger = library( name: "XXLogger", dependencies: [ Dependency.swiftyBeaver.targetDependency ] ) static let shared = library( name: "Shared", dependencies: [ Dependency.snapkit.targetDependency, Dependency.chatLayout.targetDependency, Dependency.differenceKit.targetDependency, ] // resources: [.process("Resources")] + exclude: ["swiftgen.yml"], ) static let integration = library( name: "Integration", dependencies: [ Feature.shared.targetDependency, Feature.bindings.targetDependency, Feature.logger.targetDependency, Feature.keychain.targetDependency, Feature.toast.targetDependency, Feature.backup.targetDependency, Feature.crashReporting.targetDependency, Feature.networkMonitor.targetDependency, Feature.dependencyInjection.targetDependency, Dependency.retry.targetDependency, Dependency.clientDatabase.targetDependency // resources: [.process("Resources")] // Dependency.clientDatabase.targetDependency <--- XXLegacyDatabaseMigrator ] ) static let presentation = library( name: "Presentation", dependencies: [ Feature.theme.targetDependency, Feature.shared.targetDependency, Dependency.snapkit.targetDependency ] ) static let chatInput = library( name: "ChatInputFeature", dependencies: [ Feature.voxophone.targetDependency, Dependency.composableArchitecture.targetDependency ] ) static let restore = library( name: "RestoreFeature", dependencies: [ Feature.hud.targetDependency, Feature.shared.targetDependency, Feature.sftp.targetDependency, Feature.integration.targetDependency, Feature.presentation.targetDependency, Feature.icloud.targetDependency, Feature.dropbox.targetDependency, Feature.drive.targetDependency, Feature.dependencyInjection.targetDependency ] ) static let contact = library( name: "ContactFeature", dependencies: [ Feature.shared.targetDependency, Feature.inputField.targetDependency, Feature.chat.targetDependency, Feature.presentation.targetDependency, Dependency.combineSchedulers.targetDependency, Dependency.scrollViewController.targetDependency ] ) static let chat = library( name: "ChatFeature", dependencies: [ Feature.hud.targetDependency, Feature.theme.targetDependency, Feature.shared.targetDependency, Feature.defaults.targetDependency, Feature.keychain.targetDependency, Feature.voxophone.targetDependency, Feature.integration.targetDependency, Feature.permissions.targetDependency, Feature.presentation.targetDependency, Feature.drawer.targetDependency, Feature.chatInput.targetDependency, Feature.dependencyInjection.targetDependency, Dependency.chatLayout.targetDependency, Dependency.differenceKit.targetDependency, Dependency.scrollViewController.targetDependency ] ) static let search = library( name: "SearchFeature", dependencies: [ Feature.hud.targetDependency, Feature.shared.targetDependency, Feature.countries.targetDependency, Feature.integration.targetDependency, Feature.presentation.targetDependency, Feature.contact.targetDependency, Feature.dependencyInjection.targetDependency ] ) static let launch = library( name: "LaunchFeature", dependencies: [ Feature.hud.targetDependency, Feature.theme.targetDependency, Feature.shared.targetDependency, Feature.defaults.targetDependency, Feature.push.targetDependency, Feature.integration.targetDependency, Feature.permissions.targetDependency, Feature.dropbox.targetDependency, Feature.versionChecking.targetDependency, Feature.dependencyInjection.targetDependency ] ) static let requests = library( name: "RequestsFeature", dependencies: [ Feature.theme.targetDependency, Feature.shared.targetDependency, Feature.integration.targetDependency, Feature.toast.targetDependency, Feature.contact.targetDependency, Feature.dependencyInjection.targetDependency, Dependency.differenceKit.targetDependency ] ) static let profile = library( name: "ProfileFeature", dependencies: [ Feature.hud.targetDependency, Feature.theme.targetDependency, Feature.shared.targetDependency, Feature.keychain.targetDependency, Feature.defaults.targetDependency, Feature.countries.targetDependency, Feature.inputField.targetDependency, Feature.menu.targetDependency, Feature.permissions.targetDependency, Feature.integration.targetDependency, Feature.presentation.targetDependency, Feature.drawer.targetDependency, Feature.dependencyInjection.targetDependency, Dependency.combineSchedulers.targetDependency, Dependency.scrollViewController.targetDependency ] ) static let chatList = library( name: "ChatListFeature", dependencies: [ Feature.theme.targetDependency, Feature.shared.targetDependency, Feature.defaults.targetDependency, Feature.menu.targetDependency, Feature.chat.targetDependency, Feature.profile.targetDependency, Feature.settings.targetDependency, Feature.contactList.targetDependency, Feature.dependencyInjection.targetDependency, Dependency.differenceKit.targetDependency ] ) static let onboarding = library( name: "OnboardingFeature", dependencies: [ Feature.hud.targetDependency, Feature.shared.targetDependency, Feature.defaults.targetDependency, Feature.keychain.targetDependency, Feature.countries.targetDependency, Feature.inputField.targetDependency, Feature.permissions.targetDependency, Feature.push.targetDependency, Feature.integration.targetDependency, Feature.presentation.targetDependency, Feature.drawer.targetDependency, Feature.versionChecking.targetDependency, Feature.dependencyInjection.targetDependency, Dependency.combineSchedulers.targetDependency, Dependency.scrollViewController.targetDependency ] ) static let menu = library( name: "MenuFeature", dependencies: [ Feature.theme.targetDependency, Feature.shared.targetDependency, Feature.defaults.targetDependency, Feature.integration.targetDependency, Feature.presentation.targetDependency, Feature.dependencyInjection.targetDependency ] ) static let backup = library( name: "BackupFeature", dependencies: [ Feature.hud.targetDependency, Feature.shared.targetDependency, Feature.models.targetDependency, Feature.inputField.targetDependency, Feature.sftp.targetDependency, Feature.presentation.targetDependency, Feature.icloud.targetDependency, Feature.drawer.targetDependency, Feature.dropbox.targetDependency, Feature.drive.targetDependency, Feature.dependencyInjection.targetDependency ] ) static let scan = library( name: "ScanFeature", dependencies: [ Feature.theme.targetDependency, Feature.shared.targetDependency, Feature.countries.targetDependency, Feature.permissions.targetDependency, Feature.integration.targetDependency, Feature.presentation.targetDependency, Feature.contact.targetDependency, Feature.dependencyInjection.targetDependency, Dependency.snapkit.targetDependency ] ) static let contactList = library( name: "ContactListFeature", dependencies: [ Feature.theme.targetDependency, Feature.shared.targetDependency, Feature.integration.targetDependency, Feature.presentation.targetDependency, Feature.contact.targetDependency, Feature.dependencyInjection.targetDependency, Dependency.differenceKit.targetDependency ] ) static let settings = library( name: "SettingsFeature", dependencies: [ Feature.hud.targetDependency, Feature.theme.targetDependency, Feature.shared.targetDependency, Feature.defaults.targetDependency, Feature.keychain.targetDependency, Feature.inputField.targetDependency, Feature.push.targetDependency, Feature.permissions.targetDependency, Feature.menu.targetDependency, Feature.integration.targetDependency, Feature.presentation.targetDependency, Feature.drawer.targetDependency, Feature.dependencyInjection.targetDependency, Dependency.combineSchedulers.targetDependency, Dependency.scrollViewController.targetDependency ] ) } let package = Package( name: "client-ios", defaultLocalization: "en", platforms: [.iOS(.v14)], products: Feature.all.map(\.product), dependencies: Dependency.all.map(\.packageDependency), targets: Feature.all.flatMap(\.targets) ) // // MARK: - DependencyInjectionTests // // .testTarget( // name: "DependencyInjectionTests", // dependencies: ["DependencyInjection"] // ), // // // MARK: - AppTests // // .testTarget( // name: "AppTests", // dependencies: ["App"] // ), // // // MARK: - ProfileFeatureTests // // .testTarget( // name: "ProfileFeatureTests", // dependencies: [ // "TestHelpers", // "ProfileFeature", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - ContactFeatureTests // // .testTarget( // name: "ContactFeatureTests", // dependencies: [ // "TestHelpers", // "ContactFeature", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - SearchFeatureTests // // .testTarget( // name: "SearchFeatureTests", // dependencies: [ // "TestHelpers", // "SearchFeature", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - RequestsFeatureTests // // .testTarget( // name: "RequestsFeatureTests", // dependencies: [ // "TestHelpers", // "RequestsFeature", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - SettingsFeatureTests // // .testTarget( // name: "SettingsFeatureTests", // dependencies: [ // "TestHelpers", // "SettingsFeature", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - SettingsFeatureTests // // .testTarget( // name: "ChatListFeatureTests", // dependencies: [ // "TestHelpers", // "ChatListFeature", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - ContactListFeatureTests // // .testTarget( // name: "ContactListFeatureTests", // dependencies: [ // "TestHelpers", // "ContactListFeature", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - OnboardingFeatureTests // // .testTarget( // name: "OnboardingFeatureTests", // dependencies: [ // "TestHelpers", // "OnboardingFeature", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - PresentationTests // // .testTarget( // name: "PresentationTests", // dependencies: [ // "Presentation", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - ThemeTests // // .testTarget( // name: "ThemeTests", // dependencies: [ // "Theme", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - ChatFeatureTests // // .testTarget( // name: "ChatFeatureTests", // dependencies: [ // "ChatFeature", // "TestHelpers", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - ScanFeatureTests // // .testTarget( // name: "ScanFeatureTests", // dependencies: [ // "TestHelpers", // "ScanFeature", // .product(name: "Quick", package: "Quick"), // .product(name: "Nimble", package: "Nimble") // ] // ), // // // MARK: - CollectionView // // .target( // name: "CollectionView", // dependencies: [ // .product(name: "ChatLayout", package: "ChatLayout"), // .product(name: "XCTestDynamicOverlay", package: "xctest-dynamic-overlay"), // ] // ), // .testTarget( // name: "CollectionViewTests", // dependencies: [ // .target(name: "CollectionView"), // .product(name: "CustomDump", package: "swift-custom-dump"), // ] // ), // ] //)