diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectModules.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectModules.kt index c9736d27f5e..a4f247d9c3d 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectModules.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmProjectModules.kt @@ -16,7 +16,10 @@ import java.io.File */ internal open class NpmProjectModules( val dir: File, - private val nodeModulesDir: File = dir.resolve(NODE_MODULES) + val nodeModulesDir: File = dir.resolve(NODE_MODULES), + val packageJsonEntries: Collection = listOf("main", "module", "browser"), + val indexFileNames: Collection = listOf(INDEX_FILE_NAME), + val indexFileSuffixes: Collection = listOf(JS_SUFFIX) ) { /** * Require [request] nodejs module and return canonical path to it's main js file. @@ -28,6 +31,15 @@ internal open class NpmProjectModules( open val parent: NpmProjectModules? get() = null + fun copy( + packageJsonEntries: Collection = this.packageJsonEntries, + indexFileNames: Collection = this.indexFileNames, + indexFileSuffixes: Collection = this.indexFileSuffixes + ): NpmProjectModules = object : NpmProjectModules(dir, nodeModulesDir, 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, * with exception that instead of traversing parent folders, we are traversing parent projects @@ -55,14 +67,18 @@ internal open class NpmProjectModules( private fun resolveAsDirectory(dir: File): File? { val packageJsonFile = dir.resolve(PACKAGE_JSON) + val main: String? = if (packageJsonFile.isFile) { val packageJson = packageJsonFile.reader().use { Gson().fromJson(it, JsonObject::class.java) } - packageJson.getStringOrNull("main") - ?: packageJson.getStringOrNull("module") - ?: packageJson.getStringOrNull("browser") + var result: String? = null + for (key in packageJsonEntries) { + result = packageJson.getStringOrNull(key) + if (result != null) break + } + result } else null return if (main != null) { @@ -80,13 +96,21 @@ internal open class NpmProjectModules( return null } - private fun resolveIndex(dir: File): File? = resolveAsFile(dir.resolve(INDEX_FILE_NAME)) + private fun resolveIndex(dir: File): File? { + for (it in indexFileNames) { + return resolveAsFile(dir.resolve(it)) ?: continue + } + + return null + } private fun resolveAsFile(file: File): File? { if (file.isFile) return file - val js = File(file.path + JS_SUFFIX) - if (js.isFile) return js + indexFileSuffixes.forEach { + val js = File(file.path + it) + if (js.isFile) return js + } return null }