[Gradle, JS] Move logic of resolving NpmDependency to Npm Api

#KT-36196 fixed
This commit is contained in:
Ilya Goncharov
2020-03-04 17:54:45 +03:00
parent 90f4f5db26
commit d108c8ef51
4 changed files with 69 additions and 37 deletions
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import java.io.File
/**
* NodeJS package manager API
@@ -22,6 +23,11 @@ interface NpmApi {
skipExecution: Boolean
)
fun resolveDependency(
resolvedNpmProject: KotlinCompilationNpmResolution,
dependency: NpmDependency
): Set<File>
companion object {
fun resolveOperationDescription(packageManagerTitle: String): String =
"Resolving NPM dependencies using $packageManagerTitle"
@@ -15,8 +15,8 @@ import org.gradle.api.internal.artifacts.ResolvableDependency
import org.gradle.api.internal.artifacts.dependencies.SelfResolvingDependencyInternal
import org.gradle.api.tasks.TaskDependency
import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import java.io.File
data class NpmDependency(
@@ -59,43 +59,16 @@ data class NpmDependency(
return visited
}
override fun resolve(transitive: Boolean): Set<File> {
val npmPackage = resolveProject() ?: return mutableSetOf()
val npmProject = npmPackage.npmProject
val all = mutableSetOf<File>()
val visited = mutableSetOf<NpmDependency>()
fun visit(item: NpmDependency) {
if (item in visited) return
visited.add(item)
npmProject.resolve(item.key)?.let {
if (it.isFile) all.add(it)
if (it.path.endsWith(".js")) {
val baseName = it.path.removeSuffix(".js")
val metaJs = File(baseName + ".meta.js")
if (metaJs.isFile) all.add(metaJs)
val kjsmDir = File(baseName)
if (kjsmDir.isDirectory) {
kjsmDir.walkTopDown()
.filter { it.extension == "kjsm" }
.forEach { all.add(it) }
}
}
override fun resolve(transitive: Boolean): Set<File> =
resolveProject()
?.let {
it
.npmProject
.nodeJs
.packageManager
.resolveDependency(it, this)
}
if (transitive) {
item.dependencies.forEach {
visit(it)
}
}
}
visit(this)
return all
}
?: mutableSetOf()
override fun resolve(): MutableSet<File> {
val npmPackage = parent?.resolveProject()
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.gradle.targets.js.yarn
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
object Yarn : NpmApi {
@@ -20,6 +21,11 @@ object Yarn : NpmApi {
override fun resolveProject(resolvedNpmProject: KotlinCompilationNpmResolution) =
getDelegate(resolvedNpmProject.project).resolveProject(resolvedNpmProject)
override fun resolveDependency(
resolvedNpmProject: KotlinCompilationNpmResolution,
dependency: NpmDependency
) = getDelegate(resolvedNpmProject.project).resolveDependency(resolvedNpmProject, dependency)
override fun resolveRootProject(
rootProject: Project,
subProjects: Collection<KotlinCompilationNpmResolution>,
@@ -10,9 +10,13 @@ import org.jetbrains.kotlin.gradle.internal.execWithProgress
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import java.io.File
abstract class YarnBasics : NpmApi {
private val resolvedDependencies = mutableMapOf<NpmDependency, Set<File>>()
override fun setup(project: Project) {
YarnPlugin.apply(project).executeSetup()
}
@@ -36,6 +40,49 @@ abstract class YarnBasics : NpmApi {
}
override fun resolveDependency(
resolvedNpmProject: KotlinCompilationNpmResolution,
dependency: NpmDependency
): Set<File> {
val files = resolvedDependencies[dependency]
if (files != null) {
return files
}
val npmProject = resolvedNpmProject.npmProject
val all = mutableSetOf<File>()
npmProject.resolve(dependency.key)?.let {
if (it.isFile) all.add(it)
if (it.path.endsWith(".js")) {
val baseName = it.path.removeSuffix(".js")
val metaJs = File(baseName + ".meta.js")
if (metaJs.isFile) all.add(metaJs)
val kjsmDir = File(baseName)
if (kjsmDir.isDirectory) {
kjsmDir.walkTopDown()
.filter { it.extension == "kjsm" }
.forEach { all.add(it) }
}
}
}
dependency.dependencies.forEach {
resolveDependency(
resolvedNpmProject,
it
).also { files ->
all.addAll(files)
}
}
resolvedDependencies[dependency] = all
return all
}
protected fun yarnLockReadTransitiveDependencies(
nodeWorkDir: File,
srcDependenciesList: Collection<NpmDependency>