Gradle, js, npm: fix resolving transitive npm dependencies using yarn.lock
- already visited transitive npm dependencies should be stored in parent dependencies - child NpmDependency should search resolved project data in parent NpmDependencies
This commit is contained in:
+6
-2
@@ -31,6 +31,7 @@ data class NpmDependency(
|
|||||||
|
|
||||||
override fun getGroup(): String? = org
|
override fun getGroup(): String? = org
|
||||||
|
|
||||||
|
internal var parent: NpmDependency? = null
|
||||||
internal val dependencies = mutableSetOf<NpmDependency>()
|
internal val dependencies = mutableSetOf<NpmDependency>()
|
||||||
|
|
||||||
override fun resolve(transitive: Boolean): MutableSet<File> {
|
override fun resolve(transitive: Boolean): MutableSet<File> {
|
||||||
@@ -64,7 +65,9 @@ data class NpmDependency(
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun resolve(): MutableSet<File> {
|
override fun resolve(): MutableSet<File> {
|
||||||
val npmPackage = resolveProject() ?: return mutableSetOf()
|
val npmPackage = parent?.resolveProject()
|
||||||
|
?: resolveProject()
|
||||||
|
?: return mutableSetOf()
|
||||||
return mutableSetOf(npmPackage.npmProject.resolve(key)!!)
|
return mutableSetOf(npmPackage.npmProject.resolve(key)!!)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,7 +89,8 @@ data class NpmDependency(
|
|||||||
return when (result) {
|
return when (result) {
|
||||||
null -> null
|
null -> null
|
||||||
is AlreadyInProgress -> null
|
is AlreadyInProgress -> null
|
||||||
is AlreadyResolved -> findIn(result.resolution) ?: error("Project hierarchy is already resolved in NPM without $this")
|
is AlreadyResolved -> findIn(result.resolution)
|
||||||
|
?: error("Project hierarchy is already resolved in NPM without $this")
|
||||||
is ResolvedNow -> findIn(result.resolution) ?: error("Cannot find $this after NPM project resolve")
|
is ResolvedNow -> findIn(result.resolution) ?: error("Cannot find $this after NPM project resolve")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+18
-12
@@ -42,29 +42,35 @@ abstract class YarnBasics : NpmApi {
|
|||||||
val yarnLock = nodeWorkDir.resolve("yarn.lock")
|
val yarnLock = nodeWorkDir.resolve("yarn.lock")
|
||||||
if (yarnLock.isFile) {
|
if (yarnLock.isFile) {
|
||||||
val byKey = YarnLock.parse(yarnLock).entries.associateBy { it.key }
|
val byKey = YarnLock.parse(yarnLock).entries.associateBy { it.key }
|
||||||
val visited = mutableSetOf<NpmDependency>()
|
val visited = mutableMapOf<NpmDependency, NpmDependency>()
|
||||||
|
|
||||||
fun resolveRecursively(src: NpmDependency): NpmDependency {
|
fun resolveRecursively(src: NpmDependency): NpmDependency {
|
||||||
if (src in visited) return src
|
val copy = visited[src]
|
||||||
visited.add(src)
|
if (copy != null) {
|
||||||
|
src.dependencies.addAll(copy.dependencies)
|
||||||
|
return src
|
||||||
|
}
|
||||||
|
visited[src] = src
|
||||||
|
|
||||||
val key = YarnLock.key(src.key, src.version)
|
val key = YarnLock.key(src.key, src.version)
|
||||||
val deps = byKey[key]
|
val deps = byKey[key]
|
||||||
if (deps != null) {
|
if (deps != null) {
|
||||||
src.dependencies.addAll(deps.dependencies.map { dep ->
|
src.dependencies.addAll(deps.dependencies.map { dep ->
|
||||||
val scopedName = dep.scopedName
|
val scopedName = dep.scopedName
|
||||||
|
val child = NpmDependency(
|
||||||
resolveRecursively(
|
src.project,
|
||||||
NpmDependency(
|
scopedName.scope,
|
||||||
src.project,
|
scopedName.name,
|
||||||
scopedName.scope,
|
dep.version ?: "*"
|
||||||
scopedName.name,
|
|
||||||
dep.version ?: "*"
|
|
||||||
)
|
|
||||||
)
|
)
|
||||||
|
child.parent = src
|
||||||
|
|
||||||
|
resolveRecursively(child)
|
||||||
|
|
||||||
|
child
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
// todo: [WARN] cannot find $key in yarn.lock
|
error("Cannot find $key in yarn.lock")
|
||||||
}
|
}
|
||||||
|
|
||||||
return src
|
return src
|
||||||
|
|||||||
Reference in New Issue
Block a user