diff --git a/Modules/Capabilities/DesignSystem/Sources/UIResponderExtensions.swift b/Modules/Capabilities/DesignSystem/Sources/Extensions/UIResponderExtensions.swift similarity index 100% rename from Modules/Capabilities/DesignSystem/Sources/UIResponderExtensions.swift rename to Modules/Capabilities/DesignSystem/Sources/Extensions/UIResponderExtensions.swift diff --git a/Modules/Capabilities/DesignSystem/Sources/UIViewControllerExtensions.swift b/Modules/Capabilities/DesignSystem/Sources/Extensions/UIViewControllerExtensions.swift similarity index 100% rename from Modules/Capabilities/DesignSystem/Sources/UIViewControllerExtensions.swift rename to Modules/Capabilities/DesignSystem/Sources/Extensions/UIViewControllerExtensions.swift diff --git a/Modules/Capabilities/DesignSystem/Sources/Extensions/ViewExtensions.swift b/Modules/Capabilities/DesignSystem/Sources/Extensions/ViewExtensions.swift new file mode 100644 index 00000000..90ee012a --- /dev/null +++ b/Modules/Capabilities/DesignSystem/Sources/Extensions/ViewExtensions.swift @@ -0,0 +1,32 @@ +// Created by Geoff Pado on 5/13/24. +// Copyright © 2024 Cocoatype, LLC. All rights reserved. + +import Combine +import SwiftUI + +public extension View { + func onAppReceive

