diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt index 9cd986597f5..23788dbfea9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt @@ -70,10 +70,6 @@ internal class KotlinCompilationNpmResolver( val projectPath = project.path - val packageJsonHandlers by lazy { - compilation.packageJsonHandlers - } - @Transient val packageJsonTaskHolder: TaskProvider? = KotlinPackageJsonTask.create(compilation) @@ -478,20 +474,25 @@ internal class KotlinCompilationNpmResolver( } else emptySet() val allNpmDependencies = externalNpmDependencies + toolsNpmDependencies + dukatIfNecessary + val packageJsonHandlers = if (compilationResolver.compilation != null) { + compilationResolver.compilation.packageJsonHandlers + } else { + compilationResolver.rootResolver.getPackageJsonHandlers(projectPath, compilationResolver.compilationDisambiguatedName) + } val packageJson = packageJson( compilationResolver.npmProject.name, compilationResolver.npmVersion, compilationResolver.npmProject.main, allNpmDependencies, - compilationResolver.packageJsonHandlers + packageJsonHandlers ) compositeDependencies.forEach { packageJson.dependencies[it.name] = it.version } - compilationResolver.packageJsonHandlers.forEach { + packageJsonHandlers.forEach { it(packageJson) } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt index 2dabc244c46..8b935201c11 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolver.kt @@ -133,14 +133,17 @@ internal class KotlinRootNpmResolver internal constructor( rootProject_.gradle.sharedServices.registerIfAbsent( KotlinRootNpmResolverStateHolder::class.qualifiedName, KotlinRootNpmResolverStateHolder::class.java - ) { - it.parameters.plugins.set(plugins_) - it.parameters.projectResolvers.set(projectResolvers_) - it.parameters.packageManager.set(nodeJs_.packageManager) - it.parameters.yarnEnvironment.set(yarnEnvironment_?.get()) - it.parameters.npmEnvironment.set(npmEnvironment_?.get()) - it.parameters.yarnResolutions.set(yarnResolutions_?.get()) - it.parameters.taskRequirements.set(taskRequirements_) + ) { service -> + service.parameters.plugins.set(plugins_) + service.parameters.projectResolvers.set(projectResolvers_) + service.parameters.packageManager.set(nodeJs_.packageManager) + service.parameters.yarnEnvironment.set(yarnEnvironment_?.get()) + service.parameters.npmEnvironment.set(npmEnvironment_?.get()) + service.parameters.yarnResolutions.set(yarnResolutions_?.get()) + service.parameters.taskRequirements.set(taskRequirements_) + service.parameters.packageJsonHandlers.set(compilations.associate { compilation -> + "${compilation.project.path}:${compilation.disambiguatedName}" to compilation.packageJsonHandlers + }.filter { it.value.isNotEmpty() }) } } @@ -197,6 +200,9 @@ internal class KotlinRootNpmResolver internal constructor( val compilations: Collection get() = projectResolvers.values.flatMap { it.compilationResolvers.map { it.compilation } } + internal fun getPackageJsonHandlers(projectPath: String, compilationDisambiguatedName: String): List Unit> = + resolverStateHolder.get().parameters.packageJsonHandlers.get()["$projectPath:$compilationDisambiguatedName"] ?: emptyList() + fun findDependentResolver(src: Project, target: Project): List? { // todo: proper finding using KotlinTargetComponent.findUsageContext val targetResolver = this[target.path] diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolverStateHolder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolverStateHolder.kt index c36c50710ad..1d622090fd7 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolverStateHolder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinRootNpmResolverStateHolder.kt @@ -13,6 +13,7 @@ import org.gradle.api.services.BuildServiceParameters import org.jetbrains.kotlin.gradle.targets.js.nodejs.TasksRequirements import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi import org.jetbrains.kotlin.gradle.targets.js.npm.NpmEnvironment +import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson import org.jetbrains.kotlin.gradle.targets.js.npm.plugins.RootResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnEnv import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnResolution @@ -27,6 +28,9 @@ internal abstract class KotlinRootNpmResolverStateHolder : BuildService val yarnResolutions: ListProperty val taskRequirements: Property + + // pulled up from compilation resolver since it was failing with ClassNotFoundException on deserialization, see KT-49061 + val packageJsonHandlers: MapProperty Unit>> } var initialized = false