diff --git a/build.gradle.kts b/build.gradle.kts index 09329006..7fa6d01a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,6 +11,12 @@ plugins { kotlin(Plugins.KOTLIN_SERIALIZATION) version Versions.KOTLIN } +buildscript { + dependencies { + classpath(Dependencies.Moko.RESOURCES_GENERATOR) + } +} + detekt { toolVersion = Versions.DETEKT config.setFrom("detekt.yml") diff --git a/buildSrc/src/main/java/Configurations.kt b/buildSrc/src/main/java/Configurations.kt index 197f0a3c..84cfa1e6 100644 --- a/buildSrc/src/main/java/Configurations.kt +++ b/buildSrc/src/main/java/Configurations.kt @@ -29,5 +29,7 @@ object Plugins { const val KOVER = "org.jetbrains.kotlinx.kover" const val KSP = "com.google.devtools.ksp" + const val MOKO = "dev.icerock.mobile.multiplatform-resources" + const val MULTIPLATFORM = "multiplatform" } diff --git a/buildSrc/src/main/java/Dependencies.kt b/buildSrc/src/main/java/Dependencies.kt index 1f438c1c..41bddbd6 100644 --- a/buildSrc/src/main/java/Dependencies.kt +++ b/buildSrc/src/main/java/Dependencies.kt @@ -32,6 +32,9 @@ object Versions { const val MOCKATIVE = "1.3.0" const val MOCKK = "1.13.3" + const val MOKO_RESOURCES = "0.23.0" + const val MOKO_GRAPHICS = "0.9.0" + const val NAPIER = "2.6.1" const val ROBOLECTRIC = "4.9.1" @@ -87,6 +90,13 @@ object Dependencies { const val TIMBER = "com.jakewharton.timber:timber:${Versions.TIMBER}" } + object Moko { + const val RESOURCES_GENERATOR = "dev.icerock.moko:resources-generator:${Versions.MOKO_RESOURCES}" + const val RESOURCES = "dev.icerock.moko:resources:${Versions.MOKO_RESOURCES}" + const val RESOURCES_COMPOSE = "dev.icerock.moko:resources-compose:${Versions.MOKO_RESOURCES}" + const val GRAPHICS = "dev.icerock.moko:graphics:${Versions.MOKO_GRAPHICS}" + } + object Test { const val COMPOSE_UI_TEST_JUNIT = "androidx.compose.ui:ui-test-junit4:${Versions.COMPOSE}" const val COMPOSE_UI_TEST_MANIFEST = "androidx.compose.ui:ui-test-manifest:${Versions.COMPOSE}" @@ -102,6 +112,8 @@ object Dependencies { const val MOCKK = "io.mockk:mockk:${Versions.MOCKK}" const val MOCKK_ANDROID = "io.mockk:mockk-android:${Versions.MOCKK}" + const val MOKO_RESOURCES_TEST = "dev.icerock.moko:resources-test:${Versions.MOKO_RESOURCES}" + const val ROBOLECTRIC = "org.robolectric:robolectric:${Versions.ROBOLECTRIC}" const val TURBINE = "app.cash.turbine:turbine:${Versions.TURBINE}" diff --git a/sample/android/src/main/java/co/nimblehq/kmm/template/android/ui/screens/home/HomeScreen.kt b/sample/android/src/main/java/co/nimblehq/kmm/template/android/ui/screens/home/HomeScreen.kt index 5a1b8ea1..4c7396c5 100644 --- a/sample/android/src/main/java/co/nimblehq/kmm/template/android/ui/screens/home/HomeScreen.kt +++ b/sample/android/src/main/java/co/nimblehq/kmm/template/android/ui/screens/home/HomeScreen.kt @@ -4,9 +4,12 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material.* import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview -import co.nimblehq.kmm.template.Greeting +import co.nimblehq.kmm.template.Strings import co.nimblehq.kmm.template.android.ui.theme.ComposeTheme +import co.nimblehq.kmm.template.getPlatform +import co.nimblehq.kmm.template.sharedres.SharedRes @Composable fun HomeScreen() { @@ -14,7 +17,7 @@ fun HomeScreen() { modifier = Modifier.fillMaxSize(), color = MaterialTheme.colors.background ) { - Text(text = Greeting().greet()) + Text(text = Strings(LocalContext.current).get(id = SharedRes.strings.greeting, args = listOf(getPlatform().name))) } } diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 09329006..7fa6d01a 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -11,6 +11,12 @@ plugins { kotlin(Plugins.KOTLIN_SERIALIZATION) version Versions.KOTLIN } +buildscript { + dependencies { + classpath(Dependencies.Moko.RESOURCES_GENERATOR) + } +} + detekt { toolVersion = Versions.DETEKT config.setFrom("detekt.yml") diff --git a/sample/buildSrc/src/main/java/Configurations.kt b/sample/buildSrc/src/main/java/Configurations.kt index 197f0a3c..84cfa1e6 100644 --- a/sample/buildSrc/src/main/java/Configurations.kt +++ b/sample/buildSrc/src/main/java/Configurations.kt @@ -29,5 +29,7 @@ object Plugins { const val KOVER = "org.jetbrains.kotlinx.kover" const val KSP = "com.google.devtools.ksp" + const val MOKO = "dev.icerock.mobile.multiplatform-resources" + const val MULTIPLATFORM = "multiplatform" } diff --git a/sample/buildSrc/src/main/java/Dependencies.kt b/sample/buildSrc/src/main/java/Dependencies.kt index 1f438c1c..41bddbd6 100644 --- a/sample/buildSrc/src/main/java/Dependencies.kt +++ b/sample/buildSrc/src/main/java/Dependencies.kt @@ -32,6 +32,9 @@ object Versions { const val MOCKATIVE = "1.3.0" const val MOCKK = "1.13.3" + const val MOKO_RESOURCES = "0.23.0" + const val MOKO_GRAPHICS = "0.9.0" + const val NAPIER = "2.6.1" const val ROBOLECTRIC = "4.9.1" @@ -87,6 +90,13 @@ object Dependencies { const val TIMBER = "com.jakewharton.timber:timber:${Versions.TIMBER}" } + object Moko { + const val RESOURCES_GENERATOR = "dev.icerock.moko:resources-generator:${Versions.MOKO_RESOURCES}" + const val RESOURCES = "dev.icerock.moko:resources:${Versions.MOKO_RESOURCES}" + const val RESOURCES_COMPOSE = "dev.icerock.moko:resources-compose:${Versions.MOKO_RESOURCES}" + const val GRAPHICS = "dev.icerock.moko:graphics:${Versions.MOKO_GRAPHICS}" + } + object Test { const val COMPOSE_UI_TEST_JUNIT = "androidx.compose.ui:ui-test-junit4:${Versions.COMPOSE}" const val COMPOSE_UI_TEST_MANIFEST = "androidx.compose.ui:ui-test-manifest:${Versions.COMPOSE}" @@ -102,6 +112,8 @@ object Dependencies { const val MOCKK = "io.mockk:mockk:${Versions.MOCKK}" const val MOCKK_ANDROID = "io.mockk:mockk-android:${Versions.MOCKK}" + const val MOKO_RESOURCES_TEST = "dev.icerock.moko:resources-test:${Versions.MOKO_RESOURCES}" + const val ROBOLECTRIC = "org.robolectric:robolectric:${Versions.ROBOLECTRIC}" const val TURBINE = "app.cash.turbine:turbine:${Versions.TURBINE}" diff --git a/sample/ios/ArkanaKeys/ArkanaKeys/Sources/ArkanaKeys.swift b/sample/ios/ArkanaKeys/ArkanaKeys/Sources/ArkanaKeys.swift index 124a9d2a..ad861331 100644 --- a/sample/ios/ArkanaKeys/ArkanaKeys/Sources/ArkanaKeys.swift +++ b/sample/ios/ArkanaKeys/ArkanaKeys/Sources/ArkanaKeys.swift @@ -7,7 +7,7 @@ import ArkanaKeysInterfaces public enum ArkanaKeys { @inline(__always) fileprivate static let salt: [UInt8] = [ - 0xe1, 0x1e, 0xe3, 0x73, 0x8, 0x2, 0xc5, 0xda, 0x3, 0xc4, 0xc1, 0x22, 0x93, 0x5c, 0x77, 0xa1, 0x11, 0xb6, 0xe9, 0x84, 0xd1, 0xb, 0xc3, 0xc, 0x98, 0xfa, 0xe4, 0x9c, 0x5c, 0x23, 0x6d, 0x7, 0xe, 0x98, 0x71, 0xb4, 0x41, 0xaa, 0x94, 0x29, 0x9e, 0x88, 0x85, 0x62, 0x67, 0x7, 0xbe, 0x93, 0xf6, 0xb8, 0xd7, 0x5f, 0xb5, 0xa0, 0x7a, 0xa0, 0x80, 0x34, 0x3a, 0x54, 0xe9, 0xa5, 0x8e, 0x69 + 0x4c, 0x49, 0xe2, 0x40, 0xff, 0x2e, 0x42, 0xb0, 0xc4, 0x6d, 0xb6, 0x73, 0x13, 0xd0, 0x7, 0x48, 0xc6, 0x79, 0x39, 0xa8, 0x43, 0xb6, 0x4c, 0x31, 0x5f, 0x4d, 0x86, 0x4e, 0xb1, 0x2e, 0x42, 0xa0, 0xea, 0xab, 0xf1, 0x59, 0xc3, 0x32, 0xce, 0xb3, 0x7, 0x2f, 0x7a, 0x9b, 0x9e, 0x1c, 0xe3, 0xd2, 0x6, 0xdb, 0x8e, 0xc9, 0x43, 0x70, 0x3c, 0xdf, 0x87, 0x3d, 0x2c, 0xcd, 0x30, 0x60, 0x6a, 0xc0 ] static func decode(encoded: [UInt8], cipher: [UInt8]) -> String { diff --git a/sample/ios/ArkanaKeys/ArkanaKeys/Tests/ArkanaKeysTests.swift b/sample/ios/ArkanaKeys/ArkanaKeys/Tests/ArkanaKeysTests.swift index 24a2bc7d..93a93de9 100644 --- a/sample/ios/ArkanaKeys/ArkanaKeys/Tests/ArkanaKeysTests.swift +++ b/sample/ios/ArkanaKeys/ArkanaKeys/Tests/ArkanaKeysTests.swift @@ -13,7 +13,7 @@ final class ArkanaKeysTests: XCTestCase { override func setUp() { super.setUp() salt = [ - 0xe1, 0x1e, 0xe3, 0x73, 0x8, 0x2, 0xc5, 0xda, 0x3, 0xc4, 0xc1, 0x22, 0x93, 0x5c, 0x77, 0xa1, 0x11, 0xb6, 0xe9, 0x84, 0xd1, 0xb, 0xc3, 0xc, 0x98, 0xfa, 0xe4, 0x9c, 0x5c, 0x23, 0x6d, 0x7, 0xe, 0x98, 0x71, 0xb4, 0x41, 0xaa, 0x94, 0x29, 0x9e, 0x88, 0x85, 0x62, 0x67, 0x7, 0xbe, 0x93, 0xf6, 0xb8, 0xd7, 0x5f, 0xb5, 0xa0, 0x7a, 0xa0, 0x80, 0x34, 0x3a, 0x54, 0xe9, 0xa5, 0x8e, 0x69 + 0x4c, 0x49, 0xe2, 0x40, 0xff, 0x2e, 0x42, 0xb0, 0xc4, 0x6d, 0xb6, 0x73, 0x13, 0xd0, 0x7, 0x48, 0xc6, 0x79, 0x39, 0xa8, 0x43, 0xb6, 0x4c, 0x31, 0x5f, 0x4d, 0x86, 0x4e, 0xb1, 0x2e, 0x42, 0xa0, 0xea, 0xab, 0xf1, 0x59, 0xc3, 0x32, 0xce, 0xb3, 0x7, 0x2f, 0x7a, 0x9b, 0x9e, 0x1c, 0xe3, 0xd2, 0x6, 0xdb, 0x8e, 0xc9, 0x43, 0x70, 0x3c, 0xdf, 0x87, 0x3d, 0x2c, 0xcd, 0x30, 0x60, 0x6a, 0xc0 ] globalSecrets = ArkanaKeys.Global() } @@ -26,49 +26,49 @@ final class ArkanaKeysTests: XCTestCase { func test_decodeRandomHexKey_shouldDecode() { let encoded: [UInt8] = [ - 0xd6, 0x78, 0xd0, 0x11, 0x38, 0x32, 0xf5, 0xed, 0x36, 0xf2, 0xf6, 0x44, 0xf5, 0x6b, 0x43, 0xc2, 0x20, 0x87, 0xd9, 0xe5, 0xe1, 0x3c, 0xf4, 0x3a, 0xab, 0xc8, 0x82, 0xa5, 0x68, 0x46, 0x8, 0x37, 0x3e, 0xa9, 0x46, 0xd1, 0x79, 0x9e, 0xf7, 0x48, 0xfd, 0xba, 0xe1, 0x52, 0x57, 0x35, 0x8b, 0xa7, 0xcf, 0x89, 0xe4, 0x6c, 0xd3, 0xc2, 0x4b, 0x94, 0xb7, 0x2, 0x8, 0x64, 0xdb, 0x9d, 0xb6, 0x59, 0xd5, 0x29, 0x80, 0x11, 0x6b, 0x67, 0xf7, 0xec, 0x32, 0xf3, 0xf8, 0x44, 0xa6, 0x68, 0x16, 0x92, 0x27, 0x84, 0x8c, 0xb4, 0xb7, 0x69, 0xa1, 0x3e, 0xaf, 0xc3, 0xdc, 0xfa, 0x38, 0x46, 0x9, 0x34, 0x6d, 0xfc, 0x10, 0x8d, 0x24, 0xc8, 0xf5, 0x10, 0xac, 0xed, 0xb5, 0x5a, 0x1, 0x34, 0x8f, 0xa5, 0xce, 0x80, 0xe7, 0x69, 0xd1, 0x96, 0x1b, 0x94, 0xe1, 0x5, 0x59, 0x35, 0x8d, 0x94, 0xef, 0x5a + 0x2f, 0x7d, 0xd4, 0x24, 0x9d, 0x1e, 0x74, 0x80, 0xa6, 0x5d, 0x83, 0x12, 0x25, 0xe4, 0x33, 0x7e, 0xf4, 0x1d, 0xc, 0x9f, 0x25, 0xd0, 0x2a, 0x55, 0x3c, 0x7e, 0xbf, 0x2d, 0x87, 0x48, 0x7b, 0x91, 0x88, 0x9f, 0xc2, 0x61, 0xf7, 0x6, 0xfc, 0xd0, 0x63, 0x17, 0x42, 0xfd, 0xae, 0x7a, 0x87, 0xeb, 0x34, 0xe3, 0xbf, 0xaa, 0x20, 0x11, 0x59, 0xee, 0xe4, 0xb, 0x4a, 0xae, 0x7, 0x59, 0x59, 0xa6, 0x7f, 0x7e, 0x81, 0x26, 0xc8, 0x16, 0x76, 0x85, 0xa6, 0x5e, 0x85, 0x17, 0x24, 0xb5, 0x66, 0x78, 0xf6, 0x1b, 0x5f, 0x98, 0x76, 0x83, 0x7a, 0x50, 0x6e, 0x7e, 0xe5, 0x79, 0x83, 0x17, 0x21, 0xc3, 0xdb, 0x98, 0xc5, 0x6f, 0xfb, 0, 0xfa, 0xd2, 0x31, 0x17, 0x4d, 0xa2, 0xaf, 0x29, 0x81, 0xe0, 0x34, 0xbe, 0xb6, 0xf8, 0x70, 0x46, 0xc, 0xea, 0xe2, 0xe, 0x1c, 0xfc, 0x54, 0x2, 0xb, 0xf0 ] - XCTAssertEqual(ArkanaKeys.decode(encoded: encoded, cipher: salt), "7f3b0007567ff74c110a077632f94ee0017e84cac2d002549133fb147620288047cbce26179f54a362e0fbb2798fded3cda9eba92e08f3168806d6a4a1cad1a3") + XCTAssertEqual(ArkanaKeys.decode(encoded: encoded, cipher: salt), "c46db060b05a64462d57fffdc39c6f91b438442cd88f0fd9281ccae1c6fc793f37cf7845b33d7ea00bf0556a13c729cc1346824a687915b22e813605e301dba0") } func test_decodeRandomBase64Key_shouldDecode() { let encoded: [UInt8] = [ - 0xa6, 0x73, 0x96, 0x43, 0x31, 0x60, 0xa2, 0x91, 0x6c, 0xa2, 0xb7, 0x65, 0xa3, 0x6f, 0x43, 0xcc, 0x5e, 0xdc, 0xbd, 0xfc, 0x83, 0x4c, 0x85, 0x41, 0xfb, 0x8d, 0xa0, 0xc4, 0x5, 0x8, 0xb, 0x4f, 0x7b, 0xe2, 0x28, 0xf8, 0x31, 0xc2, 0xc6, 0x7c, 0xf9, 0xe3, 0xf5, 0x25, 0x55, 0x60, 0x88, 0xab, 0x98, 0x8a, 0x9b, 0x36, 0xf3, 0x8b, 0x36, 0xd4, 0xf9, 0x65, 0x5c, 0x12, 0xb9, 0x96, 0xd8, 0x3, 0xb5, 0x2b, 0xa7, 0x1f, 0x67, 0x6c, 0x8b, 0xeb, 0x60, 0x93, 0x88, 0x5a, 0xdf, 0x65, 0x35, 0xe7, 0x27, 0x8e, 0xbe, 0xab, 0x9d, 0x6c, 0xfe, 0x31 + 0x2a, 0x3, 0xb8, 0x21, 0xa8, 0x44, 0x36, 0xfa, 0xa5, 0x54, 0xf0, 0x4b, 0x5c, 0x94, 0x72, 0xc, 0xfe, 0x1d, 0x5d, 0xfc, 0x28, 0xc6, 0x1f, 0x5d, 0x34, 0x14, 0xb0, 0xf, 0xe8, 0x62, 0x30, 0x97, 0xb9, 0xf8, 0xc2, 0x31, 0x96, 0x77, 0xfb, 0x80, 0x70, 0x57, 0x28, 0xf7, 0xaf, 0x2d, 0xb6, 0x84, 0x67, 0x91, 0xfd, 0x9b, 0x22, 0x23, 0x45, 0xef, 0xb7, 0x68, 0x54, 0x83, 0x51, 0x4b, 0xe, 0xb5, 0x7, 0x78, 0x8f, 0x4, 0x85, 0x76, 0x75, 0xd7, 0xb4, 0x1a, 0xe2, 0xb, 0x5e, 0xa8, 0x53, 0x79, 0xa8, 0x36, 0x8, 0xda, 0x14, 0xd1, 0x71, 0xc ] - XCTAssertEqual(ArkanaKeys.decode(encoded: encoded, cipher: salt), "Gmu09bgKofvG034mOjTxRGFMcwDXY+fHuzYLphRUgkpG2g68n2LiF+LtyQfFP3VjT5DlonN1cWIxL9BF68W/Lg==") + XCTAssertEqual(ArkanaKeys.decode(encoded: encoded, cipher: salt), "fJZaWjtJa9F8ODuD8ddTkpSlkY6AYLr7SS3hUE53wxRl11UVaJsRaSy00UxNa+duK1mDzX7gpwTxMxT1nO1rWg==") } func test_decodeUUIDKey_shouldDecode() { let encoded: [UInt8] = [ - 0xd7, 0x29, 0xd5, 0x41, 0x30, 0x31, 0xfd, 0xee, 0x2e, 0xf4, 0xa7, 0x14, 0xa0, 0x71, 0x43, 0x94, 0x77, 0x87, 0xc4, 0xe6, 0xb5, 0x3f, 0xf6, 0x21, 0xfc, 0xca, 0xd3, 0xae, 0x3f, 0x17, 0x55, 0x33, 0x6f, 0xac, 0x10, 0x8d + 0x7d, 0x79, 0xd3, 0x74, 0xc6, 0x18, 0x74, 0xd3, 0xe9, 0xc, 0x86, 0x47, 0x21, 0xfd, 0x33, 0x78, 0xff, 0x4c, 0x14, 0xc9, 0x7a, 0x84, 0x2f, 0x1c, 0x6a, 0x29, 0xe4, 0x2b, 0x87, 0x48, 0x76, 0x90, 0xde, 0xcd, 0xc8, 0x6c ] - XCTAssertEqual(ArkanaKeys.decode(encoded: encoded, cipher: salt), "67628384-0f63-45f1-bd45-d072c484a4a9") + XCTAssertEqual(ArkanaKeys.decode(encoded: encoded, cipher: salt), "1014966c-a042-4095-a92c-5dbe6f404f95") } func test_decodeTrueBoolValue_shouldDecode() { let encoded: [UInt8] = [ - 0x95, 0x6c, 0x96, 0x16 + 0x38, 0x3b, 0x97, 0x25 ] XCTAssertTrue(ArkanaKeys.decode(encoded: encoded, cipher: salt)) } func test_decodeFalseBoolValue_shouldDecode() { let encoded: [UInt8] = [ - 0x87, 0x7f, 0x8f, 0, 0x6d + 0x2a, 0x28, 0x8e, 0x33, 0x9a ] XCTAssertFalse(ArkanaKeys.decode(encoded: encoded, cipher: salt)) } func test_decodeIntValue_shouldDecode() { let encoded: [UInt8] = [ - 0xd5, 0x2c + 0x78, 0x7b ] XCTAssertEqual(ArkanaKeys.decode(encoded: encoded, cipher: salt), 42) } func test_encodeAndDecodeValueWithDollarSign_shouldDecode() { let encoded: [UInt8] = [ - 0x93, 0x7b, 0x82, 0x1f, 0x57, 0x26, 0xa9, 0xb3, 0x6e, 0x9b, 0xb2, 0x4a, 0xf2, 0x38, 0xe + 0x3e, 0x2c, 0x83, 0x2c, 0xa0, 0xa, 0x2e, 0xd9, 0xa9, 0x32, 0xc5, 0x1b, 0x72, 0xb4, 0x7e ] XCTAssertEqual(ArkanaKeys.decode(encoded: encoded, cipher: salt), "real_$lim_shady") } diff --git a/sample/ios/Gemfile.lock b/sample/ios/Gemfile.lock index 447a6b79..853623a8 100644 --- a/sample/ios/Gemfile.lock +++ b/sample/ios/Gemfile.lock @@ -3,7 +3,7 @@ GEM specs: CFPropertyList (3.0.6) rexml - activesupport (7.0.7.2) + activesupport (7.0.8) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (>= 1.6, < 2) minitest (>= 5.1) @@ -20,7 +20,7 @@ GEM artifactory (3.0.15) atomos (0.1.3) aws-eventstream (1.2.0) - aws-partitions (1.813.0) + aws-partitions (1.820.0) aws-sdk-core (3.181.0) aws-eventstream (~> 1, >= 1.0.2) aws-partitions (~> 1, >= 1.651.0) @@ -193,7 +193,7 @@ GEM xcodeproj (>= 1.13.0, < 2.0.0) xcpretty (~> 0.3.0) xcpretty-travis-formatter (>= 0.0.3) - fastlane-plugin-firebase_app_distribution (0.7.2) + fastlane-plugin-firebase_app_distribution (0.7.3) google-apis-firebaseappdistribution_v1 (~> 0.3.0) ffi (1.15.5) fourflusher (2.3.1) @@ -235,10 +235,9 @@ GEM google-cloud-core (~> 1.6) googleauth (>= 0.16.2, < 2.a) mini_mime (~> 1.0) - googleauth (1.7.0) + googleauth (1.8.0) faraday (>= 0.17.3, < 3.a) jwt (>= 1.4, < 3.0) - memoist (~> 0.16) multi_json (~> 1.11) os (>= 0.9, < 2.0) signet (>= 0.16, < 2.a) @@ -255,10 +254,9 @@ GEM rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) - memoist (0.16.2) mini_magick (4.12.0) mini_mime (1.1.5) - minitest (5.19.0) + minitest (5.20.0) molinillo (0.8.0) multi_json (1.15.0) multipart-post (2.3.0) @@ -292,7 +290,7 @@ GEM addressable (>= 2.3.5) faraday (>= 0.17.3, < 3) security (0.1.3) - signet (0.17.0) + signet (0.18.0) addressable (~> 2.8) faraday (>= 0.17.5, < 3.a) jwt (>= 1.5, < 3.0) @@ -343,7 +341,7 @@ GEM yaml (0.2.1) PLATFORMS - x86_64-darwin-21 + x86_64-darwin-22 DEPENDENCIES arkana diff --git a/sample/ios/Podfile.lock b/sample/ios/Podfile.lock index c230a292..0840dac9 100644 --- a/sample/ios/Podfile.lock +++ b/sample/ios/Podfile.lock @@ -92,11 +92,12 @@ PODS: - RxSwift (6.5.0) - RxTest (6.5.0): - RxSwift (= 6.5.0) + - shared (1.0) - SnapKit (5.6.0) - Sourcery (2.0.2): - Sourcery/CLI-Only (= 2.0.2) - Sourcery/CLI-Only (2.0.2) - - SwiftFormat/CLI (0.52.2) + - SwiftFormat/CLI (0.52.3) - SwiftLint (0.52.4) - Wormholy (1.7.0) - xcbeautify (0.17.0) @@ -120,6 +121,7 @@ DEPENDENCIES: - RxNimble/RxBlocking - RxNimble/RxTest - RxSwift + - shared (from `../shared`) - SnapKit - Sourcery - SwiftFormat/CLI @@ -172,6 +174,8 @@ EXTERNAL SOURCES: NimbleExtension: :branch: master :git: https://github.com/nimblehq/NimbleExtension + shared: + :path: "../shared" CHECKOUT OPTIONS: NimbleExtension: @@ -210,13 +214,14 @@ SPEC CHECKSUMS: RxRelay: 1de1523e604c72b6c68feadedd1af3b1b4d0ecbd RxSwift: 5710a9e6b17f3c3d6e40d6e559b9fa1e813b2ef8 RxTest: eb2d23adefc5a5ebf5779c7792fa3edfe6ebcc17 + shared: be96e957c615a90e6b37a5fe0b691b64ce27be2a SnapKit: e01d52ebb8ddbc333eefe2132acf85c8227d9c25 Sourcery: 9ae7eb711f830e8c3c02b98dc28fbd7e32e9d971 - SwiftFormat: 7a8a87bc31cdf971d6e91712f5be72506baeb036 + SwiftFormat: 5de81c42f043741a16e17ae2da012bbddc7c0b58 SwiftLint: 1cc5cd61ba9bacb2194e340aeb47a2a37fda00b3 Wormholy: ab1c8c2f02f58587a0941deb0088555ffbf039a1 xcbeautify: 6e2f57af5c3a86d490376d5758030a8dcc201c1b -PODFILE CHECKSUM: 85d4cae5e270d7a65db55a5c553c6c13b91a7b7f +PODFILE CHECKSUM: 7277af75142fd321ea9a3e2b3c64366b8d31855c COCOAPODS: 1.12.1 diff --git a/sample/ios/sample.xcodeproj/project.pbxproj b/sample/ios/sample.xcodeproj/project.pbxproj index 1a0f016a..8d00f2e3 100644 --- a/sample/ios/sample.xcodeproj/project.pbxproj +++ b/sample/ios/sample.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 0B975608DEB5FC5F00024E82 /* .gitkeep in Resources */ = {isa = PBXBuildFile; fileRef = EFE5D281FD0FFFF44FC92B04 /* .gitkeep */; }; 0FCD70BBC15623E2843E571B /* .gitkeep in Resources */ = {isa = PBXBuildFile; fileRef = E4C58806C2B28AED0873F8AF /* .gitkeep */; }; + 16FABDDE0376AC552EF48BC2 /* Pods_sample_sampleKIFUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7665D48D6ABB78F6B2FC1BF9 /* Pods_sample_sampleKIFUITests.framework */; }; 18B4C2A55909888C5D0EDFDA /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6432B427D5097BCF75C4B15E /* AppDelegate.swift */; }; 1F3B8CA45E426F2E4BA8A41C /* R.generated.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1EEB8F8EE4393D2D9AC51316 /* R.generated.swift */; }; 20FF012BAC088FFC92962E28 /* UIView+Subviews.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDBCDCBA1D855D7023A0342F /* UIView+Subviews.swift */; }; @@ -21,16 +22,15 @@ 7ED0E12DA355DEE8EED0B614 /* Color+Application.swift in Sources */ = {isa = PBXBuildFile; fileRef = A29F97F67192DE9B66E872E6 /* Color+Application.swift */; }; 840CF0D3913B0069F0F2FF12 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D2F657F289C5314152FFCFA2 /* Assets.xcassets */; }; 8A43095CEA3F4C83584AB199 /* .gitkeep in Resources */ = {isa = PBXBuildFile; fileRef = 05F57F86A37A0E0B6CC54CB4 /* .gitkeep */; }; + 9435BD3AD06A5B549018CBEE /* Pods_sampleTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9055C147EB709E967C570C32 /* Pods_sampleTests.framework */; }; 9726C56684473F7E78415A58 /* Navigator+Scene.swift in Sources */ = {isa = PBXBuildFile; fileRef = A64B0E7B034D526205048030 /* Navigator+Scene.swift */; }; 9ACA6A5E938E3365302C3749 /* Navigator.swift in Sources */ = {isa = PBXBuildFile; fileRef = C159B27C88C08E8AEB22AFD4 /* Navigator.swift */; }; - 9B572CAD82F5648A06EF0314 /* Pods_sample_sampleKIFUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03BEA10CB7B6DEE29A61CC9B /* Pods_sample_sampleKIFUITests.framework */; }; - B8C7DBD0EBB8E47F77D77A39 /* Pods_sampleTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D7BF6B31569F36BD756160D7 /* Pods_sampleTests.framework */; }; BA754F29AB917D745895322D /* Constants+API.swift in Sources */ = {isa = PBXBuildFile; fileRef = 222B1BD9F71FF1797F160231 /* Constants+API.swift */; }; C152F2B63E42238BE4F20592 /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 82F5C2293A2DB24CDCA81957 /* Constants.swift */; }; CA324314BE7318252E4D5D62 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 6952456309E29C9609D23B3F /* LaunchScreen.storyboard */; }; D609A7DCE8B3E7A49CFACC2E /* Navigator+Transition.swift in Sources */ = {isa = PBXBuildFile; fileRef = F9816C413C0D0DD7B01BA9CE /* Navigator+Transition.swift */; }; DE665FDD6164065A881A2F44 /* .gitkeep in Resources */ = {isa = PBXBuildFile; fileRef = 67C0EA707F4FBB459FEBA640 /* .gitkeep */; }; - DF61A00144BEDB597677AFAB /* Pods_sample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9DF8B93967CC161BAE88D7E6 /* Pods_sample.framework */; }; + EE60199D886707F964DA5C41 /* Pods_sample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D6F3D88CA0BF962988A9D98C /* Pods_sample.framework */; }; F444409E14F8ED6BF6A2666A /* KIF+Swift.swift in Sources */ = {isa = PBXBuildFile; fileRef = EFAE58D40BFE459B1184D994 /* KIF+Swift.swift */; }; F858855AD6392D182B853A79 /* Optional+Unwrap.swift in Sources */ = {isa = PBXBuildFile; fileRef = 562EF605C844B951CD47F38D /* Optional+Unwrap.swift */; }; /* End PBXBuildFile section */ @@ -86,48 +86,48 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 01B45E2C9F888E5269388564 /* Pods-sampleTests.debug staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sampleTests.debug staging.xcconfig"; path = "Target Support Files/Pods-sampleTests/Pods-sampleTests.debug staging.xcconfig"; sourceTree = ""; }; - 03BEA10CB7B6DEE29A61CC9B /* Pods_sample_sampleKIFUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_sample_sampleKIFUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 04B8796D7472561BF8EB10A1 /* DebugProduction.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DebugProduction.xcconfig; sourceTree = ""; }; 05F57F86A37A0E0B6CC54CB4 /* .gitkeep */ = {isa = PBXFileReference; path = .gitkeep; sourceTree = ""; }; 18C176717B282B7A8842FC73 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; 1EEB8F8EE4393D2D9AC51316 /* R.generated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = R.generated.swift; sourceTree = ""; }; 222B1BD9F71FF1797F160231 /* Constants+API.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Constants+API.swift"; sourceTree = ""; }; + 2BE462306D50FAB1B877F8AD /* Pods-sample-sampleKIFUITests.release staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample-sampleKIFUITests.release staging.xcconfig"; path = "Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests.release staging.xcconfig"; sourceTree = ""; }; 302BB730B8D0BF901FF489B6 /* .gitkeep */ = {isa = PBXFileReference; path = .gitkeep; sourceTree = ""; }; 41210B648761A8DC4ABD3BB9 /* .gitkeep */ = {isa = PBXFileReference; path = .gitkeep; sourceTree = ""; }; 414B86B12605C252A692EA37 /* sampleKIFUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = sampleKIFUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 44331CC8E4C1C49B1BE0E896 /* Pods-sample-sampleKIFUITests.release staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample-sampleKIFUITests.release staging.xcconfig"; path = "Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests.release staging.xcconfig"; sourceTree = ""; }; + 51687B34F2B780CCD098588B /* Pods-sampleTests.release production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sampleTests.release production.xcconfig"; path = "Target Support Files/Pods-sampleTests/Pods-sampleTests.release production.xcconfig"; sourceTree = ""; }; 562EF605C844B951CD47F38D /* Optional+Unwrap.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Optional+Unwrap.swift"; sourceTree = ""; }; - 5E2F732FE10206795FDF97A0 /* Pods-sample-sampleKIFUITests.release production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample-sampleKIFUITests.release production.xcconfig"; path = "Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests.release production.xcconfig"; sourceTree = ""; }; + 59AD1055122098FD6FC6C056 /* Pods-sample-sampleKIFUITests.debug production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample-sampleKIFUITests.debug production.xcconfig"; path = "Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests.debug production.xcconfig"; sourceTree = ""; }; 6432B427D5097BCF75C4B15E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 67C0EA707F4FBB459FEBA640 /* .gitkeep */ = {isa = PBXFileReference; path = .gitkeep; sourceTree = ""; }; - 6881636BF664E9935E20AD46 /* Pods-sample.debug staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.debug staging.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.debug staging.xcconfig"; sourceTree = ""; }; 6952456309E29C9609D23B3F /* LaunchScreen.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; - 6DAF1A76B695970472FE8753 /* Pods-sampleTests.release production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sampleTests.release production.xcconfig"; path = "Target Support Files/Pods-sampleTests/Pods-sampleTests.release production.xcconfig"; sourceTree = ""; }; + 7665D48D6ABB78F6B2FC1BF9 /* Pods_sample_sampleKIFUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_sample_sampleKIFUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 82F5C2293A2DB24CDCA81957 /* Constants.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Constants.swift; sourceTree = ""; }; - 840F9001316ABA7052841819 /* Pods-sample-sampleKIFUITests.debug production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample-sampleKIFUITests.debug production.xcconfig"; path = "Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests.debug production.xcconfig"; sourceTree = ""; }; - 8A3B80310DD60972624107DC /* Pods-sample.release staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.release staging.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.release staging.xcconfig"; sourceTree = ""; }; + 831C5A12BFB002A8C75C742C /* Pods-sampleTests.release staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sampleTests.release staging.xcconfig"; path = "Target Support Files/Pods-sampleTests/Pods-sampleTests.release staging.xcconfig"; sourceTree = ""; }; 8CA52B4C8C3AF1CB2181C14D /* UseCaseFactoryProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UseCaseFactoryProtocol.swift; sourceTree = ""; }; - 8DB9CE8A29FEA7CC50C0B5BA /* Pods-sampleTests.release staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sampleTests.release staging.xcconfig"; path = "Target Support Files/Pods-sampleTests/Pods-sampleTests.release staging.xcconfig"; sourceTree = ""; }; - 8F5DD1ABDC680B941C2D4141 /* Pods-sample.release production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.release production.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.release production.xcconfig"; sourceTree = ""; }; - 9DF8B93967CC161BAE88D7E6 /* Pods_sample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_sample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9055C147EB709E967C570C32 /* Pods_sampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_sampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9C8290774CB56E4ACECC66ED /* Pods-sample.release staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.release staging.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.release staging.xcconfig"; sourceTree = ""; }; A29F97F67192DE9B66E872E6 /* Color+Application.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Color+Application.swift"; sourceTree = ""; }; + A2CC930F0F5CAAF2C0B66F65 /* Pods-sample.debug production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.debug production.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.debug production.xcconfig"; sourceTree = ""; }; A64B0E7B034D526205048030 /* Navigator+Scene.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Navigator+Scene.swift"; sourceTree = ""; }; - A8935DC06D0CBFF9709D60D5 /* Pods-sample-sampleKIFUITests.debug staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample-sampleKIFUITests.debug staging.xcconfig"; path = "Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests.debug staging.xcconfig"; sourceTree = ""; }; + AB1332462C102DE6807468F9 /* Pods-sample-sampleKIFUITests.release production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample-sampleKIFUITests.release production.xcconfig"; path = "Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests.release production.xcconfig"; sourceTree = ""; }; ADE63A1C257C06E1D05C8136 /* DebugStaging.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = DebugStaging.xcconfig; sourceTree = ""; }; + B08F879D4FEE3665DE289059 /* Pods-sample-sampleKIFUITests.debug staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample-sampleKIFUITests.debug staging.xcconfig"; path = "Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests.debug staging.xcconfig"; sourceTree = ""; }; B8847183C3FF3D70FE4192CD /* sampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = sampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - BBB67085769D456537EA372D /* Pods-sampleTests.debug production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sampleTests.debug production.xcconfig"; path = "Target Support Files/Pods-sampleTests/Pods-sampleTests.debug production.xcconfig"; sourceTree = ""; }; BBD1568B768046A18E011F2C /* HomeViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; BBF1B234787FCD92142B105D /* AutoMockable.generated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoMockable.generated.swift; sourceTree = ""; }; BD9D9C9A495C5EA0AE9039C6 /* ReleaseProduction.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = ReleaseProduction.xcconfig; sourceTree = ""; }; C159B27C88C08E8AEB22AFD4 /* Navigator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Navigator.swift; sourceTree = ""; }; - CD21AA8F176DDB7A0FF39393 /* Pods-sample.debug production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.debug production.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.debug production.xcconfig"; sourceTree = ""; }; + CB6B8B8BB4D65544091A3C08 /* Pods-sampleTests.debug production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sampleTests.debug production.xcconfig"; path = "Target Support Files/Pods-sampleTests/Pods-sampleTests.debug production.xcconfig"; sourceTree = ""; }; CD3A7C3AC94E15DEC4F12A85 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; CDBCDCBA1D855D7023A0342F /* UIView+Subviews.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Subviews.swift"; sourceTree = ""; }; D2D7345A2017D2D372785123 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = Info.plist; sourceTree = ""; }; D2F657F289C5314152FFCFA2 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - D7BF6B31569F36BD756160D7 /* Pods_sampleTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_sampleTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + D6F3D88CA0BF962988A9D98C /* Pods_sample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_sample.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + DC55802204951CAA5A317E64 /* Pods-sampleTests.debug staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sampleTests.debug staging.xcconfig"; path = "Target Support Files/Pods-sampleTests/Pods-sampleTests.debug staging.xcconfig"; sourceTree = ""; }; E4C58806C2B28AED0873F8AF /* .gitkeep */ = {isa = PBXFileReference; path = .gitkeep; sourceTree = ""; }; + E5F956798FF147318574F319 /* Pods-sample.debug staging.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.debug staging.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.debug staging.xcconfig"; sourceTree = ""; }; + EAA11FD7D1FAF60B5EADEF10 /* Pods-sample.release production.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-sample.release production.xcconfig"; path = "Target Support Files/Pods-sample/Pods-sample.release production.xcconfig"; sourceTree = ""; }; EFAE58D40BFE459B1184D994 /* KIF+Swift.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KIF+Swift.swift"; sourceTree = ""; }; EFE5D281FD0FFFF44FC92B04 /* .gitkeep */ = {isa = PBXFileReference; path = .gitkeep; sourceTree = ""; }; F5B819017A28FE15B242BB5B /* Typealiases.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Typealiases.swift; sourceTree = ""; }; @@ -141,7 +141,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 9B572CAD82F5648A06EF0314 /* Pods_sample_sampleKIFUITests.framework in Frameworks */, + 16FABDDE0376AC552EF48BC2 /* Pods_sample_sampleKIFUITests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -149,7 +149,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - B8C7DBD0EBB8E47F77D77A39 /* Pods_sampleTests.framework in Frameworks */, + 9435BD3AD06A5B549018CBEE /* Pods_sampleTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -157,7 +157,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - DF61A00144BEDB597677AFAB /* Pods_sample.framework in Frameworks */, + EE60199D886707F964DA5C41 /* Pods_sample.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -261,9 +261,9 @@ 52B072A663159D9D007D540F /* Frameworks */ = { isa = PBXGroup; children = ( - 9DF8B93967CC161BAE88D7E6 /* Pods_sample.framework */, - 03BEA10CB7B6DEE29A61CC9B /* Pods_sample_sampleKIFUITests.framework */, - D7BF6B31569F36BD756160D7 /* Pods_sampleTests.framework */, + D6F3D88CA0BF962988A9D98C /* Pods_sample.framework */, + 7665D48D6ABB78F6B2FC1BF9 /* Pods_sample_sampleKIFUITests.framework */, + 9055C147EB709E967C570C32 /* Pods_sampleTests.framework */, ); name = Frameworks; sourceTree = ""; @@ -298,7 +298,7 @@ 9B7CF20BE2915B62911C62AA /* Project */, 52B072A663159D9D007D540F /* Frameworks */, 372816F20EC291B850EECF1F /* Products */, - ABD110A1A6F61AEFE2159B2C /* Pods */, + CB162150AAF1CB4AFCC66851 /* Pods */, ); sourceTree = ""; }; @@ -410,26 +410,6 @@ path = Application; sourceTree = ""; }; - ABD110A1A6F61AEFE2159B2C /* Pods */ = { - isa = PBXGroup; - children = ( - CD21AA8F176DDB7A0FF39393 /* Pods-sample.debug production.xcconfig */, - 6881636BF664E9935E20AD46 /* Pods-sample.debug staging.xcconfig */, - 8F5DD1ABDC680B941C2D4141 /* Pods-sample.release production.xcconfig */, - 8A3B80310DD60972624107DC /* Pods-sample.release staging.xcconfig */, - 840F9001316ABA7052841819 /* Pods-sample-sampleKIFUITests.debug production.xcconfig */, - A8935DC06D0CBFF9709D60D5 /* Pods-sample-sampleKIFUITests.debug staging.xcconfig */, - 5E2F732FE10206795FDF97A0 /* Pods-sample-sampleKIFUITests.release production.xcconfig */, - 44331CC8E4C1C49B1BE0E896 /* Pods-sample-sampleKIFUITests.release staging.xcconfig */, - BBB67085769D456537EA372D /* Pods-sampleTests.debug production.xcconfig */, - 01B45E2C9F888E5269388564 /* Pods-sampleTests.debug staging.xcconfig */, - 6DAF1A76B695970472FE8753 /* Pods-sampleTests.release production.xcconfig */, - 8DB9CE8A29FEA7CC50C0B5BA /* Pods-sampleTests.release staging.xcconfig */, - ); - name = Pods; - path = Pods; - sourceTree = ""; - }; ABEF6635E5835AF1887B4B45 /* Sources */ = { isa = PBXGroup; children = ( @@ -502,6 +482,26 @@ path = Utilities; sourceTree = ""; }; + CB162150AAF1CB4AFCC66851 /* Pods */ = { + isa = PBXGroup; + children = ( + A2CC930F0F5CAAF2C0B66F65 /* Pods-sample.debug production.xcconfig */, + E5F956798FF147318574F319 /* Pods-sample.debug staging.xcconfig */, + EAA11FD7D1FAF60B5EADEF10 /* Pods-sample.release production.xcconfig */, + 9C8290774CB56E4ACECC66ED /* Pods-sample.release staging.xcconfig */, + 59AD1055122098FD6FC6C056 /* Pods-sample-sampleKIFUITests.debug production.xcconfig */, + B08F879D4FEE3665DE289059 /* Pods-sample-sampleKIFUITests.debug staging.xcconfig */, + AB1332462C102DE6807468F9 /* Pods-sample-sampleKIFUITests.release production.xcconfig */, + 2BE462306D50FAB1B877F8AD /* Pods-sample-sampleKIFUITests.release staging.xcconfig */, + CB6B8B8BB4D65544091A3C08 /* Pods-sampleTests.debug production.xcconfig */, + DC55802204951CAA5A317E64 /* Pods-sampleTests.debug staging.xcconfig */, + 51687B34F2B780CCD098588B /* Pods-sampleTests.release production.xcconfig */, + 831C5A12BFB002A8C75C742C /* Pods-sampleTests.release staging.xcconfig */, + ); + name = Pods; + path = Pods; + sourceTree = ""; + }; D48587F0A17AA4E6B4E933F7 /* Resources */ = { isa = PBXGroup; children = ( @@ -570,7 +570,7 @@ isa = PBXNativeTarget; buildConfigurationList = 56FE2126489C1E87A2D918A3 /* Build configuration list for PBXNativeTarget "sample" */; buildPhases = ( - 3E041B93D87D28D68F71C236 /* [CP] Check Pods Manifest.lock */, + 813B99BFD4981AB6B9031865 /* [CP] Check Pods Manifest.lock */, B2B621CC2B1F4F58601CD98D /* Sourcery */, 7EB246CFC1E0CCBA652DC37E /* R.swift */, CF26733D03C8D33F8823EE1F /* SwiftLint */, @@ -580,7 +580,7 @@ 494614C33B509301DBBDAD42 /* Embed Frameworks */, 89C77BA3C707AD804F79284B /* Frameworks */, 843C67A8A78058B8D8B3D11E /* Copy GoogleService-Info.plist */, - C8D448AA1EA81C955E48A4C4 /* [CP] Embed Pods Frameworks */, + 6D022F3CA9FDC1720325F6F7 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -595,12 +595,12 @@ isa = PBXNativeTarget; buildConfigurationList = 31E84C030BDB7A39BCE38D8C /* Build configuration list for PBXNativeTarget "sampleKIFUITests" */; buildPhases = ( - 88EB0BE58BA6474A0E8A1971 /* [CP] Check Pods Manifest.lock */, + 1B5516FC2D0CB1EF7D829270 /* [CP] Check Pods Manifest.lock */, 21ADDF0B071B770FFB6A086A /* Sources */, 43218B877C978B4CA5B93235 /* Resources */, 392BFB718CBF57CF0D23848E /* Embed Frameworks */, 29CEF4F9FF315D4254B8BC69 /* Frameworks */, - 52759233B4C5DBB595F21FA8 /* [CP] Embed Pods Frameworks */, + 497314E8B9EA368761FE9CD8 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -616,13 +616,13 @@ isa = PBXNativeTarget; buildConfigurationList = C3875EBB5A0F6612B3515A13 /* Build configuration list for PBXNativeTarget "sampleTests" */; buildPhases = ( - E539E41456501BCCDF34A9A2 /* [CP] Check Pods Manifest.lock */, + C9E0F36F141635EA32F101BB /* [CP] Check Pods Manifest.lock */, 2F7B6AB35D89AA83D514ECC2 /* SwiftFormat */, 9344943859735CAEA8DDB048 /* Sources */, E472A2AC48FE9588146AB254 /* Resources */, 51D3263E7013F91DCDB0D884 /* Embed Frameworks */, 7A7AFF7C6576A774E896CA81 /* Frameworks */, - 04C1A3263A9F6E783F4E0B4B /* [CP] Embed Pods Frameworks */, + 7E48413130C77D84EC8BA2DB /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -703,21 +703,26 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 04C1A3263A9F6E783F4E0B4B /* [CP] Embed Pods Frameworks */ = { + 1B5516FC2D0CB1EF7D829270 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-sampleTests/Pods-sampleTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-sampleTests/Pods-sampleTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-sample-sampleKIFUITests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-sampleTests/Pods-sampleTests-frameworks.sh\"\n"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; 2F7B6AB35D89AA83D514ECC2 /* SwiftFormat */ = { @@ -738,67 +743,60 @@ shellPath = /bin/sh; shellScript = "if [ -z \"$CI\" ]; then\n \"${PODS_ROOT}/SwiftFormat/CommandLineTool/swiftformat\" \"$SRCROOT\"\nfi"; }; - 3E041B93D87D28D68F71C236 /* [CP] Check Pods Manifest.lock */ = { + 497314E8B9EA368761FE9CD8 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", - ); - name = "[CP] Check Pods Manifest.lock"; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-sample-checkManifestLockResult.txt", + "${PODS_ROOT}/Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 52759233B4C5DBB595F21FA8 /* [CP] Embed Pods Frameworks */ = { + 6D022F3CA9FDC1720325F6F7 /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests-frameworks-${CONFIGURATION}-input-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests-frameworks-${CONFIGURATION}-output-files.xcfilelist", + "${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-sample-sampleKIFUITests/Pods-sample-sampleKIFUITests-frameworks.sh\"\n"; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks.sh\"\n"; showEnvVarsInLog = 0; }; - 7EB246CFC1E0CCBA652DC37E /* R.swift */ = { + 7E48413130C77D84EC8BA2DB /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; - alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-sampleTests/Pods-sampleTests-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - inputPaths = ( - ); - name = R.swift; + name = "[CP] Embed Pods Frameworks"; outputFileListPaths = ( - ); - outputPaths = ( - "$SRCROOT/$PROJECT_NAME/Sources/Supports/Helpers/Rswift/R.generated.swift", + "${PODS_ROOT}/Target Support Files/Pods-sampleTests/Pods-sampleTests-frameworks-${CONFIGURATION}-output-files.xcfilelist", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$PODS_ROOT/R.swift/rswift\" generate \"$SRCROOT/$PROJECT_NAME/Sources/Supports/Helpers/Rswift/R.generated.swift\""; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-sampleTests/Pods-sampleTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; }; - 843C67A8A78058B8D8B3D11E /* Copy GoogleService-Info.plist */ = { + 7EB246CFC1E0CCBA652DC37E /* R.swift */ = { isa = PBXShellScriptBuildPhase; + alwaysOutOfDate = 1; buildActionMask = 2147483647; files = ( ); @@ -806,16 +804,17 @@ ); inputPaths = ( ); - name = "Copy GoogleService-Info.plist"; + name = R.swift; outputFileListPaths = ( ); outputPaths = ( + "$SRCROOT/$PROJECT_NAME/Sources/Supports/Helpers/Rswift/R.generated.swift", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "PATH_TO_GOOGLE_PLISTS=\"$SRCROOT/$PROJECT_NAME/Configurations/Plists/GoogleService\"\n\ncase \"${CONFIGURATION}\" in\n\"Debug Staging\" | \"Release Staging\" )\ncp -r \"$PATH_TO_GOOGLE_PLISTS/Staging/GoogleService-Info.plist\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist\"\n;;\n\"Debug Production\" | \"Release Production\" )\ncp -r \"$PATH_TO_GOOGLE_PLISTS/Production/GoogleService-Info.plist\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist\"\n;;\n*)\n;;\nesac"; + shellScript = "\"$PODS_ROOT/R.swift/rswift\" generate \"$SRCROOT/$PROJECT_NAME/Sources/Supports/Helpers/Rswift/R.generated.swift\""; }; - 88EB0BE58BA6474A0E8A1971 /* [CP] Check Pods Manifest.lock */ = { + 813B99BFD4981AB6B9031865 /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -830,14 +829,14 @@ outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-sample-sampleKIFUITests-checkManifestLockResult.txt", + "$(DERIVED_FILE_DIR)/Pods-sample-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - B2B621CC2B1F4F58601CD98D /* Sourcery */ = { + 843C67A8A78058B8D8B3D11E /* Copy GoogleService-Info.plist */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -846,33 +845,34 @@ ); inputPaths = ( ); - name = Sourcery; + name = "Copy GoogleService-Info.plist"; outputFileListPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"$PODS_ROOT/Sourcery/bin/sourcery\""; + shellScript = "PATH_TO_GOOGLE_PLISTS=\"$SRCROOT/$PROJECT_NAME/Configurations/Plists/GoogleService\"\n\ncase \"${CONFIGURATION}\" in\n\"Debug Staging\" | \"Release Staging\" )\ncp -r \"$PATH_TO_GOOGLE_PLISTS/Staging/GoogleService-Info.plist\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist\"\n;;\n\"Debug Production\" | \"Release Production\" )\ncp -r \"$PATH_TO_GOOGLE_PLISTS/Production/GoogleService-Info.plist\" \"${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/GoogleService-Info.plist\"\n;;\n*)\n;;\nesac"; }; - C8D448AA1EA81C955E48A4C4 /* [CP] Embed Pods Frameworks */ = { + B2B621CC2B1F4F58601CD98D /* Sourcery */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks-${CONFIGURATION}-input-files.xcfilelist", ); - name = "[CP] Embed Pods Frameworks"; + inputPaths = ( + ); + name = Sourcery; outputFileListPaths = ( - "${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks-${CONFIGURATION}-output-files.xcfilelist", + ); + outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-sample/Pods-sample-frameworks.sh\"\n"; - showEnvVarsInLog = 0; + shellScript = "\"$PODS_ROOT/Sourcery/bin/sourcery\""; }; - CF26733D03C8D33F8823EE1F /* SwiftLint */ = { + C9E0F36F141635EA32F101BB /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -880,17 +880,21 @@ inputFileListPaths = ( ); inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", ); - name = SwiftLint; + name = "[CP] Check Pods Manifest.lock"; outputFileListPaths = ( ); outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-sampleTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [ -z \"$CI\" ]; then\n ${PODS_ROOT}/SwiftLint/swiftlint\nfi"; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; }; - E539E41456501BCCDF34A9A2 /* [CP] Check Pods Manifest.lock */ = { + CF26733D03C8D33F8823EE1F /* SwiftLint */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -898,19 +902,15 @@ inputFileListPaths = ( ); inputPaths = ( - "${PODS_PODFILE_DIR_PATH}/Podfile.lock", - "${PODS_ROOT}/Manifest.lock", ); - name = "[CP] Check Pods Manifest.lock"; + name = SwiftLint; outputFileListPaths = ( ); outputPaths = ( - "$(DERIVED_FILE_DIR)/Pods-sampleTests-checkManifestLockResult.txt", ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; - showEnvVarsInLog = 0; + shellScript = "if [ -z \"$CI\" ]; then\n ${PODS_ROOT}/SwiftLint/swiftlint\nfi"; }; EF3878B82E1CD4611A640906 /* SwiftFormat Lint */ = { isa = PBXShellScriptBuildPhase; @@ -989,7 +989,7 @@ /* Begin XCBuildConfiguration section */ 21ACBFF0B81C5FE1926420D2 /* Debug Production */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 840F9001316ABA7052841819 /* Pods-sample-sampleKIFUITests.debug production.xcconfig */; + baseConfigurationReference = 59AD1055122098FD6FC6C056 /* Pods-sample-sampleKIFUITests.debug production.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1005,7 +1005,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sample.app/sample"; TEST_TARGET_NAME = sample; @@ -1014,7 +1014,7 @@ }; 252EA76B363BC50D825D8BD6 /* Debug Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 01B45E2C9F888E5269388564 /* Pods-sampleTests.debug staging.xcconfig */; + baseConfigurationReference = DC55802204951CAA5A317E64 /* Pods-sampleTests.debug staging.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1030,7 +1030,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sample.app/sample"; TEST_TARGET_NAME = sample; @@ -1039,7 +1039,7 @@ }; 388E6BE620787A06CA1CA7EE /* Release Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8A3B80310DD60972624107DC /* Pods-sample.release staging.xcconfig */; + baseConfigurationReference = 9C8290774CB56E4ACECC66ED /* Pods-sample.release staging.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1056,14 +1056,14 @@ SUPPORTS_MACCATALYST = NO; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = 1; }; name = "Release Staging"; }; 38F81F703A83D6A307430059 /* Release Production */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 5E2F732FE10206795FDF97A0 /* Pods-sample-sampleKIFUITests.release production.xcconfig */; + baseConfigurationReference = AB1332462C102DE6807468F9 /* Pods-sample-sampleKIFUITests.release production.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1078,7 +1078,7 @@ SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sample.app/sample"; TEST_TARGET_NAME = sample; @@ -1087,7 +1087,7 @@ }; 3BEDFE87FC2F0AE206422087 /* Release Production */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6DAF1A76B695970472FE8753 /* Pods-sampleTests.release production.xcconfig */; + baseConfigurationReference = 51687B34F2B780CCD098588B /* Pods-sampleTests.release production.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1102,7 +1102,7 @@ SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sample.app/sample"; TEST_TARGET_NAME = sample; @@ -1111,7 +1111,7 @@ }; 3E22885F8CD58F60301062E2 /* Release Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 44331CC8E4C1C49B1BE0E896 /* Pods-sample-sampleKIFUITests.release staging.xcconfig */; + baseConfigurationReference = 2BE462306D50FAB1B877F8AD /* Pods-sample-sampleKIFUITests.release staging.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1126,7 +1126,7 @@ SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sample.app/sample"; TEST_TARGET_NAME = sample; @@ -1135,7 +1135,7 @@ }; 4C1D6824327C0FD7CA0FD5EA /* Release Production */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8F5DD1ABDC680B941C2D4141 /* Pods-sample.release production.xcconfig */; + baseConfigurationReference = EAA11FD7D1FAF60B5EADEF10 /* Pods-sample.release production.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1152,7 +1152,7 @@ SUPPORTS_MACCATALYST = NO; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = 1; }; name = "Release Production"; @@ -1218,7 +1218,7 @@ }; 65EFF1C45B23F50B02803EAD /* Debug Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 6881636BF664E9935E20AD46 /* Pods-sample.debug staging.xcconfig */; + baseConfigurationReference = E5F956798FF147318574F319 /* Pods-sample.debug staging.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1236,14 +1236,14 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = 1; }; name = "Debug Staging"; }; 944F5AFF63FDFD18DB25D45F /* Debug Production */ = { isa = XCBuildConfiguration; - baseConfigurationReference = CD21AA8F176DDB7A0FF39393 /* Pods-sample.debug production.xcconfig */; + baseConfigurationReference = A2CC930F0F5CAAF2C0B66F65 /* Pods-sample.debug production.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1261,14 +1261,14 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = 1; }; name = "Debug Production"; }; A6CE62F8A695FBBC221E4690 /* Debug Production */ = { isa = XCBuildConfiguration; - baseConfigurationReference = BBB67085769D456537EA372D /* Pods-sampleTests.debug production.xcconfig */; + baseConfigurationReference = CB6B8B8BB4D65544091A3C08 /* Pods-sampleTests.debug production.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1284,7 +1284,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sample.app/sample"; TEST_TARGET_NAME = sample; @@ -1293,7 +1293,7 @@ }; B7E6733E7030283A3E74681B /* Debug Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = A8935DC06D0CBFF9709D60D5 /* Pods-sample-sampleKIFUITests.debug staging.xcconfig */; + baseConfigurationReference = B08F879D4FEE3665DE289059 /* Pods-sample-sampleKIFUITests.debug staging.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1309,7 +1309,7 @@ SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_COMPILATION_MODE = singlefile; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sample.app/sample"; TEST_TARGET_NAME = sample; @@ -1371,7 +1371,7 @@ }; BD91BBB9D406D96A13EB8291 /* Release Staging */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 8DB9CE8A29FEA7CC50C0B5BA /* Pods-sampleTests.release staging.xcconfig */; + baseConfigurationReference = 831C5A12BFB002A8C75C742C /* Pods-sampleTests.release staging.xcconfig */; buildSettings = { BUNDLE_LOADER = "$(TEST_HOST)"; CODE_SIGN_IDENTITY = "iPhone Developer"; @@ -1386,7 +1386,7 @@ SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.7.2; + SWIFT_VERSION = 5.8.1; TARGETED_DEVICE_FAMILY = "1,2"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/sample.app/sample"; TEST_TARGET_NAME = sample; diff --git a/sample/ios/sample/Configurations/Plists/Info.plist b/sample/ios/sample/Configurations/Plists/Info.plist index b18749da..79ad0959 100644 --- a/sample/ios/sample/Configurations/Plists/Info.plist +++ b/sample/ios/sample/Configurations/Plists/Info.plist @@ -24,8 +24,12 @@ armv7 - UILaunchStoryboardName - LaunchScreen + CFBundleLocalizations + + en + + UILaunchStoryboardName + LaunchScreen UISupportedInterfaceOrientations UIInterfaceOrientationPortrait diff --git a/sample/ios/sample/Sources/Presentation/Modules/HomeViewController.swift b/sample/ios/sample/Sources/Presentation/Modules/HomeViewController.swift index a9afdb16..3742bbe0 100644 --- a/sample/ios/sample/Sources/Presentation/Modules/HomeViewController.swift +++ b/sample/ios/sample/Sources/Presentation/Modules/HomeViewController.swift @@ -1,4 +1,5 @@ import UIKit +import shared final class HomeViewController: UIViewController { @@ -7,7 +8,7 @@ final class HomeViewController: UIViewController { view.backgroundColor = .white let helloLabel = UILabel() - helloLabel.text = "Hello" + helloLabel.text = Strings().get(id: SharedRes.strings().greeting, args: [Platform_iosKt.getPlatform().name]) helloLabel.translatesAutoresizingMaskIntoConstraints = false view.addSubview(helloLabel) diff --git a/sample/shared/build.gradle.kts b/sample/shared/build.gradle.kts index d05b7982..b9b87b90 100644 --- a/sample/shared/build.gradle.kts +++ b/sample/shared/build.gradle.kts @@ -11,6 +11,7 @@ plugins { id(Plugins.KOVER) id(Plugins.KSP) id(Plugins.BUILD_KONFIG) + id(Plugins.MOKO) } @OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class) @@ -36,6 +37,8 @@ kotlin { podfile = project.file("../ios/Podfile") framework { baseName = "shared" + export(Dependencies.Moko.RESOURCES) + export(Dependencies.Moko.GRAPHICS) } xcodeConfigurationToNativeBuildType["Debug Staging"] = NativeBuildType.DEBUG @@ -59,6 +62,11 @@ kotlin { implementation(AUTH) } + with(Dependencies.Moko) { + api(RESOURCES) + // api(RESOURCES_COMPOSE) FIXME: Cannot build the shared module with this dependency + } + implementation(Dependencies.Log.NAPIER) } } @@ -71,6 +79,7 @@ kotlin { implementation(KOTLINX_RESOURCES) implementation(MOCKATIVE) implementation(TURBINE) + implementation(MOKO_RESOURCES_TEST) } } } @@ -145,3 +154,8 @@ buildkonfig { ) } } + +multiplatformResources { + multiplatformResourcesPackage = "co.nimblehq.kmm.template.sharedres" + multiplatformResourcesClassName = "SharedRes" +} diff --git a/sample/shared/src/androidMain/kotlin/co/nimblehq/kmm/template/Strings.kt b/sample/shared/src/androidMain/kotlin/co/nimblehq/kmm/template/Strings.kt new file mode 100644 index 00000000..12095024 --- /dev/null +++ b/sample/shared/src/androidMain/kotlin/co/nimblehq/kmm/template/Strings.kt @@ -0,0 +1,20 @@ +package co.nimblehq.kmm.template + +import android.content.Context +import dev.icerock.moko.resources.StringResource +import dev.icerock.moko.resources.desc.Resource +import dev.icerock.moko.resources.desc.StringDesc +import dev.icerock.moko.resources.format + +actual class Strings(private val context: Context) { + actual fun get( + id: StringResource, + args: List, + ): String { + return if (args.isEmpty()) { + StringDesc.Resource(id).toString(context = context) + } else { + id.format(*args.toTypedArray()).toString(context) + } + } +} diff --git a/sample/shared/src/androidUnitTest/kotlin/co/nimblehq/kmm/template/androidTest.kt b/sample/shared/src/androidUnitTest/kotlin/co/nimblehq/kmm/template/androidTest.kt deleted file mode 100644 index 900b0bb6..00000000 --- a/sample/shared/src/androidUnitTest/kotlin/co/nimblehq/kmm/template/androidTest.kt +++ /dev/null @@ -1,12 +0,0 @@ -package co.nimblehq.kmm.template - -import org.junit.Assert.assertTrue -import org.junit.Test - -class AndroidGreetingTest { - - @Test - fun testExample() { - assertTrue("Check Android is mentioned", Greeting().greet().contains("Android")) - } -} diff --git a/sample/shared/src/commonMain/kotlin/co/nimblehq/kmm/template/Greeting.kt b/sample/shared/src/commonMain/kotlin/co/nimblehq/kmm/template/Greeting.kt deleted file mode 100644 index 29c43a71..00000000 --- a/sample/shared/src/commonMain/kotlin/co/nimblehq/kmm/template/Greeting.kt +++ /dev/null @@ -1,9 +0,0 @@ -package co.nimblehq.kmm.template - -class Greeting { - private val platform: Platform = getPlatform() - - fun greet(): String { - return "Hello, ${platform.name}!" - } -} diff --git a/sample/shared/src/commonMain/kotlin/co/nimblehq/kmm/template/Strings.kt b/sample/shared/src/commonMain/kotlin/co/nimblehq/kmm/template/Strings.kt new file mode 100644 index 00000000..2348968a --- /dev/null +++ b/sample/shared/src/commonMain/kotlin/co/nimblehq/kmm/template/Strings.kt @@ -0,0 +1,7 @@ +package co.nimblehq.kmm.template + +import dev.icerock.moko.resources.StringResource + +expect class Strings { + fun get(id: StringResource, args: List = emptyList()): String +} diff --git a/sample/shared/src/commonMain/resources/MR/base/strings.xml b/sample/shared/src/commonMain/resources/MR/base/strings.xml new file mode 100644 index 00000000..7b75c648 --- /dev/null +++ b/sample/shared/src/commonMain/resources/MR/base/strings.xml @@ -0,0 +1,3 @@ + + Hello, %s! + diff --git a/sample/shared/src/commonTest/kotlin/co/nimblehq/kmm/template/commonTest.kt b/sample/shared/src/commonTest/kotlin/co/nimblehq/kmm/template/commonTest.kt deleted file mode 100644 index 560187be..00000000 --- a/sample/shared/src/commonTest/kotlin/co/nimblehq/kmm/template/commonTest.kt +++ /dev/null @@ -1,12 +0,0 @@ -package co.nimblehq.kmm.template - -import kotlin.test.Test -import kotlin.test.assertTrue - -class CommonGreetingTest { - - @Test - fun testExample() { - assertTrue(Greeting().greet().contains("Hello"), "Check 'Hello' is mentioned") - } -} diff --git a/sample/shared/src/iosMain/kotlin/co/nimblehq/kmm/template/Strings.kt b/sample/shared/src/iosMain/kotlin/co/nimblehq/kmm/template/Strings.kt new file mode 100644 index 00000000..4c9d3a8d --- /dev/null +++ b/sample/shared/src/iosMain/kotlin/co/nimblehq/kmm/template/Strings.kt @@ -0,0 +1,19 @@ +package co.nimblehq.kmm.template + +import dev.icerock.moko.resources.StringResource +import dev.icerock.moko.resources.desc.Resource +import dev.icerock.moko.resources.desc.StringDesc +import dev.icerock.moko.resources.format + +actual class Strings { + actual fun get( + id: StringResource, + args: List, + ): String { + return if (args.isEmpty()) { + StringDesc.Resource(id).localized() + } else { + id.format(*args.toTypedArray()).localized() + } + } +} diff --git a/sample/shared/src/iosTest/kotlin/co/nimblehq/kmm/template/iosTest.kt b/sample/shared/src/iosTest/kotlin/co/nimblehq/kmm/template/iosTest.kt deleted file mode 100644 index 3922db12..00000000 --- a/sample/shared/src/iosTest/kotlin/co/nimblehq/kmm/template/iosTest.kt +++ /dev/null @@ -1,12 +0,0 @@ -package co.nimblehq.kmm.template - -import kotlin.test.Test -import kotlin.test.assertTrue - -class IosGreetingTest { - - @Test - fun testExample() { - assertTrue(Greeting().greet().contains("iOS"), "Check iOS is mentioned") - } -} diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index d05b7982..b9b87b90 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -11,6 +11,7 @@ plugins { id(Plugins.KOVER) id(Plugins.KSP) id(Plugins.BUILD_KONFIG) + id(Plugins.MOKO) } @OptIn(org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi::class) @@ -36,6 +37,8 @@ kotlin { podfile = project.file("../ios/Podfile") framework { baseName = "shared" + export(Dependencies.Moko.RESOURCES) + export(Dependencies.Moko.GRAPHICS) } xcodeConfigurationToNativeBuildType["Debug Staging"] = NativeBuildType.DEBUG @@ -59,6 +62,11 @@ kotlin { implementation(AUTH) } + with(Dependencies.Moko) { + api(RESOURCES) + // api(RESOURCES_COMPOSE) FIXME: Cannot build the shared module with this dependency + } + implementation(Dependencies.Log.NAPIER) } } @@ -71,6 +79,7 @@ kotlin { implementation(KOTLINX_RESOURCES) implementation(MOCKATIVE) implementation(TURBINE) + implementation(MOKO_RESOURCES_TEST) } } } @@ -145,3 +154,8 @@ buildkonfig { ) } } + +multiplatformResources { + multiplatformResourcesPackage = "co.nimblehq.kmm.template.sharedres" + multiplatformResourcesClassName = "SharedRes" +} diff --git a/shared/src/androidMain/kotlin/co/nimblehq/kmm/template/Strings.kt b/shared/src/androidMain/kotlin/co/nimblehq/kmm/template/Strings.kt new file mode 100644 index 00000000..12095024 --- /dev/null +++ b/shared/src/androidMain/kotlin/co/nimblehq/kmm/template/Strings.kt @@ -0,0 +1,20 @@ +package co.nimblehq.kmm.template + +import android.content.Context +import dev.icerock.moko.resources.StringResource +import dev.icerock.moko.resources.desc.Resource +import dev.icerock.moko.resources.desc.StringDesc +import dev.icerock.moko.resources.format + +actual class Strings(private val context: Context) { + actual fun get( + id: StringResource, + args: List, + ): String { + return if (args.isEmpty()) { + StringDesc.Resource(id).toString(context = context) + } else { + id.format(*args.toTypedArray()).toString(context) + } + } +} diff --git a/shared/src/commonMain/kotlin/co/nimblehq/kmm/template/Strings.kt b/shared/src/commonMain/kotlin/co/nimblehq/kmm/template/Strings.kt new file mode 100644 index 00000000..2348968a --- /dev/null +++ b/shared/src/commonMain/kotlin/co/nimblehq/kmm/template/Strings.kt @@ -0,0 +1,7 @@ +package co.nimblehq.kmm.template + +import dev.icerock.moko.resources.StringResource + +expect class Strings { + fun get(id: StringResource, args: List = emptyList()): String +} diff --git a/shared/src/commonMain/resources/MR/base/strings.xml b/shared/src/commonMain/resources/MR/base/strings.xml new file mode 100644 index 00000000..7b75c648 --- /dev/null +++ b/shared/src/commonMain/resources/MR/base/strings.xml @@ -0,0 +1,3 @@ + + Hello, %s! + diff --git a/shared/src/iosMain/kotlin/co/nimblehq/kmm/template/Strings.kt b/shared/src/iosMain/kotlin/co/nimblehq/kmm/template/Strings.kt new file mode 100644 index 00000000..4c9d3a8d --- /dev/null +++ b/shared/src/iosMain/kotlin/co/nimblehq/kmm/template/Strings.kt @@ -0,0 +1,19 @@ +package co.nimblehq.kmm.template + +import dev.icerock.moko.resources.StringResource +import dev.icerock.moko.resources.desc.Resource +import dev.icerock.moko.resources.desc.StringDesc +import dev.icerock.moko.resources.format + +actual class Strings { + actual fun get( + id: StringResource, + args: List, + ): String { + return if (args.isEmpty()) { + StringDesc.Resource(id).localized() + } else { + id.format(*args.toTypedArray()).localized() + } + } +}