(_ publisher: P, perform action: @escaping (P.Output) -> Void) -> some View where P: Publisher, P.Failure == Never { + let isPreview: Bool +#if DEBUG + isPreview = ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" +#else + isPreview = false +#endif + + if isPreview { + return self.onReceive(publisher, perform: { _ in }) + } else { + return self.onReceive(publisher, perform: action) + } + } + + func fill() -> some View { + return self.modifier(FillViewModifier()) + } +} + +struct FillViewModifier: ViewModifier { + func body(content: Content) -> some View { + AnyView(content).frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center) + } +} diff --git a/Modules/Capabilities/DesignSystem/Sources/ReadableWidthKey.swift b/Modules/Capabilities/DesignSystem/Sources/ReadableWidthKey.swift new file mode 100644 index 00000000..39cd8578 --- /dev/null +++ b/Modules/Capabilities/DesignSystem/Sources/ReadableWidthKey.swift @@ -0,0 +1,15 @@ +// Created by Geoff Pado on 5/13/24. +// Copyright © 2024 Cocoatype, LLC. All rights reserved. + +import SwiftUI + +struct ReadableWidthKey: EnvironmentKey { + static let defaultValue = CGFloat.zero +} + +public extension EnvironmentValues { + var readableWidth: CGFloat { + get { self[ReadableWidthKey.self] } + set { self[ReadableWidthKey.self] = newValue } + } +} diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingHeader.swift b/Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingHeader.swift similarity index 100% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingHeader.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingHeader.swift diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingHostingController.swift b/Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingHostingController.swift similarity index 81% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingHostingController.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingHostingController.swift index 54e9b9f9..a19b08dd 100644 --- a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingHostingController.swift +++ b/Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingHostingController.swift @@ -4,8 +4,8 @@ import SwiftUI import UIKit -class PurchaseMarketingHostingController: UIHostingController { - init() { +public class PurchaseMarketingHostingController: UIHostingController { + public init() { super.init(rootView: PurchaseMarketingView()) modalPresentationStyle = .formSheet preferredContentSize = CGSize(width: 640, height: 640) diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingItem.swift b/Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingItem.swift similarity index 100% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingItem.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingItem.swift diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingText.swift b/Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingText.swift similarity index 100% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingText.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingText.swift diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingView.swift b/Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingView.swift similarity index 96% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingView.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingView.swift index 45ecb72a..dc9d3da0 100644 --- a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/PurchaseMarketingView.swift +++ b/Modules/Capabilities/PurchaseMarketing/Sources/PurchaseMarketingView.swift @@ -1,12 +1,15 @@ // Created by Geoff Pado on 5/18/21. // Copyright © 2021 Cocoatype, LLC. All rights reserved. +import DesignSystem import SwiftUI -struct PurchaseMarketingView: View { +public struct PurchaseMarketingView: View { @Environment(\.horizontalSizeClass) var horizontalSizeClass - var body: some View { + public init() {} + + public var body: some View { GeometryReader { proxy in VStack(spacing: 0) { Color.primaryDark diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/LegacyPurchaseMarketingTopBarButtonStack.swift b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/LegacyPurchaseMarketingTopBarButtonStack.swift similarity index 100% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/LegacyPurchaseMarketingTopBarButtonStack.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/LegacyPurchaseMarketingTopBarButtonStack.swift diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/ProductPriceFormatter.swift b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/ProductPriceFormatter.swift similarity index 83% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/ProductPriceFormatter.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/ProductPriceFormatter.swift index 07d53cdb..8dc4bc28 100644 --- a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/ProductPriceFormatter.swift +++ b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/ProductPriceFormatter.swift @@ -3,8 +3,8 @@ import StoreKit -enum ProductPriceFormatter { - static func formattedPrice(for product: SKProduct) -> String? { +public enum ProductPriceFormatter { + public static func formattedPrice(for product: SKProduct) -> String? { if product.priceLocale != Self.priceFormatter.locale { Self.priceFormatter.locale = product.priceLocale } diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseButton.swift b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseButton.swift similarity index 100% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseButton.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseButton.swift diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarButtonStack.swift b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarButtonStack.swift similarity index 100% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarButtonStack.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarButtonStack.swift diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarButtons.swift b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarButtons.swift similarity index 100% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarButtons.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarButtons.swift diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarCompact.swift b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarCompact.swift similarity index 100% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarCompact.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarCompact.swift diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarHeadline.swift b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarHeadline.swift similarity index 100% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarHeadline.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarHeadline.swift diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarRegular.swift b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarRegular.swift similarity index 100% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarRegular.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarRegular.swift diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarSubheadline.swift b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarSubheadline.swift similarity index 95% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarSubheadline.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarSubheadline.swift index 9fc3394d..78acacd4 100644 --- a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseMarketingTopBarSubheadline.swift +++ b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseMarketingTopBarSubheadline.swift @@ -1,6 +1,7 @@ // Created by Geoff Pado on 1/29/22. // Copyright © 2022 Cocoatype, LLC. All rights reserved. +import DesignSystem import SwiftUI struct PurchaseMarketingTopBarSubheadline: View { diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseRestoreButton.swift b/Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseRestoreButton.swift similarity index 100% rename from Modules/Legacy/Core/Sources/Settings/Purchase Marketing/Top Bar/PurchaseRestoreButton.swift rename to Modules/Capabilities/PurchaseMarketing/Sources/Top Bar/PurchaseRestoreButton.swift diff --git a/Modules/Capabilities/PurchaseMarketing/Tests/PurchaseMarketingTests.swift b/Modules/Capabilities/PurchaseMarketing/Tests/PurchaseMarketingTests.swift new file mode 100644 index 00000000..859ed91d --- /dev/null +++ b/Modules/Capabilities/PurchaseMarketing/Tests/PurchaseMarketingTests.swift @@ -0,0 +1 @@ +// blank diff --git a/Modules/Legacy/Core/Sources/Application/EnvironmentKeys.swift b/Modules/Capabilities/Purchasing/Sources/PurchaseStatePublisherKey.swift similarity index 53% rename from Modules/Legacy/Core/Sources/Application/EnvironmentKeys.swift rename to Modules/Capabilities/Purchasing/Sources/PurchaseStatePublisherKey.swift index f5326bb0..972cb2d8 100644 --- a/Modules/Legacy/Core/Sources/Application/EnvironmentKeys.swift +++ b/Modules/Capabilities/Purchasing/Sources/PurchaseStatePublisherKey.swift @@ -1,23 +1,13 @@ -// Created by Geoff Pado on 4/24/24. +// Created by Geoff Pado on 5/13/24. // Copyright © 2024 Cocoatype, LLC. All rights reserved. -import Purchasing import SwiftUI -struct ReadableWidthKey: EnvironmentKey { - static let defaultValue = CGFloat.zero -} - struct PurchaseStatePublisherKey: EnvironmentKey { static let defaultValue = PurchaseStatePublisher() } -extension EnvironmentValues { - var readableWidth: CGFloat { - get { self[ReadableWidthKey.self] } - set { self[ReadableWidthKey.self] = newValue } - } - +public extension EnvironmentValues { var purchaseStatePublisher: PurchaseStatePublisher { get { self[PurchaseStatePublisherKey.self] } set { self[PurchaseStatePublisherKey.self] = newValue } diff --git a/Modules/Capabilities/Unpurchased/Sources/UnpurchasedFeature.swift b/Modules/Capabilities/Unpurchased/Sources/UnpurchasedFeature.swift index 36ff0e9f..23be6e2f 100644 --- a/Modules/Capabilities/Unpurchased/Sources/UnpurchasedFeature.swift +++ b/Modules/Capabilities/Unpurchased/Sources/UnpurchasedFeature.swift @@ -10,7 +10,7 @@ public struct UnpurchasedFeature { public static func autoRedactions(learnMoreAction: LearnMoreAction? = nil) -> UnpurchasedFeature { UnpurchasedFeature( message: Strings.AutoRedactions.message, - learnMoreAction: nil, + learnMoreAction: learnMoreAction, hideFeatureKey: .hideAutoRedactions ) } diff --git a/Modules/Legacy/Core/Sources/Application/AppViewController.swift b/Modules/Legacy/Core/Sources/Application/AppViewController.swift index c17fd435..1003d968 100644 --- a/Modules/Legacy/Core/Sources/Application/AppViewController.swift +++ b/Modules/Legacy/Core/Sources/Application/AppViewController.swift @@ -5,6 +5,7 @@ import AppRatings import Editing import ErrorHandling import Photos +import PurchaseMarketing import Redactions import UIKit import VisionKit diff --git a/Modules/Legacy/Core/Sources/Extensions/ViewExtensions.swift b/Modules/Legacy/Core/Sources/Extensions/ViewExtensions.swift index 5958b9bc..db51a7d0 100644 --- a/Modules/Legacy/Core/Sources/Extensions/ViewExtensions.swift +++ b/Modules/Legacy/Core/Sources/Extensions/ViewExtensions.swift @@ -5,36 +5,11 @@ import Combine import SwiftUI extension View { - public func onAppReceive

(_ publisher: P, perform action: @escaping (P.Output) -> Void) -> some View where P: Publisher, P.Failure == Never { - let isPreview: Bool - #if DEBUG - isPreview = ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" - #else - isPreview = false - #endif - - if isPreview { - return self.onReceive(publisher, perform: { _ in }) - } else { - return self.onReceive(publisher, perform: action) - } - } - - public func fill() -> some View { - return self.modifier(FillViewModifier()) - } - public func continuousCornerRadius(_ radius: CGFloat) -> some View { return self.modifier(ContinuousCornerRadiusViewModifier(radius)) } } -struct FillViewModifier: ViewModifier { - func body(content: Content) -> some View { - AnyView(content).frame(minWidth: 0, maxWidth: .infinity, minHeight: 0, maxHeight: .infinity, alignment: .center) - } -} - struct ContinuousCornerRadiusViewModifier: ViewModifier { private let radius: CGFloat init(_ radius: CGFloat) { diff --git a/Modules/Legacy/Core/Sources/Settings/Desktop/DesktopSettingsView.swift b/Modules/Legacy/Core/Sources/Settings/Desktop/DesktopSettingsView.swift index c001cd59..f6452968 100644 --- a/Modules/Legacy/Core/Sources/Settings/Desktop/DesktopSettingsView.swift +++ b/Modules/Legacy/Core/Sources/Settings/Desktop/DesktopSettingsView.swift @@ -1,6 +1,7 @@ // Created by Geoff Pado on 9/27/20. // Copyright © 2020 Cocoatype, LLC. All rights reserved. +import PurchaseMarketing import Purchasing import SwiftUI diff --git a/Modules/Legacy/Core/Sources/Settings/List/SettingsContentGenerator.swift b/Modules/Legacy/Core/Sources/Settings/List/SettingsContentGenerator.swift index 88cc0867..6a60b28c 100644 --- a/Modules/Legacy/Core/Sources/Settings/List/SettingsContentGenerator.swift +++ b/Modules/Legacy/Core/Sources/Settings/List/SettingsContentGenerator.swift @@ -3,6 +3,7 @@ import AutoRedactionsUI import Defaults +import PurchaseMarketing import Purchasing import SafariServices import SwiftUI diff --git a/Modules/Legacy/Core/Sources/Settings/Purchase Item/PurchaseSubtitle.swift b/Modules/Legacy/Core/Sources/Settings/Purchase Item/PurchaseSubtitle.swift index bbc3ee25..c3fbf78d 100644 --- a/Modules/Legacy/Core/Sources/Settings/Purchase Item/PurchaseSubtitle.swift +++ b/Modules/Legacy/Core/Sources/Settings/Purchase Item/PurchaseSubtitle.swift @@ -1,6 +1,7 @@ // Created by Geoff Pado on 5/19/21. // Copyright © 2021 Cocoatype, LLC. All rights reserved. +import PurchaseMarketing import Purchasing import StoreKit import SwiftUI diff --git a/Modules/Legacy/Editing/Sources/Editing View/PhotoEditingAutoRedactionsAccessProvider.swift b/Modules/Legacy/Editing/Sources/Editing View/PhotoEditingAutoRedactionsAccessProvider.swift index b7d8f736..b3f59b31 100644 --- a/Modules/Legacy/Editing/Sources/Editing View/PhotoEditingAutoRedactionsAccessProvider.swift +++ b/Modules/Legacy/Editing/Sources/Editing View/PhotoEditingAutoRedactionsAccessProvider.swift @@ -7,12 +7,12 @@ import UIKit import Unpurchased class PhotoEditingAutoRedactionsAccessProvider: NSObject { - func autoRedactionsAccessViewController(learnMoreAction: UnpurchasedFeature.LearnMoreAction) -> UIViewController { + func autoRedactionsAccessViewController(learnMoreAction: @escaping UnpurchasedFeature.LearnMoreAction) -> UIViewController { if purchased { return AutoRedactionsAccessViewController() } else { return UnpurchasedAlertControllerFactory() - .alertController(for: .autoRedactions(learnMoreAction: nil)) + .alertController(for: .autoRedactions(learnMoreAction: learnMoreAction)) } } diff --git a/Modules/Legacy/Editing/Sources/Editing View/PhotoEditingViewController.swift b/Modules/Legacy/Editing/Sources/Editing View/PhotoEditingViewController.swift index 2a28a15a..3a75d7d4 100644 --- a/Modules/Legacy/Editing/Sources/Editing View/PhotoEditingViewController.swift +++ b/Modules/Legacy/Editing/Sources/Editing View/PhotoEditingViewController.swift @@ -5,6 +5,7 @@ import AutoRedactionsUI import Defaults import Observations import Photos +import PurchaseMarketing import Redactions import UIKit @@ -292,8 +293,7 @@ public class PhotoEditingViewController: UIViewController, UIScrollViewDelegate, present( PhotoEditingAutoRedactionsAccessProvider() .autoRedactionsAccessViewController { [weak self] in - // TODO: present purchase marketing view -// self?.present(PurchaseMarketingHostingController(), animated: true) + self?.present(PurchaseMarketingHostingController(), animated: true) }, animated: true) } diff --git a/Project.swift b/Project.swift index fbd11299..20889fc4 100644 --- a/Project.swift +++ b/Project.swift @@ -44,6 +44,7 @@ let project = Project( ErrorHandling.target, Logging.target, Observations.target, + PurchaseMarketing.target, Purchasing.target, Receipts.target, Redacting.target, @@ -58,6 +59,7 @@ let project = Project( ErrorHandling.testTarget, Logging.testTarget, Observations.testTarget, + PurchaseMarketing.testTarget, Purchasing.testTarget, Redactions.testTarget, Unpurchased.testTarget, @@ -71,7 +73,17 @@ let project = Project( testAction: .testPlans([ "Highlighter.xctestplan", ]), - runAction: .runAction() + runAction: .runAction( + arguments: .arguments( + environmentVariables: [ + "OVERRIDE_PURCHASE": .environmentVariable(value: "", isEnabled: false), + "SHOW_DEBUG_OVERLAY": .environmentVariable(value: "", isEnabled: false), + ], + launchArguments: [ + .launchArgument(name: "-FeatureFlag.autoRedactInEdit YES", isEnabled: false), + ] + ) + ) ), ] ) diff --git a/Tuist/ProjectDescriptionHelpers/Targets/Core.swift b/Tuist/ProjectDescriptionHelpers/Targets/Core.swift index 6e679f26..174456f8 100644 --- a/Tuist/ProjectDescriptionHelpers/Targets/Core.swift +++ b/Tuist/ProjectDescriptionHelpers/Targets/Core.swift @@ -13,6 +13,7 @@ public enum Core { .target(Defaults.target), .target(DesignSystem.target), .target(Editing.target), + .target(PurchaseMarketing.target), .target(Purchasing.target), .target(Receipts.target), .target(Unpurchased.target), diff --git a/Tuist/ProjectDescriptionHelpers/Targets/Editing.swift b/Tuist/ProjectDescriptionHelpers/Targets/Editing.swift index ea9b0a28..758f045c 100644 --- a/Tuist/ProjectDescriptionHelpers/Targets/Editing.swift +++ b/Tuist/ProjectDescriptionHelpers/Targets/Editing.swift @@ -13,6 +13,7 @@ public enum Editing { .target(AutoRedactionsUI.target), .target(ErrorHandling.target), .target(Observations.target), + .target(PurchaseMarketing.target), .target(Redactions.target), .package(product: "ClippingBezier", type: .runtime), .package(product: "Introspect", type: .runtime), diff --git a/Tuist/ProjectDescriptionHelpers/Targets/PurchaseMarketing.swift b/Tuist/ProjectDescriptionHelpers/Targets/PurchaseMarketing.swift new file mode 100644 index 00000000..633e4de8 --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/Targets/PurchaseMarketing.swift @@ -0,0 +1,10 @@ +import ProjectDescription + +public enum PurchaseMarketing { + public static let target = Target.capabilitiesTarget(name: "PurchaseMarketing", dependencies: [ + .target(DesignSystem.target), + .target(Purchasing.target), + ]) + + public static let testTarget = Target.capabilitiesTestTarget(name: "PurchaseMarketing") +}