[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 val externalsDir: File
get() = externalsDirRoot.resolve("src") get() = externalsDirRoot.resolve("src")
internal val modules = object : NpmProjectModules(dir, nodeModulesDir) { internal val modules = NpmProjectModules(dir)
override val parent get() = rootNodeModules
}
private val rootNodeModules: NpmProjectModules? private val rootNodeModules: NpmProjectModules?
get() = NpmProjectModules(nodeJs.rootPackageDir) 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. * Search modules in node_modules according to https://nodejs.org/api/modules.html.
*/ */
internal open class NpmProjectModules( open class NpmProjectModules(
val dir: File, val dir: File,
val nodeModulesDir: File = dir.resolve(NODE_MODULES),
val packageJsonEntries: Collection<String> = listOf("main", "module", "browser"), val packageJsonEntries: Collection<String> = listOf("main", "module", "browser"),
val indexFileNames: Collection<String> = listOf(INDEX_FILE_NAME), val indexFileNames: Collection<String> = listOf(INDEX_FILE_NAME),
val indexFileSuffixes: Collection<String> = listOf(JS_SUFFIX) 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\"") return resolve(request)?.canonicalPath ?: error("Cannot find node module \"$request\" in \"$this\"")
} }
open val parent: NpmProjectModules?
get() = null
fun copy( fun copy(
packageJsonEntries: Collection<String> = this.packageJsonEntries, packageJsonEntries: Collection<String> = this.packageJsonEntries,
indexFileNames: Collection<String> = this.indexFileNames, indexFileNames: Collection<String> = this.indexFileNames,
indexFileSuffixes: Collection<String> = this.indexFileSuffixes indexFileSuffixes: Collection<String> = this.indexFileSuffixes
): NpmProjectModules = object : NpmProjectModules(dir, nodeModulesDir, packageJsonEntries, indexFileNames, indexFileSuffixes) { ): NpmProjectModules = NpmProjectModules(dir, packageJsonEntries, indexFileNames, indexFileSuffixes)
override val parent: NpmProjectModules?
get() = this@NpmProjectModules.parent?.copy(packageJsonEntries, indexFileNames, indexFileSuffixes)
}
/** /**
* Find node module according to https://nodejs.org/api/modules.html#modules_all_together, * 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
*/ */
internal fun resolve(name: String, context: File = dir): File? = internal fun resolve(name: String, context: File = dir): File? =
if (name.startsWith("/")) resolve(name.removePrefix("/"), File("/")) if (name.startsWith("/")) resolve(name.removePrefix("/"), File("/"))
else resolveAsRelative("./", name, context) else resolveAsRelative("./", name, context)
?: resolveAsRelative("/", name, context) ?: resolveAsRelative("/", name, context)
?: resolveAsRelative("../", name, context) ?: resolveAsRelative("../", name, context)
?: resolveInNodeModulesDir(name, nodeModulesDir) ?: resolveInNodeModulesDir(name, context.resolve(NODE_MODULES))
?: parent?.resolve(name) ?: context.parentFile?.let { resolve(name, it) }
private fun resolveAsRelative(prefix: String, name: String, context: File): File? { private fun resolveAsRelative(prefix: String, name: String, context: File): File? {
if (!name.startsWith(prefix)) return null if (!name.startsWith(prefix)) return null