Gradle, js, npm resolver: support custom package json entries, index files and extensions
This commit is contained in:
+31
-7
@@ -16,7 +16,10 @@ import java.io.File
|
|||||||
*/
|
*/
|
||||||
internal open class NpmProjectModules(
|
internal open class NpmProjectModules(
|
||||||
val dir: File,
|
val dir: File,
|
||||||
private val nodeModulesDir: File = dir.resolve(NODE_MODULES)
|
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)
|
||||||
) {
|
) {
|
||||||
/**
|
/**
|
||||||
* Require [request] nodejs module and return canonical path to it's main js file.
|
* 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?
|
open val parent: NpmProjectModules?
|
||||||
get() = null
|
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)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
* 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? {
|
private fun resolveAsDirectory(dir: File): File? {
|
||||||
val packageJsonFile = dir.resolve(PACKAGE_JSON)
|
val packageJsonFile = dir.resolve(PACKAGE_JSON)
|
||||||
|
|
||||||
val main: String? = if (packageJsonFile.isFile) {
|
val main: String? = if (packageJsonFile.isFile) {
|
||||||
val packageJson = packageJsonFile.reader().use {
|
val packageJson = packageJsonFile.reader().use {
|
||||||
Gson().fromJson(it, JsonObject::class.java)
|
Gson().fromJson(it, JsonObject::class.java)
|
||||||
}
|
}
|
||||||
|
|
||||||
packageJson.getStringOrNull("main")
|
var result: String? = null
|
||||||
?: packageJson.getStringOrNull("module")
|
for (key in packageJsonEntries) {
|
||||||
?: packageJson.getStringOrNull("browser")
|
result = packageJson.getStringOrNull(key)
|
||||||
|
if (result != null) break
|
||||||
|
}
|
||||||
|
result
|
||||||
} else null
|
} else null
|
||||||
|
|
||||||
return if (main != null) {
|
return if (main != null) {
|
||||||
@@ -80,13 +96,21 @@ internal open class NpmProjectModules(
|
|||||||
return null
|
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? {
|
private fun resolveAsFile(file: File): File? {
|
||||||
if (file.isFile) return file
|
if (file.isFile) return file
|
||||||
|
|
||||||
val js = File(file.path + JS_SUFFIX)
|
indexFileSuffixes.forEach {
|
||||||
if (js.isFile) return js
|
val js = File(file.path + it)
|
||||||
|
if (js.isFile) return js
|
||||||
|
}
|
||||||
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user