From a5893d4bee60b15865797e5b31770f54358c9fcb Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Tue, 15 Aug 2023 09:10:10 +0000 Subject: [PATCH] [Gradle, JS] Build service npm resolution manager does not contain packageJsonHandlers ^KT-60469 fixed --- .../kotlin/gradle/JsConfigurationCacheIT.kt | 2 +- .../kotlin/gradle/Kotlin2JsGradlePluginIT.kt | 1 + .../app/build.gradle.kts | 2 ++ .../gradle/targets/js/KotlinJsCompilation.kt | 5 ++-- .../targets/js/nodejs/NodeJsRootPlugin.kt | 7 ----- .../js/npm/KotlinNpmResolutionManager.kt | 4 --- .../gradle/targets/js/npm/PackageJson.kt | 5 ++-- .../targets/js/npm/PublicPackageJsonTask.kt | 25 +++++++++++------- .../npm/resolved/KotlinRootNpmResolution.kt | 2 +- .../KotlinCompilationNpmResolution.kt | 26 ++++++++++--------- .../resolver/KotlinCompilationNpmResolver.kt | 1 + .../js/npm/tasks/KotlinPackageJsonTask.kt | 23 +++++++++------- 12 files changed, 55 insertions(+), 48 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JsConfigurationCacheIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JsConfigurationCacheIT.kt index f49b047aeb5..41715768afe 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JsConfigurationCacheIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/JsConfigurationCacheIT.kt @@ -53,7 +53,7 @@ abstract class JsIrConfigurationCacheIT : KGPBaseTest() { } @DisplayName("configuration cache is reused when idea.version system property is changed in browser project") - @GradleTestVersions(minVersion = TestVersions.Gradle.G_7_5) + @GradleTestVersions(minVersion = TestVersions.Gradle.G_8_0) @GradleTest fun testBrowserDistributionOnIdeaPropertyChange(gradleVersion: GradleVersion) { project("kotlin-js-browser-project", gradleVersion) { diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index 846aeae5f82..8a6979c1c17 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -1136,6 +1136,7 @@ class Kotlin2JsIrGradlePluginIT : KGPBaseTest() { assertEquals(JsonNull.INSTANCE, jso.get("customField2").asJsonNull) assertEquals(JsonNull.INSTANCE, jso.get("customField3").asJsonNull) assertEquals(JsonNull.INSTANCE, jso.get("customField4").asJsonObject.get("foo").asJsonNull) + assertEquals("@as/main", jso.get("customField5").asString) } } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-browser-project/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-browser-project/app/build.gradle.kts index 31310aa0692..80f49d1341f 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-browser-project/app/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlin-js-browser-project/app/build.gradle.kts @@ -47,11 +47,13 @@ kotlin { binaries.executable() compilations.named("main") { + val nameOfModule = this@named.name packageJson { customField("customField1", mapOf("one" to 1, "two" to 2)) customField("customField2", null) customField("customField3" to null) customField("customField4", mapOf("foo" to null)) + customField("customField5", "@as/${nameOfModule}") } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt index c0e8c2e72d0..f1842f7f987 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsCompilation.kt @@ -9,6 +9,7 @@ package org.jetbrains.kotlin.gradle.plugin.mpp import groovy.lang.Closure +import org.gradle.api.Action import org.gradle.api.attributes.AttributeContainer import org.gradle.api.tasks.TaskProvider import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompilerOptions @@ -78,9 +79,9 @@ open class KotlinJsCompilation @Inject internal constructor( override val compileTaskProvider: TaskProvider get() = compilation.compileTaskProvider as TaskProvider - internal val packageJsonHandlers = mutableListOf Unit>() + internal val packageJsonHandlers = mutableListOf>() - fun packageJson(handler: PackageJson.() -> Unit) { + fun packageJson(handler: Action) { packageJsonHandlers.add(handler) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt index f0317320436..a734fea81db 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt @@ -109,13 +109,6 @@ open class NodeJsRootPlugin : Plugin { nodeJs.resolver.close() } ) - it.parameters.packageJsonHandlers.set( - objectFactory.providerWithLazyConvention { - nodeJs.resolver.compilations.associate { compilation -> - "${compilation.project.path}:${compilation.disambiguatedName}" to compilation.packageJsonHandlers - } - } - ) it.parameters.gradleNodeModulesProvider.set(gradleNodeModulesProvider) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt index f5316b6d6f5..a765ebd328d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt @@ -7,7 +7,6 @@ package org.jetbrains.kotlin.gradle.targets.js.npm import org.gradle.api.Task import org.gradle.api.logging.Logger -import org.gradle.api.provider.MapProperty import org.gradle.api.provider.Property import org.gradle.api.services.BuildService import org.gradle.api.services.BuildServiceParameters @@ -47,9 +46,6 @@ abstract class KotlinNpmResolutionManager : BuildService - // pulled up from compilation resolver since it was failing with ClassNotFoundException on deserialization, see KT-49061 - val packageJsonHandlers: MapProperty Unit>> - val gradleNodeModulesProvider: Property } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt index aed9eb7853c..af02c6eecac 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PackageJson.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm import com.google.gson.* +import org.gradle.api.Action import org.gradle.api.GradleException import org.jetbrains.kotlin.gradle.internal.ensureParentDirsCreated import java.io.File @@ -122,7 +123,7 @@ internal fun packageJson( version: String, main: String, npmDependencies: Collection, - packageJsonHandlers: List Unit> + packageJsonHandlers: List> ): PackageJson { val packageJson = PackageJson( @@ -150,7 +151,7 @@ internal fun packageJson( } packageJsonHandlers.forEach { - it(packageJson) + it.execute(packageJson) } return packageJson diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt index 97350a4842b..a95d54f8dbd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt @@ -5,8 +5,11 @@ package org.jetbrains.kotlin.gradle.targets.js.npm +import org.gradle.api.Action import org.gradle.api.DefaultTask +import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property +import org.gradle.api.provider.Provider import org.gradle.api.tasks.Input import org.gradle.api.tasks.Internal import org.gradle.api.tasks.OutputFile @@ -38,22 +41,24 @@ abstract class PublicPackageJsonTask : @get:Internal abstract val npmProjectMain: Property - private val packageJsonHandlers: List Unit> - get() = npmResolutionManager.get().parameters.packageJsonHandlers.get() - .getValue("$projectPath:${compilationDisambiguatedName.get()}") - + @get:Internal + abstract val packageJsonHandlers: ListProperty> @get:Input - val packageJsonCustomFields: Map - get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue) - .apply { - packageJsonHandlers.forEach { it() } - }.customFields + internal val packageJsonInputHandlers: Provider by lazy { + packageJsonHandlers.map { packageJsonHandlersList -> + PackageJson(fakePackageJsonValue, fakePackageJsonValue) + .apply { + packageJsonHandlersList.forEach { it.execute(this) } + } + } + } private val compilationResolution get() = npmResolutionManager.get().resolution.get()[projectPath][compilationDisambiguatedName.get()] .getResolutionOrPrepare( npmResolutionManager.get(), + packageJsonHandlers, logger ) @@ -78,7 +83,7 @@ abstract class PublicPackageJsonTask : projectVersion, npmProjectMain.get(), externalDependencies, - packageJsonHandlers + packageJsonHandlers.get() ).let { packageJson -> packageJson.main = "${npmProjectName.get()}.js" diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt index f11e6bfb5be..ae77c47ebd8 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinRootNpmResolution.kt @@ -32,7 +32,7 @@ class KotlinRootNpmResolution( synchronized(projects) { npmResolutionManager.parameters.gradleNodeModulesProvider.get().close() - val projectResolutions: List = projects.values.flatMap { it.npmProjects }.map { it.close(npmResolutionManager, logger) } + val projectResolutions: List = projects.values.flatMap { it.npmProjects }.map { it.close() } npmEnvironment.packageManager.prepareRootProject( npmEnvironment, rootProjectName, diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolution.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolution.kt index 18e98ffd4fb..ac43d91fd24 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolution.kt @@ -5,7 +5,9 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.resolver +import org.gradle.api.Action import org.gradle.api.logging.Logger +import org.gradle.api.provider.ListProperty import org.jetbrains.kotlin.gradle.targets.js.nodejs.TasksRequirements import org.jetbrains.kotlin.gradle.targets.js.npm.* import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.PreparedKotlinCompilationNpmResolution @@ -39,12 +41,13 @@ class KotlinCompilationNpmResolution( ) private var closed = false - private var resolution: PreparedKotlinCompilationNpmResolution? = null + internal var resolution: PreparedKotlinCompilationNpmResolution? = null @Synchronized fun prepareWithDependencies( skipWriting: Boolean = false, npmResolutionManager: KotlinNpmResolutionManager, + packageJsonHandlers: ListProperty>, logger: Logger ): PreparedKotlinCompilationNpmResolution { check(resolution == null) { "$this already resolved" } @@ -52,6 +55,7 @@ class KotlinCompilationNpmResolution( return createPreparedResolution( skipWriting, npmResolutionManager, + packageJsonHandlers, logger ).also { resolution = it @@ -61,29 +65,29 @@ class KotlinCompilationNpmResolution( @Synchronized fun getResolutionOrPrepare( npmResolutionManager: KotlinNpmResolutionManager, + packageJsonHandlers: ListProperty>, logger: Logger, ): PreparedKotlinCompilationNpmResolution { return resolution ?: prepareWithDependencies( skipWriting = true, npmResolutionManager, + packageJsonHandlers, logger ) } @Synchronized - fun close( - npmResolutionManager: KotlinNpmResolutionManager, - logger: Logger, - ): PreparedKotlinCompilationNpmResolution { + fun close(): PreparedKotlinCompilationNpmResolution { check(!closed) { "$this already closed" } closed = true - return getResolutionOrPrepare(npmResolutionManager, logger) + return resolution!! } fun createPreparedResolution( skipWriting: Boolean, npmResolutionManager: KotlinNpmResolutionManager, + packageJsonHandlers: ListProperty>, logger: Logger ): PreparedKotlinCompilationNpmResolution { val rootResolver = npmResolutionManager.parameters.resolution.get() @@ -93,6 +97,7 @@ class KotlinCompilationNpmResolution( val compilationNpmResolution: KotlinCompilationNpmResolution = rootResolver[it.projectPath][it.compilationName] compilationNpmResolution.getResolutionOrPrepare( npmResolutionManager, + packageJsonHandlers, logger ) } @@ -120,20 +125,17 @@ class KotlinCompilationNpmResolution( val otherNpmDependencies = toolsNpmDependencies + transitiveNpmDependencies val allNpmDependencies = disambiguateDependencies(externalNpmDependencies, otherNpmDependencies, logger) - val packageJsonHandlers = - npmResolutionManager.parameters.packageJsonHandlers.get()["$projectPath:${compilationDisambiguatedName}"] - ?: emptyList() val packageJson = packageJson( npmProjectName, npmProjectVersion, npmProjectMain, allNpmDependencies, - packageJsonHandlers + packageJsonHandlers.get() ) - packageJsonHandlers.forEach { - it(packageJson) + packageJsonHandlers.get().forEach { + it.execute(packageJson) } if (!skipWriting) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt index 65c27a79c91..88c7d28918e 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt @@ -72,6 +72,7 @@ class KotlinCompilationNpmResolver( it.dependsOn(packageJsonTaskHolder) it.compilationDisambiguatedName.set(compilation.disambiguatedName) + it.packageJsonHandlers.set(compilation.packageJsonHandlers) it.npmResolutionManager.value(npmResolutionManager) .disallowChanges() diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt index eea1c066dd0..8296962a88b 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt @@ -5,9 +5,12 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.tasks +import org.gradle.api.Action import org.gradle.api.DefaultTask import org.gradle.api.artifacts.component.ProjectComponentIdentifier +import org.gradle.api.provider.ListProperty import org.gradle.api.provider.Property +import org.gradle.api.provider.Provider import org.gradle.api.tasks.* import org.gradle.work.DisableCachingByDefault import org.gradle.work.NormalizeLineEndings @@ -55,19 +58,19 @@ abstract class KotlinPackageJsonTask : @get:Internal abstract val compilationDisambiguatedName: Property - private val packageJsonHandlers: List Unit> - get() = npmResolutionManager.get().parameters.packageJsonHandlers.get() - .getValue("$projectPath:${compilationDisambiguatedName.get()}") + @get:Internal + abstract val packageJsonHandlers: ListProperty> @get:Input - val packageJsonCustomFields: Map by lazy { - PackageJson(fakePackageJsonValue, fakePackageJsonValue) - .apply { - packageJsonHandlers.forEach { it() } - }.customFields + internal val packageJsonInputHandlers: Provider by lazy { + packageJsonHandlers.map { packageJsonHandlersList -> + PackageJson(fakePackageJsonValue, fakePackageJsonValue) + .apply { + packageJsonHandlersList.forEach { it.execute(this) } + } + } } - @get:Input internal val toolsNpmDependencies: List by lazy { nodeJs.taskRequirements @@ -112,6 +115,7 @@ abstract class KotlinPackageJsonTask : npmResolutionManager.get().resolution.get()[projectPath][compilationDisambiguatedName.get()] .prepareWithDependencies( npmResolutionManager = npmResolutionManager.get(), + packageJsonHandlers = packageJsonHandlers, logger = logger ) } @@ -130,6 +134,7 @@ abstract class KotlinPackageJsonTask : val gradleNodeModules = GradleNodeModulesCache.registerIfAbsent(project, null, null) val packageJsonTask = project.registerTask(packageJsonTaskName) { task -> task.compilationDisambiguatedName.set(compilation.disambiguatedName) + task.packageJsonHandlers.set(compilation.packageJsonHandlers) task.description = "Create package.json file for $compilation" task.group = NodeJsRootPlugin.TASKS_GROUP_NAME