diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt index 5784a37fc3996f1fb7e35e42846abfb1ccf33241..8f00905fef769366b725d3b6e7acc922e0d2a726 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt @@ -85,7 +85,7 @@ internal class DukatCompilationResolverPlugin( internalCompositeDependencies: Set, externalGradleDependencies: Set, externalNpmDependencies: Set, - fileCollectionDependencies: Set + fileCollectionDependencies: Set ) { if (nodeJs.experimental.discoverTypes) { // todo: discoverTypes diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt index 712905f6a7314c7b71630fca7906293f02cf147d..4639a5834ba5dd1bd70334fa94e483444a5d353d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/AbstractNodeModulesCache.kt @@ -53,6 +53,8 @@ internal abstract class AbstractNodeModulesCache(nodeJs: NodeJsRootExtension) : } } +// Synchronized as tasks from configuration cache run in parallel and every task has it's own modules cache +@Synchronized fun makeNodeModule( container: File, packageJson: PackageJson, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt index c9998df5026e438857067ee659307eba3c00bd73..b11fb9f8b51abd366bc18fb193a016ab295c4b6a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/PublicPackageJsonTask.kt @@ -11,8 +11,10 @@ import org.gradle.api.tasks.Nested import org.gradle.api.tasks.OutputFile import org.gradle.api.tasks.TaskAction import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation +import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject.Companion.PACKAGE_JSON import org.jetbrains.kotlin.gradle.utils.disableTaskOnConfigurationCacheBuild +import org.jetbrains.kotlin.gradle.utils.getValue import org.jetbrains.kotlin.gradle.utils.property import java.io.File import javax.inject.Inject @@ -27,29 +29,32 @@ constructor( private val nodeJs = npmProject.nodeJs private val compilationName = compilation.name + private val projectPath = project.path + + private val compilationResolution + get() = nodeJs.npmResolutionManager.requireInstalled( + services, + logger + )[projectPath][compilationName] - private val compilationResolution by lazy { - nodeJs.npmResolutionManager.requireInstalled( - services, - logger - )[project.path][compilationName] - } init { // TODO: temporary workaround for configuration cache enabled builds // disableTaskOnConfigurationCacheBuild { nodeJs.npmResolutionManager.toString() } } -// @get:Input -// val packageJsonCustomFields: Map -// get() = PackageJson(fakePackageJsonValue, fakePackageJsonValue) -// .apply { -// compilation.packageJsonHandlers.forEach { it() } -// }.customFields + // TODO: is map contains only serializable values? + @get:Input + val packageJsonCustomFields: Map by lazy { + PackageJson(fakePackageJsonValue, fakePackageJsonValue) + .apply { + compilation.packageJsonHandlers.forEach { it() } + }.customFields + } @get:Nested - internal val externalDependencies: Collection by lazy { - compilationResolution.externalNpmDependencies + internal val externalDependencies: Collection + get() = compilationResolution.externalNpmDependencies .map { NpmDependencyDeclaration( scope = it.scope, @@ -58,40 +63,44 @@ constructor( generateExternals = it.generateExternals ) } - } - private val publicPackageJsonTaskName = npmProject.publicPackageJsonTaskName + private val publicPackageJsonTaskName by lazy { + npmProject.publicPackageJsonTaskName + } - @get:OutputFile - var packageJsonFile: File by property { + private val defaultPackageJsonFile by lazy { project.buildDir .resolve("tmp") .resolve(publicPackageJsonTaskName) .resolve(PACKAGE_JSON) } + @get:OutputFile + var packageJsonFile: File by property { defaultPackageJsonFile } + + private val isJrIrCompilation = compilation is KotlinJsIrCompilation + private val projectVersion = project.version.toString() + @TaskAction fun resolve() { -// val compilation = npmProject.compilation -// -// packageJson(npmProject, realExternalDependencies).let { packageJson -> -// packageJson.main = "${npmProject.name}.js" -// -// if (compilation is KotlinJsIrCompilation) { -// packageJson.types = "${npmProject.name}.d.ts" -// } -// -// packageJson.apply { -// listOf( -// dependencies, -// devDependencies, -// peerDependencies, -// optionalDependencies -// ).forEach { it.processDependencies() } -// } -// -// packageJson.saveTo(this@PublicPackageJsonTask.packageJsonFile) -// } + packageJson(npmProject.name, projectVersion, npmProject.main, externalDependencies).let { packageJson -> + packageJson.main = "${npmProject.name}.js" + + if (isJrIrCompilation) { + packageJson.types = "${npmProject.name}.d.ts" + } + + packageJson.apply { + listOf( + dependencies, + devDependencies, + peerDependencies, + optionalDependencies + ).forEach { it.processDependencies() } + } + + packageJson.saveTo(this@PublicPackageJsonTask.packageJsonFile) + } } private fun MutableMap.processDependencies() { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt index 00f2aafa9aaf4e2159b4b5ede7a002c54786aca4..c1ba9e0f77b15bd65e69ab7dd2db734af24eb997 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/plugins/CompilationResolverPlugin.kt @@ -5,7 +5,6 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.plugins -import org.gradle.api.artifacts.FileCollectionDependency import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver @@ -15,6 +14,6 @@ internal interface CompilationResolverPlugin { internalCompositeDependencies: Set, externalGradleDependencies: Set, externalNpmDependencies: Set, - fileCollectionDependencies: Set + fileCollectionDependencies: Set ) } \ No newline at end of file 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 ca01e9fd36b4d00a114faf140e107a45ccf3e6ef..c6650cd23387a37ad2b1193e9d95013abead0a78 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 @@ -11,6 +11,7 @@ import org.gradle.api.artifacts.ResolvedArtifact import org.gradle.api.artifacts.ResolvedDependency import org.gradle.api.artifacts.component.ProjectComponentIdentifier import org.gradle.api.attributes.Usage +import org.gradle.api.file.FileCollection import org.gradle.api.initialization.IncludedBuild import org.gradle.api.internal.artifacts.DefaultProjectComponentIdentifier import org.gradle.api.tasks.Input @@ -210,6 +211,11 @@ internal class KotlinCompilationNpmResolver( val artifact: ResolvedArtifact ) + data class FileCollectionExternalGradleDependency( + val fileCollection: FileCollection, + val dependencyVersion: String? + ) + data class FileExternalGradleDependency( val dependencyName: String, val dependencyVersion: String, @@ -226,7 +232,7 @@ internal class KotlinCompilationNpmResolver( private val internalCompositeDependencies = mutableSetOf() private val externalGradleDependencies = mutableSetOf() private val externalNpmDependencies = mutableSetOf() - private val fileCollectionDependencies = mutableSetOf() + private val fileCollectionDependencies = mutableSetOf() fun visit(configuration: Configuration) { configuration.resolvedConfiguration.firstLevelModuleDependencies.forEach { @@ -236,7 +242,7 @@ internal class KotlinCompilationNpmResolver( configuration.allDependencies.forEach { dependency -> when (dependency) { is NpmDependency -> externalNpmDependencies.add(dependency) - is FileCollectionDependency -> fileCollectionDependencies.add(dependency) + is FileCollectionDependency -> fileCollectionDependencies.add(FileCollectionExternalGradleDependency(dependency.files, dependency.version)) } } @@ -369,7 +375,7 @@ internal class KotlinCompilationNpmResolver( val externalGradleDependencies: Collection, @Transient val externalNpmDependencies: Collection, - val fileCollectionDependencies: Collection + val fileCollectionDependencies: Collection ) { val externalNpmDependencyDeclarations by lazy { externalNpmDependencies.map { @@ -393,7 +399,7 @@ internal class KotlinCompilationNpmResolver( internalCompositeDependencies.flatMap { it.getPackages() }, fileExternalGradleDependencies.map { it.file }, externalNpmDependencyDeclarations.map { it.uniqueRepresentation() }, - fileCollectionDependencies.map { it.files }.flatMap { it.files } + fileCollectionDependencies.map{ it.fileCollection }.flatMap { it.files } ) fun createPackageJson(skipWriting: Boolean): KotlinCompilationNpmResolution { @@ -404,13 +410,13 @@ internal class KotlinCompilationNpmResolver( val importedExternalGradleDependencies = fileExternalGradleDependencies.mapNotNull { gradleNodeModules.get(it.dependencyName, it.dependencyVersion, it.file) } + fileCollectionDependencies.flatMap { dependency -> - dependency.files + dependency.fileCollection.files // Gradle can hash with FileHasher only files and only existed files .filter { it.isFile } .map { file -> gradleNodeModules.get( file.name, - dependency.version ?: "0.0.1", + dependency.dependencyVersion ?: "0.0.1", file ) }