You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

93 lines
3.9 KiB

/*
* Copyright 2020-2022 JetBrains s.r.o. and respective authors and developers.
* Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE.txt file.
*/
package org.jetbrains.compose.experimental.web.internal
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
import org.gradle.api.artifacts.ResolvedDependency
import org.gradle.api.artifacts.UnresolvedDependency
import org.gradle.api.provider.Provider
import org.jetbrains.compose.ComposeBuildConfig
import org.jetbrains.compose.experimental.dsl.ExperimentalWebApplication
import org.jetbrains.compose.experimental.web.tasks.ExperimentalUnpackSkikoWasmRuntimeTask
import org.jetbrains.compose.internal.utils.*
import org.jetbrains.compose.internal.utils.registerTask
import org.jetbrains.compose.internal.utils.uppercaseFirstChar
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
internal fun KotlinJsIrTarget.configureExperimentalWebApplication(app: ExperimentalWebApplication) {
val mainCompilation = compilations.getByName("main")
val unpackedRuntimeDir = project.layout.buildDirectory.dir("compose/skiko-wasm/$targetName")
val taskName = "unpackSkikoWasmRuntime${targetName.uppercaseFirstChar()}"
mainCompilation.defaultSourceSet.resources.srcDir(unpackedRuntimeDir)
val skikoJsWasmRuntimeDependency = skikoVersionProvider(project)
.map { skikoVersion ->
project.dependencies.create("org.jetbrains.skiko:skiko-js-wasm-runtime:$skikoVersion")
}
val skikoJsWasmRuntimeConfiguration = project.configurations.create("COMPOSE_SKIKO_JS_WASM_RUNTIME").defaultDependencies {
it.addLater(skikoJsWasmRuntimeDependency)
}
val unpackRuntime = project.registerTask<ExperimentalUnpackSkikoWasmRuntimeTask>(taskName) {
skikoRuntimeFiles = skikoJsWasmRuntimeConfiguration
outputDir.set(unpackedRuntimeDir)
}
project.tasks.named(mainCompilation.processResourcesTaskName).configure { processResourcesTask ->
processResourcesTask.dependsOn(unpackRuntime)
}
}
private const val SKIKO_GROUP = "org.jetbrains.skiko"
private fun skikoVersionProvider(project: Project): Provider<String> {
val composeVersion = ComposeBuildConfig.composeVersion
val configurationWithSkiko = project.detachedComposeDependency(
artifactId = "ui-graphics",
groupId = "org.jetbrains.compose.ui"
)
return project.provider {
val skikoDependency = configurationWithSkiko.allDependenciesDescriptors.firstOrNull(::isSkikoDependency)
skikoDependency?.version
?: error("Cannot determine the version of Skiko for Compose '$composeVersion'")
}
}
private fun isSkikoDependency(dep: DependencyDescriptor): Boolean =
dep.group == SKIKO_GROUP && dep.version != null
private val Configuration.allDependenciesDescriptors: Sequence<DependencyDescriptor>
get() = with (resolvedConfiguration.lenientConfiguration) {
allModuleDependencies.asSequence().map { ResolvedDependencyDescriptor(it) } +
unresolvedModuleDependencies.asSequence().map { UnresolvedDependencyDescriptor(it) }
}
private abstract class DependencyDescriptor {
abstract val group: String?
abstract val name: String?
abstract val version: String?
}
private class ResolvedDependencyDescriptor(private val dependency: ResolvedDependency) : DependencyDescriptor() {
override val group: String?
get() = dependency.moduleGroup
override val name: String?
get() = dependency.moduleName
override val version: String?
get() = dependency.moduleVersion
}
private class UnresolvedDependencyDescriptor(private val dependency: UnresolvedDependency) : DependencyDescriptor() {
override val group: String?
get() = dependency.selector.group
override val name: String?
get() = dependency.selector.name
override val version: String?
get() = dependency.selector.version
}