From 95b56e10b410d1607f1c1c50cd821f93e0b4acd5 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Fri, 22 Nov 2019 18:23:26 +0300 Subject: [PATCH] [Gradle, JS] Activate root npm dependency declaration for multiplatform --- .../gradle/plugin/KotlinPluginWrapper.kt | 3 + .../gradle/targets/js/KotlinJsPlugin.kt | 67 ---------------- .../targets/js/npm/NpmDependencyExtension.kt | 76 +++++++++++++++++++ 3 files changed, 79 insertions(+), 67 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependencyExtension.kt diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt index 00e562827aa..025c1ba367f 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinPluginWrapper.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinUsages import org.jetbrains.kotlin.gradle.plugin.sources.DefaultKotlinSourceSetFactory import org.jetbrains.kotlin.gradle.targets.js.KotlinJsPlugin +import org.jetbrains.kotlin.gradle.targets.js.npm.addNpmDependencyExtension import org.jetbrains.kotlin.gradle.tasks.KOTLIN_COMPILER_EMBEDDABLE import org.jetbrains.kotlin.gradle.tasks.KOTLIN_MODULE_GROUP import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestsRegistry @@ -80,6 +81,8 @@ abstract class KotlinBasePluginWrapper( setupAttributeMatchingStrategy(project) plugin.apply(project) + + project.addNpmDependencyExtension() } internal open fun createTestRegistry(project: Project) = KotlinTestsRegistry(project) 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 c0b9f9fdeee..77be98adb0b 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,25 +5,15 @@ 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 import org.gradle.api.plugins.JavaBasePlugin -import org.gradle.api.reflect.TypeOf.typeOf import org.jetbrains.kotlin.gradle.dsl.KotlinJsProjectExtension import org.jetbrains.kotlin.gradle.dsl.kotlinExtension import org.jetbrains.kotlin.gradle.plugin.configureDefaultVersionsResolutionStrategy import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsSingleTargetPreset -import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency import org.jetbrains.kotlin.gradle.utils.checkGradleCompatibility -interface Npm { - operator fun invoke(packageName: String, version: String = "*"): NpmDependency - - operator fun invoke(org: String, packageName: String, version: String = "*"): NpmDependency -} - open class KotlinJsPlugin( private val kotlinPluginVersion: String ) : Plugin { @@ -36,63 +26,6 @@ open class KotlinJsPlugin( checkGradleCompatibility() - 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 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 - ) - } - } - } - - dependencies - .extensions - .add( - typeOf(Npm::class.java), - "npm", - npm - ) - val kotlinExtension = project.kotlinExtension as KotlinJsProjectExtension configureDefaultVersionsResolutionStrategy(project, kotlinPluginVersion) 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 new file mode 100644 index 00000000000..78215b1ee1e --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/NpmDependencyExtension.kt @@ -0,0 +1,76 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.gradle.targets.js.npm + +import groovy.lang.Closure +import org.gradle.api.Project +import org.gradle.api.plugins.ExtensionAware +import org.gradle.api.reflect.TypeOf + +interface NpmDependencyExtension { + operator fun invoke(packageName: String, version: String = "*"): NpmDependency + + operator fun invoke(org: String, packageName: String, version: String = "*"): NpmDependency +} + +fun Project.addNpmDependencyExtension() { + val dependencies = this.dependencies as ExtensionAware + + val npmDependencyExtension: NpmDependencyExtension = object : NpmDependencyExtension, Closure(dependencies) { + override operator fun invoke(packageName: String, version: String): NpmDependency { + return NpmDependency(this@addNpmDependencyExtension, null, packageName, version) + } + + override operator fun invoke(org: String, packageName: String, version: String): NpmDependency { + return NpmDependency(this@addNpmDependencyExtension, 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 + ) + } + } + } + + dependencies + .extensions + .add( + TypeOf.typeOf(NpmDependencyExtension::class.java), + "npm", + npmDependencyExtension + ) +} \ No newline at end of file