diff --git a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/HasKotlinDependencies.kt b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/HasKotlinDependencies.kt index e4a301e8f59..9248d885ca1 100644 --- a/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/HasKotlinDependencies.kt +++ b/libraries/tools/kotlin-gradle-plugin-api/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/HasKotlinDependencies.kt @@ -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" ) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/DefaultKotlinDependencyHandler.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/DefaultKotlinDependencyHandler.kt index 851521df502..1f651a6a2b2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/DefaultKotlinDependencyHandler.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/mpp/DefaultKotlinDependencyHandler.kt @@ -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) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt index 4f0dce64ca3..2eae5abe1c2 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependency.kt @@ -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, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependencyExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependencyExtension.kt index 8ca34463116..64fa920e547 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependencyExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependencyExtension.kt @@ -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(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): 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