[Gradle, JS] Support for groovy dsl and Pair in kotlin dsl

[Gradle, JS] Use package json custom fields as inputs

^KT-42400 fixed
This commit is contained in:
Ilya Goncharov
2020-10-02 13:36:30 +03:00
parent 6c1dc43d25
commit de8776ec1d
4 changed files with 42 additions and 4 deletions
@@ -8,7 +8,9 @@
// Old package for compatibility
package org.jetbrains.kotlin.gradle.plugin.mpp
import groovy.lang.Closure
import org.gradle.api.tasks.TaskProvider
import org.gradle.util.ConfigureUtil
import org.gradle.util.WrapUtil
import org.jetbrains.kotlin.gradle.dsl.KotlinJsOptions
import org.jetbrains.kotlin.gradle.dsl.KotlinJsOptionsImpl
@@ -60,11 +62,16 @@ open class KotlinJsCompilation(
internal val packageJsonHandlers = mutableListOf<PackageJson.() -> Unit>()
@Suppress("unused")
fun packageJson(handler: PackageJson.() -> Unit) {
packageJsonHandlers.add(handler)
}
fun packageJson(handler: Closure<*>) {
packageJson {
ConfigureUtil.configure(handler, this)
}
}
override val apiConfigurationName: String
get() = disambiguateNameInPlatform(API)
@@ -10,6 +10,7 @@ import com.google.gson.FieldAttributes
import com.google.gson.Gson
import com.google.gson.GsonBuilder
import org.gradle.api.GradleException
import org.gradle.api.tasks.Input
import org.jetbrains.kotlin.gradle.internal.ensureParentDirsCreated
import java.io.File
@@ -18,7 +19,7 @@ class PackageJson(
var name: String,
var version: String
) {
private val customFields = mutableMapOf<String, Any>()
internal val customFields = mutableMapOf<String, Any?>()
val empty: Boolean
get() = main == null &&
@@ -60,10 +61,22 @@ class PackageJson(
val bundledDependencies = mutableListOf<String>()
get() = field ?: mutableListOf()
fun customField(pair: Pair<String, Any>) {
customFields[pair.first] = pair.second
}
fun customField(key: String, value: Any) {
customFields[key] = value
}
fun customField(key: String, value: Number) {
customFields[key] = value
}
fun customField(key: String, value: Boolean) {
customFields[key] = value
}
companion object {
fun scopedName(name: String): ScopedName = if (name.contains("/")) ScopedName(
scope = name.substringBeforeLast("/").removePrefix("@"),
@@ -163,4 +176,6 @@ private fun chooseVersion(
There is already declared version of '$module' with version '$oldVersion' which does not intersects with another declared version '${newVersion}'
""".trimIndent()
)
}
}
internal const val fakePackageJsonValue = "FAKE"
@@ -21,7 +21,7 @@ import javax.inject.Inject
open class PublicPackageJsonTask
@Inject
constructor(
compilation: KotlinJsCompilation
private val compilation: KotlinJsCompilation
) : DefaultTask() {
private val npmProject = compilation.npmProject
@@ -31,6 +31,13 @@ constructor(
private val compilationResolution
get() = nodeJs.npmResolutionManager.requireInstalled()[project][npmProject.compilation]
@get:Input
val packageJsonCustomFields: Map<String, Any?>
get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue)
.apply {
compilation.packageJsonHandlers.forEach { it() }
}.customFields
@get:Nested
internal val externalDependencies: Collection<NestedNpmDependency>
get() = compilationResolution.externalNpmDependencies
@@ -11,6 +11,8 @@ import org.gradle.api.tasks.*
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
import org.jetbrains.kotlin.gradle.targets.js.npm.fakePackageJsonValue
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.PACKAGE_JSON_UMBRELLA_TASK_NAME
@@ -28,6 +30,13 @@ open class KotlinPackageJsonTask : DefaultTask() {
private val producer: KotlinCompilationNpmResolver.PackageJsonProducer
get() = compilationResolver.packageJsonProducer
@get:Input
val packageJsonCustomFields: Map<String, Any?>
get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue)
.apply {
compilation.packageJsonHandlers.forEach { it() }
}.customFields
private fun findDependentTasks(): Collection<Any> =
producer.internalDependencies.map { dependentResolver ->
dependentResolver.npmProject.packageJsonTask