diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModuleBuilder.kt new file mode 100644 index 00000000000..a156568f5fa --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModuleBuilder.kt @@ -0,0 +1,61 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.targets.js.npm + +import com.google.gson.GsonBuilder +import org.gradle.api.Project +import org.gradle.api.artifacts.ResolvedDependency +import java.io.File + +/** + * Creates fake NodeJS module directory from given composite [dependency]. + */ +internal class CompositeNodeModuleBuilder( + val project: Project, + val dependency: ResolvedDependency, + val srcDir: File, + val cache: CompositeNodeModulesCache +) { + var srcPackageJsonFile: File = srcDir + + fun rebuild(): File? { + check(srcPackageJsonFile.isFile) { + "Unable to read package.json of composite build" + } + + val packageJson = fromSrcPackageJson(srcPackageJsonFile)!! + + packageJson.main = srcDir.parentFile.resolve(packageJson.main!!).canonicalPath + + // yarn requires semver + packageJson.version = fixSemver(packageJson.version) + + return makeNodeModule2(cache.dir, packageJson) + } +} + +fun makeNodeModule2( + container: File, + packageJson: PackageJson +): File { + val dir = importedPackageDir(container, packageJson.name, packageJson.version) + + if (dir.exists()) dir.deleteRecursively() + + check(dir.mkdirs()) { + "Cannot create directory: $dir" + } + + val gson = GsonBuilder() + .setPrettyPrinting() + .create() + + dir.resolve("package.json").writer().use { + gson.toJson(packageJson, it) + } + + return dir +} diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModulesCache.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModulesCache.kt new file mode 100644 index 00000000000..d19d223e5b7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/CompositeNodeModulesCache.kt @@ -0,0 +1,23 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.targets.js.npm + +import org.gradle.api.artifacts.ResolvedDependency +import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension +import java.io.File + +/** + * Cache for storing already created [GradleNodeModule]s + */ +internal class CompositeNodeModulesCache(nodeJs: NodeJsRootExtension) : AbstractNodeModulesCache(nodeJs) { + override fun buildImportedPackage( + dependency: ResolvedDependency, + file: File + ): File? { + val module = CompositeNodeModuleBuilder(project, dependency, file, this) + return module.rebuild() + } +} \ No newline at end of file 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 7f93b7cb170..1659e806fca 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 @@ -18,6 +18,7 @@ class KotlinCompilationNpmResolution( val project: Project, val npmProject: NpmProject, val internalDependencies: Collection, + val internalCompositeDependencies: Collection, val externalGradleDependencies: Collection, val externalNpmDependencies: Collection, val packageJson: PackageJson 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 e6d1721bee5..0c7b85c4edc 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 @@ -198,7 +198,7 @@ internal class KotlinCompilationNpmResolver( ?.forEach { dependentResolver -> internalDependencies.add(dependentResolver) } - } else { + } else if (componentIdentifier !is ProjectComponentIdentifier) { externalGradleDependencies.add(ExternalGradleDependency(dependency, artifact)) } @@ -253,6 +253,13 @@ internal class KotlinCompilationNpmResolver( resolver.gradleNodeModules.get(it.dependency, it.artifact.file) } + val compositeDependencies = internalCompositeDependencies.mapNotNull { dependency -> + resolver.compositeNodeModules.get( + dependency.dependency, + dependency.includedBuild.projectDir.resolve("build/js/packages/lib/package.json") + ) + } + val packageJson = PackageJson( npmProject.name, fixSemver(project.version.toString()) @@ -260,6 +267,10 @@ internal class KotlinCompilationNpmResolver( packageJson.main = npmProject.main + compositeDependencies.forEach { + packageJson.dependencies[it.name] = it.version + } + resolvedInternalDependencies.forEach { packageJson.dependencies[it.packageJson.name] = it.packageJson.version } @@ -297,6 +308,7 @@ internal class KotlinCompilationNpmResolver( project, npmProject, resolvedInternalDependencies, + compositeDependencies, importedExternalGradleDependencies, externalNpmDependencies, 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 0ccbf43e36b..2daed5e883f 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 @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.dukat.DukatRootResolverPlugin import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrCompilation import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension +import org.jetbrains.kotlin.gradle.targets.js.npm.CompositeNodeModulesCache import org.jetbrains.kotlin.gradle.targets.js.npm.GradleNodeModulesCache import org.jetbrains.kotlin.gradle.targets.js.npm.KotlinNpmResolutionManager import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJsonUpToDateCheck @@ -37,6 +38,7 @@ internal class KotlinRootNpmResolver internal constructor( private var closed: Boolean = false val gradleNodeModules = GradleNodeModulesCache(nodeJs) + val compositeNodeModules = CompositeNodeModulesCache(nodeJs) private val projectResolvers = mutableMapOf() fun alreadyResolvedMessage(action: String) = "Cannot $action. NodeJS projects already resolved." 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 7bbaba10de9..d4a347a0710 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 @@ -7,7 +7,10 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.tasks import org.gradle.api.DefaultTask import org.gradle.api.plugins.BasePlugin -import org.gradle.api.tasks.* +import org.gradle.api.tasks.Nested +import org.gradle.api.tasks.OutputFile +import org.gradle.api.tasks.TaskAction +import org.gradle.api.tasks.TaskProvider 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 @@ -26,9 +29,11 @@ open class KotlinPackageJsonTask : DefaultTask() { private val producer: KotlinCompilationNpmResolver.PackageJsonProducer get() = compilationResolver.packageJsonProducer - private fun findDependentTasks(): Collection = + private fun findDependentTasks(): Collection = producer.internalDependencies.map { dependentResolver -> dependentResolver.npmProject.packageJsonTask + } + producer.internalCompositeDependencies.map { dependency -> + dependency.includedBuild.task(":packageJson") } @get:Nested diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnImportedPackagesVersionResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnImportedPackagesVersionResolver.kt index 70d5e38ac28..94e7ebe3d83 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnImportedPackagesVersionResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/YarnImportedPackagesVersionResolver.kt @@ -9,8 +9,8 @@ import com.google.gson.Gson import org.gradle.api.Project import org.jetbrains.kotlin.gradle.targets.js.npm.GradleNodeModule import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject -import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson +import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution import java.io.File class YarnImportedPackagesVersionResolver( @@ -21,7 +21,7 @@ class YarnImportedPackagesVersionResolver( private val resolvedVersion = mutableMapOf() private val importedProjectWorkspaces = mutableListOf() private val externalModules = npmProjects.flatMapTo(mutableSetOf()) { - it.externalGradleDependencies + it.externalGradleDependencies + it.internalCompositeDependencies } fun resolveAndUpdatePackages(): MutableList {