[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
This commit is contained in:
Ilya Goncharov
2020-10-08 13:37:13 +03:00
parent 0a86beeb64
commit 3ad6d58153
12 changed files with 128 additions and 20 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.gradle package org.jetbrains.kotlin.gradle
import org.jetbrains.kotlin.gradle.targets.js.dukat.DukatMode
import org.jetbrains.kotlin.gradle.util.modify import org.jetbrains.kotlin.gradle.util.modify
import org.junit.Test import org.junit.Test
import kotlin.test.assertTrue import kotlin.test.assertTrue
@@ -101,6 +102,9 @@ class DukatIntegrationIT : BaseGradleIT() {
) )
project.setupWorkingDir() project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.gradleProperties().modify {
"${DukatMode.dukatModeProperty}=${DukatMode.SOURCE}"
}
val externalSrcs = "build/externals/$projectName/src" val externalSrcs = "build/externals/$projectName/src"
project.build("generateExternalsIntegrated") { project.build("generateExternalsIntegrated") {
@@ -153,6 +157,9 @@ class DukatIntegrationIT : BaseGradleIT() {
) )
project.setupWorkingDir() project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.gradleProperties().modify {
"${DukatMode.dukatModeProperty}=${DukatMode.SOURCE}"
}
val externalSrcs = "build/externals/$projectName/src" val externalSrcs = "build/externals/$projectName/src"
project.build("generateExternalsIntegrated") { project.build("generateExternalsIntegrated") {
@@ -224,7 +231,10 @@ class DukatIntegrationIT : BaseGradleIT() {
project.setupWorkingDir() project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.gradleProperties().modify { project.gradleProperties().modify {
"kotlin.js.generate.externals=true" """
kotlin.js.generate.externals=true
${DukatMode.dukatModeProperty}=${DukatMode.SOURCE}
""".trimIndent()
} }
project.gradleBuildScript().modify { buildScript -> project.gradleBuildScript().modify { buildScript ->
@@ -251,18 +261,21 @@ class DukatIntegrationIT : BaseGradleIT() {
) )
project.setupWorkingDir() project.setupWorkingDir()
project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl) project.gradleBuildScript().modify(::transformBuildScriptWithPluginsDsl)
project.gradleProperties().modify {
"${DukatMode.dukatModeProperty}=${DukatMode.SOURCE}"
}
val externalSrcs = "build/externals/both-jsLegacy/src" val externalSrcs = "build/externals/both-jsIr/src"
project.build("compileKotlinJsIr") { project.build("compileKotlinJsLegacy") {
assertSuccessful() assertSuccessful()
assertTasksExecuted(":legacyGenerateExternalsIntegrated") assertTasksExecuted(":irGenerateExternalsIntegrated")
assertSingleFileExists(externalSrcs, "index.module_decamelize.kt") assertSingleFileExists(externalSrcs, "index.module_decamelize.kt")
val irExternals = "build/externals/both-jsIr/src" val legacyExternals = "build/externals/both-jsLegacy/src"
val directoryFile = fileInWorkingDir(irExternals) val directoryFile = fileInWorkingDir(legacyExternals)
assertTrue( assertTrue(
!directoryFile.exists(), !directoryFile.exists(),
"[$irExternals] should not contain files" "[$legacyExternals] should not contain files"
) )
} }
@@ -271,7 +284,7 @@ class DukatIntegrationIT : BaseGradleIT() {
"--rerun-tasks" "--rerun-tasks"
) { ) {
assertSuccessful() assertSuccessful()
assertTasksExecuted(":legacyGenerateExternalsIntegrated") assertTasksExecuted(":irGenerateExternalsIntegrated")
assertSingleFileExists(externalSrcs, "index.module_decamelize.kt") 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( private fun projectName(
dslType: DslType, dslType: DslType,
dependenciesLocation: DependenciesLocation dependenciesLocation: DependenciesLocation
@@ -14,6 +14,7 @@ dependencies {
kotlin { kotlin {
js(BOTH) { js(BOTH) {
useCommonJs()
nodejs() nodejs()
} }
} }
@@ -9,6 +9,7 @@ repositories {
kotlin { kotlin {
js { js {
useCommonJs()
nodejs() nodejs()
} }
@@ -15,6 +15,7 @@ dependencies {
kotlin { kotlin {
js { js {
useCommonJs()
nodejs() nodejs()
} }
} }
@@ -9,6 +9,7 @@ repositories {
kotlin { kotlin {
js { js {
useCommonJs()
nodejs() nodejs()
} }
@@ -15,6 +15,7 @@ dependencies {
kotlin { kotlin {
js { js {
useCommonJs()
nodejs() nodejs()
} }
} }
@@ -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.mpp.KotlinMultiplatformPlugin
import org.jetbrains.kotlin.gradle.plugin.statistics.KotlinBuildStatsService 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
import org.jetbrains.kotlin.gradle.targets.js.dukat.DukatMode.Companion.dukatModeProperty
import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter import org.jetbrains.kotlin.gradle.targets.native.DisabledNativeTargetsReporter
import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile import org.jetbrains.kotlin.gradle.tasks.AbstractKotlinCompile
import org.jetbrains.kotlin.gradle.tasks.CacheBuilder 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 * Default mode of generating of Dukat
*/ */
val dukatMode: DukatMode? val dukatMode: DukatMode?
get() = property("dukat.mode")?.let { DukatMode.byArgumentOrNull(it) } get() = property(dukatModeProperty)?.let { DukatMode.byArgumentOrNull(it) }
/** /**
* Use Kotlin/JS backend compiler type * Use Kotlin/JS backend compiler type
@@ -10,7 +10,7 @@ package org.jetbrains.kotlin.gradle.targets.js
*/ */
// DO NOT MODIFY DIRECTLY! Use org.jetbrains.kotlin.generators.gradle.targets.js.MainKt // DO NOT MODIFY DIRECTLY! Use org.jetbrains.kotlin.generators.gradle.targets.js.MainKt
class NpmVersions { class NpmVersions {
val dukat = NpmPackageVersion("dukat", "next") val dukat = NpmPackageVersion("dukat", "0.5.8-rc.2")
val webpack = NpmPackageVersion("webpack", "4.44.1") val webpack = NpmPackageVersion("webpack", "4.44.1")
val webpackCli = NpmPackageVersion("webpack-cli", "3.3.12") val webpackCli = NpmPackageVersion("webpack-cli", "3.3.12")
val webpackBundleAnalyzer = NpmPackageVersion("webpack-bundle-analyzer", "3.8.0") val webpackBundleAnalyzer = NpmPackageVersion("webpack-bundle-analyzer", "3.8.0")
@@ -85,10 +85,16 @@ internal class DukatCompilationResolverPlugin(
) { ) {
val externalNpmDependencies = resolution[project][compilation].externalNpmDependencies val externalNpmDependencies = resolution[project][compilation].externalNpmDependencies
val target = compilation.target
val dukatMode = compilation.dukatMode
if (target is KotlinJsTarget && dukatMode == DukatMode.SOURCE) {
return
}
DukatExecutor( DukatExecutor(
nodeJs, nodeJs,
DtsResolver(npmProject).getAllDts(externalNpmDependencies), DtsResolver(npmProject).getAllDts(externalNpmDependencies),
compilation.dukatMode, dukatMode,
npmProject, npmProject,
packageJsonIsUpdated, packageJsonIsUpdated,
operation = compilation.name + " > " + DukatExecutor.OPERATION, operation = compilation.name + " > " + DukatExecutor.OPERATION,
@@ -12,5 +12,7 @@ enum class DukatMode {
companion object { companion object {
fun byArgumentOrNull(argument: String): DukatMode? = fun byArgumentOrNull(argument: String): DukatMode? =
values().firstOrNull { it.name.equals(argument, ignoreCase = true) } values().firstOrNull { it.name.equals(argument, ignoreCase = true) }
const val dukatModeProperty = "dukat.mode"
} }
} }
@@ -337,15 +337,17 @@ internal class KotlinCompilationNpmResolver(
} }
val importedExternalGradleDependencies = externalGradleDependencies.mapNotNull { val importedExternalGradleDependencies = externalGradleDependencies.mapNotNull {
resolver.gradleNodeModules.get(it.dependency.moduleName, it.dependency.moduleVersion, it.artifact.file) resolver.gradleNodeModules.get(it.dependency.moduleName, it.dependency.moduleVersion, it.artifact.file)
} + fileCollectionDependencies.mapNotNull { } + fileCollectionDependencies.flatMap { dependency ->
val file = it.files.singleFile dependency.files
.filter { it.exists() }
resolver.gradleNodeModules.get( .map { file ->
it.name, resolver.gradleNodeModules.get(
it.version ?: "0.0.1", file.name,
file dependency.version ?: "0.0.1",
) file
} )
}
}.filterNotNull()
val compositeDependencies = internalCompositeDependencies.flatMap { dependency -> val compositeDependencies = internalCompositeDependencies.flatMap { dependency ->
dependency.getPackages() dependency.getPackages()