[Gradle, JS] KT-37207 Add possibility to add npm dependency to directory

This commit is contained in:
Ilya Goncharov
2020-03-26 19:36:32 +03:00
parent ee941a3e77
commit 8cefa09528
4 changed files with 67 additions and 19 deletions
@@ -10,6 +10,7 @@ import org.gradle.api.artifacts.Dependency
import org.gradle.api.artifacts.ExternalModuleDependency
import org.gradle.api.artifacts.ProjectDependency
import org.gradle.util.ConfigureUtil
import java.io.File
interface KotlinDependencyHandler {
fun api(dependencyNotation: Any): Dependency?
@@ -46,6 +47,8 @@ interface KotlinDependencyHandler {
fun npm(name: String, version: String = "*"): Dependency
fun npm(name: String, directory: File): Dependency
@Deprecated(
message = "Use npm(name, version) instead. Name like in package.json"
)
@@ -7,6 +7,7 @@ import org.gradle.api.artifacts.ProjectDependency
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
import org.jetbrains.kotlin.gradle.plugin.KotlinDependencyHandler
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
import java.io.File
class DefaultKotlinDependencyHandler(
val parent: HasKotlinDependencies,
@@ -80,7 +81,18 @@ class DefaultKotlinDependencyHandler(
}
override fun npm(name: String, version: String): NpmDependency =
NpmDependency(project, name, version)
NpmDependency(
project = project,
name = name,
version = version
)
override fun npm(name: String, directory: File): NpmDependency =
NpmDependency(
project = project,
name = name,
directory = directory
)
override fun npm(org: String?, packageName: String, version: String) =
npm("${if (org != null) "@$org/" else ""}$packageName", version)
@@ -17,6 +17,7 @@ import org.gradle.api.tasks.TaskDependency
import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import org.jetbrains.kotlin.gradle.utils.relativeToRoot
import java.io.File
data class NpmDependency(
@@ -29,6 +30,16 @@ data class NpmDependency(
ResolvableDependency,
FileCollectionDependency {
constructor(
project: Project,
name: String,
directory: File
) : this(
project,
name,
"file:${directory.relativeToRoot(project)}"
)
enum class Scope {
NORMAL,
DEV,
@@ -9,43 +9,65 @@ import groovy.lang.Closure
import org.gradle.api.Project
import org.gradle.api.plugins.ExtensionAware
import org.gradle.api.reflect.TypeOf
import java.io.File
interface NpmDependencyExtension {
operator fun invoke(name: String, version: String = "*"): NpmDependency
operator fun invoke(name: String, directory: File): NpmDependency
}
fun Project.addNpmDependencyExtension() {
val dependencies = this.dependencies as ExtensionAware
val npmDependencyExtension: NpmDependencyExtension = object : NpmDependencyExtension, Closure<NpmDependency>(dependencies) {
override operator fun invoke(name: String, version: String): NpmDependency {
return NpmDependency(this@addNpmDependencyExtension, name, version)
}
override operator fun invoke(name: String, version: String): NpmDependency =
NpmDependency(
project = this@addNpmDependencyExtension,
name = name,
version = version
)
override operator fun invoke(name: String, directory: File): NpmDependency =
NpmDependency(
project = this@addNpmDependencyExtension,
name = name,
directory = directory
)
override fun call(vararg args: Any?): NpmDependency {
val size = args.size
if (size > 2) throw IllegalArgumentException(
"""
Unable to add NPM dependency by $args
- npm('name') -> name:*
- npm('name', 'version') -> name:version
""".trimIndent()
)
if (size > 2) throw npmDeclarationException(args)
val name = args[0] as String
val version = if (size > 1) args[1] as String else null
val arg = if (size > 1) args[1] else null
return if (version != null) {
invoke(
name = name,
version = version
)
} else {
invoke(
return when (arg) {
null -> invoke(
name = name
)
is String -> invoke(
name = name,
version = arg
)
is File -> invoke(
name = name,
directory = arg
)
else -> throw npmDeclarationException(args)
}
}
private fun npmDeclarationException(args: Array<out Any?>): IllegalArgumentException {
return IllegalArgumentException(
"""
Unable to add NPM dependency by $args
- npm('name') -> name:*
- npm('name', 'version') -> name:version
- npm('name', File) -> name:File
""".trimIndent()
)
}
}
dependencies