From 3ad6d581531f77a0f5fd480737d523da0d307ef8 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Thu, 8 Oct 2020 13:37:13 +0300 Subject: [PATCH] [Gradle, JS] Execute dukat on import in both mode ^KT-42339 fixed [Gradle, JS] Fix tests for dukat ^KT-42339 fixed [Gradle, JS] Add tests on binaries-both mode ^KT-42339 fixed [Gradle, JS] Remove snapshot versions ^KT-42339 fixed [Gradle, JS] Fix file dependency resolution into imported package ^KT-42339 fixed --- .../kotlin/gradle/DukatIntegrationIT.kt | 105 ++++++++++++++++-- .../dukat-integration/both/build.gradle.kts | 1 + .../both/src/main/kotlin/main.kt | 3 + .../groovy-dsl-ext/build.gradle | 1 + .../groovy-dsl-root/build.gradle | 1 + .../kotlin-dsl-ext/build.gradle.kts | 1 + .../kotlin-dsl-root/build.gradle.kts | 1 + .../kotlin/gradle/plugin/KotlinProperties.kt | 3 +- .../kotlin/gradle/targets/js/NpmVersions.kt | 2 +- .../dukat/DukatCompilationResolverPlugin.kt | 8 +- .../gradle/targets/js/dukat/DukatMode.kt | 2 + .../resolver/KotlinCompilationNpmResolver.kt | 20 ++-- 12 files changed, 128 insertions(+), 20 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/both/src/main/kotlin/main.kt diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt index 75ccd9ee8b0..995ed973093 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/DukatIntegrationIT.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.gradle +import org.jetbrains.kotlin.gradle.targets.js.dukat.DukatMode import org.jetbrains.kotlin.gradle.util.modify import org.junit.Test import kotlin.test.assertTrue @@ -101,6 +102,9 @@ class DukatIntegrationIT : BaseGradleIT() { ) project.setupWorkingDir() project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + project.gradleProperties().modify { + "${DukatMode.dukatModeProperty}=${DukatMode.SOURCE}" + } val externalSrcs = "build/externals/$projectName/src" project.build("generateExternalsIntegrated") { @@ -153,6 +157,9 @@ class DukatIntegrationIT : BaseGradleIT() { ) project.setupWorkingDir() project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + project.gradleProperties().modify { + "${DukatMode.dukatModeProperty}=${DukatMode.SOURCE}" + } val externalSrcs = "build/externals/$projectName/src" project.build("generateExternalsIntegrated") { @@ -224,7 +231,10 @@ class DukatIntegrationIT : BaseGradleIT() { project.setupWorkingDir() project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) project.gradleProperties().modify { - "kotlin.js.generate.externals=true" + """ + kotlin.js.generate.externals=true + ${DukatMode.dukatModeProperty}=${DukatMode.SOURCE} + """.trimIndent() } project.gradleBuildScript().modify { buildScript -> @@ -251,18 +261,21 @@ class DukatIntegrationIT : BaseGradleIT() { ) project.setupWorkingDir() project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + project.gradleProperties().modify { + "${DukatMode.dukatModeProperty}=${DukatMode.SOURCE}" + } - val externalSrcs = "build/externals/both-jsLegacy/src" - project.build("compileKotlinJsIr") { + val externalSrcs = "build/externals/both-jsIr/src" + project.build("compileKotlinJsLegacy") { assertSuccessful() - assertTasksExecuted(":legacyGenerateExternalsIntegrated") + assertTasksExecuted(":irGenerateExternalsIntegrated") assertSingleFileExists(externalSrcs, "index.module_decamelize.kt") - val irExternals = "build/externals/both-jsIr/src" - val directoryFile = fileInWorkingDir(irExternals) + val legacyExternals = "build/externals/both-jsLegacy/src" + val directoryFile = fileInWorkingDir(legacyExternals) assertTrue( !directoryFile.exists(), - "[$irExternals] should not contain files" + "[$legacyExternals] should not contain files" ) } @@ -271,7 +284,7 @@ class DukatIntegrationIT : BaseGradleIT() { "--rerun-tasks" ) { assertSuccessful() - assertTasksExecuted(":legacyGenerateExternalsIntegrated") + assertTasksExecuted(":irGenerateExternalsIntegrated") assertSingleFileExists(externalSrcs, "index.module_decamelize.kt") } @@ -307,6 +320,82 @@ class DukatIntegrationIT : BaseGradleIT() { } } + @Test + fun testAssembleBothBinaries() { + val projectName = "both" + val project = Project( + projectName = projectName, + directoryPrefix = "dukat-integration" + ) + project.setupWorkingDir() + project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + + project.build("assemble") { + assertSuccessful() + } + } + + @Test + fun testCompileLegacyBothBinaries() { + val projectName = "both" + val project = Project( + projectName = projectName, + directoryPrefix = "dukat-integration" + ) + project.setupWorkingDir() + project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + project.gradleProperties().modify { + """ + ${DukatMode.dukatModeProperty}=${DukatMode.BINARY} + """.trimIndent() + } + + val externalSrcs = "build/externals/both-jsLegacy/src" + project.build("compileKotlinJsLegacy") { + assertSuccessful() + + assertSingleFileExists(externalSrcs, "index.d.jar") + + val irExternals = "build/externals/both-jsIr/src" + val directoryFile = fileInWorkingDir(irExternals) + assertTrue( + !directoryFile.exists(), + "[$irExternals] should not contain files" + ) + } + } + + @Test + fun testAssembleBothSource() { + val projectName = "both" + val project = Project( + projectName = projectName, + directoryPrefix = "dukat-integration" + ) + project.setupWorkingDir() + project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) + project.gradleProperties().modify { + """ + ${DukatMode.dukatModeProperty}=${DukatMode.SOURCE} + """.trimIndent() + } + + val externalSrcs = "build/externals/both-jsIr/src" + project.build("assemble") { + assertSuccessful() + + assertTasksExecuted(":irGenerateExternalsIntegrated") + + assertSingleFileExists(externalSrcs, "index.module_decamelize.kt") + val legacyExternals = "build/externals/both-jsLegacy/src" + val directoryFile = fileInWorkingDir(legacyExternals) + assertTrue( + !directoryFile.exists(), + "[$legacyExternals] should not contain files" + ) + } + } + private fun projectName( dslType: DslType, dependenciesLocation: DependenciesLocation diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/both/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/both/build.gradle.kts index 3cbe9d480b7..db6910bce49 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/both/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/both/build.gradle.kts @@ -14,6 +14,7 @@ dependencies { kotlin { js(BOTH) { + useCommonJs() nodejs() } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/both/src/main/kotlin/main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/both/src/main/kotlin/main.kt new file mode 100644 index 00000000000..15ad5ce4201 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/both/src/main/kotlin/main.kt @@ -0,0 +1,3 @@ +fun main() { + decamelize("helloWorld") +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/groovy-dsl-ext/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/groovy-dsl-ext/build.gradle index 544d2729dfd..c80cd5e16b8 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/groovy-dsl-ext/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/groovy-dsl-ext/build.gradle @@ -9,6 +9,7 @@ repositories { kotlin { js { + useCommonJs() nodejs() } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/groovy-dsl-root/build.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/groovy-dsl-root/build.gradle index 782f2929b14..531124d2c5a 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/groovy-dsl-root/build.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/groovy-dsl-root/build.gradle @@ -15,6 +15,7 @@ dependencies { kotlin { js { + useCommonJs() nodejs() } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/kotlin-dsl-ext/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/kotlin-dsl-ext/build.gradle.kts index 2f739fc84c2..6bbfa858042 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/kotlin-dsl-ext/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/kotlin-dsl-ext/build.gradle.kts @@ -9,6 +9,7 @@ repositories { kotlin { js { + useCommonJs() nodejs() } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/kotlin-dsl-root/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/kotlin-dsl-root/build.gradle.kts index e34ca50eeba..40dcd500c8a 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/kotlin-dsl-root/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/dukat-integration/kotlin-dsl-root/build.gradle.kts @@ -15,6 +15,7 @@ dependencies { kotlin { js { + useCommonJs() nodejs() } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt index 840aaf5c632..9b952e28cea 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/plugin/KotlinProperties.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinJsCompilerType.Companion.jsCompi import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMultiplatformPlugin import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService import org.jetbrains.kotlin.gradle.targets.js.dukat.DukatMode +import org.jetbrains.kotlin.gradle.targets.js.dukat.DukatMode.Companion.dukatModeProperty import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.CacheBuilder @@ -221,7 +222,7 @@ internal class PropertiesProvider private constructor(private val project: Proje * Default mode of generating of Dukat */ val dukatMode: DukatMode? - get() = property("dukat.mode")?.let { DukatMode.byArgumentOrNull(it) } + get() = property(dukatModeProperty)?.let { DukatMode.byArgumentOrNull(it) } /** * Use Kotlin/JS backend compiler type diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/NpmVersions.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/NpmVersions.kt index 4d40d104c1b..559098d77d0 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/NpmVersions.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/NpmVersions.kt @@ -10,7 +10,7 @@ package org.jetbrains.kotlin.gradle.targets.js */ // DO NOT MODIFY DIRECTLY! Use org.jetbrains.kotlin.generators.gradle.targets.js.MainKt class NpmVersions { - val dukat = NpmPackageVersion("dukat", "next") + val dukat = NpmPackageVersion("dukat", "0.5.8-rc.2") val webpack = NpmPackageVersion("webpack", "4.44.1") val webpackCli = NpmPackageVersion("webpack-cli", "3.3.12") val webpackBundleAnalyzer = NpmPackageVersion("webpack-bundle-analyzer", "3.8.0") diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt index f90491486ab..e1233619785 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatCompilationResolverPlugin.kt @@ -85,10 +85,16 @@ internal class DukatCompilationResolverPlugin( ) { val externalNpmDependencies = resolution[project][compilation].externalNpmDependencies + val target = compilation.target + val dukatMode = compilation.dukatMode + if (target is KotlinJsTarget && dukatMode == DukatMode.SOURCE) { + return + } + DukatExecutor( nodeJs, DtsResolver(npmProject).getAllDts(externalNpmDependencies), - compilation.dukatMode, + dukatMode, npmProject, packageJsonIsUpdated, operation = compilation.name + " > " + DukatExecutor.OPERATION, diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatMode.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatMode.kt index c4c13abbed8..e823370e896 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatMode.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/dukat/DukatMode.kt @@ -12,5 +12,7 @@ enum class DukatMode { companion object { fun byArgumentOrNull(argument: String): DukatMode? = values().firstOrNull { it.name.equals(argument, ignoreCase = true) } + + const val dukatModeProperty = "dukat.mode" } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt index 234a21ab616..1e301b770c9 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt @@ -337,15 +337,17 @@ internal class KotlinCompilationNpmResolver( } val importedExternalGradleDependencies = externalGradleDependencies.mapNotNull { resolver.gradleNodeModules.get(it.dependency.moduleName, it.dependency.moduleVersion, it.artifact.file) - } + fileCollectionDependencies.mapNotNull { - val file = it.files.singleFile - - resolver.gradleNodeModules.get( - it.name, - it.version ?: "0.0.1", - file - ) - } + } + fileCollectionDependencies.flatMap { dependency -> + dependency.files + .filter { it.exists() } + .map { file -> + resolver.gradleNodeModules.get( + file.name, + dependency.version ?: "0.0.1", + file + ) + } + }.filterNotNull() val compositeDependencies = internalCompositeDependencies.flatMap { dependency -> dependency.getPackages()