[Gradle, JS] KT-36784 Fix requireing of node modules

#KT-32466 fixed
#KT-36784 fixed
#KT-36864 fixed
This commit is contained in:
Ilya Goncharov
2020-03-30 20:03:02 +03:00
parent f30875f79b
commit 149d7fb33a
2 changed files with 6 additions and 16 deletions
@@ -64,9 +64,7 @@ open class NpmProject(val compilation: KotlinJsCompilation) {
val externalsDir: File
get() = externalsDirRoot.resolve("src")
internal val modules = object : NpmProjectModules(dir, nodeModulesDir) {
override val parent get() = rootNodeModules
}
internal val modules = NpmProjectModules(dir)
private val rootNodeModules: NpmProjectModules?
get() = NpmProjectModules(nodeJs.rootPackageDir)
@@ -14,9 +14,8 @@ import java.io.File
/**
* Search modules in node_modules according to https://nodejs.org/api/modules.html.
*/
internal open class NpmProjectModules(
open class NpmProjectModules(
val dir: File,
val nodeModulesDir: File = dir.resolve(NODE_MODULES),
val packageJsonEntries: Collection<String> = listOf("main", "module", "browser"),
val indexFileNames: Collection<String> = listOf(INDEX_FILE_NAME),
val indexFileSuffixes: Collection<String> = listOf(JS_SUFFIX)
@@ -28,29 +27,22 @@ internal open class NpmProjectModules(
return resolve(request)?.canonicalPath ?: error("Cannot find node module \"$request\" in \"$this\"")
}
open val parent: NpmProjectModules?
get() = null
fun copy(
packageJsonEntries: Collection<String> = this.packageJsonEntries,
indexFileNames: Collection<String> = this.indexFileNames,
indexFileSuffixes: Collection<String> = this.indexFileSuffixes
): NpmProjectModules = object : NpmProjectModules(dir, nodeModulesDir, packageJsonEntries, indexFileNames, indexFileSuffixes) {
override val parent: NpmProjectModules?
get() = this@NpmProjectModules.parent?.copy(packageJsonEntries, indexFileNames, indexFileSuffixes)
}
): NpmProjectModules = NpmProjectModules(dir, packageJsonEntries, indexFileNames, indexFileSuffixes)
/**
* Find node module according to https://nodejs.org/api/modules.html#modules_all_together,
* with exception that instead of traversing parent folders, we are traversing parent projects
* Find node module according to https://nodejs.org/api/modules.html#modules_all_together
*/
internal fun resolve(name: String, context: File = dir): File? =
if (name.startsWith("/")) resolve(name.removePrefix("/"), File("/"))
else resolveAsRelative("./", name, context)
?: resolveAsRelative("/", name, context)
?: resolveAsRelative("../", name, context)
?: resolveInNodeModulesDir(name, nodeModulesDir)
?: parent?.resolve(name)
?: resolveInNodeModulesDir(name, context.resolve(NODE_MODULES))
?: context.parentFile?.let { resolve(name, it) }
private fun resolveAsRelative(prefix: String, name: String, context: File): File? {
if (!name.startsWith(prefix)) return null