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
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 |
|
} |