import com.vanniktech.maven.publish.SonatypeHost
import static de.fayard.refreshVersions.core.Versions.versionFor

plugins {
  id 'com.android.library'
  id 'kotlin-android'
  id 'com.vanniktech.maven.publish'
}

android {
  namespace 'com.airbnb.lottie.compose'
  compileSdk 33
  defaultConfig {
    minSdk 21
    targetSdk 33
    testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
  }
  buildTypes {
    release {
      minifyEnabled false
    }
  }
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_17
    targetCompatibility JavaVersion.VERSION_17
  }
  kotlinOptions {
    jvmTarget = JavaVersion.VERSION_17.toString()
    freeCompilerArgs += [
        "-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi",
    ]
  }
  buildFeatures {
    compose true
  }
  composeOptions {
    kotlinCompilerExtensionVersion = versionFor(project, AndroidX.compose.compiler)
  }
}

mavenPublishing {
  publishToMavenCentral(SonatypeHost.DEFAULT)
  signAllPublications()
}

dependencies {
  api project(':lottie')
  implementation platform(libs.compose.bom)
  implementation libs.compose.foundation
  implementation libs.compose.ui

  testImplementation libs.robolectric
  testImplementation libs.androidx.collection.ktx
  testImplementation libs.kotlinx.coroutines.test
  testImplementation libs.junit4
  androidTestImplementation libs.androidx.test.junit
  androidTestImplementation libs.androidx.test.espresso
}