diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt index c5f6f0cc9e2..af4498b0304 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt @@ -28,15 +28,15 @@ open class NodeJsRootExtension(project: Project) : NodeJsExtension(project) { val npmResolveTask: NpmResolveTask get() = project.tasks.getByName(NpmResolveTask.NAME) as NpmResolveTask - val nodeModulesGradleCacheDir: File - get() = project.buildDir.resolve("node_modules_gradle") - val rootPackageDir: File get() = project.buildDir.resolve("js") val projectPackagesDir: File get() = rootPackageDir.resolve("packages") + val nodeModulesGradleCacheDir: File + get() = rootPackageDir.resolve("packages_imported") + internal val environment: NodeJsEnv get() { val platform = NodeJsPlatform.name diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModule.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModule.kt index c7216f0e08e..a296b8d3f4d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModule.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModule.kt @@ -10,4 +10,4 @@ import java.io.File /** * Fake NodeJS module directory created from Gradle external module */ -class GradleNodeModule(val name: String, val path: File) \ No newline at end of file +class GradleNodeModule(val name: String, val version: String, val path: File) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt index 8f5c3dfa19f..762839abd9a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModuleBuilder.kt @@ -39,7 +39,7 @@ internal class GradleNodeModuleBuilder( } } - fun rebuild(): File? { + fun rebuild(): PackageJson? { if (files.isEmpty()) return null val packageJson = srcPackageJsonFile?.reader()?.use { @@ -100,7 +100,7 @@ fun makeNodeModule( container: File, packageJson: PackageJson, files: (File) -> Unit -): File { +): PackageJson { val dir = container.resolve(packageJson.name) if (dir.exists()) dir.deleteRecursively() @@ -119,5 +119,5 @@ fun makeNodeModule( gson.toJson(packageJson, it) } - return dir + return packageJson } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt index dfb0c184426..a056de3a5fe 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/GradleNodeModulesCache.kt @@ -22,10 +22,10 @@ internal class GradleNodeModulesCache(val project: Project) : AutoCloseable { } internal val dir = project.nodeJs.root.nodeModulesGradleCacheDir - private val cache = ProcessedFilesCache(project, dir, STATE_FILE_NAME, "5") + private val cache = ProcessedFilesCache(project, dir, STATE_FILE_NAME, "6") private val visited = mutableSetOf() - fun collectDependenciesFromConfiguration(configuration: Configuration, result: NpmProjectGradleDeps) { + fun collectDependenciesFromConfiguration(configuration: Configuration, result: NpmGradleDependencies) { if (configuration.isCanBeResolved) { configuration.resolvedConfiguration.firstLevelModuleDependencies.forEach { visitDependency(it, result) @@ -33,7 +33,7 @@ internal class GradleNodeModulesCache(val project: Project) : AutoCloseable { } } - private fun visitDependency(dependency: ResolvedDependency, result: NpmProjectGradleDeps) { + private fun visitDependency(dependency: ResolvedDependency, result: NpmGradleDependencies) { if (!visited.add(dependency)) return visitArtifacts(dependency, dependency.moduleArtifacts, result) @@ -46,14 +46,8 @@ internal class GradleNodeModulesCache(val project: Project) : AutoCloseable { private fun visitArtifacts( dependency: ResolvedDependency, artifacts: MutableSet, - result: NpmProjectGradleDeps + result: NpmGradleDependencies ) { - val lazyDirName: String? by lazy { - val module = GradleNodeModuleBuilder(project, dependency, artifacts, this) - module.visitArtifacts() - module.rebuild()?.canonicalFile?.relativeTo(dir)?.path - } - artifacts.forEach { artifact -> val componentIdentifier = artifact.id.componentIdentifier if (componentIdentifier is ProjectComponentIdentifier) { @@ -63,11 +57,16 @@ internal class GradleNodeModulesCache(val project: Project) : AutoCloseable { result.internalModules.add(dependentProject) } else { val key = cache.getOrCompute(artifact.file) { - lazyDirName + val module = GradleNodeModuleBuilder(project, dependency, artifacts, this) + module.visitArtifacts() + module.rebuild()?.let { + it.name + ":" + it.version + } } if (key != null) { - result.externalModules.add(GradleNodeModule(key, dir.resolve(key))) + val (name, version) = key.split(":") + result.externalModules.add(GradleNodeModule(name, version, dir.resolve(name))) } } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectGradleDeps.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmGradleDependencies.kt similarity index 70% rename from libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectGradleDeps.kt rename to libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmGradleDependencies.kt index f727c67ecac..80c817fb341 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectGradleDeps.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmGradleDependencies.kt @@ -10,7 +10,12 @@ import org.gradle.api.Project /** * Gradle dependencies for [NpmProject]. */ -class NpmProjectGradleDeps { +class NpmGradleDependencies { val internalModules = mutableSetOf() val externalModules = mutableSetOf() + + fun addAll(other: NpmGradleDependencies) { + internalModules.addAll(other.internalModules) + externalModules.addAll(other.externalModules) + } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectPackage.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectPackage.kt index 2cc3aed5f6a..b72f0e2c4fd 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectPackage.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectPackage.kt @@ -14,5 +14,6 @@ class NpmProjectPackage( val project: Project, val npmProject: NpmProject, val npmDependencies: Collection, + val gradleDependencies: NpmGradleDependencies, val packageJson: PackageJson ) \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectVisitor.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectVisitor.kt index 3709eb9ca40..7320db7334f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectVisitor.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectVisitor.kt @@ -99,7 +99,7 @@ internal class NpmProjectVisitor(val resolver: NpmResolver, val project: Project project.version.toString() ) val npmDependencies = mutableSetOf() - val gradleDeps = NpmProjectGradleDeps() + val gradleDeps = NpmGradleDependencies() compilation.allKotlinSourceSets.forEach { sourceSet -> sourceSet.relatedConfigurationNames.forEach { configurationName -> @@ -125,8 +125,7 @@ internal class NpmProjectVisitor(val resolver: NpmResolver, val project: Project } gradleDeps.externalModules.forEach { - val relativePath = it.path.relativeTo(npmProject.dir) - packageJson.dependencies[it.name] = "file:$relativePath" + packageJson.dependencies[it.name] = it.version } gradleDeps.internalModules.forEach { target -> @@ -140,7 +139,7 @@ internal class NpmProjectVisitor(val resolver: NpmResolver, val project: Project it(packageJson) } - val npmPackage = NpmProjectPackage(project, npmProject, npmDependencies, packageJson) + val npmPackage = NpmProjectPackage(project, npmProject, npmDependencies, gradleDeps, packageJson) npmPackage.packageJson.saveTo(npmProject.packageJsonFile) resolver.packageManager.resolveProject(npmPackage) @@ -151,9 +150,9 @@ internal class NpmProjectVisitor(val resolver: NpmResolver, val project: Project private fun visitConfiguration( configuration: Configuration, npmDependencies: MutableSet, - gradleDeps: NpmProjectGradleDeps + gradleDependencies: NpmGradleDependencies ) { - resolver.gradleNodeModules.collectDependenciesFromConfiguration(configuration, gradleDeps) + resolver.gradleNodeModules.collectDependenciesFromConfiguration(configuration, gradleDependencies) configuration.allDependencies.forEach { dependency -> when (dependency) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmResolver.kt index 3cf5934c203..d9be1965253 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmResolver.kt @@ -124,6 +124,7 @@ internal class NpmResolver private constructor(val rootProject: Project) : AutoC val visited = NpmProjectVisitor(this, project).visitProject() data.visit = visited + allNpmPackages.addAll(visited.npmProjects) return visited diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt index 6fe4b8c3b4e..c8df6c96c0a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/yarn/Yarn.kt @@ -125,8 +125,15 @@ object Yarn : NpmApi { ) { val rootPackageJson = PackageJson(rootProject.name, rootProject.version.toString()) rootPackageJson.private = true - rootPackageJson.workspaces = npmProjects - .map { it.npmProject.dir.relativeTo(nodeJsWorldDir).path } + + val npmProjectWorkspaces = npmProjects.map { it.npmProject.dir.relativeTo(nodeJsWorldDir).path } + val importedProjectWorkspaces = npmProjects.flatMapTo(mutableSetOf()) { + it.gradleDependencies.externalModules.map { importedProject -> + importedProject.path.relativeTo(nodeJsWorldDir).path + } + } + + rootPackageJson.workspaces = npmProjectWorkspaces + importedProjectWorkspaces rootProject.nodeJs.packageJsonHandlers.forEach { it(rootPackageJson)