diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index e7827f376..12c6adad0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -31,7 +31,7 @@ jobs: run: chmod +x gradlew - uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: latest-stable + xcode-version: '16.4' - name: Publish Firebase Analytics run: ./gradlew :firebase-analytics:publish - name: Publish Firebase App @@ -74,7 +74,7 @@ jobs: run: chmod +x gradlew - uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: latest-stable + xcode-version: '16.4' - name: Generate documentation run: ./gradlew dokkaHtmlMultiModule - name: Uploading build folder diff --git a/.github/workflows/pull_request.yml b/.github/workflows/pull_request.yml index ac6af22a0..baac108f7 100644 --- a/.github/workflows/pull_request.yml +++ b/.github/workflows/pull_request.yml @@ -17,6 +17,8 @@ jobs: outputs: emulator_jobs_matrix: ${{ steps.dataStep.outputs.emulator_jobs_matrix }} ios_test_jobs_matrix: ${{ steps.dataStep.outputs.ios_test_jobs_matrix }} + macos_test_jobs_matrix: ${{ steps.dataStep.outputs.macos_test_jobs_matrix }} + tvos_test_jobs_matrix: ${{ steps.dataStep.outputs.tvos_test_jobs_matrix }} js_test_jobs_matrix: ${{ steps.dataStep.outputs.js_test_jobs_matrix }} jvm_test_jobs_matrix: ${{ steps.dataStep.outputs.jvm_test_jobs_matrix }} steps: @@ -34,6 +36,8 @@ jobs: echo " emulator_jobs_matrix=$(jq -c . < ./build/emulator_jobs_matrix.json) ios_test_jobs_matrix=$(jq -c . < ./build/ios_test_jobs_matrix.json) + macos_test_jobs_matrix=$(jq -c . < ./build/macos_test_jobs_matrix.json) + tvos_test_jobs_matrix=$(jq -c . < ./build/tvos_test_jobs_matrix.json) js_test_jobs_matrix=$(jq -c . < ./build/js_test_jobs_matrix.json) jvm_test_jobs_matrix=$(jq -c . < ./build/jvm_test_jobs_matrix.json) " >> $GITHUB_OUTPUT @@ -121,7 +125,7 @@ jobs: key: cocoapods-cache-v2 - uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: latest-stable + xcode-version: '16.4' - name: Setup test environment uses: ./.github/actions/setup_test_action - name: Set Artifact Name @@ -141,6 +145,84 @@ jobs: with: name: iOS ${{ env.ARCHIVE_KEY }} Firebase Debug Log path: "**/firebase-debug.log" + build-macos: + needs: jobMatrixSetup + runs-on: macos-15 + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.jobMatrixSetup.outputs.macos_test_jobs_matrix) }} + steps: + - uses: actions/checkout@v4 + - name: Cocoapods cache + uses: actions/cache@v4 + with: + path: | + ~/.cocoapods + ~/Library/Caches/CocoaPods + */build/cocoapods + */build/classes + key: cocoapods-cache-v2 + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '16.4' + - name: Setup test environment + uses: ./.github/actions/setup_test_action + - name: Set Artifact Name + run: | + echo "ARCHIVE_KEY=$(echo ${{ matrix.gradle_tasks }} | cut -d: -f2)" >> $GITHUB_ENV + - name: Run macOS Tests + run: ./gradlew ${{ matrix.gradle_tasks }} + - name: Upload macOS test artifact + uses: actions/upload-artifact@v4 + if: failure() + with: + name: macOS ${{ env.ARCHIVE_KEY }} Test Report HTML + path: "**/build/reports/tests/macosArm64Test/" + - name: Upload Firebase Debug Log + uses: actions/upload-artifact@v4 + if: failure() + with: + name: macOS ${{ env.ARCHIVE_KEY }} Firebase Debug Log + path: "**/firebase-debug.log" + build-tvos: + needs: jobMatrixSetup + runs-on: macos-15 + strategy: + fail-fast: false + matrix: ${{ fromJson(needs.jobMatrixSetup.outputs.tvos_test_jobs_matrix) }} + steps: + - uses: actions/checkout@v4 + - name: Cocoapods cache + uses: actions/cache@v4 + with: + path: | + ~/.cocoapods + ~/Library/Caches/CocoaPods + */build/cocoapods + */build/classes + key: cocoapods-cache-v2 + - uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: '16.4' + - name: Setup test environment + uses: ./.github/actions/setup_test_action + - name: Set Artifact Name + run: | + echo "ARCHIVE_KEY=$(echo ${{ matrix.gradle_tasks }} | cut -d: -f2)" >> $GITHUB_ENV + - name: Run tvOS Tests + run: ./gradlew ${{ matrix.gradle_tasks }} + - name: Upload tvOS test artifact + uses: actions/upload-artifact@v4 + if: failure() + with: + name: tvOS ${{ env.ARCHIVE_KEY }} Test Report HTML + path: "**/build/reports/tests/tvosArm64Test/" + - name: Upload Firebase Debug Log + uses: actions/upload-artifact@v4 + if: failure() + with: + name: tvOS ${{ env.ARCHIVE_KEY }} Firebase Debug Log + path: "**/firebase-debug.log" build-jvm: needs: jobMatrixSetup runs-on: ubuntu-latest diff --git a/.github/workflows/pull_request_target.yml b/.github/workflows/pull_request_target.yml index 61bda52d4..acd499d69 100644 --- a/.github/workflows/pull_request_target.yml +++ b/.github/workflows/pull_request_target.yml @@ -32,7 +32,7 @@ jobs: key: cocoapods-cache-v2 - uses: maxim-lobanov/setup-xcode@v1 with: - xcode-version: latest-stable + xcode-version: '16.4' - name: Format Kotlin run: ./gradlew formatKotlin - name: Api File Update diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 000000000..cc02e636b --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + `kotlin-dsl` +} + +repositories { + gradlePluginPortal() +} diff --git a/buildSrc/src/main/kotlin/Utils.kt b/buildSrc/src/main/kotlin/Utils.kt new file mode 100644 index 000000000..64e7aa2ca --- /dev/null +++ b/buildSrc/src/main/kotlin/Utils.kt @@ -0,0 +1,22 @@ +package utils + +enum class TargetPlatform { + Android, Ios, Macos, Tvos, Jvm, Js +} + +fun String.toTargetPlatforms(): List = + split(",").map { + when (it.lowercase().trim()) { + "android" -> TargetPlatform.Android + "ios" -> TargetPlatform.Ios + "macos" -> TargetPlatform.Macos + "tvos" -> TargetPlatform.Tvos + "jvm" -> TargetPlatform.Jvm + "js" -> TargetPlatform.Js + else -> throw IllegalArgumentException("Unknown target platform: $it") + } + } + +fun List.supportsApple() = this.any { + it == TargetPlatform.Ios || it == TargetPlatform.Macos || it == TargetPlatform.Tvos +} diff --git a/convention-plugin-test-option/src/main/kotlin/EmulatorJobsMatrix.kt b/convention-plugin-test-option/src/main/kotlin/EmulatorJobsMatrix.kt index 13c9f64ec..ee1362711 100644 --- a/convention-plugin-test-option/src/main/kotlin/EmulatorJobsMatrix.kt +++ b/convention-plugin-test-option/src/main/kotlin/EmulatorJobsMatrix.kt @@ -16,6 +16,8 @@ class EmulatorJobsMatrix { mapOf( "emulator_jobs_matrix.json" to getEmulatorTaskList(rootProject = rootProject), "ios_test_jobs_matrix.json" to getIosTestTaskList(rootProject = rootProject), + "macos_test_jobs_matrix.json" to getMacosTestTaskList(rootProject = rootProject), + "tvos_test_jobs_matrix.json" to getTvosTestTaskList(rootProject = rootProject), "js_test_jobs_matrix.json" to getJsTestTaskList(rootProject = rootProject), "jvm_test_jobs_matrix.json" to getJvmTestTaskList(rootProject = rootProject) ) @@ -32,8 +34,8 @@ class EmulatorJobsMatrix { fun getIosTestTaskList(rootProject: Project): List> = rootProject.subprojects.filter { subProject -> - subProject.name == "test-utils" || - (rootProject.property("${subProject.name}.skipIosTests") == "true").not() + (subProject.property("${subProject.name}.supportedTestTargets") as String).toTargetPlatforms().contains( + TargetPlatform.Ios) || subProject.name == "test-utils" }.map { subProject -> when (val osArch = System.getProperty("os.arch")) { "arm64", "arm-v8", "aarch64" -> "${subProject.path}:iosSimulatorArm64Test" @@ -41,18 +43,40 @@ class EmulatorJobsMatrix { } }.map { listOf("cleanTest", it) } + fun getMacosTestTaskList(rootProject: Project): List> = + rootProject.subprojects.filter { subProject -> + (subProject.property("${subProject.name}.supportedTestTargets") as String).toTargetPlatforms().contains( + TargetPlatform.Macos) || subProject.name == "test-utils" + }.map { subProject -> + when (val osArch = System.getProperty("os.arch")) { + "arm64", "arm-v8", "aarch64" -> "${subProject.path}:macosArm64Test" + else -> throw Error("Unexpected System.getProperty(\"os.arch\") = $osArch") + } + }.map { listOf("cleanTest", it) } + + fun getTvosTestTaskList(rootProject: Project): List> = + rootProject.subprojects.filter { subProject -> + (subProject.property("${subProject.name}.supportedTestTargets") as String).toTargetPlatforms().contains( + TargetPlatform.Tvos) || subProject.name == "test-utils" + }.map { subProject -> + when (val osArch = System.getProperty("os.arch")) { + "arm64", "arm-v8", "aarch64" -> "${subProject.path}:tvosSimulatorArm64Test" + else -> throw Error("Unexpected System.getProperty(\"os.arch\") = $osArch") + } + }.map { listOf("cleanTest", it) } + fun getJsTestTaskList(rootProject: Project): List> = rootProject.subprojects.filter { subProject -> - subProject.name == "test-utils" || - (rootProject.property("${subProject.name}.skipJsTests") == "true").not() + (subProject.property("${subProject.name}.supportedTestTargets") as String).toTargetPlatforms().contains( + TargetPlatform.Js) || subProject.name == "test-utils" }.map { subProject -> "${subProject.path}:jsTest" }.map { listOf("cleanTest", it) } fun getJvmTestTaskList(rootProject: Project): List> = rootProject.subprojects.filter { subProject -> - subProject.name == "test-utils" || - (rootProject.property("${subProject.name}.skipJvmTests") == "true").not() + (subProject.property("${subProject.name}.supportedTestTargets") as String).toTargetPlatforms().contains( + TargetPlatform.Jvm) || subProject.name == "test-utils" }.map { subProject -> "${subProject.path}:jvmTest" }.map { listOf("cleanTest", it) } @@ -101,3 +125,20 @@ fun getSdkmanagerFile(rootDir: File): File? = println("sdkmanagerFile: $sdkmanagerFile") sdkmanagerFile } + +enum class TargetPlatform { + Android, Ios, Macos, Tvos, Jvm, Js +} + +fun String.toTargetPlatforms(): List = + split(",").map { + when (it.lowercase().trim()) { + "android" -> TargetPlatform.Android + "ios" -> TargetPlatform.Ios + "macos" -> TargetPlatform.Macos + "tvos" -> TargetPlatform.Tvos + "jvm" -> TargetPlatform.Jvm + "js" -> TargetPlatform.Js + else -> throw IllegalArgumentException("Unknown target platform: $it") + } + } \ No newline at end of file diff --git a/firebase-analytics/build.gradle.kts b/firebase-analytics/build.gradle.kts index 11d6d2cf0..9927eee74 100644 --- a/firebase-analytics/build.gradle.kts +++ b/firebase-analytics/build.gradle.kts @@ -1,15 +1,17 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2023 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-analytics.version") as String +val supportedPlatforms = (project.property("firebase-analytics.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -19,36 +21,36 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.analytics" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.analytics" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -69,20 +71,44 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + osx.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebaseAnalytics" } @@ -94,19 +120,21 @@ kotlin { } } - js(IR) { - useCommonJs() - nodejs { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs { + testTask { + useKarma { + useChromeHeadless() + } } } - } - browser { - testTask { - useKarma { - useChromeHeadless() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -118,7 +146,11 @@ kotlin { this.apiVersion = libs.versions.settings.api.get() this.languageVersion = libs.versions.settings.language.get() progressiveMode = true - if (name.lowercase().contains("ios")) { + if (name.lowercase().contains("ios") + || name.lowercase().contains("apple") + || name.lowercase().contains("tvos") + || name.lowercase().contains("macos") + ) { optIn("kotlinx.cinterop.ExperimentalForeignApi") } } @@ -137,32 +169,16 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.analytics) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.analytics) + } } } } } -if (project.property("firebase-analytics.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-analytics.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-analytics.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-analytics/src/iosMain/kotlin/dev/gitlive/firebase/analytics/analytics.kt b/firebase-analytics/src/appleMain/kotlin/dev/gitlive/firebase/analytics/analytics.kt similarity index 100% rename from firebase-analytics/src/iosMain/kotlin/dev/gitlive/firebase/analytics/analytics.kt rename to firebase-analytics/src/appleMain/kotlin/dev/gitlive/firebase/analytics/analytics.kt diff --git a/firebase-analytics/src/iosTest/kotlin/dev/gitlive/firebase/analytics/analytics.kt b/firebase-analytics/src/appleTest/kotlin/dev/gitlive/firebase/analytics/analytics.kt similarity index 100% rename from firebase-analytics/src/iosTest/kotlin/dev/gitlive/firebase/analytics/analytics.kt rename to firebase-analytics/src/appleTest/kotlin/dev/gitlive/firebase/analytics/analytics.kt diff --git a/firebase-app/build.gradle.kts b/firebase-app/build.gradle.kts index 99e9c95a2..aadde426c 100644 --- a/firebase-app/build.gradle.kts +++ b/firebase-app/build.gradle.kts @@ -1,15 +1,17 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-app.version") as String +val supportedPlatforms = (project.property("firebase-app.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -19,36 +21,36 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace="dev.gitlive.firebase" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -70,21 +72,44 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() - + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + osx.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebaseApp" } @@ -96,19 +121,21 @@ kotlin { } } - js(IR) { - useCommonJs() - nodejs { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs { + testTask { + useKarma { + useChromeHeadless() + } } } - } - browser { - testTask { - useKarma { - useChromeHeadless() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -120,7 +147,11 @@ kotlin { this.apiVersion = libs.versions.settings.api.get() this.languageVersion = libs.versions.settings.language.get() progressiveMode = true - if (name.lowercase().contains("ios")) { + if (name.lowercase().contains("ios") + || name.lowercase().contains("apple") + || name.lowercase().contains("tvos") + || name.lowercase().contains("macos") + ) { optIn("kotlinx.cinterop.ExperimentalForeignApi") } } @@ -138,36 +169,22 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.common) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.common) + } } } - getByName("jvmMain") { - kotlin.srcDir("src/androidMain/kotlin") + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + getByName("jvmMain") { + kotlin.srcDir("src/androidMain/kotlin") + } } } } -if (project.property("firebase-app.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-app.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-app.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-app/src/iosMain/kotlin/dev/gitlive/firebase/firebase.kt b/firebase-app/src/appleMain/kotlin/dev/gitlive/firebase/firebase.kt similarity index 100% rename from firebase-app/src/iosMain/kotlin/dev/gitlive/firebase/firebase.kt rename to firebase-app/src/appleMain/kotlin/dev/gitlive/firebase/firebase.kt diff --git a/firebase-app/src/iosTest/kotlin/dev/gitlive/firebase/firebase.kt b/firebase-app/src/appleTest/kotlin/dev/gitlive/firebase/firebase.kt similarity index 100% rename from firebase-app/src/iosTest/kotlin/dev/gitlive/firebase/firebase.kt rename to firebase-app/src/appleTest/kotlin/dev/gitlive/firebase/firebase.kt diff --git a/firebase-auth/build.gradle.kts b/firebase-auth/build.gradle.kts index ed1a7647e..48c0e5930 100644 --- a/firebase-auth/build.gradle.kts +++ b/firebase-auth/build.gradle.kts @@ -1,17 +1,19 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTargetWithSimulatorTests import org.jetbrains.kotlin.gradle.targets.native.tasks.KotlinNativeSimulatorTest -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-auth.version") as String +val supportedPlatforms = (project.property("firebase-auth.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -21,35 +23,36 @@ plugins { alias(libs.plugins.publish) } -android { - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.auth" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.auth" - defaultConfig { - minSdk = 23 // Auth has a MinSDK of 23. See https://github.com/firebase/firebase-android-sdk/issues/5927#issuecomment-2093466572 - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + defaultConfig { + minSdk = + 23 // Auth has a MinSDK of 23. See https://github.com/firebase/firebase-android-sdk/issues/5927#issuecomment-2093466572 + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -70,20 +73,45 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { - iosArm64() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + iosArm64().enableKeychainForTests() + iosX64().enableKeychainForTests() iosSimulatorArm64().enableKeychainForTests() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64().enableKeychainForTests() + tvosX64().enableKeychainForTests() + tvosSimulatorArm64().enableKeychainForTests() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64().enableKeychainForTests() + macosX64().enableKeychainForTests() + } + + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macos.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebaseAuth" } @@ -95,19 +123,21 @@ kotlin { } } - js(IR) { - useCommonJs() - nodejs { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs { + testTask { + useKarma { + useChromeHeadless() + } } } - } - browser { - testTask { - useKarma { - useChromeHeadless() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -140,33 +170,17 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.auth) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.auth) + } } } } } -if (project.property("firebase-auth.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-auth.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-auth.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (supportIosTarget) { +if (supportedPlatforms.supportsApple()) { tasks.create("launchIosSimulator") { commandLine("open", "-a", "Simulator") } diff --git a/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/auth.kt b/firebase-auth/src/appleMain/kotlin/dev/gitlive/firebase/auth/auth.kt similarity index 100% rename from firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/auth.kt rename to firebase-auth/src/appleMain/kotlin/dev/gitlive/firebase/auth/auth.kt diff --git a/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/credentials.kt b/firebase-auth/src/appleMain/kotlin/dev/gitlive/firebase/auth/credentials.kt similarity index 100% rename from firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/credentials.kt rename to firebase-auth/src/appleMain/kotlin/dev/gitlive/firebase/auth/credentials.kt diff --git a/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/multifactor.kt b/firebase-auth/src/appleMain/kotlin/dev/gitlive/firebase/auth/multifactor.kt similarity index 100% rename from firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/multifactor.kt rename to firebase-auth/src/appleMain/kotlin/dev/gitlive/firebase/auth/multifactor.kt diff --git a/firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/user.kt b/firebase-auth/src/appleMain/kotlin/dev/gitlive/firebase/auth/user.kt similarity index 100% rename from firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/user.kt rename to firebase-auth/src/appleMain/kotlin/dev/gitlive/firebase/auth/user.kt diff --git a/firebase-auth/src/iosTest/kotlin/dev/gitlive/firebase/auth/auth.kt b/firebase-auth/src/appleTest/kotlin/dev/gitlive/firebase/auth/auth.kt similarity index 100% rename from firebase-auth/src/iosTest/kotlin/dev/gitlive/firebase/auth/auth.kt rename to firebase-auth/src/appleTest/kotlin/dev/gitlive/firebase/auth/auth.kt diff --git a/firebase-common-internal/build.gradle.kts b/firebase-common-internal/build.gradle.kts index 97549c2fe..a37f706c0 100644 --- a/firebase-common-internal/build.gradle.kts +++ b/firebase-common-internal/build.gradle.kts @@ -1,15 +1,16 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-common-internal.version") as String +val supportedPlatforms = (project.property("firebase-common-internal.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -19,31 +20,33 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.common.internal" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.common.internal" + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) + testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } @@ -68,35 +71,49 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() - - val supportIosTarget = project.property("skipIosTarget") != "true" + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } - js(IR) { - useCommonJs() - nodejs { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs { + testTask { + useKarma { + useChromeHeadless() + } } } - } - browser { - testTask { - useKarma { - useChromeHeadless() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -127,49 +144,37 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.common) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.common) + } } } - getByName("jsMain") { - dependencies { - api(npm("firebase", "10.12.2")) + if (supportedPlatforms.contains(TargetPlatform.Js)) { + getByName("jsMain") { + dependencies { + api(npm("firebase", "10.12.2")) + } } } - getByName("jvmMain") { - kotlin.srcDir("src/androidMain/kotlin") - } + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + getByName("jvmMain") { + kotlin.srcDir("src/androidMain/kotlin") + } - getByName("jvmTest") { - dependencies { - implementation(kotlin("test-junit")) + getByName("jvmTest") { + dependencies { + implementation(kotlin("test-junit")) + } + kotlin.srcDir("src/androidAndroidTest/kotlin") } - kotlin.srcDir("src/androidAndroidTest/kotlin") } } } -if (project.property("firebase-common.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-common.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-common.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-common-internal/src/iosMain/kotlin/dev/gitlive/firebase/internal/EncodedObject.kt b/firebase-common-internal/src/appleMain/kotlin/dev/gitlive/firebase/internal/EncodedObject.kt similarity index 100% rename from firebase-common-internal/src/iosMain/kotlin/dev/gitlive/firebase/internal/EncodedObject.kt rename to firebase-common-internal/src/appleMain/kotlin/dev/gitlive/firebase/internal/EncodedObject.kt diff --git a/firebase-common-internal/src/iosMain/kotlin/dev/gitlive/firebase/internal/_decoders.kt b/firebase-common-internal/src/appleMain/kotlin/dev/gitlive/firebase/internal/_decoders.kt similarity index 98% rename from firebase-common-internal/src/iosMain/kotlin/dev/gitlive/firebase/internal/_decoders.kt rename to firebase-common-internal/src/appleMain/kotlin/dev/gitlive/firebase/internal/_decoders.kt index 59008b9d9..507bb427f 100644 --- a/firebase-common-internal/src/iosMain/kotlin/dev/gitlive/firebase/internal/_decoders.kt +++ b/firebase-common-internal/src/appleMain/kotlin/dev/gitlive/firebase/internal/_decoders.kt @@ -8,6 +8,7 @@ import kotlinx.serialization.encoding.CompositeDecoder import kotlinx.serialization.descriptors.PolymorphicKind import kotlinx.serialization.descriptors.SerialDescriptor import kotlinx.serialization.descriptors.StructureKind +import kotlin.collections.get internal actual fun FirebaseDecoderImpl.structureDecoder(descriptor: SerialDescriptor, polymorphicIsNested: Boolean): CompositeDecoder = when (descriptor.kind) { StructureKind.CLASS, StructureKind.OBJECT -> decodeAsMap(false) diff --git a/firebase-common-internal/src/iosMain/kotlin/dev/gitlive/firebase/internal/_encoders.kt b/firebase-common-internal/src/appleMain/kotlin/dev/gitlive/firebase/internal/_encoders.kt similarity index 100% rename from firebase-common-internal/src/iosMain/kotlin/dev/gitlive/firebase/internal/_encoders.kt rename to firebase-common-internal/src/appleMain/kotlin/dev/gitlive/firebase/internal/_encoders.kt diff --git a/firebase-common-internal/src/commonMain/kotlin/dev/gitlive/firebase/internal/serializers.kt b/firebase-common-internal/src/commonMain/kotlin/dev/gitlive/firebase/internal/serializers.kt index 18f3df21f..34cbd86ea 100644 --- a/firebase-common-internal/src/commonMain/kotlin/dev/gitlive/firebase/internal/serializers.kt +++ b/firebase-common-internal/src/commonMain/kotlin/dev/gitlive/firebase/internal/serializers.kt @@ -2,6 +2,8 @@ * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ +@file:OptIn(SealedSerializationApi::class) + package dev.gitlive.firebase.internal import kotlinx.serialization.KSerializer diff --git a/firebase-common/build.gradle.kts b/firebase-common/build.gradle.kts index 07ec4b0ce..ea151f115 100644 --- a/firebase-common/build.gradle.kts +++ b/firebase-common/build.gradle.kts @@ -1,15 +1,16 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-common.version") as String +val supportedPlatforms = (project.property("firebase-common.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -19,31 +20,33 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.common" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.common" + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) + testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } @@ -67,35 +70,49 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() - - val supportIosTarget = project.property("skipIosTarget") != "true" + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } - js(IR) { - useCommonJs() - nodejs { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs { + testTask { + useKarma { + useChromeHeadless() + } } } - } - browser { - testTask { - useKarma { - useChromeHeadless() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -125,49 +142,36 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.common) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.common) + } } } - getByName("jsMain") { - dependencies { - api(npm("firebase", "10.12.2")) + if (supportedPlatforms.contains(TargetPlatform.Js)) { + getByName("jsMain") { + dependencies { + api(npm("firebase", "10.12.2")) + } } } - getByName("jvmMain") { - kotlin.srcDir("src/androidMain/kotlin") - } + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + getByName("jvmMain") { + kotlin.srcDir("src/androidMain/kotlin") + } - getByName("jvmTest") { - dependencies { - implementation(kotlin("test-junit")) + getByName("jvmTest") { + dependencies { + implementation(kotlin("test-junit")) + } + kotlin.srcDir("src/androidAndroidTest/kotlin") } - kotlin.srcDir("src/androidAndroidTest/kotlin") } } } - -if (project.property("firebase-common.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-common.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-common.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-config/build.gradle.kts b/firebase-config/build.gradle.kts index b47b8deb5..00db5bf31 100644 --- a/firebase-config/build.gradle.kts +++ b/firebase-config/build.gradle.kts @@ -1,15 +1,17 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-config.version") as String +val supportedPlatforms = (project.property("firebase-config.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -19,36 +21,36 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.remoteconfig" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.remoteconfig" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -69,20 +71,44 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + osx.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebaseConfig" } @@ -94,12 +120,14 @@ kotlin { } } - js(IR) { - useCommonJs() - browser { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -112,7 +140,11 @@ kotlin { this.languageVersion = libs.versions.settings.language.get() progressiveMode = true optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") - if (name.lowercase().contains("ios")) { + if (name.lowercase().contains("ios") + || name.lowercase().contains("apple") + || name.lowercase().contains("tvos") + || name.lowercase().contains("macos") + ) { optIn("kotlinx.cinterop.ExperimentalForeignApi") optIn("kotlinx.cinterop.BetaInteropApi") } @@ -133,36 +165,22 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.config) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.config) + } } } - getByName("jvmMain") { - kotlin.srcDir("src/androidMain/kotlin") + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + getByName("jvmMain") { + kotlin.srcDir("src/androidMain/kotlin") + } } } } -if (project.property("firebase-config.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-config.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-config.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-config/src/iosMain/kotlin/dev/gitlive/firebase/remoteconfig/FirebaseRemoteConfig.kt b/firebase-config/src/appleMain/kotlin/dev/gitlive/firebase/remoteconfig/FirebaseRemoteConfig.kt similarity index 100% rename from firebase-config/src/iosMain/kotlin/dev/gitlive/firebase/remoteconfig/FirebaseRemoteConfig.kt rename to firebase-config/src/appleMain/kotlin/dev/gitlive/firebase/remoteconfig/FirebaseRemoteConfig.kt diff --git a/firebase-config/src/iosMain/kotlin/dev/gitlive/firebase/remoteconfig/FirebaseRemoteConfigValue.kt b/firebase-config/src/appleMain/kotlin/dev/gitlive/firebase/remoteconfig/FirebaseRemoteConfigValue.kt similarity index 100% rename from firebase-config/src/iosMain/kotlin/dev/gitlive/firebase/remoteconfig/FirebaseRemoteConfigValue.kt rename to firebase-config/src/appleMain/kotlin/dev/gitlive/firebase/remoteconfig/FirebaseRemoteConfigValue.kt diff --git a/firebase-config/src/iosMain/kotlin/dev/gitlive/firebase/remoteconfig/NSDataExtension.kt b/firebase-config/src/appleMain/kotlin/dev/gitlive/firebase/remoteconfig/NSDataExtension.kt similarity index 100% rename from firebase-config/src/iosMain/kotlin/dev/gitlive/firebase/remoteconfig/NSDataExtension.kt rename to firebase-config/src/appleMain/kotlin/dev/gitlive/firebase/remoteconfig/NSDataExtension.kt diff --git a/firebase-config/src/iosTest/kotlin/dev/gitlive/firebase/remoteconfig/NSDataExtensionTest.kt b/firebase-config/src/appleTest/kotlin/dev/gitlive/firebase/remoteconfig/NSDataExtensionTest.kt similarity index 100% rename from firebase-config/src/iosTest/kotlin/dev/gitlive/firebase/remoteconfig/NSDataExtensionTest.kt rename to firebase-config/src/appleTest/kotlin/dev/gitlive/firebase/remoteconfig/NSDataExtensionTest.kt diff --git a/firebase-config/src/iosTest/kotlin/dev/gitlive/firebase/remoteconfig/RemoteConfig.kt b/firebase-config/src/appleTest/kotlin/dev/gitlive/firebase/remoteconfig/RemoteConfig.kt similarity index 100% rename from firebase-config/src/iosTest/kotlin/dev/gitlive/firebase/remoteconfig/RemoteConfig.kt rename to firebase-config/src/appleTest/kotlin/dev/gitlive/firebase/remoteconfig/RemoteConfig.kt diff --git a/firebase-crashlytics/build.gradle.kts b/firebase-crashlytics/build.gradle.kts index 514c1763b..2824c666a 100644 --- a/firebase-crashlytics/build.gradle.kts +++ b/firebase-crashlytics/build.gradle.kts @@ -1,15 +1,17 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-crashlytics.version") as String +val supportedPlatforms = (project.property("firebase-crashlytics.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -19,37 +21,37 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.crashlytics" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.crashlytics" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - multiDexEnabled = true - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + multiDexEnabled = true + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -70,20 +72,42 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } // jvm() - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + osx.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebaseCrashlytics" } @@ -102,7 +126,11 @@ kotlin { this.languageVersion = libs.versions.settings.language.get() progressiveMode = true optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") - if (name.lowercase().contains("ios")) { + if (name.lowercase().contains("ios") + || name.lowercase().contains("apple") + || name.lowercase().contains("tvos") + || name.lowercase().contains("macos") + ) { optIn("kotlinx.cinterop.ExperimentalForeignApi") } } @@ -121,9 +149,11 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.crashlytics) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.crashlytics) + } } } @@ -132,24 +162,6 @@ kotlin { } } -if (project.property("firebase-crashlytics.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-crashlytics.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-crashlytics.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-crashlytics/src/iosMain/kotlin/dev/gitlive/firebase/crashlytics/crashlytics.kt b/firebase-crashlytics/src/appleMain/kotlin/dev/gitlive/firebase/crashlytics/crashlytics.kt similarity index 100% rename from firebase-crashlytics/src/iosMain/kotlin/dev/gitlive/firebase/crashlytics/crashlytics.kt rename to firebase-crashlytics/src/appleMain/kotlin/dev/gitlive/firebase/crashlytics/crashlytics.kt diff --git a/firebase-crashlytics/src/iosTest/kotlin/dev/gitlive/firebase/crashlytics/crashlytics.kt b/firebase-crashlytics/src/appleTest/kotlin/dev/gitlive/firebase/crashlytics/crashlytics.kt similarity index 100% rename from firebase-crashlytics/src/iosTest/kotlin/dev/gitlive/firebase/crashlytics/crashlytics.kt rename to firebase-crashlytics/src/appleTest/kotlin/dev/gitlive/firebase/crashlytics/crashlytics.kt diff --git a/firebase-database/build.gradle.kts b/firebase-database/build.gradle.kts index 6f64bddb6..4238182de 100644 --- a/firebase-database/build.gradle.kts +++ b/firebase-database/build.gradle.kts @@ -1,15 +1,17 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-database.version") as String +val supportedPlatforms = (project.property("firebase-database.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -20,36 +22,36 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.database" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.database" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -71,20 +73,44 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + osx.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebaseDatabase" } @@ -96,19 +122,21 @@ kotlin { } } - js(IR) { - useCommonJs() - nodejs { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs { + testTask { + useKarma { + useChromeHeadless() + } } } - } - browser { - testTask { - useKarma { - useChromeHeadless() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -123,7 +151,11 @@ kotlin { optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") optIn("kotlinx.coroutines.FlowPreview") optIn("kotlinx.serialization.InternalSerializationApi") - if (name.lowercase().contains("ios")) { + if (name.lowercase().contains("ios") + || name.lowercase().contains("apple") + || name.lowercase().contains("tvos") + || name.lowercase().contains("macos") + ) { optIn("kotlinx.cinterop.ExperimentalForeignApi") } } @@ -143,36 +175,19 @@ kotlin { } } - getByName("jvmMain") { - kotlin.srcDir("src/androidMain/kotlin") + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + getByName("jvmMain") { + kotlin.srcDir("src/androidMain/kotlin") + } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.database) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.database) + } } } - getByName("jvmMain") { - kotlin.srcDir("src/androidMain/kotlin") - } - } -} - -if (project.property("firebase-database.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-database.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-database.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } } } diff --git a/firebase-database/src/iosMain/kotlin/dev/gitlive/firebase/database/ServerValue.kt b/firebase-database/src/appleMain/kotlin/dev/gitlive/firebase/database/ServerValue.kt similarity index 100% rename from firebase-database/src/iosMain/kotlin/dev/gitlive/firebase/database/ServerValue.kt rename to firebase-database/src/appleMain/kotlin/dev/gitlive/firebase/database/ServerValue.kt diff --git a/firebase-database/src/iosMain/kotlin/dev/gitlive/firebase/database/database.kt b/firebase-database/src/appleMain/kotlin/dev/gitlive/firebase/database/database.kt similarity index 100% rename from firebase-database/src/iosMain/kotlin/dev/gitlive/firebase/database/database.kt rename to firebase-database/src/appleMain/kotlin/dev/gitlive/firebase/database/database.kt diff --git a/firebase-database/src/iosTest/kotlin/dev/gitlive/firebase/database/database.kt b/firebase-database/src/appleTest/kotlin/dev/gitlive/firebase/database/database.kt similarity index 100% rename from firebase-database/src/iosTest/kotlin/dev/gitlive/firebase/database/database.kt rename to firebase-database/src/appleTest/kotlin/dev/gitlive/firebase/database/database.kt diff --git a/firebase-firestore/build.gradle.kts b/firebase-firestore/build.gradle.kts index f57307d21..ef0817558 100644 --- a/firebase-firestore/build.gradle.kts +++ b/firebase-firestore/build.gradle.kts @@ -1,15 +1,17 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-firestore.version") as String +val supportedPlatforms = (project.property("firebase-firestore.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -20,38 +22,38 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.firestore" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.firestore" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - multiDexEnabled = true - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + multiDexEnabled = true + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - resources.pickFirsts.add("androidsupportmultidexversion.txt") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + resources.pickFirsts.add("androidsupportmultidexversion.txt") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -73,20 +75,44 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + osx.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebaseFirestore" } @@ -105,26 +131,28 @@ kotlin { } } - js(IR) { - useCommonJs() - nodejs { - testTask { - useKarma { - useChromeHeadless() - // Explicitly specify Mocha here since it seems to be throwing random errors otherwise - useMocha { - timeout = "180s" + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs { + testTask { + useKarma { + useChromeHeadless() + // Explicitly specify Mocha here since it seems to be throwing random errors otherwise + useMocha { + timeout = "180s" + } } } } - } - browser { - testTask { - useKarma { - useChromeHeadless() - // Explicitly specify Mocha here since it seems to be throwing random errors otherwise - useMocha { - timeout = "180s" + browser { + testTask { + useKarma { + useChromeHeadless() + // Explicitly specify Mocha here since it seems to be throwing random errors otherwise + useMocha { + timeout = "180s" + } } } } @@ -140,7 +168,11 @@ kotlin { optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") optIn("kotlinx.serialization.InternalSerializationApi") optIn("kotlinx.serialization.ExperimentalSerializationApi") - if (name.lowercase().contains("ios")) { + if (name.lowercase().contains("ios") + || name.lowercase().contains("apple") + || name.lowercase().contains("tvos") + || name.lowercase().contains("macos") + ) { optIn("kotlinx.cinterop.ExperimentalForeignApi") optIn("kotlinx.cinterop.BetaInteropApi") } @@ -161,37 +193,23 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.firestore) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.firestore) + } } } - getByName("jvmMain") { - kotlin.srcDir("src/androidMain/kotlin") + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + getByName("jvmMain") { + kotlin.srcDir("src/androidMain/kotlin") + } } } } -if (project.property("firebase-firestore.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-firestore.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-firestore.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/FieldValue.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/FieldValue.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/FieldValue.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/FieldValue.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/GeoPoint.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/GeoPoint.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/GeoPoint.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/GeoPoint.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/Timestamp.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/Timestamp.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/Timestamp.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/Timestamp.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/_encoders.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/_encoders.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/_encoders.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/_encoders.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/firestore.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeCollectionReferenceWrapper.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeCollectionReferenceWrapper.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeCollectionReferenceWrapper.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeCollectionReferenceWrapper.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeDocumentReference.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeDocumentReference.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeDocumentReference.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeDocumentReference.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeDocumentSnapshotWrapper.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeDocumentSnapshotWrapper.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeDocumentSnapshotWrapper.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeDocumentSnapshotWrapper.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeFirebaseFirestoreWrapper.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeQueryWrapper.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeQueryWrapper.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeQueryWrapper.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeQueryWrapper.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeTransactionWrapper.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeTransactionWrapper.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeTransactionWrapper.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeTransactionWrapper.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeWriteBatchWrapper.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeWriteBatchWrapper.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeWriteBatchWrapper.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/NativeWriteBatchWrapper.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/Source.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/Source.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/Source.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/Source.kt diff --git a/firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/throwError.kt b/firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/throwError.kt similarity index 100% rename from firebase-firestore/src/iosMain/kotlin/dev/gitlive/firebase/firestore/internal/throwError.kt rename to firebase-firestore/src/appleMain/kotlin/dev/gitlive/firebase/firestore/internal/throwError.kt diff --git a/firebase-firestore/src/iosTest/kotlin/dev/gitlive/firebase/firestore/ContextSwitchTest.kt b/firebase-firestore/src/appleTest/kotlin/dev/gitlive/firebase/firestore/ContextSwitchTest.kt similarity index 100% rename from firebase-firestore/src/iosTest/kotlin/dev/gitlive/firebase/firestore/ContextSwitchTest.kt rename to firebase-firestore/src/appleTest/kotlin/dev/gitlive/firebase/firestore/ContextSwitchTest.kt diff --git a/firebase-firestore/src/iosTest/kotlin/dev/gitlive/firebase/firestore/Ignore.kt b/firebase-firestore/src/appleTest/kotlin/dev/gitlive/firebase/firestore/Ignore.kt similarity index 100% rename from firebase-firestore/src/iosTest/kotlin/dev/gitlive/firebase/firestore/Ignore.kt rename to firebase-firestore/src/appleTest/kotlin/dev/gitlive/firebase/firestore/Ignore.kt diff --git a/firebase-firestore/src/iosTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt b/firebase-firestore/src/appleTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt similarity index 100% rename from firebase-firestore/src/iosTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt rename to firebase-firestore/src/appleTest/kotlin/dev/gitlive/firebase/firestore/firestore.kt diff --git a/firebase-functions/build.gradle.kts b/firebase-functions/build.gradle.kts index 7a9144309..f8e60bc7a 100644 --- a/firebase-functions/build.gradle.kts +++ b/firebase-functions/build.gradle.kts @@ -1,15 +1,17 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-functions.version") as String +val supportedPlatforms = (project.property("firebase-functions.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -19,36 +21,36 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.functions" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.functions" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -70,20 +72,44 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + osx.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebaseFunctions" } @@ -95,19 +121,21 @@ kotlin { } } - js(IR) { - useCommonJs() - nodejs { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs { + testTask { + useKarma { + useChromeHeadless() + } } } - } - browser { - testTask { - useKarma { - useChromeHeadless() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -121,7 +149,11 @@ kotlin { progressiveMode = true optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") optIn("kotlinx.serialization.InternalSerializationApi") - if (name.lowercase().contains("ios")) { + if (name.lowercase().contains("ios") + || name.lowercase().contains("apple") + || name.lowercase().contains("tvos") + || name.lowercase().contains("macos") + ) { optIn("kotlinx.cinterop.ExperimentalForeignApi") } } @@ -141,36 +173,22 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.functions) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.functions) + } } } - getByName("jvmMain") { - kotlin.srcDir("src/androidMain/kotlin") + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + getByName("jvmMain") { + kotlin.srcDir("src/androidMain/kotlin") + } } } } -if (project.property("firebase-functions.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-functions.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-functions.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-functions/src/iosMain/kotlin/dev/gitlive/firebase/functions/functions.kt b/firebase-functions/src/appleMain/kotlin/dev/gitlive/firebase/functions/functions.kt similarity index 100% rename from firebase-functions/src/iosMain/kotlin/dev/gitlive/firebase/functions/functions.kt rename to firebase-functions/src/appleMain/kotlin/dev/gitlive/firebase/functions/functions.kt diff --git a/firebase-installations/build.gradle.kts b/firebase-installations/build.gradle.kts index f4ccb0f18..08108c15b 100644 --- a/firebase-installations/build.gradle.kts +++ b/firebase-installations/build.gradle.kts @@ -1,15 +1,17 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-installations.version") as String +val supportedPlatforms = (project.property("firebase-installations.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -19,36 +21,36 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.installations" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.installations" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -69,20 +71,44 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + osx.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebaseInstallations" } @@ -94,19 +120,21 @@ kotlin { } } - js(IR) { - useCommonJs() - nodejs { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs { + testTask { + useKarma { + useChromeHeadless() + } } } - } - browser { - testTask { - useKarma { - useChromeHeadless() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -118,7 +146,11 @@ kotlin { this.apiVersion = libs.versions.settings.api.get() this.languageVersion = libs.versions.settings.language.get() progressiveMode = true - if (name.lowercase().contains("ios")) { + if (name.lowercase().contains("ios") + || name.lowercase().contains("apple") + || name.lowercase().contains("tvos") + || name.lowercase().contains("macos") + ) { optIn("kotlinx.cinterop.ExperimentalForeignApi") } } @@ -137,36 +169,22 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.installations) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.installations) + } } } - getByName("jvmMain") { - kotlin.srcDir("src/androidMain/kotlin") + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + getByName("jvmMain") { + kotlin.srcDir("src/androidMain/kotlin") + } } } } -if (project.property("firebase-installations.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-installations.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-installations.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-installations/src/iosMain/kotlin/dev/gitlive/firebase/installations/installations.kt b/firebase-installations/src/appleMain/kotlin/dev/gitlive/firebase/installations/installations.kt similarity index 100% rename from firebase-installations/src/iosMain/kotlin/dev/gitlive/firebase/installations/installations.kt rename to firebase-installations/src/appleMain/kotlin/dev/gitlive/firebase/installations/installations.kt diff --git a/firebase-messaging/build.gradle.kts b/firebase-messaging/build.gradle.kts index 54f578b86..0fdcf6396 100644 --- a/firebase-messaging/build.gradle.kts +++ b/firebase-messaging/build.gradle.kts @@ -1,15 +1,17 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-messaging.version") as String +val supportedPlatforms = (project.property("firebase-messaging.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -19,36 +21,36 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.messaging" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.messaging" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -69,20 +71,44 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + osx.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebaseMessaging" } @@ -94,19 +120,21 @@ kotlin { } } - js(IR) { - useCommonJs() - nodejs { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs { + testTask { + useKarma { + useChromeHeadless() + } } } - } - browser { - testTask { - useKarma { - useChromeHeadless() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -119,7 +147,11 @@ kotlin { this.languageVersion = libs.versions.settings.language.get() progressiveMode = true optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") - if (name.lowercase().contains("ios")) { + if (name.lowercase().contains("ios") + || name.lowercase().contains("apple") + || name.lowercase().contains("tvos") + || name.lowercase().contains("macos") + ) { optIn("kotlinx.cinterop.ExperimentalForeignApi") optIn("kotlinx.cinterop.BetaInteropApi") } @@ -139,32 +171,16 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.messaging) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.messaging) + } } } } } -if (project.property("firebase-messaging.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-messaging.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-messaging.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-messaging/src/iosMain/kotlin/dev/gitlive/firebase/messaging/messaging.kt b/firebase-messaging/src/appleMain/kotlin/dev/gitlive/firebase/messaging/messaging.kt similarity index 100% rename from firebase-messaging/src/iosMain/kotlin/dev/gitlive/firebase/messaging/messaging.kt rename to firebase-messaging/src/appleMain/kotlin/dev/gitlive/firebase/messaging/messaging.kt diff --git a/firebase-messaging/src/iosTest/kotlin/dev/gitlive/firebase/messaging/messaging.kt b/firebase-messaging/src/appleTest/kotlin/dev/gitlive/firebase/messaging/messaging.kt similarity index 100% rename from firebase-messaging/src/iosTest/kotlin/dev/gitlive/firebase/messaging/messaging.kt rename to firebase-messaging/src/appleTest/kotlin/dev/gitlive/firebase/messaging/messaging.kt diff --git a/firebase-perf/build.gradle.kts b/firebase-perf/build.gradle.kts index 05e72148c..a1ebb97bd 100644 --- a/firebase-perf/build.gradle.kts +++ b/firebase-perf/build.gradle.kts @@ -1,15 +1,17 @@ -import org.gradle.kotlin.dsl.distribution import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2020 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-perf.version") as String +val supportedPlatforms = (project.property("firebase-perf.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -19,37 +21,37 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.perf" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.perf" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - multiDexEnabled = true - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + multiDexEnabled = true + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -70,20 +72,46 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } + } + + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() } - jvm() - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } + + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + osx.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebasePerformance" } @@ -95,12 +123,14 @@ kotlin { } } - js(IR) { - useCommonJs() - browser { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -113,7 +143,11 @@ kotlin { this.languageVersion = libs.versions.settings.language.get() progressiveMode = true optIn("kotlinx.coroutines.ExperimentalCoroutinesApi") - if (name.lowercase().contains("ios")) { + if (name.lowercase().contains("ios") + || name.lowercase().contains("apple") + || name.lowercase().contains("tvos") + || name.lowercase().contains("macos") + ) { optIn("kotlinx.cinterop.ExperimentalForeignApi") } } @@ -132,9 +166,11 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.perf) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.perf) + } } } @@ -144,24 +180,6 @@ kotlin { } } -if (project.property("firebase-perf.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-perf.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-perf.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-perf/src/iosMain/kotlin/dev/gitlive/firebase/perf/metrics/Trace.kt b/firebase-perf/src/appleMain/kotlin/dev/gitlive/firebase/perf/metrics/Trace.kt similarity index 100% rename from firebase-perf/src/iosMain/kotlin/dev/gitlive/firebase/perf/metrics/Trace.kt rename to firebase-perf/src/appleMain/kotlin/dev/gitlive/firebase/perf/metrics/Trace.kt diff --git a/firebase-perf/src/iosMain/kotlin/dev/gitlive/firebase/perf/performance.kt b/firebase-perf/src/appleMain/kotlin/dev/gitlive/firebase/perf/performance.kt similarity index 100% rename from firebase-perf/src/iosMain/kotlin/dev/gitlive/firebase/perf/performance.kt rename to firebase-perf/src/appleMain/kotlin/dev/gitlive/firebase/perf/performance.kt diff --git a/firebase-perf/src/iosTest/kotlin/dev/gitlive/firebase/perf/performance.kt b/firebase-perf/src/appleTest/kotlin/dev/gitlive/firebase/perf/performance.kt similarity index 100% rename from firebase-perf/src/iosTest/kotlin/dev/gitlive/firebase/perf/performance.kt rename to firebase-perf/src/appleTest/kotlin/dev/gitlive/firebase/perf/performance.kt diff --git a/firebase-storage/build.gradle.kts b/firebase-storage/build.gradle.kts index d8d7c9688..0e1c01d85 100644 --- a/firebase-storage/build.gradle.kts +++ b/firebase-storage/build.gradle.kts @@ -1,15 +1,18 @@ -import org.gradle.kotlin.dsl.distribution +import org.gradle.kotlin.dsl.kotlin import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree -import kotlin.text.set +import utils.TargetPlatform +import utils.supportsApple +import utils.toTargetPlatforms /* * Copyright (c) 2023 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. */ version = project.property("firebase-storage.version") as String +val supportedPlatforms = (project.property("firebase-storage.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -19,36 +22,36 @@ plugins { alias(libs.plugins.publish) } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.storage" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.storage" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - testOptions.configureTestOptions(project) - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + testOptions.configureTestOptions(project) + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } -val supportIosTarget = project.property("skipIosTarget") != "true" - kotlin { explicitApi() @@ -69,20 +72,45 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosArm64() + tvosX64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } + + if (supportedPlatforms.supportsApple()) { cocoapods { - ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + if (supportedPlatforms.contains(TargetPlatform.Ios)) { + ios.deploymentTarget = libs.versions.ios.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvos.deploymentTarget = libs.versions.tvos.deploymentTarget.get() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + osx.deploymentTarget = libs.versions.macos.deploymentTarget.get() + } framework { baseName = "FirebaseStorage" } @@ -94,19 +122,21 @@ kotlin { } } - js(IR) { - useCommonJs() - nodejs { - testTask { - useKarma { - useChromeHeadless() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs { + testTask { + useKarma { + useChromeHeadless() + } } } - } - browser { - testTask { - useKarma { - useChromeHeadless() + browser { + testTask { + useKarma { + useChromeHeadless() + } } } } @@ -118,7 +148,11 @@ kotlin { this.apiVersion = libs.versions.settings.api.get() this.languageVersion = libs.versions.settings.language.get() progressiveMode = true - if (name.lowercase().contains("ios")) { + if (name.lowercase().contains("ios") + || name.lowercase().contains("apple") + || name.lowercase().contains("tvos") + || name.lowercase().contains("macos") + ) { optIn("kotlinx.cinterop.ExperimentalForeignApi") } } @@ -137,36 +171,22 @@ kotlin { } } - getByName("androidMain") { - dependencies { - api(libs.google.firebase.storage) + if (supportedPlatforms.contains(TargetPlatform.Android)) { + getByName("androidMain") { + dependencies { + api(libs.google.firebase.storage) + } } } - getByName("jvmMain") { - kotlin.srcDir("src/androidMain/kotlin") + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + getByName("jvmMain") { + kotlin.srcDir("src/androidMain/kotlin") + } } } } -if (project.property("firebase-storage.skipIosTests") == "true") { - tasks.forEach { - if (it.name.contains("ios", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-storage.skipJvmTests") == "true") { - tasks.forEach { - if (it.name.contains("jvm", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - -if (project.property("firebase-storage.skipJsTests") == "true") { - tasks.forEach { - if (it.name.contains("js", true) && it.name.contains("test", true)) { it.enabled = false } - } -} - mavenPublishing { publishToMavenCentral(automaticRelease = true) signAllPublications() diff --git a/firebase-storage/src/iosMain/kotlin/dev/gitlive/firebase/storage/storage.kt b/firebase-storage/src/appleMain/kotlin/dev/gitlive/firebase/storage/storage.kt similarity index 100% rename from firebase-storage/src/iosMain/kotlin/dev/gitlive/firebase/storage/storage.kt rename to firebase-storage/src/appleMain/kotlin/dev/gitlive/firebase/storage/storage.kt diff --git a/firebase-storage/src/iosTest/kotlin/dev/gitlive/firebase/storage/storage.ios.kt b/firebase-storage/src/appleTest/kotlin/dev/gitlive/firebase/storage/storage.ios.kt similarity index 100% rename from firebase-storage/src/iosTest/kotlin/dev/gitlive/firebase/storage/storage.ios.kt rename to firebase-storage/src/appleTest/kotlin/dev/gitlive/firebase/storage/storage.ios.kt diff --git a/firebase-storage/src/iosTest/kotlin/dev/gitlive/firebase/storage/storage.kt b/firebase-storage/src/appleTest/kotlin/dev/gitlive/firebase/storage/storage.kt similarity index 100% rename from firebase-storage/src/iosTest/kotlin/dev/gitlive/firebase/storage/storage.kt rename to firebase-storage/src/appleTest/kotlin/dev/gitlive/firebase/storage/storage.kt diff --git a/gradle.properties b/gradle.properties index 597e763f9..7abe76b57 100644 --- a/gradle.properties +++ b/gradle.properties @@ -18,56 +18,39 @@ testOptions.unitTests.isIncludeAndroidResources=true kotlin.mpp.enableCInteropCommonization=true kotlin.native.cacheKind=none -# Set to true to skip tests and even compilation of the iOS target. -skipIosTarget=false +# supportedTargets=ios,macos,tvos,jvm,js,android +firebase-analytics.supportedTargets=ios,macos,tvos,jvm,js,android +firebase-app.supportedTargets=ios,macos,tvos,jvm,js,android +firebase-auth.supportedTargets=ios,macos,tvos,jvm,js,android +firebase-common-internal.supportedTargets=ios,macos,tvos,jvm,js,android +firebase-common.supportedTargets=ios,macos,tvos,jvm,js,android +firebase-config.supportedTargets=ios,macos,tvos,jvm,js,android +firebase-crashlytics.supportedTargets=ios,macos,tvos,jvm,android +firebase-database.supportedTargets=ios,macos,tvos,jvm,js,android +firebase-firestore.supportedTargets=ios,macos,tvos,jvm,js,android +firebase-functions.supportedTargets=ios,macos,tvos,jvm,js,android +firebase-installations.supportedTargets=ios,macos,tvos,jvm,js,android +firebase-messaging.supportedTargets=ios,macos,tvos,jvm,js,android +firebase-perf.supportedTargets=ios,tvos,jvm,js,android +firebase-storage.supportedTargets=ios,macos,tvos,jvm,js,android +test-utils.supportedTargets=ios,macos,tvos,jvm,js,android -# Skip iOS Tests -firebase-analytics.skipIosTests=true -firebase-app.skipIosTests=false -firebase-auth.skipIosTests=false -firebase-common-internal.skipIosTests=false -firebase-common.skipIosTests=false -firebase-config.skipIosTests=false -firebase-crashlytics.skipIosTests=false -firebase-database.skipIosTests=false -firebase-firestore.skipIosTests=false -firebase-functions.skipIosTests=false -firebase-installations.skipIosTests=false -firebase-messaging.skipIosTests=false -firebase-perf.skipIosTests=false -firebase-storage.skipIosTests=true - -# We can have the functionality to skip jvm tests, due to compatibility issues. -firebase-analytics.skipJvmTests=true -firebase-app.skipJvmTests=false -firebase-auth.skipJvmTests=true -firebase-common-internal.skipJvmTests=false -firebase-common.skipJvmTests=false -firebase-config.skipJvmTests=true -firebase-crashlytics.skipJvmTests=true -firebase-database.skipJvmTests=false -firebase-firestore.skipJvmTests=false -firebase-functions.skipJvmTests=false -firebase-installations.skipJvmTests=false -firebase-messaging.skipJvmTests=false -firebase-perf.skipJvmTests=true -firebase-storage.skipJvmTests=true - -# We can have the functionality to skip js tests, due to compatibility issues. -firebase-analytics.skipJsTests=false -firebase-app.skipJsTests=false -firebase-auth.skipJsTests=false -firebase-common-internal.skipJsTests=false -firebase-common.skipJsTests=false -firebase-config.skipJsTests=false -firebase-crashlytics.skipJsTests=true -firebase-database.skipJsTests=false -firebase-firestore.skipJsTests=false -firebase-functions.skipJsTests=false -firebase-installations.skipJsTests=false -firebase-messaging.skipJsTests=false -firebase-perf.skipJsTests=false -firebase-storage.skipJsTests=false +# supportedTestTargets=ios,macos,tvos,jvm,js,android +firebase-analytics.supportedTestTargets=js,android +firebase-app.supportedTestTargets=ios,tvos,jvm,js,android +firebase-auth.supportedTestTargets=ios,js,android +firebase-common-internal.supportedTestTargets=ios,macos,tvos,jvm,js,android +firebase-common.supportedTestTargets=ios,macos,tvos,jvm,js,android +firebase-config.supportedTestTargets=ios,macos,tvos,js,android +firebase-crashlytics.supportedTestTargets=ios,macos,tvos,android +firebase-database.supportedTestTargets=ios,macos,tvos,jvm,js,android +firebase-firestore.supportedTestTargets=ios,macos,tvos,jvm,js,android +firebase-functions.supportedTestTargets=ios,macos,tvos,jvm,js,android +firebase-installations.supportedTestTargets=ios,macos,tvos,jvm,js,android +firebase-messaging.supportedTestTargets=ios,macos,tvos,jvm,js,android +firebase-perf.supportedTestTargets=ios,tvos,js,android +firebase-storage.supportedTestTargets=js,android +test-utils.supportedTestTargets=ios,macos,tvos,jvm,js,android # Versions: firebase-analytics.version=2.3.0 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d55c7499a..17650163d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -8,7 +8,7 @@ firebase-bom = "33.15.0" gitlive-firebase-java-sdk = "0.6.1" gson = "2.13.1" junit = "4.13.2" -kotlin = "2.2.0" +kotlin = "2.2.20" kotlinx-coroutines = "1.10.2" kotlinx-serialization = "1.9.0" kotlinx-binarycompatibilityvalidator = "0.18.1" @@ -18,6 +18,8 @@ settings-api = "2.2" settings-language = "2.2" firebase-cocoapods = "11.8.0" ios-deploymentTarget = "13.0" +tvos-deploymentTarget = "13.0" +macos-deploymentTarget = "10.15" test-logger-plugin = "4.0.0" dokka = "2.0.0" publish = "0.34.0" diff --git a/test-utils/build.gradle.kts b/test-utils/build.gradle.kts index a68dad0bf..df64ce14c 100644 --- a/test-utils/build.gradle.kts +++ b/test-utils/build.gradle.kts @@ -2,6 +2,8 @@ import org.jetbrains.kotlin.gradle.ExperimentalKotlinGradlePluginApi import org.jetbrains.kotlin.gradle.dsl.JvmTarget import org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompilerOptions import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree +import utils.TargetPlatform +import utils.toTargetPlatforms /* * Copyright (c) 2023 GitLive Ltd. Use of this source code is governed by the Apache 2.0 license. @@ -10,6 +12,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSetTree // this project is used only in tests to share common code. publishing is disabled in the root build.gradle.kts version = "0.0.1" +val supportedPlatforms = (project.property("test-utils.supportedTargets") as String).toTargetPlatforms() plugins { id("com.android.library") @@ -17,30 +20,32 @@ plugins { kotlin("plugin.serialization") } -android { - val minSdkVersion: Int by project - val compileSdkVersion: Int by project +if (supportedPlatforms.contains(TargetPlatform.Android)) { + android { + val minSdkVersion: Int by project + val compileSdkVersion: Int by project - compileSdk = compileSdkVersion - namespace = "dev.gitlive.firebase.testUtils" + compileSdk = compileSdkVersion + namespace = "dev.gitlive.firebase.testUtils" - defaultConfig { - minSdk = minSdkVersion - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - } + defaultConfig { + minSdk = minSdkVersion + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } - packaging { - resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") - resources.pickFirsts.add("META-INF/AL2.0") - resources.pickFirsts.add("META-INF/LGPL2.1") - } - lint { - abortOnError = false + packaging { + resources.pickFirsts.add("META-INF/kotlinx-serialization-core.kotlin_module") + resources.pickFirsts.add("META-INF/AL2.0") + resources.pickFirsts.add("META-INF/LGPL2.1") + } + lint { + abortOnError = false + } } } @@ -62,26 +67,40 @@ kotlin { } } - @Suppress("OPT_IN_USAGE") - androidTarget { - instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) - publishAllLibraryVariants() + if (supportedPlatforms.contains(TargetPlatform.Android)) { + @Suppress("OPT_IN_USAGE") + androidTarget { + instrumentedTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + unitTestVariant.sourceSetTree.set(KotlinSourceSetTree.test) + publishAllLibraryVariants() + } } - jvm() - - val supportIosTarget = project.property("skipIosTarget") != "true" + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + jvm() + } - if (supportIosTarget) { + if (supportedPlatforms.contains(TargetPlatform.Ios)) { iosArm64() + iosX64() iosSimulatorArm64() } + if (supportedPlatforms.contains(TargetPlatform.Tvos)) { + tvosX64() + tvosArm64() + tvosSimulatorArm64() + } + if (supportedPlatforms.contains(TargetPlatform.Macos)) { + macosArm64() + macosX64() + } - js(IR) { - useCommonJs() - nodejs() - browser() + if (supportedPlatforms.contains(TargetPlatform.Js)) { + js(IR) { + useCommonJs() + nodejs() + browser() + } } sourceSets { @@ -105,15 +124,19 @@ kotlin { } } - getByName("jsMain") { - dependencies { - implementation(kotlin("test-js")) + if (supportedPlatforms.contains(TargetPlatform.Js)) { + getByName("jsMain") { + dependencies { + implementation(kotlin("test-js")) + } } } - getByName("jvmMain") { - dependencies { - api(libs.kotlinx.coroutines.swing) + if (supportedPlatforms.contains(TargetPlatform.Jvm)) { + getByName("jvmMain") { + dependencies { + api(libs.kotlinx.coroutines.swing) + } } } } diff --git a/test-utils/src/iosMain/kotlin/dev/gitlive/firebase/TestUtils.kt b/test-utils/src/appleMain/kotlin/dev/gitlive/firebase/TestUtils.kt similarity index 94% rename from test-utils/src/iosMain/kotlin/dev/gitlive/firebase/TestUtils.kt rename to test-utils/src/appleMain/kotlin/dev/gitlive/firebase/TestUtils.kt index 1bd12ad92..971625fc8 100644 --- a/test-utils/src/iosMain/kotlin/dev/gitlive/firebase/TestUtils.kt +++ b/test-utils/src/appleMain/kotlin/dev/gitlive/firebase/TestUtils.kt @@ -14,6 +14,7 @@ import platform.Foundation.NSDefaultRunLoopMode import platform.Foundation.NSRunLoop import platform.Foundation.create import platform.Foundation.runMode +import kotlin.test.assertEquals actual fun runTest(test: suspend CoroutineScope.() -> Unit) = runBlocking { val testRun = MainScope().async { test() } @@ -30,5 +31,5 @@ actual fun runBlockingTest(action: suspend CoroutineScope.() -> Unit) = runBlock actual fun nativeMapOf(vararg pairs: Pair): Any = mapOf(*pairs) actual fun nativeListOf(vararg elements: Any?): Any = listOf(*elements) actual fun nativeAssertEquals(expected: Any?, actual: Any?) { - kotlin.test.assertEquals(expected, actual) + assertEquals(expected, actual) }