From 5397023f71d9036b037f7eb8a981ba4ef4d30e89 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Fri, 22 Nov 2019 16:09:07 +0300 Subject: [PATCH] [Gradle, JS] Add Groovy Closure support --- .../gradle/targets/js/KotlinJsPlugin.kt | 49 +++++++++++++++++-- 1 file changed, 44 insertions(+), 5 deletions(-) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt index 13116361528..c0b9f9fdeee 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/KotlinJsPlugin.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle.targets.js +import groovy.lang.Closure import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.plugins.ExtensionAware @@ -35,21 +36,59 @@ open class KotlinJsPlugin( checkGradleCompatibility() - val npm = object : Npm { - override fun invoke(packageName: String, version: String): NpmDependency { + val dependencies = project.dependencies as ExtensionAware + + val npm: Npm = object : Npm, Closure(dependencies) { + override operator fun invoke(packageName: String, version: String): NpmDependency { return NpmDependency(project, null, packageName, version) } - override fun invoke(org: String, packageName: String, version: String): NpmDependency { + override operator fun invoke(org: String, packageName: String, version: String): NpmDependency { return NpmDependency(project, org, packageName, version) } + override fun call(vararg args: Any?): NpmDependency { + val size = args.size + if (size > 3) throw IllegalArgumentException( + """ + Unable to add NPM dependency by $args + - npm('packageName') -> packageName:* + - npm('packageName', 'version') -> packageName:version + - npm('org', 'packageName', 'version') -> org/packageName:version + """.trimIndent() + ) + + if (size == 3) { + val (org, packageName, version) = args + .map { it as String } + + return invoke( + org = org, + packageName = packageName, + version = version + ) + } + + val packageName = args[0] as String + val version = if (size > 1) args[1] as String else null + + return if (version != null) { + invoke( + packageName = packageName, + version = version + ) + } else { + invoke( + packageName = packageName + ) + } + } } - (project.dependencies as ExtensionAware) + dependencies .extensions .add( - typeOf(npm::class.java), + typeOf(Npm::class.java), "npm", npm )