diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt index a15250d244d..dd7f34baa09 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootPlugin.kt @@ -7,9 +7,11 @@ package org.jetbrains.kotlin.gradle.targets.js.nodejs import org.gradle.api.Plugin import org.gradle.api.Project +import org.gradle.api.Task import org.gradle.api.plugins.BasePlugin import org.jetbrains.kotlin.gradle.targets.js.MultiplePluginDeclarationDetector import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension.Companion.EXTENSION_NAME +import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.PACKAGE_JSON_UMBRELLA_TASK_NAME import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask import org.jetbrains.kotlin.gradle.targets.js.yarn.YarnPlugin import org.jetbrains.kotlin.gradle.tasks.CleanDataTask @@ -34,7 +36,7 @@ open class NodeJsRootPlugin : Plugin { val rootClean = project.rootProject.tasks.named(BasePlugin.CLEAN_TASK_NAME) - tasks.register(KotlinNpmInstallTask.NAME, KotlinNpmInstallTask::class.java) { + registerTask(KotlinNpmInstallTask.NAME) { it.dependsOn(setupTask) it.group = TASKS_GROUP_NAME it.description = "Find, download and link NPM dependencies and projects" @@ -42,6 +44,8 @@ open class NodeJsRootPlugin : Plugin { it.mustRunAfter(rootClean) } + registerTask(PACKAGE_JSON_UMBRELLA_TASK_NAME) + YarnPlugin.apply(project) tasks.register("node" + CleanDataTask.NAME_SUFFIX, CleanDataTask::class.java) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinCompilationNpmResolution.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinCompilationNpmResolution.kt index 2bc6ed4557a..ecc968cd7c4 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinCompilationNpmResolution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinCompilationNpmResolution.kt @@ -15,7 +15,9 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson * Resolved [NpmProject] */ class KotlinCompilationNpmResolution( + @Transient val project: Project, + @Transient val npmProject: NpmProject, val internalDependencies: Collection, val internalCompositeDependencies: Collection, 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 6bde98e8725..8c56410ae00 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 @@ -43,16 +43,27 @@ import java.io.Serializable * See [KotlinNpmResolutionManager] for details about resolution process. */ internal class KotlinCompilationNpmResolver( + @Transient val projectResolver: KotlinProjectNpmResolver, + @Transient val compilation: KotlinJsCompilation ) { + @Transient val resolver = projectResolver.resolver + + @Transient val npmProject = compilation.npmProject + val nodeJs get() = resolver.nodeJs + val target get() = compilation.target + val project get() = target.project + + @Transient val packageJsonTaskHolder = KotlinPackageJsonTask.create(compilation) + @Transient val publicPackageJsonTaskHolder: TaskProvider = project.registerTask( npmProject.publicPackageJsonTaskName, @@ -71,6 +82,7 @@ internal class KotlinCompilationNpmResolver( } } + @Transient val plugins: List = projectResolver.resolver.plugins .flatMap { if (compilation.isMain()) { @@ -168,6 +180,12 @@ internal class KotlinCompilationNpmResolver( val artifact: ResolvedArtifact ) + data class FileExternalGradleDependency( + val dependencyName: String, + val dependencyVersion: String, + val file: File + ) + data class CompositeDependency( val dependency: ResolvedDependency, val includedBuild: IncludedBuild @@ -317,15 +335,26 @@ internal class KotlinCompilationNpmResolver( inner class PackageJsonProducer( val internalDependencies: Collection, val internalCompositeDependencies: Collection, + @Transient val externalGradleDependencies: Collection, val externalNpmDependencies: Collection, val fileCollectionDependencies: Collection ) { + val fileExternalGradleDependencies by lazy { + externalGradleDependencies.map { + FileExternalGradleDependency( + it.dependency.moduleName, + it.dependency.moduleVersion, + it.artifact.file + ) + } + } + val inputs: PackageJsonProducerInputs get() = PackageJsonProducerInputs( internalDependencies.map { it.npmProject.name }, internalCompositeDependencies.flatMap { it.getPackages() }, - externalGradleDependencies.map { it.artifact.file }, + fileExternalGradleDependencies.map { it.file }, externalNpmDependencies.map { it.uniqueRepresentation() }, fileCollectionDependencies.map { it.files }.flatMap { it.files } ) @@ -335,8 +364,8 @@ internal class KotlinCompilationNpmResolver( it.getResolutionOrResolveIfForced() ?: error("Unresolved dependent npm package: ${this@KotlinCompilationNpmResolver} -> $it") } - val importedExternalGradleDependencies = externalGradleDependencies.mapNotNull { - resolver.gradleNodeModules.get(it.dependency.moduleName, it.dependency.moduleVersion, it.artifact.file) + val importedExternalGradleDependencies = fileExternalGradleDependencies.mapNotNull { + resolver.gradleNodeModules.get(it.dependencyName, it.dependencyVersion, it.file) } + fileCollectionDependencies.flatMap { dependency -> dependency.files // Gradle can hash with FileHasher only files and only existed files diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt index 699f363a05d..20dfe39366f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinProjectNpmResolver.kt @@ -45,7 +45,6 @@ internal class KotlinProjectNpmResolver( init { addContainerListeners() - project.whenEvaluated { val nodeJs = resolver.nodeJs project.tasks.implementing(RequiresNpmDependencies::class) 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 b60ab8edefc..7caf2838bea 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 @@ -49,25 +49,24 @@ internal class KotlinRootNpmResolver internal constructor( val gradleNodeModules = GradleNodeModulesCache(nodeJs) val compositeNodeModules = CompositeNodeModulesCache(nodeJs) - val packageJsonUmbrella = rootProject.registerTask(PACKAGE_JSON_UMBRELLA_TASK_NAME, Task::class.java) {} - val projectResolvers = mutableMapOf() + val projectResolvers = mutableMapOf() fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved." @Synchronized fun addProject(target: Project) { check(state == State.CONFIGURING) { alreadyResolvedMessage("add new project: $target") } - projectResolvers[target] = KotlinProjectNpmResolver(target, this) + projectResolvers[target.path] = KotlinProjectNpmResolver(target, this) } - operator fun get(project: Project) = projectResolvers[project] ?: error("$project is not configured for JS usage") + operator fun get(projectPath: String) = projectResolvers[projectPath] ?: error("$projectPath is not configured for JS usage") val compilations: Collection get() = projectResolvers.values.flatMap { it.compilationResolvers.map { it.compilation } } fun findDependentResolver(src: Project, target: Project): List? { // todo: proper finding using KotlinTargetComponent.findUsageContext - val targetResolver = this[target] + val targetResolver = this[target.path] val mainCompilations = targetResolver.compilationResolvers.filter { it.compilation.isMain() } return if (mainCompilations.isNotEmpty()) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt index 4a029745fc5..606d69337c1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt @@ -33,8 +33,11 @@ open class KotlinPackageJsonTask : DefaultTask() { @Transient private lateinit var compilation: KotlinJsCompilation + @Input + val projectPath = project.path + private val compilationResolver - get() = nodeJs.npmResolutionManager.resolver[project][compilation] + get() = nodeJs.npmResolutionManager.resolver[projectPath][compilation] private val producer: KotlinCompilationNpmResolver.PackageJsonProducer get() = compilationResolver.packageJsonProducer