diff --git a/.gitignore b/.gitignore index 6044e6594c..85970eccc3 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,18 @@ Local.xcconfig /buildServer.json *.orig + +# tuist +**/Derived/ + +# Tuist workspaces +RevenueCat-Workspace.xcworkspace/ +Projects/**/*.xcodeproj +Examples/**/*.xcodeproj + +Projects/**/xcshareddata/ +Projects/**/*.xcworkspacedata + +Examples/**/.xcworkspacedata +Examples/**/*.xcscheme +Examples/**/xcshareddata/** diff --git a/.swiftlint.yml b/.swiftlint.yml index ee1d08ab02..d0054f0456 100644 --- a/.swiftlint.yml +++ b/.swiftlint.yml @@ -4,6 +4,7 @@ excluded: - Tests/InstallationTests - Tests/TestingApps - Tests/APITesters + - Tuist - vendor - scan_derived_data - .git diff --git a/Examples/MagicWeather/MagicWeather.xcodeproj/project.pbxproj b/Examples/MagicWeather/MagicWeather.xcodeproj/project.pbxproj index fa7847fdb2..8f46f64264 100644 --- a/Examples/MagicWeather/MagicWeather.xcodeproj/project.pbxproj +++ b/Examples/MagicWeather/MagicWeather.xcodeproj/project.pbxproj @@ -3,171 +3,204 @@ archiveVersion = 1; classes = { }; - objectVersion = 54; + objectVersion = 55; objects = { /* Begin PBXBuildFile section */ - 4E9E1B2E2CAD38EC00B51150 /* RevenueCat in Frameworks */ = {isa = PBXBuildFile; productRef = 4E9E1B2D2CAD38EC00B51150 /* RevenueCat */; }; - 4E9E1B302CAD38EC00B51150 /* RevenueCatUI in Frameworks */ = {isa = PBXBuildFile; productRef = 4E9E1B2F2CAD38EC00B51150 /* RevenueCatUI */; }; - 5539DF1D258806A10073FB19 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5539DF1C258806A10073FB19 /* Errors.swift */; }; - 5539DF2025880AB80073FB19 /* WeatherViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5539DF1F25880AB80073FB19 /* WeatherViewController.swift */; }; - 5539DF24258A9AA70073FB19 /* SampleData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5539DF23258A9AA70073FB19 /* SampleData.swift */; }; - 5539DF2D2592A07A0073FB19 /* SplashScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5539DF2C2592A0790073FB19 /* SplashScreen.storyboard */; }; - 5539DF302592A0C30073FB19 /* SplashScreenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5539DF2F2592A0C30073FB19 /* SplashScreenViewController.swift */; }; - 5575FD49258801DE001B2F0D /* UserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5575FD48258801DE001B2F0D /* UserViewController.swift */; }; - 5576344325A3C08400C0486A /* PackageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5576344225A3C08400C0486A /* PackageCell.swift */; }; - 5582ECD72587EF8500ACB34B /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5582ECD62587EF8500ACB34B /* AppDelegate.swift */; }; - 5582ECD92587EF8500ACB34B /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5582ECD82587EF8500ACB34B /* SceneDelegate.swift */; }; - 5582ECDE2587EF8500ACB34B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5582ECDC2587EF8500ACB34B /* Main.storyboard */; }; - 5582ECE02587EF8800ACB34B /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5582ECDF2587EF8800ACB34B /* Assets.xcassets */; }; - 5582ECE32587EF8800ACB34B /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5582ECE12587EF8800ACB34B /* LaunchScreen.storyboard */; }; - 5582ECFA2587F29600ACB34B /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5582ECF92587F29600ACB34B /* Constants.swift */; }; + 1065CCB4BB3E94D66A063E21 /* PackageCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A90A08146AE8C005B05144A5 /* PackageCell.swift */; }; + 2F704AC77AEC2A10D7C04E02 /* RevenueCat.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 00B11FF935E6C87A5BE6E8A8 /* RevenueCat.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 332A944A5C236E8A82994333 /* TuistAssets+MagicWeather.swift in Sources */ = {isa = PBXBuildFile; fileRef = 33C3B1CAFF9927CE41F9CD70 /* TuistAssets+MagicWeather.swift */; }; + 3BDE45EEBBAC64E164985840 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B7D83641A3BEA2A80D59F60A /* Assets.xcassets */; }; + 51DF56C7C248B3A0B686D3F4 /* Errors.swift in Sources */ = {isa = PBXBuildFile; fileRef = 992DA96B41D15177E3631D3D /* Errors.swift */; }; + 5B4E25CAAA4308DE19AAE7B7 /* SplashScreenViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F3D4E82CB455B1FD93D38AA /* SplashScreenViewController.swift */; }; + 698C26102B365A2FD84131DA /* RevenueCatUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 67FC64E0DA7B5D33517AF018 /* RevenueCatUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 73679D6C3DB163AD856BE20A /* RevenueCat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 00B11FF935E6C87A5BE6E8A8 /* RevenueCat.framework */; }; + 8DCF484195A00B76F1857EB2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E83BD63E6C2A1D892E52B04 /* AppDelegate.swift */; }; + 924992EF3ACDCBA9B579CBA3 /* WeatherViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A459CB95735D6FC471FD001 /* WeatherViewController.swift */; }; + A09967C4A53DA1E90827AD11 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 36B758C57A6EE6FE6212141C /* SceneDelegate.swift */; }; + A9AD191CE4BA312FA9E100C3 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6F1BA8A04F72922EBAD819DA /* Constants.swift */; }; + ABEC5D02D4D9C42BC19BBDBD /* UserViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0967EDE23CD011015F4D0613 /* UserViewController.swift */; }; + D77941F01F2E367E6CF11536 /* SampleData.swift in Sources */ = {isa = PBXBuildFile; fileRef = D519AE4B2AB9A5325985CF36 /* SampleData.swift */; }; + E2A3591BA48FDC19ED0C22C9 /* RevenueCatUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 67FC64E0DA7B5D33517AF018 /* RevenueCatUI.framework */; }; + EF8E3C9CE86F24B1D7DA9E35 /* TuistBundle+MagicWeather.swift in Sources */ = {isa = PBXBuildFile; fileRef = 753C50E09FE1248725367386 /* TuistBundle+MagicWeather.swift */; }; /* End PBXBuildFile section */ +/* Begin PBXCopyFilesBuildPhase section */ + 1A1F97EAA1D19CF6DA81AE1E /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 2F704AC77AEC2A10D7C04E02 /* RevenueCat.framework in Embed Frameworks */, + 698C26102B365A2FD84131DA /* RevenueCatUI.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ - 5539DF1C258806A10073FB19 /* Errors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Errors.swift; sourceTree = ""; }; - 5539DF1F25880AB80073FB19 /* WeatherViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherViewController.swift; sourceTree = ""; }; - 5539DF23258A9AA70073FB19 /* SampleData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleData.swift; sourceTree = ""; }; - 5539DF2C2592A0790073FB19 /* SplashScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = SplashScreen.storyboard; sourceTree = ""; }; - 5539DF2F2592A0C30073FB19 /* SplashScreenViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenViewController.swift; sourceTree = ""; }; - 5539DF392593E6D90073FB19 /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 5575FD48258801DE001B2F0D /* UserViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserViewController.swift; sourceTree = ""; }; - 5576344225A3C08400C0486A /* PackageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PackageCell.swift; sourceTree = ""; }; - 5582ECD32587EF8500ACB34B /* MagicWeather.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MagicWeather.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5582ECD62587EF8500ACB34B /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 5582ECD82587EF8500ACB34B /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; - 5582ECDD2587EF8500ACB34B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 5582ECDF2587EF8800ACB34B /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 5582ECE22587EF8800ACB34B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 5582ECE42587EF8800ACB34B /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 5582ECF92587F29600ACB34B /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + 00B11FF935E6C87A5BE6E8A8 /* RevenueCat.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RevenueCat.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0967EDE23CD011015F4D0613 /* UserViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UserViewController.swift; sourceTree = ""; }; + 0E83BD63E6C2A1D892E52B04 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 33C3B1CAFF9927CE41F9CD70 /* TuistAssets+MagicWeather.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TuistAssets+MagicWeather.swift"; sourceTree = ""; }; + 36B758C57A6EE6FE6212141C /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 67FC64E0DA7B5D33517AF018 /* RevenueCatUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RevenueCatUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 6A459CB95735D6FC471FD001 /* WeatherViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeatherViewController.swift; sourceTree = ""; }; + 6F1BA8A04F72922EBAD819DA /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + 6F3D4E82CB455B1FD93D38AA /* SplashScreenViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SplashScreenViewController.swift; sourceTree = ""; }; + 753C50E09FE1248725367386 /* TuistBundle+MagicWeather.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TuistBundle+MagicWeather.swift"; sourceTree = ""; }; + 992DA96B41D15177E3631D3D /* Errors.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Errors.swift; sourceTree = ""; }; + A90A08146AE8C005B05144A5 /* PackageCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PackageCell.swift; sourceTree = ""; }; + B7D83641A3BEA2A80D59F60A /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + BBF3C1C7DC749E6602010842 /* MagicWeather-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "MagicWeather-Info.plist"; sourceTree = ""; }; + D519AE4B2AB9A5325985CF36 /* SampleData.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SampleData.swift; sourceTree = ""; }; + F19D7D4D26AA12B64F5C344F /* MagicWeather.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MagicWeather.app; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 5582ECD02587EF8500ACB34B /* Frameworks */ = { + 27C1CDA5786808E35C926307 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 4E9E1B302CAD38EC00B51150 /* RevenueCatUI in Frameworks */, - 4E9E1B2E2CAD38EC00B51150 /* RevenueCat in Frameworks */, + 73679D6C3DB163AD856BE20A /* RevenueCat.framework in Frameworks */, + E2A3591BA48FDC19ED0C22C9 /* RevenueCatUI.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 5576344125A3C06E00C0486A /* Views */ = { + 1ADC5528742C8FC02CE97362 /* MagicWeather */ = { isa = PBXGroup; children = ( - 5576344225A3C08400C0486A /* PackageCell.swift */, - ); - path = Views; - sourceTree = ""; - }; - 5582ECCA2587EF8500ACB34B = { - isa = PBXGroup; - children = ( - 5539DF392593E6D90073FB19 /* README.md */, - 5582ECD52587EF8500ACB34B /* MagicWeather */, - 5582ECD42587EF8500ACB34B /* Products */, - 8380C26426FE001500922AB1 /* Frameworks */, - ); - sourceTree = ""; - }; - 5582ECD42587EF8500ACB34B /* Products */ = { - isa = PBXGroup; - children = ( - 5582ECD32587EF8500ACB34B /* MagicWeather.app */, - ); - name = Products; - sourceTree = ""; - }; - 5582ECD52587EF8500ACB34B /* MagicWeather */ = { - isa = PBXGroup; - children = ( - 5582ECF92587F29600ACB34B /* Constants.swift */, - 5582ECEF2587EFD100ACB34B /* Sources */, - 5582ECF42587F01E00ACB34B /* Resources */, + C4DD375A7F60D2C73E3110C2 /* Resources */, + 98BCB06BF3D4F9B80450B731 /* Sources */, + 6F1BA8A04F72922EBAD819DA /* Constants.swift */, ); path = MagicWeather; sourceTree = ""; }; - 5582ECEF2587EFD100ACB34B /* Sources */ = { + 27BCC4FE59AAAA420C21265B /* Views */ = { isa = PBXGroup; children = ( - 5582ECF22587F01100ACB34B /* Lifecycle */, - 5582ECF12587EFFE00ACB34B /* Controllers */, - 5576344125A3C06E00C0486A /* Views */, - 5582ECF82587F28500ACB34B /* Helpers */, + A90A08146AE8C005B05144A5 /* PackageCell.swift */, + ); + path = Views; + sourceTree = ""; + }; + 47A2962F7A060F89C47C162C /* Sources */ = { + isa = PBXGroup; + children = ( + 33C3B1CAFF9927CE41F9CD70 /* TuistAssets+MagicWeather.swift */, + 753C50E09FE1248725367386 /* TuistBundle+MagicWeather.swift */, ); path = Sources; sourceTree = ""; }; - 5582ECF12587EFFE00ACB34B /* Controllers */ = { + 68B0497CA188975AE9EECB71 /* Helpers */ = { isa = PBXGroup; children = ( - 5539DF2F2592A0C30073FB19 /* SplashScreenViewController.swift */, - 5575FD48258801DE001B2F0D /* UserViewController.swift */, - 5539DF1F25880AB80073FB19 /* WeatherViewController.swift */, - ); - path = Controllers; - sourceTree = ""; - }; - 5582ECF22587F01100ACB34B /* Lifecycle */ = { - isa = PBXGroup; - children = ( - 5582ECD62587EF8500ACB34B /* AppDelegate.swift */, - 5582ECD82587EF8500ACB34B /* SceneDelegate.swift */, - ); - path = Lifecycle; - sourceTree = ""; - }; - 5582ECF42587F01E00ACB34B /* Resources */ = { - isa = PBXGroup; - children = ( - 5582ECF52587F02400ACB34B /* UI */, - 5582ECDF2587EF8800ACB34B /* Assets.xcassets */, - 5582ECE12587EF8800ACB34B /* LaunchScreen.storyboard */, - 5582ECE42587EF8800ACB34B /* Info.plist */, - ); - path = Resources; - sourceTree = ""; - }; - 5582ECF52587F02400ACB34B /* UI */ = { - isa = PBXGroup; - children = ( - 5582ECDC2587EF8500ACB34B /* Main.storyboard */, - 5539DF2C2592A0790073FB19 /* SplashScreen.storyboard */, - ); - path = UI; - sourceTree = ""; - }; - 5582ECF82587F28500ACB34B /* Helpers */ = { - isa = PBXGroup; - children = ( - 5539DF1C258806A10073FB19 /* Errors.swift */, - 5539DF23258A9AA70073FB19 /* SampleData.swift */, + 992DA96B41D15177E3631D3D /* Errors.swift */, + D519AE4B2AB9A5325985CF36 /* SampleData.swift */, ); path = Helpers; sourceTree = ""; }; - 8380C26426FE001500922AB1 /* Frameworks */ = { + 6A571EB63F5968A07C8B2900 /* Controllers */ = { isa = PBXGroup; children = ( + 6F3D4E82CB455B1FD93D38AA /* SplashScreenViewController.swift */, + 0967EDE23CD011015F4D0613 /* UserViewController.swift */, + 6A459CB95735D6FC471FD001 /* WeatherViewController.swift */, ); - name = Frameworks; + path = Controllers; + sourceTree = ""; + }; + 927575168FFC0306B47AEE2F /* Derived */ = { + isa = PBXGroup; + children = ( + C7DDEE374E324341D0012216 /* InfoPlists */, + 47A2962F7A060F89C47C162C /* Sources */, + ); + path = Derived; + sourceTree = ""; + }; + 98BCB06BF3D4F9B80450B731 /* Sources */ = { + isa = PBXGroup; + children = ( + 6A571EB63F5968A07C8B2900 /* Controllers */, + 68B0497CA188975AE9EECB71 /* Helpers */, + A5FA5D2585CCC0DB760FD70F /* Lifecycle */, + 27BCC4FE59AAAA420C21265B /* Views */, + ); + path = Sources; + sourceTree = ""; + }; + A5FA5D2585CCC0DB760FD70F /* Lifecycle */ = { + isa = PBXGroup; + children = ( + 0E83BD63E6C2A1D892E52B04 /* AppDelegate.swift */, + 36B758C57A6EE6FE6212141C /* SceneDelegate.swift */, + ); + path = Lifecycle; + sourceTree = ""; + }; + AD7BBA323B2BE5671D526E23 = { + isa = PBXGroup; + children = ( + F0B41D56B75357AA98087904 /* Project */, + E9A8966EEC7AEB12321CA495 /* Products */, + ); + sourceTree = ""; + }; + C4DD375A7F60D2C73E3110C2 /* Resources */ = { + isa = PBXGroup; + children = ( + B7D83641A3BEA2A80D59F60A /* Assets.xcassets */, + ); + path = Resources; + sourceTree = ""; + }; + C7DDEE374E324341D0012216 /* InfoPlists */ = { + isa = PBXGroup; + children = ( + BBF3C1C7DC749E6602010842 /* MagicWeather-Info.plist */, + ); + path = InfoPlists; + sourceTree = ""; + }; + E9A8966EEC7AEB12321CA495 /* Products */ = { + isa = PBXGroup; + children = ( + F19D7D4D26AA12B64F5C344F /* MagicWeather.app */, + 00B11FF935E6C87A5BE6E8A8 /* RevenueCat.framework */, + 67FC64E0DA7B5D33517AF018 /* RevenueCatUI.framework */, + ); + name = Products; + sourceTree = ""; + }; + F0B41D56B75357AA98087904 /* Project */ = { + isa = PBXGroup; + children = ( + 927575168FFC0306B47AEE2F /* Derived */, + 1ADC5528742C8FC02CE97362 /* MagicWeather */, + ); + name = Project; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 5582ECD22587EF8500ACB34B /* MagicWeather */ = { + 8CA00CCCA2D8A3F7370C14CB /* MagicWeather */ = { isa = PBXNativeTarget; - buildConfigurationList = 5582ECE72587EF8800ACB34B /* Build configuration list for PBXNativeTarget "MagicWeather" */; + buildConfigurationList = 4A22AF8B35CDF2F1BB74343B /* Build configuration list for PBXNativeTarget "MagicWeather" */; buildPhases = ( - 5582ECCF2587EF8500ACB34B /* Sources */, - 5582ECD02587EF8500ACB34B /* Frameworks */, - 5582ECD12587EF8500ACB34B /* Resources */, + 0F6EA5C9012E5EFF4FEFE7CA /* Sources */, + DC138E2BE3D049A6372E9A77 /* Resources */, + 27C1CDA5786808E35C926307 /* Frameworks */, + 1A1F97EAA1D19CF6DA81AE1E /* Embed Frameworks */, ); buildRules = ( ); @@ -175,105 +208,76 @@ ); name = MagicWeather; packageProductDependencies = ( - 4E9E1B2D2CAD38EC00B51150 /* RevenueCat */, - 4E9E1B2F2CAD38EC00B51150 /* RevenueCatUI */, ); - productName = "Magic Weather"; - productReference = 5582ECD32587EF8500ACB34B /* MagicWeather.app */; + productName = MagicWeather; + productReference = F19D7D4D26AA12B64F5C344F /* MagicWeather.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 5582ECCB2587EF8500ACB34B /* Project object */ = { + 6F6DC1CDA4E7E5EE45D2566A /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 1220; - LastUpgradeCheck = 1220; - TargetAttributes = { - 5582ECD22587EF8500ACB34B = { - CreatedOnToolsVersion = 12.2; - }; - }; + BuildIndependentTargetsInParallel = YES; + ORGANIZATIONNAME = "RevenueCat, Inc."; }; - buildConfigurationList = 5582ECCE2587EF8500ACB34B /* Build configuration list for PBXProject "MagicWeather" */; - compatibilityVersion = "Xcode 9.3"; + buildConfigurationList = 05BAB7B35F477C6D1EE6374B /* Build configuration list for PBXProject "MagicWeather" */; + compatibilityVersion = "Xcode 14.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - en, Base, + en, ); - mainGroup = 5582ECCA2587EF8500ACB34B; - packageReferences = ( - 4E9E1B2C2CAD38EC00B51150 /* XCRemoteSwiftPackageReference "purchases-ios-spm" */, - ); - productRefGroup = 5582ECD42587EF8500ACB34B /* Products */; + mainGroup = AD7BBA323B2BE5671D526E23; + productRefGroup = E9A8966EEC7AEB12321CA495 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 5582ECD22587EF8500ACB34B /* MagicWeather */, + 8CA00CCCA2D8A3F7370C14CB /* MagicWeather */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 5582ECD12587EF8500ACB34B /* Resources */ = { + DC138E2BE3D049A6372E9A77 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5582ECE32587EF8800ACB34B /* LaunchScreen.storyboard in Resources */, - 5539DF2D2592A07A0073FB19 /* SplashScreen.storyboard in Resources */, - 5582ECE02587EF8800ACB34B /* Assets.xcassets in Resources */, - 5582ECDE2587EF8500ACB34B /* Main.storyboard in Resources */, + 3BDE45EEBBAC64E164985840 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 5582ECCF2587EF8500ACB34B /* Sources */ = { + 0F6EA5C9012E5EFF4FEFE7CA /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5576344325A3C08400C0486A /* PackageCell.swift in Sources */, - 5575FD49258801DE001B2F0D /* UserViewController.swift in Sources */, - 5539DF24258A9AA70073FB19 /* SampleData.swift in Sources */, - 5582ECD72587EF8500ACB34B /* AppDelegate.swift in Sources */, - 5582ECD92587EF8500ACB34B /* SceneDelegate.swift in Sources */, - 5539DF2025880AB80073FB19 /* WeatherViewController.swift in Sources */, - 5539DF1D258806A10073FB19 /* Errors.swift in Sources */, - 5539DF302592A0C30073FB19 /* SplashScreenViewController.swift in Sources */, - 5582ECFA2587F29600ACB34B /* Constants.swift in Sources */, + 332A944A5C236E8A82994333 /* TuistAssets+MagicWeather.swift in Sources */, + EF8E3C9CE86F24B1D7DA9E35 /* TuistBundle+MagicWeather.swift in Sources */, + A9AD191CE4BA312FA9E100C3 /* Constants.swift in Sources */, + 5B4E25CAAA4308DE19AAE7B7 /* SplashScreenViewController.swift in Sources */, + ABEC5D02D4D9C42BC19BBDBD /* UserViewController.swift in Sources */, + 924992EF3ACDCBA9B579CBA3 /* WeatherViewController.swift in Sources */, + 51DF56C7C248B3A0B686D3F4 /* Errors.swift in Sources */, + D77941F01F2E367E6CF11536 /* SampleData.swift in Sources */, + 8DCF484195A00B76F1857EB2 /* AppDelegate.swift in Sources */, + A09967C4A53DA1E90827AD11 /* SceneDelegate.swift in Sources */, + 1065CCB4BB3E94D66A063E21 /* PackageCell.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ -/* Begin PBXVariantGroup section */ - 5582ECDC2587EF8500ACB34B /* Main.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 5582ECDD2587EF8500ACB34B /* Base */, - ); - name = Main.storyboard; - sourceTree = ""; - }; - 5582ECE12587EF8800ACB34B /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 5582ECE22587EF8800ACB34B /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; -/* End PBXVariantGroup section */ - /* Begin XCBuildConfiguration section */ - 5582ECE52587EF8800ACB34B /* Debug */ = { + 657983500F013B37ABFD9576 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -304,6 +308,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -321,20 +326,44 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; + MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; - 5582ECE62587EF8800ACB34B /* Release */ = { + 9659AE5917ED4016C858310D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = 8SXR2327BM; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = "Derived/InfoPlists/MagicWeather-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.revenuecat.sampleapp; + PRODUCT_NAME = MagicWeather; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 96E0A57DF5232981213D6340 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; @@ -365,6 +394,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; @@ -376,102 +406,65 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; + PRODUCT_NAME = "$(TARGET_NAME)"; VALIDATE_PRODUCT = YES; }; name = Release; }; - 5582ECE82587EF8800ACB34B /* Debug */ = { + AA39FA72F2986C451DAD16C5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CODE_SIGN_IDENTITY = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = MagicWeather/Resources/Info.plist; + DEVELOPMENT_TEAM = 8SXR2327BM; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = "Derived/InfoPlists/MagicWeather-Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); PRODUCT_BUNDLE_IDENTIFIER = com.revenuecat.sampleapp; - PRODUCT_NAME = "$(TARGET_NAME)"; + PRODUCT_NAME = MagicWeather; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 5582ECE92587EF8800ACB34B /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = ""; - INFOPLIST_FILE = MagicWeather/Resources/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 15.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - PRODUCT_BUNDLE_IDENTIFIER = com.revenuecat.sampleapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 5582ECCE2587EF8500ACB34B /* Build configuration list for PBXProject "MagicWeather" */ = { + 05BAB7B35F477C6D1EE6374B /* Build configuration list for PBXProject "MagicWeather" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5582ECE52587EF8800ACB34B /* Debug */, - 5582ECE62587EF8800ACB34B /* Release */, + 657983500F013B37ABFD9576 /* Debug */, + 96E0A57DF5232981213D6340 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5582ECE72587EF8800ACB34B /* Build configuration list for PBXNativeTarget "MagicWeather" */ = { + 4A22AF8B35CDF2F1BB74343B /* Build configuration list for PBXNativeTarget "MagicWeather" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5582ECE82587EF8800ACB34B /* Debug */, - 5582ECE92587EF8800ACB34B /* Release */, + AA39FA72F2986C451DAD16C5 /* Debug */, + 9659AE5917ED4016C858310D /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ - -/* Begin XCRemoteSwiftPackageReference section */ - 4E9E1B2C2CAD38EC00B51150 /* XCRemoteSwiftPackageReference "purchases-ios-spm" */ = { - isa = XCRemoteSwiftPackageReference; - repositoryURL = "https://github.com/RevenueCat/purchases-ios-spm"; - requirement = { - kind = upToNextMajorVersion; - minimumVersion = 5.5.0; - }; - }; -/* End XCRemoteSwiftPackageReference section */ - -/* Begin XCSwiftPackageProductDependency section */ - 4E9E1B2D2CAD38EC00B51150 /* RevenueCat */ = { - isa = XCSwiftPackageProductDependency; - package = 4E9E1B2C2CAD38EC00B51150 /* XCRemoteSwiftPackageReference "purchases-ios-spm" */; - productName = RevenueCat; - }; - 4E9E1B2F2CAD38EC00B51150 /* RevenueCatUI */ = { - isa = XCSwiftPackageProductDependency; - package = 4E9E1B2C2CAD38EC00B51150 /* XCRemoteSwiftPackageReference "purchases-ios-spm" */; - productName = RevenueCatUI; - }; -/* End XCSwiftPackageProductDependency section */ }; - rootObject = 5582ECCB2587EF8500ACB34B /* Project object */; + rootObject = 6F6DC1CDA4E7E5EE45D2566A /* Project object */; } diff --git a/Examples/MagicWeather/Project.swift b/Examples/MagicWeather/Project.swift new file mode 100644 index 0000000000..bd22701785 --- /dev/null +++ b/Examples/MagicWeather/Project.swift @@ -0,0 +1,36 @@ +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project( + name: "MagicWeather", + organizationName: .revenueCatOrgName, + targets: [ + .target( + name: "MagicWeather", + destinations: .iOS, + product: .app, + bundleId: "com.revenuecat.sampleapp", + deploymentTargets: .iOS("15.0"), + infoPlist: .extendingDefault( + with: [ + "UILaunchScreen": [ + "UIColorName": "", + "UIImageName": "", + ] + ] + ), + sources: [ + "MagicWeather/Sources/**/*.swift", + "MagicWeather/Constants.swift" + ], + resources: [ + "MagicWeather/Resources/**/*.xcassets", + ], + dependencies: [ + .revenueCat, + .revenueCatUI, + ], + settings: .settings(base: [:].automaticCodeSigning(devTeam: .revenueCatTeamID)) + ) + ] +) \ No newline at end of file diff --git a/Examples/MagicWeatherSwiftUI/Shared/Constants.swift b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Constants.swift similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Constants.swift rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Constants.swift diff --git a/Examples/MagicWeatherSwiftUI/Shared/PrivacyInfo.xcprivacy b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/PrivacyInfo.xcprivacy similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/PrivacyInfo.xcprivacy rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/PrivacyInfo.xcprivacy diff --git a/Examples/MagicWeatherSwiftUI/Shared/Assets.xcassets/AccentColor.colorset/Contents.json b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Assets.xcassets/AccentColor.colorset/Contents.json similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Assets.xcassets/AccentColor.colorset/Contents.json rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Assets.xcassets/AccentColor.colorset/Contents.json diff --git a/Examples/MagicWeatherSwiftUI/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Assets.xcassets/AppIcon.appiconset/Contents.json rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/Examples/MagicWeatherSwiftUI/Shared/Assets.xcassets/Contents.json b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Assets.xcassets/Contents.json similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Assets.xcassets/Contents.json rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Assets.xcassets/Contents.json diff --git a/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Info.plist b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Info.plist new file mode 100644 index 0000000000..7b7841968c --- /dev/null +++ b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Info.plist @@ -0,0 +1,48 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UIApplicationSupportsIndirectInputEvents + + UILaunchScreen + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Magic Weather SwiftUI.entitlements b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Magic Weather SwiftUI.entitlements new file mode 100644 index 0000000000..0c67376eba --- /dev/null +++ b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Resources/Magic Weather SwiftUI.entitlements @@ -0,0 +1,5 @@ + + + + + diff --git a/Examples/MagicWeatherSwiftUI/Shared/Sources/Helpers/Extensions.swift b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Helpers/Extensions.swift similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Sources/Helpers/Extensions.swift rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Helpers/Extensions.swift diff --git a/Examples/MagicWeatherSwiftUI/Shared/Sources/Helpers/SampleData.swift b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Helpers/SampleData.swift similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Sources/Helpers/SampleData.swift rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Helpers/SampleData.swift diff --git a/Examples/MagicWeatherSwiftUI/Shared/Sources/Lifecycle/MagicWeatherApp.swift b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Lifecycle/MagicWeatherApp.swift similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Sources/Lifecycle/MagicWeatherApp.swift rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Lifecycle/MagicWeatherApp.swift diff --git a/Examples/MagicWeatherSwiftUI/Shared/Sources/Lifecycle/PurchasesDelegateHandler.swift b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Lifecycle/PurchasesDelegateHandler.swift similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Sources/Lifecycle/PurchasesDelegateHandler.swift rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Lifecycle/PurchasesDelegateHandler.swift diff --git a/Examples/MagicWeatherSwiftUI/Shared/Sources/ViewModels/UserViewModel.swift b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/ViewModels/UserViewModel.swift similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Sources/ViewModels/UserViewModel.swift rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/ViewModels/UserViewModel.swift diff --git a/Examples/MagicWeatherSwiftUI/Shared/Sources/ViewModels/WeatherViewModel.swift b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/ViewModels/WeatherViewModel.swift similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Sources/ViewModels/WeatherViewModel.swift rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/ViewModels/WeatherViewModel.swift diff --git a/Examples/MagicWeatherSwiftUI/Shared/Sources/Views/ContentView.swift b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Views/ContentView.swift similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Sources/Views/ContentView.swift rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Views/ContentView.swift diff --git a/Examples/MagicWeatherSwiftUI/Shared/Sources/Views/PaywallView.swift b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Views/PaywallView.swift similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Sources/Views/PaywallView.swift rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Views/PaywallView.swift diff --git a/Examples/MagicWeatherSwiftUI/Shared/Sources/Views/UserView.swift b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Views/UserView.swift similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Sources/Views/UserView.swift rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Views/UserView.swift diff --git a/Examples/MagicWeatherSwiftUI/Shared/Sources/Views/WeatherView.swift b/Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Views/WeatherView.swift similarity index 100% rename from Examples/MagicWeatherSwiftUI/Shared/Sources/Views/WeatherView.swift rename to Examples/MagicWeatherSwiftUI/MagicWeatherSwiftUI/Sources/Views/WeatherView.swift diff --git a/Examples/MagicWeatherSwiftUI/Project.swift b/Examples/MagicWeatherSwiftUI/Project.swift new file mode 100644 index 0000000000..deba131825 --- /dev/null +++ b/Examples/MagicWeatherSwiftUI/Project.swift @@ -0,0 +1,36 @@ +import ProjectDescription +import ProjectDescriptionHelpers + +let project = Project( + name: "MagicWeatherSwiftUI", + organizationName: .revenueCatOrgName, + settings: .settings(base: [:].automaticCodeSigning(devTeam: .revenueCatTeamID)), + targets: [ + .target( + name: "MagicWeatherSwiftUI", + destinations: .iOS, + product: .app, + bundleId: "com.revenuecat.sampleapp", + deploymentTargets: .iOS("15.0"), + infoPlist: .extendingDefault( + with: [ + "UILaunchScreen": [ + "UIColorName": "", + "UIImageName": "", + ] + ] + ), + sources: [ + "MagicWeatherSwiftUI/Sources/**/*.swift", + "MagicWeatherSwiftUI/Constants.swift" + ], + resources: [ + "MagicWeatherSwiftUI/Resources/**/*.xcassets", + ], + dependencies: [ + .revenueCat, + .revenueCatUI, + ] + ) + ], +) \ No newline at end of file diff --git a/Examples/PurchaseTester/Project.swift b/Examples/PurchaseTester/Project.swift new file mode 100644 index 0000000000..1cc7a7cb1b --- /dev/null +++ b/Examples/PurchaseTester/Project.swift @@ -0,0 +1,117 @@ +import ProjectDescription +import ProjectDescriptionHelpers + +let destinations: Destinations = [ + .iPhone, + .iPad, + .mac, + .macCatalyst, + .appleTv, + .appleVision +] + +let deploymentTargets: DeploymentTargets = .multiplatform( + iOS: "15.2", + macOS: "13.0", + tvOS: "15.2", + visionOS: "1.3" +) + +let allDeploymentTargets: DeploymentTargets = .multiplatform( + iOS: "15.2", + macOS: "13.0", + watchOS: "8.0", + tvOS: "15.2", + visionOS: "1.3" +) + +let allDestinations = destinations + [.appleWatch] + +let project = Project( + name: "PurchaseTester", + organizationName: .revenueCatOrgName, + settings: .settings(base: [:].automaticCodeSigning(devTeam: .revenueCatTeamID)), + targets: [ + .target( + name: "PurchaseTester", + destinations: destinations, + product: .app, + bundleId: "com.revenuecat.sampleapp", + deploymentTargets: deploymentTargets, + infoPlist: "../../Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTester-Info.plist", + sources: [ + "../../Tests/TestingApps/PurchaseTesterSwiftUI/Shared/**/*.swift", + ], + resources: [ + "../../Tests/TestingApps/PurchaseTesterSwiftUI/AppIcon.xcassets", + "../../Tests/TestingApps/PurchaseTesterSwiftUI/Shared/Assets.xcassets", + "../../Tests/TestingApps/PurchaseTesterSwiftUI/Resources/**/LaunchScreen.storyboard", + ], + dependencies: [ + .target(name: "Core") + ], + additionalFiles: [ + "../../Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTester.entitlements", + "../../Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTesterStoreKitConfiguration.storekit" + ] + ), + + .target( + name: "PurchaseTesterWatchOS", + destinations: [.appleWatch], + product: .app, + bundleId: "com.revenuecat.sampleapp.watchkitapp", + deploymentTargets: .watchOS("8.0"), + infoPlist: "../../Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTesterWatchOS/Info.plist", + sources: [ + "../../Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTesterWatchOS/**/*.swift" + ], + resources: [ + "../../Tests/TestingApps/PurchaseTesterSwiftUI/AppIcon.xcassets", + "../../Tests/TestingApps/PurchaseTesterSwiftUI/Shared/Assets.xcassets", + ], + dependencies: [ + .target(name: "Core") + ] + ), + + .target( + name: "Core", + destinations: Set(allDestinations), + product: .framework, + bundleId: "com.revenuecat.Core", + deploymentTargets: allDeploymentTargets, + sources: [ + "../../Tests/TestingApps/PurchaseTesterSwiftUI/Core/**/*.swift", + ], + dependencies: [ + .revenueCat, + .revenueCatUI, + .receiptparser, + ] + ), + ], + schemes: [ + .scheme( + name: "PurchaseTester", + shared: true, + buildAction: .buildAction(targets: ["PurchaseTester"], findImplicitDependencies: true), + runAction: .runAction( + configuration: "Debug", + executable: "PurchaseTester", + options: .options( + storeKitConfigurationPath: "../../Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTesterStoreKitConfiguration.storekit" + ) + ) + ), + .scheme( + name: "PurchaseTesterWatchOS", + shared: true, + buildAction: .buildAction(targets: ["PurchaseTesterWatchOS"], findImplicitDependencies: true), + runAction: .runAction( + configuration: "Debug", + executable: "PurchaseTesterWatchOS" + ) + ) + ] +) \ No newline at end of file diff --git a/Examples/rc-maestro/.gitignore b/Examples/rc-maestro/.gitignore deleted file mode 100644 index ea7a7dfb6b..0000000000 --- a/Examples/rc-maestro/.gitignore +++ /dev/null @@ -1,73 +0,0 @@ -### macOS ### -# General -.DS_Store -.AppleDouble -.LSOverride - -# Icon must end with two -Icon - -# Thumbnails -._* - -# Files that might appear in the root of a volume -.DocumentRevisions-V100 -.fseventsd -.Spotlight-V100 -.TemporaryItems -.Trashes -.VolumeIcon.icns -.com.apple.timemachine.donotpresent - -# Directories potentially created on remote AFP share -.AppleDB -.AppleDesktop -Network Trash Folder -Temporary Items -.apdisk - -### Xcode ### -# Xcode -# -# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore - -## User settings -xcuserdata/ - -## compatibility with Xcode 8 and earlier (ignoring not required starting Xcode 9) -*.xcscmblueprint -*.xccheckout - -## compatibility with Xcode 3 and earlier (ignoring not required starting Xcode 4) -build/ -DerivedData/ -*.moved-aside -*.pbxuser -!default.pbxuser -*.mode1v3 -!default.mode1v3 -*.mode2v3 -!default.mode2v3 -*.perspectivev3 -!default.perspectivev3 - -### Xcode Patch ### -*.xcodeproj/* -!*.xcodeproj/project.pbxproj -!*.xcodeproj/xcshareddata/ -!*.xcworkspace/contents.xcworkspacedata -/*.gcno - -### Projects ### -*.xcodeproj -*.xcworkspace - -### Tuist derived files ### -graph.dot -Derived/ - -### Tuist managed dependencies ### -Tuist/.build - -### xcconfig -**/Local.xcconfig diff --git a/Examples/rc-maestro/Maestro.xcworkspace/.tuist-generated b/Examples/rc-maestro/Maestro.xcworkspace/.tuist-generated new file mode 100644 index 0000000000..e69de29bb2 diff --git a/Examples/rc-maestro/Maestro.xcworkspace/contents.xcworkspacedata b/Examples/rc-maestro/Maestro.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..14b04f9cbf --- /dev/null +++ b/Examples/rc-maestro/Maestro.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/Examples/rc-maestro/Project.swift b/Examples/rc-maestro/Project.swift index 24c2368714..ec8077c9e4 100644 --- a/Examples/rc-maestro/Project.swift +++ b/Examples/rc-maestro/Project.swift @@ -1,12 +1,21 @@ import ProjectDescription +import ProjectDescriptionHelpers +import Foundation + +var additionalFiles: [FileElement] = [ + .glob(pattern: "rc-maestro/Resources/**/Local.xcconfig.sample") +] +var shouldAddLocalConfig: Bool = false +if FileManager.default.fileExists(atPath: "rc-maestro/Resources/**/Local.xcconfig") { + shouldAddLocalConfig = true + additionalFiles.append(.glob(pattern: "rc-maestro/Resources/**/Local.xcconfig")) +} let project = Project( name: "Maestro", - organizationName: "RevenueCat", + organizationName: .revenueCatOrgName, settings: .settings( - configurations: [ - .debug(name: "Debug", xcconfig: .relativeToManifest("rc-maestro/Resources/Local.xcconfig")) - ], + base: [:].automaticCodeSigning(devTeam: .revenueCatTeamID), defaultSettings: .essential ), targets: [ @@ -30,9 +39,9 @@ let project = Project( "rc-maestro/Resources/**/*.xcassets", ], dependencies: [ - .external(name: "RevenueCat"), - .external(name: "RevenueCatUI"), - .sdk(name: "StoreKit", type: .framework, status: .required) + .revenueCat, + .revenueCatUI, + .storeKit ] ) ], @@ -51,8 +60,5 @@ let project = Project( ) ) ], - additionalFiles: [ - "rc-maestro/Resources/**/Local.xcconfig.sample", - "rc-maestro/Resources/**/Local.xcconfig" - ] + additionalFiles: additionalFiles ) \ No newline at end of file diff --git a/Examples/rc-maestro/Tuist.swift b/Examples/rc-maestro/Tuist.swift deleted file mode 100644 index ebf9894116..0000000000 --- a/Examples/rc-maestro/Tuist.swift +++ /dev/null @@ -1,3 +0,0 @@ -import ProjectDescription - -let tuist = Tuist(project: .tuist()) \ No newline at end of file diff --git a/Examples/rc-maestro/Tuist/Package.swift b/Examples/rc-maestro/Tuist/Package.swift deleted file mode 100644 index 36ea387856..0000000000 --- a/Examples/rc-maestro/Tuist/Package.swift +++ /dev/null @@ -1,24 +0,0 @@ -// swift-tools-version: 6.0 -@preconcurrency import PackageDescription - -#if TUIST - import ProjectDescription - - let packageSettings = PackageSettings( - productTypes: [ - "RevenueCat": .framework, - "RevenueCatUI": .framework // default is .staticFramework - ] - ) - -#endif - -let package = Package( - name: "Dependencies", - dependencies: [ - .package( - url: "https://github.com/RevenueCat/purchases-ios", - branch: "main" - ), - ] -) diff --git a/Examples/testCustomEntitlementsComputation/Project.swift b/Examples/testCustomEntitlementsComputation/Project.swift new file mode 100644 index 0000000000..15e1ee0973 --- /dev/null +++ b/Examples/testCustomEntitlementsComputation/Project.swift @@ -0,0 +1,43 @@ +import ProjectDescription +import ProjectDescriptionHelpers + +let allDestinations: Destinations = [ + .iPhone, + .iPad, + .macWithiPadDesign, + .appleVisionWithiPadDesign +] + +let project = Project( + name: "testCustomEntitlementsComputation", + organizationName: .revenueCatOrgName, + settings: .settings(base: [:].automaticCodeSigning(devTeam: .revenueCatTeamID)), + targets: [ + .target( + name: "testCustomEntitlementsComputation", + destinations: allDestinations, + product: .app, + bundleId: "com.revenuecat.sampleapp", + deploymentTargets: .iOS("15.0"), + infoPlist: .extendingDefault( + with: [ + "UILaunchScreen": [ + "UIColorName": "", + "UIImageName": "", + ] + ] + ), + sources: [ + "testCustomEntitlementsComputation/Sources/**/*.swift", + "testCustomEntitlementsComputation/Constants.swift" + ], + resources: [ + "testCustomEntitlementsComputation/Resources/**/*.xcassets", + ], + dependencies: [ + .revenueCat, + .revenueCatUI, + ] + ) + ], +) \ No newline at end of file diff --git a/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation.xcodeproj/project.pbxproj b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation.xcodeproj/project.pbxproj index d13cf83dfe..bbe6573870 100644 --- a/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation.xcodeproj/project.pbxproj +++ b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation.xcodeproj/project.pbxproj @@ -3,95 +3,165 @@ archiveVersion = 1; classes = { }; - objectVersion = 56; + objectVersion = 55; objects = { /* Begin PBXBuildFile section */ - 2D276F5629F1C85700F51382 /* testCustomEntitlementsComputationApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D276F5529F1C85700F51382 /* testCustomEntitlementsComputationApp.swift */; }; - 2D276F5829F1C85700F51382 /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2D276F5729F1C85700F51382 /* ContentView.swift */; }; - 2D276F5A29F1C85800F51382 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2D276F5929F1C85800F51382 /* Assets.xcassets */; }; - 2D276F5D29F1C85800F51382 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2D276F5C29F1C85800F51382 /* Preview Assets.xcassets */; }; - 2DB0898929F30ABD00A4DAE7 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2DB0898829F30ABD00A4DAE7 /* Constants.swift */; }; - 5714383029F86B4400CC2D44 /* RevenueCat_CustomEntitlementComputation in Frameworks */ = {isa = PBXBuildFile; productRef = 5714382F29F86B4400CC2D44 /* RevenueCat_CustomEntitlementComputation */; }; + 08925B4E584FC5D20CA59FBE /* TuistBundle+TestCustomEntitlementsComputation.swift in Sources */ = {isa = PBXBuildFile; fileRef = B279D5A7966CB41CCBF05D66 /* TuistBundle+TestCustomEntitlementsComputation.swift */; }; + 165EA4DBD39926FC9A7FF580 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2AE116B293A2B413F35DFEAD /* Constants.swift */; }; + 2185E8F026F4ED75FACD2635 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 2B97AF29CED8B6B137A91DBC /* Assets.xcassets */; }; + 2451FCD2806B9E943175C4C6 /* RevenueCat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DBA5CC143913C7C0176E9BC0 /* RevenueCat.framework */; }; + 372A6651DC7ABDE7AA4C0DB8 /* TuistAssets+TestCustomEntitlementsComputation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2F7B3A4A14B2E020B9CE706B /* TuistAssets+TestCustomEntitlementsComputation.swift */; }; + 4BE4152BEE86A9A5B28D9F9C /* RevenueCat.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = DBA5CC143913C7C0176E9BC0 /* RevenueCat.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 682A311FBF1D51A8F99BB80B /* RevenueCatUI.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7B56A335C3599AE98135A29B /* RevenueCatUI.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 934F4A57DA874AB9FEC7DEAE /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4299FA8156FAC6F41B1D3E2E /* ContentView.swift */; }; + 988FDB03EA1FAA46FD5D4060 /* testCustomEntitlementsComputationApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1AE9B635F241F5E679A0AA70 /* testCustomEntitlementsComputationApp.swift */; }; + C5E7710847748C154EF4D353 /* RevenueCatUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7B56A335C3599AE98135A29B /* RevenueCatUI.framework */; }; + F060823B8F8D63C71CEED067 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5D3D43B0F1902135F3556572 /* Preview Assets.xcassets */; }; /* End PBXBuildFile section */ +/* Begin PBXCopyFilesBuildPhase section */ + DEDB9AEAB198712CBD836B3D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 4BE4152BEE86A9A5B28D9F9C /* RevenueCat.framework in Embed Frameworks */, + 682A311FBF1D51A8F99BB80B /* RevenueCatUI.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + /* Begin PBXFileReference section */ - 2D276F5229F1C85700F51382 /* testCustomEntitlementsComputation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = testCustomEntitlementsComputation.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 2D276F5529F1C85700F51382 /* testCustomEntitlementsComputationApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = testCustomEntitlementsComputationApp.swift; sourceTree = ""; }; - 2D276F5729F1C85700F51382 /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; - 2D276F5929F1C85800F51382 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 2D276F5C29F1C85800F51382 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; - 2DB0898829F30ABD00A4DAE7 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; - 2DB0899029F32C9400A4DAE7 /* purchases-ios */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = "purchases-ios"; path = ../../..; sourceTree = ""; }; + 1AE9B635F241F5E679A0AA70 /* testCustomEntitlementsComputationApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = testCustomEntitlementsComputationApp.swift; sourceTree = ""; }; + 2AE116B293A2B413F35DFEAD /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; + 2B97AF29CED8B6B137A91DBC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 2F7B3A4A14B2E020B9CE706B /* TuistAssets+TestCustomEntitlementsComputation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TuistAssets+TestCustomEntitlementsComputation.swift"; sourceTree = ""; }; + 4299FA8156FAC6F41B1D3E2E /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; }; + 57BE31076EE78CAC5D802898 /* testCustomEntitlementsComputation-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = "testCustomEntitlementsComputation-Info.plist"; sourceTree = ""; }; + 5D3D43B0F1902135F3556572 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 7B56A335C3599AE98135A29B /* RevenueCatUI.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RevenueCatUI.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + ABECB7BAA86F9315475B0DC4 /* testCustomEntitlementsComputation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = testCustomEntitlementsComputation.app; sourceTree = BUILT_PRODUCTS_DIR; }; + B279D5A7966CB41CCBF05D66 /* TuistBundle+TestCustomEntitlementsComputation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "TuistBundle+TestCustomEntitlementsComputation.swift"; sourceTree = ""; }; + DBA5CC143913C7C0176E9BC0 /* RevenueCat.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = RevenueCat.framework; sourceTree = BUILT_PRODUCTS_DIR; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 2D276F4F29F1C85700F51382 /* Frameworks */ = { + 7E2DEFF12B0AA3C1D3DA9A28 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5714383029F86B4400CC2D44 /* RevenueCat_CustomEntitlementComputation in Frameworks */, + 2451FCD2806B9E943175C4C6 /* RevenueCat.framework in Frameworks */, + C5E7710847748C154EF4D353 /* RevenueCatUI.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 2D276F4929F1C85700F51382 = { + 0707E46784F11FB53488F02E /* Preview Content */ = { isa = PBXGroup; children = ( - 2D276F5429F1C85700F51382 /* testCustomEntitlementsComputation */, - 2D276F5329F1C85700F51382 /* Products */, - 2DB0899129F32C9F00A4DAE7 /* Frameworks */, - ); - sourceTree = ""; - }; - 2D276F5329F1C85700F51382 /* Products */ = { - isa = PBXGroup; - children = ( - 2D276F5229F1C85700F51382 /* testCustomEntitlementsComputation.app */, - ); - name = Products; - sourceTree = ""; - }; - 2D276F5429F1C85700F51382 /* testCustomEntitlementsComputation */ = { - isa = PBXGroup; - children = ( - 2D276F5529F1C85700F51382 /* testCustomEntitlementsComputationApp.swift */, - 2D276F5729F1C85700F51382 /* ContentView.swift */, - 2D276F5929F1C85800F51382 /* Assets.xcassets */, - 2D276F5B29F1C85800F51382 /* Preview Content */, - 2DB0898829F30ABD00A4DAE7 /* Constants.swift */, - 2DB0899029F32C9400A4DAE7 /* purchases-ios */, - ); - path = testCustomEntitlementsComputation; - sourceTree = ""; - }; - 2D276F5B29F1C85800F51382 /* Preview Content */ = { - isa = PBXGroup; - children = ( - 2D276F5C29F1C85800F51382 /* Preview Assets.xcassets */, + 5D3D43B0F1902135F3556572 /* Preview Assets.xcassets */, ); path = "Preview Content"; sourceTree = ""; }; - 2DB0899129F32C9F00A4DAE7 /* Frameworks */ = { + 07E088A7C1D042A64FC53D06 = { isa = PBXGroup; children = ( + 677B10069913F47E2FAFBBB6 /* Project */, + 40E598C55A2D32212EB03801 /* Products */, ); - name = Frameworks; + sourceTree = ""; + }; + 1742866A69D0D9E0B638A3D6 /* Sources */ = { + isa = PBXGroup; + children = ( + 2F7B3A4A14B2E020B9CE706B /* TuistAssets+TestCustomEntitlementsComputation.swift */, + B279D5A7966CB41CCBF05D66 /* TuistBundle+TestCustomEntitlementsComputation.swift */, + ); + path = Sources; + sourceTree = ""; + }; + 1CFCD15AB796063A4BF9406D /* Sources */ = { + isa = PBXGroup; + children = ( + 4299FA8156FAC6F41B1D3E2E /* ContentView.swift */, + 1AE9B635F241F5E679A0AA70 /* testCustomEntitlementsComputationApp.swift */, + ); + path = Sources; + sourceTree = ""; + }; + 40E598C55A2D32212EB03801 /* Products */ = { + isa = PBXGroup; + children = ( + DBA5CC143913C7C0176E9BC0 /* RevenueCat.framework */, + 7B56A335C3599AE98135A29B /* RevenueCatUI.framework */, + ABECB7BAA86F9315475B0DC4 /* testCustomEntitlementsComputation.app */, + ); + name = Products; + sourceTree = ""; + }; + 677B10069913F47E2FAFBBB6 /* Project */ = { + isa = PBXGroup; + children = ( + A40080F28EB3880802B7FB10 /* Derived */, + E7D1F5B3665A2D7448CCB79D /* testCustomEntitlementsComputation */, + ); + name = Project; + sourceTree = ""; + }; + 845B9BF54C2CE410488320FA /* InfoPlists */ = { + isa = PBXGroup; + children = ( + 57BE31076EE78CAC5D802898 /* testCustomEntitlementsComputation-Info.plist */, + ); + path = InfoPlists; + sourceTree = ""; + }; + A40080F28EB3880802B7FB10 /* Derived */ = { + isa = PBXGroup; + children = ( + 845B9BF54C2CE410488320FA /* InfoPlists */, + 1742866A69D0D9E0B638A3D6 /* Sources */, + ); + path = Derived; + sourceTree = ""; + }; + D2532C3692EA740F87F11286 /* Resources */ = { + isa = PBXGroup; + children = ( + 0707E46784F11FB53488F02E /* Preview Content */, + 2B97AF29CED8B6B137A91DBC /* Assets.xcassets */, + ); + path = Resources; + sourceTree = ""; + }; + E7D1F5B3665A2D7448CCB79D /* testCustomEntitlementsComputation */ = { + isa = PBXGroup; + children = ( + D2532C3692EA740F87F11286 /* Resources */, + 1CFCD15AB796063A4BF9406D /* Sources */, + 2AE116B293A2B413F35DFEAD /* Constants.swift */, + ); + path = testCustomEntitlementsComputation; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 2D276F5129F1C85700F51382 /* testCustomEntitlementsComputation */ = { + A87D977F7D7103389A52F6AC /* testCustomEntitlementsComputation */ = { isa = PBXNativeTarget; - buildConfigurationList = 2D276F6029F1C85800F51382 /* Build configuration list for PBXNativeTarget "testCustomEntitlementsComputation" */; + buildConfigurationList = 91129418DFF6B3F3158762A5 /* Build configuration list for PBXNativeTarget "testCustomEntitlementsComputation" */; buildPhases = ( - 2D276F4E29F1C85700F51382 /* Sources */, - 2D276F4F29F1C85700F51382 /* Frameworks */, - 2D276F5029F1C85700F51382 /* Resources */, + 480572A80E3D0E21EB91AB69 /* Sources */, + 0C4E874BC2D10DA93EE1A6E5 /* Resources */, + 7E2DEFF12B0AA3C1D3DA9A28 /* Frameworks */, + DEDB9AEAB198712CBD836B3D /* Embed Frameworks */, ); buildRules = ( ); @@ -99,80 +169,129 @@ ); name = testCustomEntitlementsComputation; packageProductDependencies = ( - 5714382F29F86B4400CC2D44 /* RevenueCat_CustomEntitlementComputation */, ); productName = testCustomEntitlementsComputation; - productReference = 2D276F5229F1C85700F51382 /* testCustomEntitlementsComputation.app */; + productReference = ABECB7BAA86F9315475B0DC4 /* testCustomEntitlementsComputation.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ - 2D276F4A29F1C85700F51382 /* Project object */ = { + 0F199CE67194A4C3A8E8CB74 /* Project object */ = { isa = PBXProject; attributes = { - BuildIndependentTargetsInParallel = 1; - LastSwiftUpdateCheck = 1430; - LastUpgradeCheck = 1430; - TargetAttributes = { - 2D276F5129F1C85700F51382 = { - CreatedOnToolsVersion = 14.3; - }; - }; + BuildIndependentTargetsInParallel = YES; + ORGANIZATIONNAME = "RevenueCat, Inc."; }; - buildConfigurationList = 2D276F4D29F1C85700F51382 /* Build configuration list for PBXProject "testCustomEntitlementsComputation" */; + buildConfigurationList = 928B6F5BF967A7DC15FFC616 /* Build configuration list for PBXProject "testCustomEntitlementsComputation" */; compatibilityVersion = "Xcode 14.0"; developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( - en, Base, + en, ); - mainGroup = 2D276F4929F1C85700F51382; - packageReferences = ( - ); - productRefGroup = 2D276F5329F1C85700F51382 /* Products */; + mainGroup = 07E088A7C1D042A64FC53D06; + productRefGroup = 40E598C55A2D32212EB03801 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 2D276F5129F1C85700F51382 /* testCustomEntitlementsComputation */, + A87D977F7D7103389A52F6AC /* testCustomEntitlementsComputation */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 2D276F5029F1C85700F51382 /* Resources */ = { + 0C4E874BC2D10DA93EE1A6E5 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2D276F5D29F1C85800F51382 /* Preview Assets.xcassets in Resources */, - 2D276F5A29F1C85800F51382 /* Assets.xcassets in Resources */, + 2185E8F026F4ED75FACD2635 /* Assets.xcassets in Resources */, + F060823B8F8D63C71CEED067 /* Preview Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 2D276F4E29F1C85700F51382 /* Sources */ = { + 480572A80E3D0E21EB91AB69 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 2D276F5829F1C85700F51382 /* ContentView.swift in Sources */, - 2D276F5629F1C85700F51382 /* testCustomEntitlementsComputationApp.swift in Sources */, - 2DB0898929F30ABD00A4DAE7 /* Constants.swift in Sources */, + 372A6651DC7ABDE7AA4C0DB8 /* TuistAssets+TestCustomEntitlementsComputation.swift in Sources */, + 08925B4E584FC5D20CA59FBE /* TuistBundle+TestCustomEntitlementsComputation.swift in Sources */, + 165EA4DBD39926FC9A7FF580 /* Constants.swift in Sources */, + 934F4A57DA874AB9FEC7DEAE /* ContentView.swift in Sources */, + 988FDB03EA1FAA46FD5D4060 /* testCustomEntitlementsComputationApp.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin XCBuildConfiguration section */ - 2D276F5E29F1C85800F51382 /* Debug */ = { + 307B9D6AEF6EED4E56F5F658 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = "Derived/InfoPlists/testCustomEntitlementsComputation-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.revenuecat.sampleapp; + PRODUCT_NAME = testCustomEntitlementsComputation; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ( + "$(inherited)", + DEBUG, + ); + SWIFT_COMPILATION_MODE = singlefile; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 3634D661A8E0A97836805213 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_IDENTITY = "iPhone Developer"; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = "Derived/InfoPlists/testCustomEntitlementsComputation-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 15.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = com.revenuecat.sampleapp; + PRODUCT_NAME = testCustomEntitlementsComputation; + SDKROOT = iphoneos; + SUPPORTS_MACCATALYST = NO; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = YES; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = YES; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + 7156FB3704DF8A365714742C /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_ENABLE_OBJC_WEAK = YES; @@ -198,8 +317,66 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 8SXR2327BM; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 741F762893818BD5864928D4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEAD_CODE_STRIPPING = YES; DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 8SXR2327BM; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu11; @@ -216,157 +393,34 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.4; - MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; - MTL_FAST_MATH = YES; + MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; }; - 2D276F5F29F1C85800F51382 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_ENABLE_OBJC_WEAK = YES; - CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_COMMA = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_DOCUMENTATION_COMMENTS = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; - CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; - CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; - CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; - CLANG_WARN_STRICT_PROTOTYPES = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu11; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 16.4; - MTL_ENABLE_DEBUG_INFO = NO; - MTL_FAST_MATH = YES; - SDKROOT = iphoneos; - SWIFT_COMPILATION_MODE = wholemodule; - SWIFT_OPTIMIZATION_LEVEL = "-O"; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - 2D276F6129F1C85800F51382 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_ASSET_PATHS = "\"testCustomEntitlementsComputation/Preview Content\""; - DEVELOPMENT_TEAM = 8SXR2327BM; - ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchScreen_Generation = YES; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.revenuecat.sampleapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Debug; - }; - 2D276F6229F1C85800F51382 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; - CODE_SIGN_STYLE = Automatic; - CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_ASSET_PATHS = "\"testCustomEntitlementsComputation/Preview Content\""; - DEVELOPMENT_TEAM = 8SXR2327BM; - ENABLE_PREVIEWS = YES; - GENERATE_INFOPLIST_FILE = YES; - INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES; - INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES; - INFOPLIST_KEY_UILaunchScreen_Generation = YES; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight"; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - ); - MARKETING_VERSION = 1.0; - PRODUCT_BUNDLE_IDENTIFIER = com.revenuecat.sampleapp; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_EMIT_LOC_STRINGS = YES; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - }; - name = Release; - }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 2D276F4D29F1C85700F51382 /* Build configuration list for PBXProject "testCustomEntitlementsComputation" */ = { + 91129418DFF6B3F3158762A5 /* Build configuration list for PBXNativeTarget "testCustomEntitlementsComputation" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2D276F5E29F1C85800F51382 /* Debug */, - 2D276F5F29F1C85800F51382 /* Release */, + 307B9D6AEF6EED4E56F5F658 /* Debug */, + 3634D661A8E0A97836805213 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 2D276F6029F1C85800F51382 /* Build configuration list for PBXNativeTarget "testCustomEntitlementsComputation" */ = { + 928B6F5BF967A7DC15FFC616 /* Build configuration list for PBXProject "testCustomEntitlementsComputation" */ = { isa = XCConfigurationList; buildConfigurations = ( - 2D276F6129F1C85800F51382 /* Debug */, - 2D276F6229F1C85800F51382 /* Release */, + 741F762893818BD5864928D4 /* Debug */, + 7156FB3704DF8A365714742C /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ - -/* Begin XCSwiftPackageProductDependency section */ - 5714382F29F86B4400CC2D44 /* RevenueCat_CustomEntitlementComputation */ = { - isa = XCSwiftPackageProductDependency; - productName = RevenueCat_CustomEntitlementComputation; - }; -/* End XCSwiftPackageProductDependency section */ }; - rootObject = 2D276F4A29F1C85700F51382 /* Project object */; + rootObject = 0F199CE67194A4C3A8E8CB74 /* Project object */; } diff --git a/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation.xcodeproj/xcshareddata/xcschemes/testCustomEntitlementsComputation.xcscheme b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation.xcodeproj/xcshareddata/xcschemes/testCustomEntitlementsComputation.xcscheme index c23c1d588c..f4b0abe3b5 100644 --- a/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation.xcodeproj/xcshareddata/xcschemes/testCustomEntitlementsComputation.xcscheme +++ b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation.xcodeproj/xcshareddata/xcschemes/testCustomEntitlementsComputation.xcscheme @@ -1,20 +1,20 @@ + LastUpgradeVersion = "1010" + version = "1.3"> @@ -27,7 +27,9 @@ selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" shouldUseLaunchSchemeArgsEnv = "YES" - shouldAutocreateTestPlan = "YES"> + disableMainThreadChecker = "YES"> + + @@ -60,7 +62,7 @@ runnableDebuggingMode = "0"> diff --git a/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000000..eb87897008 --- /dev/null +++ b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000000..13613e3ee1 --- /dev/null +++ b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,13 @@ +{ + "images" : [ + { + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Assets.xcassets/Contents.json b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Assets.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Preview Content/Preview Assets.xcassets/Contents.json b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000000..73c00596a7 --- /dev/null +++ b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Resources/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/ContentView.swift b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Sources/ContentView.swift similarity index 82% rename from Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/ContentView.swift rename to Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Sources/ContentView.swift index e9bb9c12ca..806cf443f4 100644 --- a/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/ContentView.swift +++ b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Sources/ContentView.swift @@ -89,19 +89,6 @@ struct ContentView: View { .cornerRadius(20) .padding() - Button("Fetch product's intro/trial eligibility") { - Task { - await checkProductTrialIntroEligibility() - } - } - .font(.system(size: 20)) - .foregroundColor(.white) - .frame(maxWidth: .infinity) - .padding() - .background(Color.blue) - .cornerRadius(20) - .padding() - .task { Purchases.configureInCustomEntitlementsComputationMode(apiKey: Constants.apiKey, appUserID: appUserID) @@ -244,43 +231,6 @@ struct ContentView: View { } - func checkProductTrialIntroEligibility() async { - guard let offerings = self.offerings, - let offering = offerings.current, - let package = offering.availablePackages.first else { - print("no offerings, can't check product's eligibility") - return - } - - print("Checking intro offers with the async functions.") - print("Checking product trial intro eligibility with async checkTrialOrIntroDiscountEligibility(product:)...") - let introStatus = await Purchases.shared.checkTrialOrIntroDiscountEligibility(product: package.storeProduct) - print("Intro status: \(introStatus)") - - print("Checking product trial intro eligibility with async checkTrialOrIntroDiscountEligibility(packages:)...") - let introStatusDict = await Purchases.shared.checkTrialOrIntroDiscountEligibility(packages: [package]) - print("Intro status dictionary: \(introStatusDict)") - - print("Checking product trial intro eligibility with async checkTrialOrIntroDiscountEligibility(productIdentifiers:)") - let introStatusDict2 = await Purchases.shared.checkTrialOrIntroDiscountEligibility( - productIdentifiers: [package.storeProduct.productIdentifier] - ) - print("Intro status dictionary: \(introStatusDict2)") - - print("Checking intro offers with the completion handler functions.") - print("Checking product trial intro eligibility with checkTrialOrIntroDiscountEligibility(product:completion:)") - Purchases.shared.checkTrialOrIntroDiscountEligibility(product: package.storeProduct) { introEligibilityStatus in - print("Intro status: \(introEligibilityStatus)") - - print("Checking checkTrialOrIntroDiscountEligibility(productIdentifiers:completion:") - Purchases.shared.checkTrialOrIntroDiscountEligibility( - productIdentifiers: [package.storeProduct.productIdentifier] - ) { introStatusDict3 in - print("Intro status dict: \(introStatusDict3)") - } - } - } - private let dateFormatter: DateFormatter = { let formatter = DateFormatter() diff --git a/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Sources/testCustomEntitlementsComputationApp.swift b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Sources/testCustomEntitlementsComputationApp.swift new file mode 100644 index 0000000000..a00ec3a3c7 --- /dev/null +++ b/Examples/testCustomEntitlementsComputation/testCustomEntitlementsComputation/Sources/testCustomEntitlementsComputationApp.swift @@ -0,0 +1,17 @@ +// +// testCustomEntitlementsComputationApp.swift +// testCustomEntitlementsComputation +// +// Created by Andrés Boedo on 4/20/23. +// + +import SwiftUI + +@main +struct testCustomEntitlementsComputationApp: App { + var body: some Scene { + WindowGroup { + ContentView() + } + } +} diff --git a/Projects/APITesters/Project.swift b/Projects/APITesters/Project.swift new file mode 100644 index 0000000000..c50bd94b2a --- /dev/null +++ b/Projects/APITesters/Project.swift @@ -0,0 +1,141 @@ +import ProjectDescription +import ProjectDescriptionHelpers + +// swiftlint:disable line_length + +let allDestinations: Destinations = [ + .iPhone, + .iPad, + .mac, + .macWithiPadDesign, + .macCatalyst, + .appleWatch, + .appleTv, + .appleVision, + .appleVisionWithiPadDesign +] + +let allDeploymentTargets: DeploymentTargets = .multiplatform( + iOS: "13.0", + macOS: "10.15", + watchOS: "1.0", + tvOS: "13.0" +) + +let project = Project( + name: "APITesters", + organizationName: .revenueCatOrgName, + settings: .settings(base: [:].automaticCodeSigning(devTeam: .revenueCatTeamID)), + targets: [ + .target( + name: "ObjcAPITester", + destinations: allDestinations, + product: .framework, + bundleId: "com.revenuecat.ObjcAPITester", + deploymentTargets: allDeploymentTargets, + sources: [ + "../../Tests/APITesters/AllAPITests/ObjcAPITester/**/*.m" + ], + headers: .headers( + public: [ + "../../Tests/APITesters/AllAPITests/ObjcAPITester/RCSubscriptionInfoAPI.h" + ], + project: [ + "../../Tests/APITesters/AllAPITests/ObjcAPITester/ObjcAPITester.h" + ] + ), + dependencies: [ + .revenueCat + ] + ), + + .target( + name: "SwiftAPITester", + destinations: allDestinations, + product: .framework, + bundleId: "com.revenuecat.SwiftAPITester", + deploymentTargets: allDeploymentTargets, + sources: [ + "../../Tests/APITesters/AllAPITests/SwiftAPITester/**/*.swift" + ], + headers: .headers( + public: [ + "../../Tests/APITesters/AllAPITests/SwiftAPITester/SwiftAPITester.h" + ] + ), + dependencies: [ + .revenueCat + ] + ), + + .target( + name: "ReceiptParserAPITester", + destinations: allDestinations, + product: .framework, + bundleId: "com.revenuecat.ReceiptParserAPITester", + deploymentTargets: allDeploymentTargets, + sources: [ + "../../Tests/APITesters/AllAPITests/ReceiptParserAPITester/**/*.swift" + ], + headers: .headers( + public: [ + "../../Tests/APITesters/AllAPITests/ReceiptParserAPITester/ReceiptParserAPITester.h" + ] + ), + dependencies: [ + .receiptparser + ] + ), + + .target( + name: "RevenueCatUISwiftAPITester", + destinations: allDestinations, + product: .framework, + bundleId: "com.revenuecat.RevenueCatUISwiftAPITester", + deploymentTargets: .multiplatform( + iOS: "15.0", + macOS: "10.15", + watchOS: "1.0", + tvOS: "13.0" + ), + sources: [ + "../../Tests/APITesters/AllAPITests/RevenueCatUISwiftAPITester/**/*.swift" + ], + headers: .headers( + public: [ + "../../Tests/APITesters/AllAPITests/RevenueCatUISwiftAPITester/RevenueCatUISwiftAPITester.h" + ] + ), + dependencies: [ + .revenueCatUI + ] + ), + + .target( + name: "CustomEntitlementComputationSwiftAPITester", + destinations: allDestinations, + product: .framework, + bundleId: "com.revenuecat.CustomEntitlementComputationSwiftAPITester", + deploymentTargets: allDeploymentTargets, + sources: [ + "../../Tests/APITesters/AllAPITests/CustomEntitlementComputationSwiftAPITester/**/*.swift" + ], + headers: .headers( + public: [ + "../../Tests/APITesters/AllAPITests/CustomEntitlementComputationSwiftAPITester/CustomEntitlementComputationSwiftAPITester.h" + ] + ), + dependencies: [ + .revenueCatCustomEntitlementComputation + ] + ) + ], + schemes: [], + additionalFiles: [ + "../../Tests/APITesters/AllAPITests/ObjcAPITester/**/*.h", + "../../Tests/APITesters/AllAPITests/SwiftAPITester/SwiftAPITester.h", + "../../Tests/APITesters/AllAPITests/CustomEntitlementComputationSwiftAPITester/CustomEntitlementComputationSwiftAPITester.h", + "../../Tests/APITesters/AllAPITests/RevenueCatUISwiftAPITester/RevenueCatUISwiftAPITester.h", + "../../Tests/APITesters/AllAPITests/ReceiptParserAPITester/ReceiptParserAPITester.h" + ] +) diff --git a/Projects/PaywallTester/Project.swift b/Projects/PaywallTester/Project.swift new file mode 100644 index 0000000000..33bb556b25 --- /dev/null +++ b/Projects/PaywallTester/Project.swift @@ -0,0 +1,83 @@ +import Foundation +import ProjectDescription +import ProjectDescriptionHelpers + +let allDestinations: Destinations = [ + .iPhone, + .iPad, + .mac, + .macWithiPadDesign, + .macCatalyst, + .appleWatch, + .appleTv, + .appleVision, + .appleVisionWithiPadDesign +] + +let allDeploymentTargets: DeploymentTargets = .multiplatform( + iOS: "15.0", + watchOS: "10.0", + visionOS: "1.3" +) + +var additionalFiles: [FileElement] = [ + .glob(pattern: "../../Global.xcconfig") +] +if FileManager.default.fileExists(atPath: "../../Local.xcconfig") { + additionalFiles.append(.glob(pattern: "../../Local.xcconfig")) +} + +let project = Project( + name: "PaywallTester", + organizationName: .revenueCatOrgName, + settings: .settings( + base: [:].automaticCodeSigning(devTeam: .revenueCatTeamID), + configurations: [ + .debug(name: "Debug-SK", xcconfig: .relativeToRoot("Global.xcconfig")), + .debug(name: "Debug") + ], + defaultSettings: .essential + ), + targets: [ + .target( + name: "PaywallTester", + destinations: allDestinations, + product: .app, + bundleId: "com.revenuecat.PaywallTester", + deploymentTargets: allDeploymentTargets, + infoPlist: "../../Tests/TestingApps/PaywallsTester/PaywallsTester/Info.plist", + sources: [ + "../../Tests/TestingApps/PaywallsTester/PaywallsTester/**/*.swift" + ], + dependencies: [ + .revenueCat, + .revenueCatUI, + .storeKit + ] + ) + ], + schemes: [ + .scheme( + name: "PaywallTester - SK Config", + shared: true, + buildAction: .buildAction(targets: ["PaywallTester"]), + runAction: .runAction( + configuration: "Debug-SK", + executable: "PaywallTester", + options: .options( + storeKitConfigurationPath: "../../Tests/TestingApps/PaywallsTester/PaywallsTester/Products.storekit" + ) + ) + ), + .scheme( + name: "PaywallTester - Live Config", + shared: true, + buildAction: .buildAction(targets: ["PaywallTester"]), + runAction: .runAction( + configuration: "Debug", + executable: "PaywallTester" + ) + ) + ], + additionalFiles: additionalFiles +) diff --git a/Projects/RevenueCat/Project.swift b/Projects/RevenueCat/Project.swift new file mode 100644 index 0000000000..6e1ad2f5d7 --- /dev/null +++ b/Projects/RevenueCat/Project.swift @@ -0,0 +1,349 @@ +import ProjectDescription +import ProjectDescriptionHelpers + +// MARK: - Shared Constants + +func allDestinations(macWithiPadDesign: Bool) -> Destinations { + let destinations: [Destination?] = [ + .iPhone, + .iPad, + .mac, + macWithiPadDesign ? .macWithiPadDesign : nil, + .macCatalyst, + .appleWatch, + .appleTv, + .appleVision, + .appleVisionWithiPadDesign + ] + return Set(destinations.compactMap { $0 }) +} + +let allDeploymentTargets: DeploymentTargets = .multiplatform( + iOS: "13.0", + macOS: "11.0", + watchOS: "7.0", + tvOS: "14.0" +) + +// MARK: - Project Definition + +let project = Project( + name: "RevenueCat", + organizationName: .revenueCatOrgName, + settings: .settings(base: [:].automaticCodeSigning(devTeam: .revenueCatTeamID)), + targets: [ + // MARK: – Main Library + .target( + name: "RevenueCat", + destinations: .allRevenueCat, + product: .framework, + bundleId: "com.revenuecat.Purchases", + deploymentTargets: .allRevenueCat, + infoPlist: "../../Sources/Info.plist", + sources: [ + .glob( + "../../Sources/**/*.swift", + excluding: [ + "../../Sources/LocalReceiptParsing/ReceiptParser-only-files/**/*.swift" + ] + ) + ], + headers: .headers( + public: ["../../Sources/RevenueCat.h"] + ), + settings: .settings( + base: [ + "APPLICATION_EXTENSION_API_ONLY": "YES" + ] + ) + ), + + .target( + name: "UnitTests", + destinations: .allRevenueCat, + product: .unitTests, + bundleId: "com.revenuecat.PurchasesTests", + deploymentTargets: .allRevenueCat, + infoPlist: .default, + sources: [ + "../../Tests/UnitTests/**/*.swift", + "../../Tests/ReceiptParserTests/Helpers/MockBundle.swift", + "../../Tests/StoreKitUnitTests/TestHelpers/AvailabilityChecks.swift", + "../../Tests/StoreKitUnitTests/TestHelpers/StoreKitTestHelpers.swift", + "../../Tests/StoreKitUnitTests/TestHelpers/ImageSnapshot.swift" + ], + dependencies: [ + .target(name: "RevenueCat"), + .nimble, + .snapshotTesting, + .ohHTTPStubsSwift + ], + ), + + .target( + name: "RevenueCat_CustomEntitlementComputation", + destinations: allDestinations(macWithiPadDesign: true), + product: .framework, + bundleId: "com.revenuecat.RevenueCatCustomEntitlementComputation", + deploymentTargets: allDeploymentTargets, + infoPlist: "../../Sources/Info.plist", + sources: [ + .glob( + "../../Sources/**/*.swift", + excluding: [ + "../../Sources/LocalReceiptParsing/ReceiptParser-only-files/**/*.swift" + ] + ) + ], + headers: .headers( + project: ["../../Sources/RevenueCat.h"] + ), + settings: .settings( + base: [ + "APPLICATION_EXTENSION_API_ONLY": "YES" + ] + .swiftActiveCompilationConditions([.enableCustomEntitlementComputation]) + ) + ), + + // MARK: – Receipt Parser + .target( + name: "ReceiptParser", + destinations: allDestinations(macWithiPadDesign: false), + product: .framework, + bundleId: "com.revenuecat.ReceiptParser", + deploymentTargets: allDeploymentTargets, + infoPlist: .default, + sources: [ + "../../Sources/LocalReceiptParsing/**/*.swift" + ] + ), + + .target( + name: "ReceiptParserTests", + destinations: allDestinations(macWithiPadDesign: false), + product: .unitTests, + bundleId: "com.revenuecat.ReceiptParserTests", + deploymentTargets: allDeploymentTargets, + infoPlist: .default, + sources: [ + "../../Tests/ReceiptParserTests/**/*.swift" + ], + resources: [ + "../../Tests/UnitTests/Resources/receipts/**/*.txt" + ], + dependencies: [ + .target(name: "ReceiptParser"), + .nimble + ] + ), + + // MARK: – Unit Tests Host App + .target( + name: "UnitTestsHostApp", + destinations: allDestinations(macWithiPadDesign: true), + product: .app, + bundleId: "com.revenuecat.StoreKitUnitTestsHostApp", + deploymentTargets: .multiplatform( + iOS: "13.0", + macOS: "10.15", + watchOS: "6.2", + tvOS: "13.0", + visionOS: "1.0" + ), + infoPlist: .file(path: "../../Tests/UnitTestsHostApp/Info.plist"), + sources: [ + "../../Tests/UnitTestsHostApp/**/*.swift" + ], + dependencies: [], + ), + + // MARK: – StoreKit Unit Tests + .target( + name: "StoreKitUnitTests", + destinations: allDestinations(macWithiPadDesign: true), + product: .unitTests, + bundleId: "com.revenuecat.StoreKitUnitTests", + deploymentTargets: allDeploymentTargets, + infoPlist: .default, + sources: [ + "../../Tests/StoreKitUnitTests/**/*.swift", + "../../Tests/UnitTests/TestHelpers/**/*.swift", + "../../Tests/UnitTests/Misc/**/TestCase.swift", + "../../Tests/UnitTests/Misc/**/CustomerInfo+TestExtensions.swift", + "../../Tests/UnitTests/Misc/**/XCTestCase+Extensions.swift", + "../../Tests/UnitTests/Mocks/**/*.swift" + ], + resources: [ + "../../Tests/StoreKitUnitTests/UnitTestsConfiguration.storekit" + ], + dependencies: [ + .target(name: "RevenueCat"), + .target(name: "UnitTestsHostApp"), + .nimble, + .ohHTTPStubsSwift, + .snapshotTesting + ], + additionalFiles: [ + "../../Tests/StoreKitUnitTests/UnitTestsConfiguration.storekit" + ] + ), + + // MARK: – BackendIntegrationTests Host App + .target( + name: "BackendIntegrationTestsHostApp", + destinations: allDestinations(macWithiPadDesign: true), + product: .app, + bundleId: "com.revenuecat.StoreKitTestApp", + deploymentTargets: .multiplatform( + iOS: "14.1", + macOS: "10.15", + tvOS: "14.1" + ), + infoPlist: .file(path: "../../Tests/UnitTestsHostApp/Info.plist"), + sources: [ + "../../Tests/BackendIntegrationTestApp/**/*.swift" + ], + dependencies: [ + .storeKit + ], + settings: .settings( + base: [ + "APPLICATION_EXTENSION_API_ONLY": "YES" + ] + .swiftActiveCompilationConditions([.enableCustomEntitlementComputation]) + ) + ), + + .target( + name: "BackendCustomEntitlementsIntegrationTests", + destinations: allDestinations(macWithiPadDesign: true), + product: .unitTests, + bundleId: "com.revenuecat.BackendIntBackendCustomEntitlementsIntegrationTestsegrationTests", + deploymentTargets: .iOS("16.0"), + infoPlist: .default, + sources: [ + "../../Tests/BackendIntegrationTests/CustomEntitlementsComputationIntegrationTests.swift", + "../../Tests/BackendIntegrationTests/BaseBackendIntegrationTests.swift", + "../../Tests/BackendIntegrationTests/BaseStoreKitIntegrationTests.swift", + "../../Tests/BackendIntegrationTests/MainThreadMonitor.swift", + "../../Tests/BackendIntegrationTests/Constants.swift", + "../../Tests/BackendIntegrationTests/Helpers/**/*.swift", + "../../Tests/UnitTests/Misc/**/TestCase.swift", + "../../Tests/UnitTests/Mocks/MockSandboxEnvironmentDetector.swift", + "../../Tests/UnitTests/TestHelpers/**/TestLogHandler.swift", + "../../Tests/UnitTests/TestHelpers/**/CurrentTestCaseTracker.swift", + "../../Tests/UnitTests/TestHelpers/**/AsyncTestHelpers.swift", + "../../Tests/UnitTests/TestHelpers/**/OSVersionEquivalent.swift", + "../../Tests/UnitTests/Misc/XCTestCase+Extensions.swift", + "../../Tests/StoreKitUnitTests/TestHelpers/StoreKitTestHelpers.swift", + "../../Tests/StoreKitUnitTests/TestHelpers/AvailabilityChecks.swift" + ], + dependencies: [ + .target(name: "RevenueCat_CustomEntitlementComputation"), + .target(name: "BackendIntegrationTestsHostApp"), + .nimble, + .snapshotTesting, + .storeKitTests + ], + settings: .settings( + base: [:].swiftActiveCompilationConditions([.enableCustomEntitlementComputation]) + ) + ), + + .target( + name: "BackendIntegrationTests", + destinations: allDestinations(macWithiPadDesign: true), + product: .unitTests, + bundleId: "com.revenuecat.BackendIntegrationTests", + deploymentTargets: .iOS("16.0"), + infoPlist: .default, + sources: [ + .glob( + "../../Tests/BackendIntegrationTests/**/*.swift", + excluding: [ + "../../Tests/BackendIntegrationTests/CustomEntitlementsComputationIntegrationTests.swift" + ] + ), + "../../Tests/UnitTests/Mocks/MockSandboxEnvironmentDetector.swift", + "../../Tests/UnitTests/Misc/**/TestCase.swift", + "../../Tests/UnitTests/Misc/**/XCTestCase+Extensions.swift", + "../../Tests/UnitTests/TestHelpers/**/*.swift", + .glob( + "../../Tests/StoreKitUnitTests/TestHelpers/**/*.swift", + excluding: [ + "../../Tests/StoreKitUnitTests/TestHelpers/StoreKitConfigTestCase+Extensions.swift" + ] + ) + ], + resources: [ + "../../Tests/BackendIntegrationTests/RevenueCat_IntegrationPurchaseTesterConfiguration.storekit" + ], + dependencies: [ + .target(name: "RevenueCat"), + .nimble, + .ohHTTPStubsSwift, + .snapshotTesting, + .storeKitTests + ], + additionalFiles: [ + "../../Tests/BackendIntegrationTests/RevenueCat_IntegrationPurchaseTesterConfiguration.storekit", + "../../BackendIntegrationTests/**.xctestplan" + ] + ) + + ], + schemes: [ + .scheme( + name: "RevenueCat", + shared: true, + buildAction: .buildAction(targets: ["RevenueCat"]), + testAction: .testPlans([ + .relativeToRoot("Tests/TestPlans/AllTests.xctestplan") + ] + ), + runAction: .runAction( + executable: "RevenueCat", + options: .options( + storeKitConfigurationPath: .relativeToRoot( + "Tests/StoreKitUnitTests/UnitTestsConfiguration.storekit" + ) + ) + ), + archiveAction: .archiveAction(configuration: "Release"), + profileAction: .profileAction(configuration: "Release"), + analyzeAction: .analyzeAction(configuration: "Debug") + ), + + .scheme( + name: "BackendIntegrationTests", + shared: true, + buildAction: .buildAction(targets: ["BackendIntegrationTests"]), + testAction: .testPlans([ + .relativeToRoot("BackendIntegrationTests/BackendIntegrationTests-All-CI.xctestplan") + ] + ), + runAction: .runAction( + executable: "BackendIntegrationTestsHostApp", + options: .options( + storeKitConfigurationPath: .relativeToRoot( + "Tests/BackendIntegrationTests/RevenueCat_IntegrationPurchaseTesterConfiguration.storekit" + ) + ) + ), + archiveAction: .archiveAction(configuration: "Release"), + profileAction: .profileAction(configuration: "Release"), + analyzeAction: .analyzeAction(configuration: "Debug") + ), + + .scheme( + name: "ReceiptParser", + shared: true, + buildAction: .buildAction(targets: ["ReceiptParser"]), + testAction: .targets([ + .testableTarget(target: .init(stringLiteral: "ReceiptParserTests")) + ]), + runAction: .runAction(configuration: "Debug") + ) + ], +) diff --git a/Projects/RevenueCatUI/Project.swift b/Projects/RevenueCatUI/Project.swift new file mode 100644 index 0000000000..bbe3e70ac2 --- /dev/null +++ b/Projects/RevenueCatUI/Project.swift @@ -0,0 +1,65 @@ +import ProjectDescription +import ProjectDescriptionHelpers + +let allDeploymentTargets: DeploymentTargets = .multiplatform( + iOS: "13.0", + macOS: "10.15", + watchOS: "6.2", + tvOS: "13.0", + visionOS: "1.0" +) + +let project = Project( + name: "RevenueCatUI", + organizationName: .revenueCatOrgName, + settings: .settings(base: [:].automaticCodeSigning(devTeam: .revenueCatTeamID)), + targets: [ + .target( + name: "RevenueCatUI", + destinations: .allRevenueCat, + product: .framework, + bundleId: "com.revenuecat.RevenueCatUI", + deploymentTargets: .allRevenueCat, + infoPlist: .default, + sources: [ + "../../RevenueCatUI/**/*.swift" + ], + dependencies: [ + .revenueCat + ] + ), + + // MARK: – RevenueCat Tests + .target( + name: "RevenueCatUITests", + destinations: .allRevenueCat, + product: .unitTests, + bundleId: "com.revenuecat.sampleapp.tests", + deploymentTargets: .allRevenueCat, + infoPlist: .default, + sources: [ + "../../Tests/RevenueCatUITests/**/*.swift" + ], + dependencies: [ + .target(name: "RevenueCatUI"), + .nimble, + .snapshotTesting, + .ohHTTPStubsSwift + ] + ) + ], + schemes: [ + .scheme( + name: "RevenueCatUI", + shared: true, + buildAction: .buildAction(targets: ["RevenueCatUI"]), + testAction: .targets([ + .testableTarget(target: .init(stringLiteral: "RevenueCatUITests")) + ]), + runAction: .runAction(configuration: "Debug"), + archiveAction: .archiveAction(configuration: "Release"), + profileAction: .profileAction(configuration: "Release"), + analyzeAction: .analyzeAction(configuration: "Debug") + ) + ] +) diff --git a/Projects/v3LoadShedderIntegration/Project.swift b/Projects/v3LoadShedderIntegration/Project.swift new file mode 100644 index 0000000000..2158d91ec4 --- /dev/null +++ b/Projects/v3LoadShedderIntegration/Project.swift @@ -0,0 +1,91 @@ +import ProjectDescription +import ProjectDescriptionHelpers + +// swiftlint:disable line_length + +// MARK: - Shared Constants + +let allDestinations: Destinations = [ + .iPhone, + .iPad +] + +let allDeploymentTargets: DeploymentTargets = .multiplatform( + iOS: "16.2", +) + +// MARK: - Project Definition + +let project = Project( + name: "v3LoadShedderIntegration", + organizationName: .revenueCatOrgName, + targets: [ + // MARK: – Main Library + .target( + name: "v3LoadShedderIntegration", + destinations: allDestinations, + product: .app, + bundleId: "com.revenuecat.v3LoadShedderIntegration", + deploymentTargets: allDeploymentTargets, + infoPlist: .file(path: "../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegration/Info.plist"), + sources: [ + .glob( + "../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegration/**/*.swift" + ) + ], + resources: [ + "../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegration/Assets.xcassets", + "../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegration/Base.lproj/LaunchScreen.storyboard", + "../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegration/Base.lproj/Main.storyboard", + "../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegrationTests/V3LoadShedderIntegrationTestsConfiguration.storekit" + ], + headers: .headers( + project: ["../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegration/v3LoadShedderIntegrationTests-Info.h"] + ), + additionalFiles: [ + "../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegrationTests/V3LoadShedderIntegrationTestsConfiguration.storekit", + "../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegration/Info.plist" + ] + ), + + .target( + name: "v3LoadShedderIntegrationTests", + destinations: allDestinations, + product: .unitTests, + bundleId: "com.revenuecat.v3LoadShedderIntegrationTests", + deploymentTargets: allDeploymentTargets, + infoPlist: .default, + sources: [ + "../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegrationTests/**/*.swift" + ], + dependencies: [ + .target(name: "v3LoadShedderIntegration"), + .external(name: "Purchases") + ], + additionalFiles: [ + "../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegrationTests/V3LoadShedderIntegrationTestsConfiguration.storekit" + ] + ) + ], + schemes: [ + .scheme( + name: "v3LoadShedderIntegration", + shared: true, + buildAction: .buildAction(targets: [ + "v3LoadShedderIntegration", + "v3LoadShedderIntegrationTests" + ]), + testAction: .targets(["v3LoadShedderIntegrationTests"]), + runAction: .runAction( + executable: "v3LoadShedderIntegration", + options: .options( + storeKitConfigurationPath: "../../Tests/v3LoadShedderIntegration/v3LoadShedderIntegrationTests/V3LoadShedderIntegrationTestsConfiguration.storekit" + ) + ), + archiveAction: .archiveAction(configuration: "Release"), + profileAction: .profileAction(configuration: "Release"), + analyzeAction: .analyzeAction(configuration: "Debug") + ) + ], + settings: .settings(base: [:].automaticCodeSigning(devTeam: .revenueCatTeamID)) +) diff --git a/Tests/TestingApps/PaywallsTester/PaywallsTester/Info.plist b/Tests/TestingApps/PaywallsTester/PaywallsTester/Info.plist index dabe6d2517..9065833a09 100644 --- a/Tests/TestingApps/PaywallsTester/PaywallsTester/Info.plist +++ b/Tests/TestingApps/PaywallsTester/PaywallsTester/Info.plist @@ -2,6 +2,10 @@ + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleName + $(PRODUCT_NAME) CFBundleURLTypes @@ -28,5 +32,58 @@ $(REVENUECAT_PROXY_URL_HOST) REVENUECAT_PROXY_URL_SCHEME $(REVENUECAT_PROXY_URL_SCHEME) + WKWatchOnly + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + UISupportedInterfaceOrientations~iphone + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleExecutable + $(EXECUTABLE_NAME) + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIRequiresFullScreen + + LSApplicationCategoryType + public.app-category.developer-tools + CFBundleDisplayName + RevenueCat + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default + + + + + UILaunchScreen + + UILaunchScreen + + diff --git a/Tests/TestingApps/PaywallsTester/PaywallsTester/UI/Views/OfferingList/OfferingsList.swift b/Tests/TestingApps/PaywallsTester/PaywallsTester/UI/Views/OfferingList/OfferingsList.swift index 10b87842aa..454be3939e 100644 --- a/Tests/TestingApps/PaywallsTester/PaywallsTester/UI/Views/OfferingList/OfferingsList.swift +++ b/Tests/TestingApps/PaywallsTester/PaywallsTester/UI/Views/OfferingList/OfferingsList.swift @@ -11,7 +11,7 @@ import SwiftUI struct OfferingsList: View { - @Binding + @Binding private var introEligility: IntroEligibilityStatus var body: some View { @@ -75,7 +75,7 @@ struct OfferingsList: View { #endif } } - + @ViewBuilder private func offeringsList(with data: PaywallsData) -> some View { List { diff --git a/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTester-Info.plist b/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTester-Info.plist index b35567f2bf..c98848927d 100644 --- a/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTester-Info.plist +++ b/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTester-Info.plist @@ -2,6 +2,22 @@ + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + Purchase Tester + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) CFBundleURLTypes @@ -15,8 +31,12 @@ + CFBundleVersion + $(CURRENT_PROJECT_VERSION) ITSAppUsesNonExemptEncryption + LSApplicationCategoryType + public.app-category.developer-tools NSAppTransportSecurity NSAllowsArbitraryLoads @@ -39,5 +59,25 @@ + UIApplicationSupportsIndirectInputEvents + + UILaunchScreen + + UILaunchScreen + + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~iphone + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + diff --git a/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTester.xcodeproj/project.pbxproj b/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTester.xcodeproj/project.pbxproj index e54fcabb80..535f657d34 100644 --- a/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTester.xcodeproj/project.pbxproj +++ b/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTester.xcodeproj/project.pbxproj @@ -810,7 +810,6 @@ INFOPLIST_FILE = PurchaseTesterWatchOS/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = PurchaseTesterWatchOS; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.revenuecat.sampleapp; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -839,7 +838,6 @@ INFOPLIST_FILE = PurchaseTesterWatchOS/Info.plist; INFOPLIST_KEY_CFBundleDisplayName = PurchaseTesterWatchOS; INFOPLIST_KEY_UISupportedInterfaceOrientations = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown"; - INFOPLIST_KEY_WKCompanionAppBundleIdentifier = com.revenuecat.sampleapp; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", diff --git a/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTesterWatchOS/Info.plist b/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTesterWatchOS/Info.plist index d9bc08ca74..aeee2efbcf 100644 --- a/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTesterWatchOS/Info.plist +++ b/Tests/TestingApps/PurchaseTesterSwiftUI/PurchaseTesterWatchOS/Info.plist @@ -2,7 +2,34 @@ + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + PurchaseTesterWatchOS + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSApplicationCategoryType + WKWatchKitApp REVENUECAT_API_KEY $(REVENUECAT_API_KEY) + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + + WKCompanionAppBundleIdentifier + com.revenuecat.sampleapp diff --git a/Tests/TestingApps/PurchaseTesterSwiftUI/Shared/Assets.xcassets/LaunchImage.launchimage/Contents.json b/Tests/TestingApps/PurchaseTesterSwiftUI/Shared/Assets.xcassets/LaunchImage.launchimage/Contents.json new file mode 100644 index 0000000000..0426c9b074 --- /dev/null +++ b/Tests/TestingApps/PurchaseTesterSwiftUI/Shared/Assets.xcassets/LaunchImage.launchimage/Contents.json @@ -0,0 +1,238 @@ +{ + "images" : [ + { + "extent" : "full-screen", + "idiom" : "iphone", + "minimum-system-version" : "12.0", + "orientation" : "portrait", + "scale" : "3x", + "subtype" : "2688h" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "minimum-system-version" : "12.0", + "orientation" : "landscape", + "scale" : "3x", + "subtype" : "2688h" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "minimum-system-version" : "12.0", + "orientation" : "portrait", + "scale" : "2x", + "subtype" : "1792h" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "minimum-system-version" : "12.0", + "orientation" : "landscape", + "scale" : "2x", + "subtype" : "1792h" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "minimum-system-version" : "12.0", + "orientation" : "portrait", + "scale" : "2x", + "subtype" : "2388h" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "minimum-system-version" : "12.0", + "orientation" : "landscape", + "scale" : "2x", + "subtype" : "2388h" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "minimum-system-version" : "11.0", + "orientation" : "portrait", + "scale" : "3x", + "subtype" : "2436h" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "minimum-system-version" : "11.0", + "orientation" : "landscape", + "scale" : "3x", + "subtype" : "2436h" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "minimum-system-version" : "10.0", + "orientation" : "portrait", + "scale" : "2x", + "subtype" : "2224h" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "minimum-system-version" : "10.0", + "orientation" : "landscape", + "scale" : "2x", + "subtype" : "2224h" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "minimum-system-version" : "9.0", + "orientation" : "portrait", + "scale" : "2x", + "subtype" : "1366h" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "minimum-system-version" : "9.0", + "orientation" : "landscape", + "scale" : "2x", + "subtype" : "1366h" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "minimum-system-version" : "8.0", + "orientation" : "portrait", + "scale" : "3x", + "subtype" : "736h" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "minimum-system-version" : "8.0", + "orientation" : "landscape", + "scale" : "3x", + "subtype" : "736h" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "minimum-system-version" : "8.0", + "orientation" : "portrait", + "scale" : "2x", + "subtype" : "667h" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x", + "subtype" : "retina4" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "1x" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "orientation" : "landscape", + "scale" : "1x" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "minimum-system-version" : "7.0", + "orientation" : "landscape", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "orientation" : "portrait", + "scale" : "1x" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "iphone", + "orientation" : "portrait", + "scale" : "2x", + "subtype" : "retina4" + }, + { + "extent" : "to-status-bar", + "idiom" : "ipad", + "orientation" : "portrait", + "scale" : "1x" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "orientation" : "portrait", + "scale" : "1x" + }, + { + "extent" : "to-status-bar", + "idiom" : "ipad", + "orientation" : "landscape", + "scale" : "1x" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "orientation" : "landscape", + "scale" : "1x" + }, + { + "extent" : "to-status-bar", + "idiom" : "ipad", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "orientation" : "portrait", + "scale" : "2x" + }, + { + "extent" : "to-status-bar", + "idiom" : "ipad", + "orientation" : "landscape", + "scale" : "2x" + }, + { + "extent" : "full-screen", + "idiom" : "ipad", + "orientation" : "landscape", + "scale" : "2x" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Tests/UnitTests/Purchasing/ReceiptStringsTests.swift b/Tests/UnitTests/Purchasing/ReceiptStringsTests.swift index 54521020b7..77dd0eb9b0 100644 --- a/Tests/UnitTests/Purchasing/ReceiptStringsTests.swift +++ b/Tests/UnitTests/Purchasing/ReceiptStringsTests.swift @@ -212,16 +212,6 @@ final class ReceiptStringsTests: TestCase { expect(subject.description).to(equal(expectedDescription)) } - func testReceiptRetryingMechanismNotAvailable() { - let subject = ReceiptStrings - .receipt_retrying_mechanism_not_available - let expectedDescription = "Receipt retrying mechanism is not available in iOS 12. " + - "Will only attempt to fetch once." - - expect(subject.category).to(equal("receipt")) - expect(subject.description).to(equal(expectedDescription)) - } - func testLocalReceiptMissingPurchase() { let receipt = AppleReceipt( environment: .unknown, diff --git a/Tests/v3LoadShedderIntegration/v3LoadShedderIntegration.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Tests/v3LoadShedderIntegration/v3LoadShedderIntegration.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000000..919434a625 --- /dev/null +++ b/Tests/v3LoadShedderIntegration/v3LoadShedderIntegration.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Tests/v3LoadShedderIntegration/v3LoadShedderIntegration.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/Tests/v3LoadShedderIntegration/v3LoadShedderIntegration.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000000..b4f215e671 --- /dev/null +++ b/Tests/v3LoadShedderIntegration/v3LoadShedderIntegration.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,15 @@ +{ + "originHash" : "fbdec518f66720abc9cceef1ea36ee3229c4faa09fdcfd36f45e77839c989f98", + "pins" : [ + { + "identity" : "purchases-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/RevenueCat/purchases-ios", + "state" : { + "revision" : "590804fc3a141fb52762b9232ba5791fce645fe7", + "version" : "3.14.4" + } + } + ], + "version" : 3 +} diff --git a/Tests/v3LoadShedderIntegration/v3LoadShedderIntegration/Info.plist b/Tests/v3LoadShedderIntegration/v3LoadShedderIntegration/Info.plist index dd3c9afdae..c76517bb28 100644 --- a/Tests/v3LoadShedderIntegration/v3LoadShedderIntegration/Info.plist +++ b/Tests/v3LoadShedderIntegration/v3LoadShedderIntegration/Info.plist @@ -21,5 +21,42 @@ + CFBundleName + $(PRODUCT_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + UIMainStoryboardFile + Main + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + UILaunchStoryboardName + LaunchScreen + CFBundleExecutable + $(EXECUTABLE_NAME) + LSRequiresIPhoneOS + + UISupportedInterfaceOrientations~iphone + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIApplicationSupportsIndirectInputEvents + + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + CFBundleShortVersionString + $(MARKETING_VERSION) diff --git a/Tests/v3LoadShedderIntegration/v3LoadShedderIntegrationTests/V3LoadShedderIntegrationTestsConfiguration.storekit b/Tests/v3LoadShedderIntegration/v3LoadShedderIntegrationTests/V3LoadShedderIntegrationTestsConfiguration.storekit index f61690dba9..c5457bd3bc 100644 --- a/Tests/v3LoadShedderIntegration/v3LoadShedderIntegrationTests/V3LoadShedderIntegrationTestsConfiguration.storekit +++ b/Tests/v3LoadShedderIntegration/v3LoadShedderIntegrationTests/V3LoadShedderIntegrationTestsConfiguration.storekit @@ -1,4 +1,14 @@ { + "appPolicies" : { + "eula" : "", + "policies" : [ + { + "locale" : "en_US", + "policyText" : "", + "policyURL" : "" + } + ] + }, "identifier" : "B495CDA2", "nonRenewingSubscriptions" : [ @@ -7,6 +17,56 @@ ], "settings" : { + "_failTransactionsEnabled" : false, + "_locale" : "en_US", + "_storefront" : "USA", + "_storeKitErrors" : [ + { + "current" : null, + "enabled" : false, + "name" : "Load Products" + }, + { + "current" : null, + "enabled" : false, + "name" : "Purchase" + }, + { + "current" : null, + "enabled" : false, + "name" : "Verification" + }, + { + "current" : null, + "enabled" : false, + "name" : "App Store Sync" + }, + { + "current" : null, + "enabled" : false, + "name" : "Subscription Status" + }, + { + "current" : null, + "enabled" : false, + "name" : "App Transaction" + }, + { + "current" : null, + "enabled" : false, + "name" : "Manage Subscriptions Sheet" + }, + { + "current" : null, + "enabled" : false, + "name" : "Refund Request Sheet" + }, + { + "current" : null, + "enabled" : false, + "name" : "Offer Code Redeem Sheet" + } + ], "_timeRate" : 6 }, "subscriptionGroups" : [ @@ -40,7 +100,10 @@ "recurringSubscriptionPeriod" : "P1M", "referenceName" : "loadShedder monthly", "subscriptionGroupID" : "ADE6FE00", - "type" : "RecurringSubscription" + "type" : "RecurringSubscription", + "winbackOffers" : [ + + ] } ] } @@ -50,7 +113,7 @@ "privateKey" : "MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgMpw0LScUC+8o+WsEAM20KOMzZOMSWKFjUixtwDidPMugCgYIKoZIzj0DAQehRANCAAQIMw4YEVZrDPrk/1dx5WV3hpkuy8enQs+yDAuJRtsrOnzRH6EFgTyiydprKlgUOHW6xBocrRNTMZXioCBQtchg" }, "version" : { - "major" : 2, + "major" : 4, "minor" : 0 } } diff --git a/Tuist.swift b/Tuist.swift new file mode 100644 index 0000000000..e1a3a81b6e --- /dev/null +++ b/Tuist.swift @@ -0,0 +1,11 @@ +import ProjectDescription + +let tuist = Tuist( + project: .tuist( + swiftVersion: Version(5, 10, 0), + generationOptions: .options( + staticSideEffectsWarningTargets: .all, + enforceExplicitDependencies: true + ) + ) +) diff --git a/Tuist/Package.resolved b/Tuist/Package.resolved new file mode 100644 index 0000000000..592c03c60c --- /dev/null +++ b/Tuist/Package.resolved @@ -0,0 +1,68 @@ +{ + "originHash" : "307cbbbed5d781834365009af8023abbc6ef88a08803b78642391c6cfb4b3ab3", + "pins" : [ + { + "identity" : "cwlcatchexception", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlCatchException.git", + "state" : { + "revision" : "07b2ba21d361c223e25e3c1e924288742923f08c", + "version" : "2.2.1" + } + }, + { + "identity" : "cwlpreconditiontesting", + "kind" : "remoteSourceControl", + "location" : "https://github.com/mattgallagher/CwlPreconditionTesting.git", + "state" : { + "revision" : "0139c665ebb45e6a9fbdb68aabfd7c39f3fe0071", + "version" : "2.2.2" + } + }, + { + "identity" : "nimble", + "kind" : "remoteSourceControl", + "location" : "https://github.com/quick/nimble", + "state" : { + "revision" : "7795df4fff1a9cd231fe4867ae54f4dc5f5734f9", + "version" : "13.7.1" + } + }, + { + "identity" : "ohhttpstubs", + "kind" : "remoteSourceControl", + "location" : "https://github.com/AliSoftware/OHHTTPStubs", + "state" : { + "branch" : "9.1.0", + "revision" : "12f19662426d0434d6c330c6974d53e2eb10ecd9" + } + }, + { + "identity" : "purchases-ios", + "kind" : "remoteSourceControl", + "location" : "https://github.com/RevenueCat/purchases-ios", + "state" : { + "branch" : "main", + "revision" : "b715caf85ab9298db7ab16976ac3ed196a837993" + } + }, + { + "identity" : "purchases-ios-spm", + "kind" : "remoteSourceControl", + "location" : "https://github.com/RevenueCat/purchases-ios-spm", + "state" : { + "branch" : "3.14.4", + "revision" : "590804fc3a141fb52762b9232ba5791fce645fe7" + } + }, + { + "identity" : "swift-snapshot-testing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-snapshot-testing", + "state" : { + "revision" : "26ed3a2b4a2df47917ca9b790a57f91285b923fb" + } + } + ], + "version" : 3 +} diff --git a/Tuist/Package.swift b/Tuist/Package.swift new file mode 100644 index 0000000000..7435899409 --- /dev/null +++ b/Tuist/Package.swift @@ -0,0 +1,45 @@ +// swift-tools-version: 6.0 +@preconcurrency import PackageDescription + +#if TUIST + import ProjectDescription + + let packageSettings = PackageSettings( + productTypes: [ + "Nimble": .framework, + "SnapshotTesting": .framework, // default is .staticFramework, + "RevenueCat": .framework, + "RevenueCatUI": .framework, + "Purchases": .framework, + "OHHTTPStubs": .framework, + "OHHTTPStubsSwift": .framework + ] + ) + +#endif + +let package = Package( + name: "Dependencies", + dependencies: [ + .package( + url: "https://github.com/quick/nimble", + exact: "13.7.1" + ), + .package( + url: "https://github.com/pointfreeco/swift-snapshot-testing", + revision: "26ed3a2b4a2df47917ca9b790a57f91285b923fb" + ), + .package( + url: "https://github.com/RevenueCat/purchases-ios", + branch: "main" + ), + .package( + url: "https://github.com/RevenueCat/purchases-ios-spm", + revision: "3.14.4" + ), + .package( + url: "https://github.com/AliSoftware/OHHTTPStubs", + revision: "9.1.0" + ) + ] +) diff --git a/Tuist/ProjectDescriptionHelpers/DeploymentTargets.swift b/Tuist/ProjectDescriptionHelpers/DeploymentTargets.swift new file mode 100644 index 0000000000..ff1d0d597b --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/DeploymentTargets.swift @@ -0,0 +1,15 @@ +import ProjectDescription + +extension DeploymentTargets { + + /// Deployment targets for all RevenueCat targets (RevenueCat, RevenueCatUI) + public static var allRevenueCat: DeploymentTargets { + .multiplatform( + iOS: "13.0", + macOS: "10.15", + watchOS: "6.2", + tvOS: "13.0", + visionOS: "1.0" + ) + } +} diff --git a/Tuist/ProjectDescriptionHelpers/Destinations.swift b/Tuist/ProjectDescriptionHelpers/Destinations.swift new file mode 100644 index 0000000000..3648c350bb --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/Destinations.swift @@ -0,0 +1,19 @@ +import ProjectDescription + +extension Destinations { + + /// Destinations for all RevenueCat targets (RevenueCat, RevenueCatUI) + public static var allRevenueCat: Destinations { + [ + .iPhone, + .iPad, + .mac, + .macWithiPadDesign, + .macCatalyst, + .appleWatch, + .appleTv, + .appleVision, + .appleVisionWithiPadDesign + ] + } +} diff --git a/Tuist/ProjectDescriptionHelpers/Environment.swift b/Tuist/ProjectDescriptionHelpers/Environment.swift new file mode 100644 index 0000000000..ded1b56906 --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/Environment.swift @@ -0,0 +1,18 @@ +import ProjectDescription + +extension Environment { + /// Returns whether the current environment is local. + /// This is determined by the `rcLocal` environment variable, defaulting to `true` if not set. + /// + /// Example usage: + /// ```bash + /// # Generate project with local environment (default) + /// tuist generate + /// + /// # Generate project with non-local environment + /// TUIST_RC_LOCAL=false tuist generate + /// ``` + public static var local: Bool { + Environment.rcLocal.getBoolean(default: true) + } +} diff --git a/Tuist/ProjectDescriptionHelpers/Strings.swift b/Tuist/ProjectDescriptionHelpers/Strings.swift new file mode 100644 index 0000000000..c733676fc3 --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/Strings.swift @@ -0,0 +1,14 @@ +import ProjectDescription + +extension String { + + /// Enable custom entitlement computation key + public static let enableCustomEntitlementComputation: String = "ENABLE_CUSTOM_ENTITLEMENT_COMPUTATION" + + /// The team ID for RevenueCat + public static let revenueCatTeamID: String = "8SXR2327BM" + + /// The name of the RevenueCat team + public static let revenueCatOrgName: String = "RevenueCat, Inc." + +} diff --git a/Tuist/ProjectDescriptionHelpers/TargetDependencies.swift b/Tuist/ProjectDescriptionHelpers/TargetDependencies.swift new file mode 100644 index 0000000000..04b38cb186 --- /dev/null +++ b/Tuist/ProjectDescriptionHelpers/TargetDependencies.swift @@ -0,0 +1,107 @@ +import ProjectDescription + +extension TargetDependency { + /// Returns a RevenueCat dependency that can be either local or external + /// - Parameter local: If true, returns a local project dependency. If false, returns an external dependency + /// from spm + /// - Returns: A TargetDependency for RevenueCat + public static var revenueCat: TargetDependency { + if Environment.local { + .project( + target: "RevenueCat", + path: .relativeToRoot("Projects/RevenueCat") + ) + } else { + .revenueCatLocal + } + } + + /// Returns a local RevenueCat dependency from SPM + /// - Returns: A TargetDependency for RevenueCat from external source + public static var revenueCatLocal: TargetDependency { + .external( + name: "RevenueCat" + ) + } + + /// Returns a RevenueCat dependency with custom entitlement computation enabled + /// - Returns: A TargetDependency for RevenueCat_CustomEntitlementComputation + public static var revenueCatCustomEntitlementComputation: TargetDependency { + .project( + target: "RevenueCat_CustomEntitlementComputation", + path: .relativeToRoot("Projects/RevenueCat") + ) + } + + /// Returns a RevenueCatUI dependency that can be either local or external + /// - Parameter local: If true, returns a local project dependency. If false, returns an external dependency + /// from spm + /// - Returns: A TargetDependency for RevenueCatUI + public static var revenueCatUI: TargetDependency { + if Environment.local { + .project( + target: "RevenueCatUI", + path: .relativeToRoot("Projects/RevenueCatUI") + ) + } else { + .revenueCatUILocal + } + } + + /// Returns a local RevenueCatUI dependency from SPM + /// - Returns: A TargetDependency for RevenueCatUI from external source + public static var revenueCatUILocal: TargetDependency { + .external( + name: "RevenueCatUI" + ) + } + + /// Returns a ReceiptParser dependency + /// - Returns: A TargetDependency for ReceiptParser + public static var receiptparser: TargetDependency { + .project( + target: "ReceiptParser", + path: .relativeToRoot("Projects/RevenueCat") + ) + } + + /// Returns a dependency for the Nimble testing framework + /// - Returns: A TargetDependency for Nimble + public static var nimble: TargetDependency { + .external( + name: "Nimble" + ) + } + + /// Returns a dependency for the SnapshotTesting framework + /// - Returns: A TargetDependency for SnapshotTesting + public static var snapshotTesting: TargetDependency { + .external( + name: "SnapshotTesting" + ) + } + + /// Returns a dependency for the OHHTTPStubs framework + /// - Returns: A TargetDependency for OHHTTPStubs + public static var ohHTTPStubs: TargetDependency { + .external(name: "OHHTTPStubs") + } + + /// Returns a dependency for the OHHTTPStubsSwift framework + /// - Returns: A TargetDependency for OHHTTPStubsSwift + public static var ohHTTPStubsSwift: TargetDependency { + .external(name: "OHHTTPStubsSwift") + } + + /// Returns a dependency for the StoreKit framework + /// - Returns: A TargetDependency for StoreKit + public static var storeKit: TargetDependency { + .sdk(name: "StoreKit", type: .framework) + } + + /// Returns a dependency for the StoreKitTest framework + /// - Returns: A TargetDependency for StoreKitTest + public static var storeKitTests: TargetDependency { + .sdk(name: "StoreKitTest", type: .framework) + } +} diff --git a/Workspace.swift b/Workspace.swift new file mode 100644 index 0000000000..fbb7a80600 --- /dev/null +++ b/Workspace.swift @@ -0,0 +1,35 @@ +import Foundation +import ProjectDescription +import ProjectDescriptionHelpers + +var projects: [Path] = [ + "./Examples/rc-maestro/", + "./Examples/MagicWeather/", + "./Examples/MagicWeatherSwiftUI/", + "./Examples/testCustomEntitlementsComputation/", + "./Examples/PurchaseTester/", + "./Projects/PaywallTester", + "./Projects/APITesters" +] + +if Environment.local { + projects.append("./Projects/RevenueCat") + projects.append("./Projects/RevenueCatUI") +} else { + // Needs 3.0.0 of Purchases. + // Only when TUIST_RC_LOCAL=false tuist generate + projects.append("./Projects/v3LoadShedderIntegration") +} + +var additionalFiles: [FileElement] = [ + .glob(pattern: "Global.xcconfig") +] +if FileManager.default.fileExists(atPath: "Local.xcconfig") { + additionalFiles.append(.glob(pattern: "Local.xcconfig")) +} + +let workspace = Workspace( + name: "RevenueCat-Workspace", + projects: projects, + additionalFiles: additionalFiles +)