diff --git a/Gemfile b/Gemfile
index 40333a4c..96de0f8f 100644
--- a/Gemfile
+++ b/Gemfile
@@ -1,6 +1,6 @@
source "https://rubygems.org"
-gem "fastlane", :github => "keeshux/fastlane", :ref => "2f464bc16fbebf4dbac52ed7362993434af3f022"
+gem "fastlane", :github => "keeshux/fastlane", :ref => "91a3bc8cbf26dd761920939fd7579ee4362ce9b3"
gem "dotenv"
plugins_path = File.join(File.dirname(__FILE__), 'fastlane', 'Pluginfile')
diff --git a/Gemfile.lock b/Gemfile.lock
index 164c8c2c..f3394373 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -1,9 +1,9 @@
GIT
remote: https://github.com/keeshux/fastlane.git
- revision: 2f464bc16fbebf4dbac52ed7362993434af3f022
- ref: 2f464bc16fbebf4dbac52ed7362993434af3f022
+ revision: 91a3bc8cbf26dd761920939fd7579ee4362ce9b3
+ ref: 91a3bc8cbf26dd761920939fd7579ee4362ce9b3
specs:
- fastlane (2.223.1)
+ fastlane (2.225.0)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -19,6 +19,7 @@ GIT
faraday-cookie_jar (~> 0.0.6)
faraday_middleware (~> 1.0)
fastimage (>= 2.1.0, < 3.0.0)
+ fastlane-sirp (>= 1.0.0)
gh_inspector (>= 1.1.2, < 2.0.0)
google-apis-androidpublisher_v3 (~> 0.3)
google-apis-playcustomapp_v1 (~> 0.1)
@@ -57,20 +58,20 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
- aws-partitions (1.981.0)
- aws-sdk-core (3.209.1)
+ aws-partitions (1.1001.0)
+ aws-sdk-core (3.211.0)
aws-eventstream (~> 1, >= 1.3.0)
- aws-partitions (~> 1, >= 1.651.0)
+ aws-partitions (~> 1, >= 1.992.0)
aws-sigv4 (~> 1.9)
jmespath (~> 1, >= 1.6.1)
- aws-sdk-kms (1.94.0)
- aws-sdk-core (~> 3, >= 3.207.0)
+ aws-sdk-kms (1.95.0)
+ aws-sdk-core (~> 3, >= 3.210.0)
aws-sigv4 (~> 1.5)
- aws-sdk-s3 (1.166.0)
- aws-sdk-core (~> 3, >= 3.207.0)
+ aws-sdk-s3 (1.169.0)
+ aws-sdk-core (~> 3, >= 3.210.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.5)
- aws-sigv4 (1.10.0)
+ aws-sigv4 (1.10.1)
aws-eventstream (~> 1, >= 1.0.2)
babosa (1.0.4)
base64 (0.2.0)
@@ -87,7 +88,7 @@ GEM
domain_name (0.6.20240107)
dotenv (2.8.1)
emoji_regex (3.2.3)
- excon (0.111.0)
+ excon (0.112.0)
faraday (1.10.4)
faraday-em_http (~> 1.0)
faraday-em_synchrony (~> 1.0)
@@ -121,6 +122,8 @@ GEM
loco_strings (~> 0.1.4.1)
ruby-openai (~> 3.7)
fastlane-plugin-versioning (0.6.0)
+ fastlane-sirp (1.0.0)
+ sysrandom (~> 1.0)
gh_inspector (1.1.3)
google-apis-androidpublisher_v3 (0.54.0)
google-apis-core (>= 0.11.0, < 2.a)
@@ -167,8 +170,8 @@ GEM
multi_xml (>= 0.5.2)
httpclient (2.8.3)
jmespath (1.6.2)
- json (2.7.2)
- jwt (2.9.1)
+ json (2.7.5)
+ jwt (2.9.3)
base64
loco_strings (0.1.4.1)
nokogiri (~> 1.13, >= 1.13.8)
@@ -179,7 +182,7 @@ GEM
multi_xml (0.7.1)
bigdecimal (~> 3.1)
multipart-post (2.4.1)
- nanaimo (0.3.0)
+ nanaimo (0.4.0)
naturally (2.2.1)
nkf (0.2.0)
nokogiri (1.16.7)
@@ -198,7 +201,7 @@ GEM
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
- rexml (3.3.8)
+ rexml (3.3.9)
rouge (2.0.7)
ruby-openai (3.7.0)
httparty (>= 0.18.1)
@@ -213,6 +216,7 @@ GEM
simctl (1.6.10)
CFPropertyList
naturally
+ sysrandom (1.0.5)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
@@ -224,13 +228,13 @@ GEM
uber (0.1.0)
unicode-display_width (2.6.0)
word_wrap (1.0.0)
- xcodeproj (1.25.0)
+ xcodeproj (1.27.0)
CFPropertyList (>= 2.3.3, < 4.0)
atomos (~> 0.1.3)
claide (>= 1.0.2, < 2.0)
colored2 (~> 3.1)
- nanaimo (~> 0.3.0)
- rexml (>= 3.3.2, < 4.0)
+ nanaimo (~> 0.4.0)
+ rexml (>= 3.3.6, < 4.0)
xcpretty (0.3.0)
rouge (~> 2.0.7)
xcpretty-travis-formatter (1.0.1)
diff --git a/Passepartout.xcodeproj/project.pbxproj b/Passepartout.xcodeproj/project.pbxproj
index b98f5f51..1c334780 100644
--- a/Passepartout.xcodeproj/project.pbxproj
+++ b/Passepartout.xcodeproj/project.pbxproj
@@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
+ 0E182C6C2CD61CD800051DB2 /* AppUI in Frameworks */ = {isa = PBXBuildFile; productRef = 0E182C6B2CD61CD800051DB2 /* AppUI */; };
0E757F132CD0CFFC006E13E1 /* PassepartoutLoginItemApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E757F122CD0CFFC006E13E1 /* PassepartoutLoginItemApp.swift */; };
0E757F202CD0D22B006E13E1 /* PassepartoutLoginItem.app in Embed Login Item */ = {isa = PBXBuildFile; fileRef = 0E757F102CD0CFFC006E13E1 /* PassepartoutLoginItem.app */; platformFilters = (macos, ); settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
0E757F232CD0D2BD006E13E1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E757F212CD0D2B7006E13E1 /* AppDelegate.swift */; };
@@ -19,7 +20,6 @@
0EC066D12C7DC47600D88A94 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 0EC066D02C7DC47600D88A94 /* LaunchScreen.storyboard */; platformFilter = ios; };
0EC332CA2B8A1808000B9C2F /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0EC332C92B8A1808000B9C2F /* NetworkExtension.framework */; };
0EC332D22B8A1808000B9C2F /* PassepartoutTunnel.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = 0EC332C82B8A1808000B9C2F /* PassepartoutTunnel.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
- 0EC4A7132CD597EF00B7CAAD /* AppUIPlatform in Frameworks */ = {isa = PBXBuildFile; productRef = 0EC4A7122CD597EF00B7CAAD /* AppUIPlatform */; };
0EC797422B9378E000C093B7 /* Shared+App.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EC797402B9378E000C093B7 /* Shared+App.swift */; };
0EC797432B9378E000C093B7 /* Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EC797412B9378E000C093B7 /* Shared.swift */; };
0EC797442B93790600C093B7 /* Shared.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EC797412B9378E000C093B7 /* Shared.swift */; };
@@ -144,7 +144,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
- 0EC4A7132CD597EF00B7CAAD /* AppUIPlatform in Frameworks */,
+ 0E182C6C2CD61CD800051DB2 /* AppUI in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -290,7 +290,7 @@
);
name = Passepartout;
packageProductDependencies = (
- 0EC4A7122CD597EF00B7CAAD /* AppUIPlatform */,
+ 0E182C6B2CD61CD800051DB2 /* AppUI */,
);
productName = PassepartoutKit;
productReference = 0E06D18F2B87629100176E1D /* Passepartout.app */;
@@ -983,6 +983,10 @@
/* End XCConfigurationList section */
/* Begin XCSwiftPackageProductDependency section */
+ 0E182C6B2CD61CD800051DB2 /* AppUI */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = AppUI;
+ };
0E6C0A022BF4047100450362 /* AppLibrary */ = {
isa = XCSwiftPackageProductDependency;
productName = AppLibrary;
@@ -995,10 +999,6 @@
isa = XCSwiftPackageProductDependency;
productName = TunnelLibrary;
};
- 0EC4A7122CD597EF00B7CAAD /* AppUIPlatform */ = {
- isa = XCSwiftPackageProductDependency;
- productName = AppUIPlatform;
- };
/* End XCSwiftPackageProductDependency section */
};
rootObject = 0E06D1872B87629100176E1D /* Project object */;
diff --git a/Passepartout.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Passepartout.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
index 9400c385..65967e54 100644
--- a/Passepartout.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
+++ b/Passepartout.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved
@@ -41,7 +41,7 @@
"kind" : "remoteSourceControl",
"location" : "git@github.com:passepartoutvpn/passepartoutkit-source",
"state" : {
- "revision" : "e95c7b54dc11e744d9b40a722fccf752436ac0ef"
+ "revision" : "b32b63ab8e09883f965737bb6214dfb81e38283a"
}
},
{
diff --git a/Passepartout/App/AppDelegate.swift b/Passepartout/App/AppDelegate.swift
index ed8e1ec0..0c33e2df 100644
--- a/Passepartout/App/AppDelegate.swift
+++ b/Passepartout/App/AppDelegate.swift
@@ -23,18 +23,18 @@
// along with Passepartout. If not, see .
//
-import AppUI
import CommonLibrary
import PassepartoutKit
import SwiftUI
+import UILibrary
@MainActor
final class AppDelegate: NSObject {
let context: AppContext = .shared
// let context: AppContext = .mock(withRegistry: .shared)
- func configure(with appUIConfiguring: AppUIConfiguring) {
- AppUI(appUIConfiguring)
+ func configure(with uiConfiguring: UILibraryConfiguring) {
+ UILibrary(uiConfiguring)
.configure(with: context)
}
}
diff --git a/Passepartout/Library/Package.swift b/Passepartout/Library/Package.swift
index c28d81b7..7039f7b5 100644
--- a/Passepartout/Library/Package.swift
+++ b/Passepartout/Library/Package.swift
@@ -25,10 +25,6 @@ let package = Package(
name: "AppUIMain",
targets: ["AppUIMain"]
),
- .library(
- name: "AppUIPlatform",
- targets: ["AppUIPlatform"]
- ),
.library(
name: "AppUITV",
targets: ["AppUITV"]
@@ -36,11 +32,15 @@ let package = Package(
.library(
name: "TunnelLibrary",
targets: ["CommonLibrary"]
+ ),
+ .library(
+ name: "UILibrary",
+ targets: ["UILibrary"]
)
],
dependencies: [
// .package(url: "git@github.com:passepartoutvpn/passepartoutkit-source", from: "0.9.0"),
- .package(url: "git@github.com:passepartoutvpn/passepartoutkit-source", revision: "e95c7b54dc11e744d9b40a722fccf752436ac0ef"),
+ .package(url: "git@github.com:passepartoutvpn/passepartoutkit-source", revision: "b32b63ab8e09883f965737bb6214dfb81e38283a"),
// .package(path: "../../../passepartoutkit-source"),
.package(url: "git@github.com:passepartoutvpn/passepartoutkit-source-openvpn-openssl", from: "0.9.1"),
// .package(url: "git@github.com:passepartoutvpn/passepartoutkit-source-openvpn-openssl", revision: "031863a1cd683962a7dfe68e20b91fa820a1ecce"),
@@ -53,13 +53,6 @@ let package = Package(
targets: [
// Targets are the basic building blocks of a package, defining a module or a test suite.
// Targets can depend on other targets in this package and products from dependencies.
- .target(
- name: "APILibrary",
- dependencies: ["CommonLibrary"],
- resources: [
- .copy("API")
- ]
- ),
.target(
name: "AppData",
dependencies: []
@@ -87,42 +80,38 @@ let package = Package(
.target(
name: "AppLibrary",
dependencies: [
- "APILibrary",
- "Kvitto",
- "UtilsLibrary"
+ "CommonLibrary",
+ "CommonUtils",
+ "Kvitto"
]
),
.target(
name: "AppUI",
- dependencies: [
- "AppDataProfiles",
- "AppDataProviders",
- "AppLibrary"
- ],
- resources: [
- .process("Resources")
- ]
- ),
- .target(
- name: "AppUIMain",
- dependencies: [
- "AppUI",
- "LegacyV2"
- ],
- resources: [
- .process("Resources")
- ]
- ),
- .target(
- name: "AppUIPlatform",
dependencies: [
.target(name: "AppUIMain", condition: .when(platforms: [.iOS, .macOS])),
.target(name: "AppUITV", condition: .when(platforms: [.tvOS]))
]
),
+ .target(
+ name: "AppUIMain",
+ dependencies: [
+ "LegacyV2",
+ "UILibrary"
+ ],
+ resources: [
+ .process("Resources")
+ ]
+ ),
.target(
name: "AppUITV",
- dependencies: ["AppUI"]
+ dependencies: ["UILibrary"]
+ ),
+ .target(
+ name: "CommonAPI",
+ dependencies: ["CommonLibrary"],
+ resources: [
+ .copy("API")
+ ]
),
.target(
name: "CommonLibrary",
@@ -135,10 +124,13 @@ let package = Package(
.process("Resources")
]
),
+ .target(
+ name: "CommonUtils"
+ ),
.target(
name: "LegacyV2",
dependencies: [
- "UtilsLibrary",
+ "CommonUtils",
.product(name: "PassepartoutKit", package: "passepartoutkit-source")
],
resources: [
@@ -146,7 +138,16 @@ let package = Package(
]
),
.target(
- name: "UtilsLibrary"
+ name: "UILibrary",
+ dependencies: [
+ "AppDataProfiles",
+ "AppDataProviders",
+ "AppLibrary",
+ "CommonAPI"
+ ],
+ resources: [
+ .process("Resources")
+ ]
),
.testTarget(
name: "AppLibraryTests",
@@ -157,8 +158,8 @@ let package = Package(
dependencies: ["AppUIMain"]
),
.testTarget(
- name: "AppUITests",
- dependencies: ["AppUI"]
+ name: "UILibraryTests",
+ dependencies: ["UILibrary"]
)
]
)
diff --git a/Passepartout/Library/Sources/AppDataProfiles/CDProfileRepositoryV3.swift b/Passepartout/Library/Sources/AppDataProfiles/CDProfileRepositoryV3.swift
index e61d506d..b960dcc1 100644
--- a/Passepartout/Library/Sources/AppDataProfiles/CDProfileRepositoryV3.swift
+++ b/Passepartout/Library/Sources/AppDataProfiles/CDProfileRepositoryV3.swift
@@ -26,10 +26,10 @@
import AppData
import AppLibrary
import Combine
+import CommonUtils
import CoreData
import Foundation
import PassepartoutKit
-import UtilsLibrary
extension AppData {
public static func cdProfileRepositoryV3(
diff --git a/Passepartout/Library/Sources/AppDataProviders/CDProviderRepositoryV3.swift b/Passepartout/Library/Sources/AppDataProviders/CDProviderRepositoryV3.swift
index 3d116565..37485c0f 100644
--- a/Passepartout/Library/Sources/AppDataProviders/CDProviderRepositoryV3.swift
+++ b/Passepartout/Library/Sources/AppDataProviders/CDProviderRepositoryV3.swift
@@ -25,10 +25,10 @@
import AppData
import Combine
+import CommonUtils
import CoreData
import Foundation
import PassepartoutKit
-import UtilsLibrary
extension AppData {
public static func cdProviderRepositoryV3(
diff --git a/Passepartout/Library/Sources/AppDataProviders/CDVPNProviderServerRepositoryV3.swift b/Passepartout/Library/Sources/AppDataProviders/CDVPNProviderServerRepositoryV3.swift
index 21a3830a..1629a08f 100644
--- a/Passepartout/Library/Sources/AppDataProviders/CDVPNProviderServerRepositoryV3.swift
+++ b/Passepartout/Library/Sources/AppDataProviders/CDVPNProviderServerRepositoryV3.swift
@@ -24,10 +24,10 @@
//
import AppData
+import CommonUtils
import CoreData
import Foundation
import PassepartoutKit
-import UtilsLibrary
final class CDVPNProviderServerRepositoryV3: VPNProviderServerRepository {
private let context: NSManagedObjectContext
diff --git a/Passepartout/Library/Sources/AppLibrary/IAP/AppProduct.swift b/Passepartout/Library/Sources/AppLibrary/IAP/AppProduct.swift
index cae43a03..cc8a867c 100644
--- a/Passepartout/Library/Sources/AppLibrary/IAP/AppProduct.swift
+++ b/Passepartout/Library/Sources/AppLibrary/IAP/AppProduct.swift
@@ -24,9 +24,9 @@
//
import CommonLibrary
+import CommonUtils
import Foundation
import PassepartoutKit
-import UtilsLibrary
public struct AppProduct: RawRepresentable, Hashable, Sendable {
public let rawValue: String
diff --git a/Passepartout/Library/Sources/AppLibrary/IAP/AppProductHelper.swift b/Passepartout/Library/Sources/AppLibrary/IAP/AppProductHelper.swift
index 675e5a29..7d72ea33 100644
--- a/Passepartout/Library/Sources/AppLibrary/IAP/AppProductHelper.swift
+++ b/Passepartout/Library/Sources/AppLibrary/IAP/AppProductHelper.swift
@@ -23,8 +23,8 @@
// along with Passepartout. If not, see .
//
+import CommonUtils
import Foundation
-import UtilsLibrary
public protocol AppProductHelper: InAppHelper where ProductIdentifier == AppProduct {
}
diff --git a/Passepartout/Library/Sources/AppLibrary/IAP/AppReceiptReader.swift b/Passepartout/Library/Sources/AppLibrary/IAP/AppReceiptReader.swift
index 7a2ca261..b743a939 100644
--- a/Passepartout/Library/Sources/AppLibrary/IAP/AppReceiptReader.swift
+++ b/Passepartout/Library/Sources/AppLibrary/IAP/AppReceiptReader.swift
@@ -23,8 +23,8 @@
// along with Passepartout. If not, see .
//
+import CommonUtils
import Foundation
-import UtilsLibrary
public protocol AppReceiptReader: InAppReceiptReader where UserLevel == AppUserLevel {
}
diff --git a/Passepartout/Library/Sources/AppLibrary/IAP/IAPManager.swift b/Passepartout/Library/Sources/AppLibrary/IAP/IAPManager.swift
index 77e8a5be..c8a821cf 100644
--- a/Passepartout/Library/Sources/AppLibrary/IAP/IAPManager.swift
+++ b/Passepartout/Library/Sources/AppLibrary/IAP/IAPManager.swift
@@ -23,9 +23,9 @@
// along with Passepartout. If not, see .
//
+import CommonUtils
import Foundation
import PassepartoutKit
-import UtilsLibrary
// FIXME: #424, reload receipt + objectWillChange on purchase/transactions
diff --git a/Passepartout/Library/Sources/AppLibrary/IAP/KvittoReceiptReader.swift b/Passepartout/Library/Sources/AppLibrary/IAP/KvittoReceiptReader.swift
index ad25c480..1b60ae3b 100644
--- a/Passepartout/Library/Sources/AppLibrary/IAP/KvittoReceiptReader.swift
+++ b/Passepartout/Library/Sources/AppLibrary/IAP/KvittoReceiptReader.swift
@@ -23,10 +23,10 @@
// along with Passepartout. If not, see .
//
+import CommonUtils
import Foundation
import Kvitto
import PassepartoutKit
-import UtilsLibrary
public final class KvittoReceiptReader: AppReceiptReader {
public init() {
diff --git a/Passepartout/Library/Sources/AppLibrary/Mock/MockAppProductHelper.swift b/Passepartout/Library/Sources/AppLibrary/Mock/MockAppProductHelper.swift
index 84f5524c..9e8d41f9 100644
--- a/Passepartout/Library/Sources/AppLibrary/Mock/MockAppProductHelper.swift
+++ b/Passepartout/Library/Sources/AppLibrary/Mock/MockAppProductHelper.swift
@@ -23,8 +23,8 @@
// along with Passepartout. If not, see .
//
+import CommonUtils
import Foundation
-import UtilsLibrary
public actor MockAppProductHelper: AppProductHelper {
public private(set) var products: [AppProduct: InAppProduct]
diff --git a/Passepartout/Library/Sources/AppLibrary/Mock/MockAppReceiptReader.swift b/Passepartout/Library/Sources/AppLibrary/Mock/MockAppReceiptReader.swift
index 78628bfe..32560888 100644
--- a/Passepartout/Library/Sources/AppLibrary/Mock/MockAppReceiptReader.swift
+++ b/Passepartout/Library/Sources/AppLibrary/Mock/MockAppReceiptReader.swift
@@ -23,8 +23,8 @@
// along with Passepartout. If not, see .
//
+import CommonUtils
import Foundation
-import UtilsLibrary
public actor MockAppReceiptReader: AppReceiptReader {
private var receipt: InAppReceipt?
diff --git a/Passepartout/Library/Sources/AppUIPlatform/Dummy.swift b/Passepartout/Library/Sources/AppUI/Dummy.swift
similarity index 100%
rename from Passepartout/Library/Sources/AppUIPlatform/Dummy.swift
rename to Passepartout/Library/Sources/AppUI/Dummy.swift
diff --git a/Passepartout/Library/Sources/AppUIMain/AppUIMain.swift b/Passepartout/Library/Sources/AppUIMain/AppUIMain.swift
index aa88c711..ec3ab889 100644
--- a/Passepartout/Library/Sources/AppUIMain/AppUIMain.swift
+++ b/Passepartout/Library/Sources/AppUIMain/AppUIMain.swift
@@ -23,10 +23,10 @@
// along with Passepartout. If not, see .
//
-@_exported import AppUI
import Foundation
+@_exported import UILibrary
-public final class AppUIMain: AppUIConfiguring {
+public final class AppUIMain: UILibraryConfiguring {
public init() {
}
diff --git a/Passepartout/Library/Sources/AppUIMain/Business/ProfileImporter.swift b/Passepartout/Library/Sources/AppUIMain/Business/ProfileImporter.swift
index 5ba9009c..78f65f96 100644
--- a/Passepartout/Library/Sources/AppUIMain/Business/ProfileImporter.swift
+++ b/Passepartout/Library/Sources/AppUIMain/Business/ProfileImporter.swift
@@ -24,9 +24,9 @@
//
import AppLibrary
+import CommonUtils
import Foundation
import PassepartoutKit
-import UtilsLibrary
@MainActor
final class ProfileImporter: ObservableObject {
diff --git a/Passepartout/Library/Sources/AppUIMain/Views/About/AboutView.swift b/Passepartout/Library/Sources/AppUIMain/Views/About/AboutView.swift
index 5232ca48..b83d09d3 100644
--- a/Passepartout/Library/Sources/AppUIMain/Views/About/AboutView.swift
+++ b/Passepartout/Library/Sources/AppUIMain/Views/About/AboutView.swift
@@ -25,9 +25,9 @@
import AppLibrary
import CommonLibrary
+import CommonUtils
import PassepartoutKit
import SwiftUI
-import UtilsLibrary
struct AboutView: View {
let profileManager: ProfileManager
diff --git a/Passepartout/Library/Sources/AppUIMain/Views/About/CreditsView.swift b/Passepartout/Library/Sources/AppUIMain/Views/About/CreditsView.swift
index 45244475..941d1025 100644
--- a/Passepartout/Library/Sources/AppUIMain/Views/About/CreditsView.swift
+++ b/Passepartout/Library/Sources/AppUIMain/Views/About/CreditsView.swift
@@ -23,8 +23,8 @@
// along with Passepartout. If not, see .
//
+import CommonUtils
import SwiftUI
-import UtilsLibrary
struct CreditsView: View {
var body: some View {
diff --git a/Passepartout/Library/Sources/AppUIMain/Views/App/AppToolbar.swift b/Passepartout/Library/Sources/AppUIMain/Views/App/AppToolbar.swift
index f460e82e..dbff5a42 100644
--- a/Passepartout/Library/Sources/AppUIMain/Views/App/AppToolbar.swift
+++ b/Passepartout/Library/Sources/AppUIMain/Views/App/AppToolbar.swift
@@ -24,9 +24,9 @@
//
import AppLibrary
+import CommonUtils
import PassepartoutKit
import SwiftUI
-import UtilsLibrary
struct AppToolbar: ToolbarContent, SizeClassProviding {
diff --git a/Passepartout/Library/Sources/AppUIMain/Views/App/InstalledProfileView.swift b/Passepartout/Library/Sources/AppUIMain/Views/App/InstalledProfileView.swift
index 616f6a35..8d3a631f 100644
--- a/Passepartout/Library/Sources/AppUIMain/Views/App/InstalledProfileView.swift
+++ b/Passepartout/Library/Sources/AppUIMain/Views/App/InstalledProfileView.swift
@@ -24,9 +24,9 @@
//
import AppLibrary
+import CommonUtils
import PassepartoutKit
import SwiftUI
-import UtilsLibrary
struct InstalledProfileView: View, Routable {
diff --git a/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileContainerView.swift b/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileContainerView.swift
index 966378c8..530b45d4 100644
--- a/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileContainerView.swift
+++ b/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileContainerView.swift
@@ -24,9 +24,9 @@
//
import AppLibrary
+import CommonUtils
import PassepartoutKit
import SwiftUI
-import UtilsLibrary
struct ProfileContainerView: View, Routable {
let layout: ProfilesLayout
diff --git a/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileContextMenu.swift b/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileContextMenu.swift
index 2c41b5a1..af6f3fe0 100644
--- a/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileContextMenu.swift
+++ b/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileContextMenu.swift
@@ -24,9 +24,9 @@
//
import AppLibrary
+import CommonUtils
import PassepartoutKit
import SwiftUI
-import UtilsLibrary
struct ProfileContextMenu: View, Routable {
let profileManager: ProfileManager
diff --git a/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileDuplicateButton.swift b/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileDuplicateButton.swift
index 68c4e1c7..cbfd072d 100644
--- a/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileDuplicateButton.swift
+++ b/Passepartout/Library/Sources/AppUIMain/Views/App/ProfileDuplicateButton.swift
@@ -24,9 +24,9 @@
//
import AppLibrary
+import CommonUtils
import PassepartoutKit
import SwiftUI
-import UtilsLibrary
struct ProfileDuplicateButton