diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt index 4c22af3935f..1f9544bd939 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/Kotlin2JsGradlePluginIT.kt @@ -28,7 +28,6 @@ import org.jetbrains.kotlin.gradle.util.normalizePath import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.condition.DisabledIf import java.nio.file.Files -import java.nio.file.Path import java.nio.file.Paths import java.util.zip.ZipFile import kotlin.io.path.* @@ -85,26 +84,31 @@ class Kotlin2JsIrGradlePluginIT : AbstractKotlin2JsGradlePluginIT(true) { fun testJsCompositeBuild(gradleVersion: GradleVersion) { project("js-composite-build", gradleVersion) { buildGradleKts.modify(::transformBuildScriptWithPluginsDsl) - gradleProperties.appendText(jsCompilerType(KotlinJsCompilerType.IR)) subProject("lib").apply { buildGradleKts.modify(::transformBuildScriptWithPluginsDsl) - gradleProperties.appendText(jsCompilerType(KotlinJsCompilerType.IR)) } - fun asyncVersion(rootModulePath: String, moduleName: String): String = + subProject("base").apply { + buildGradleKts.modify(::transformBuildScriptWithPluginsDsl) + } + + fun moduleVersion(rootModulePath: String, moduleName: String, pathToPackageJson: String): String = NpmProjectModules(projectPath.resolve(rootModulePath).toFile()) .require(moduleName) - .let { Paths.get(it).parent.parent.resolve(NpmProject.PACKAGE_JSON) } + .let { Paths.get(it).parent.resolve(pathToPackageJson).resolve(NpmProject.PACKAGE_JSON) } .let { fromSrcPackageJson(it.toFile()) } .let { it!!.version } build("build") { - val appAsyncVersion = asyncVersion("build/js/node_modules/js-composite-build", "async") + val appAsyncVersion = moduleVersion("build/js/node_modules/js-composite-build", "async", "..") assertEquals("3.2.0", appAsyncVersion) - val libAsyncVersion = asyncVersion("build/js/node_modules/lib2", "async") + val libAsyncVersion = moduleVersion("build/js/node_modules/lib2", "async", "..") assertEquals("2.6.2", libAsyncVersion) + + val appDecamelizeVersion = moduleVersion("build/js/node_modules/base2", "decamelize", ".") + assertEquals("1.1.1", appDecamelizeVersion) } } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/base/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/base/build.gradle.kts new file mode 100755 index 00000000000..85341bf731d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/base/build.gradle.kts @@ -0,0 +1,38 @@ +group = "com.example" + +plugins { + kotlin("js") version "" +} + +repositories { + mavenLocal() + mavenCentral() +} + +kotlin.js { + nodejs() + browser() +} + +tasks.named("browserTest") { + enabled = false +} + +rootProject.tasks + .withType(org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask::class.java) + .named("kotlinNpmInstall") + .configure { + args.addAll( + listOf( + "--network-concurrency", + "1", + "--mutex", + "network" + ) + ) + } + +dependencies { + implementation(kotlin("stdlib-js")) + implementation(npm("decamelize", "1.1.1")) +} \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/base/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/base/settings.gradle new file mode 100755 index 00000000000..f226e494d92 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/base/settings.gradle @@ -0,0 +1,15 @@ +pluginManagement { + repositories { + mavenLocal() + mavenCentral() + google() + gradlePluginPortal() + } + + plugins { + id "org.jetbrains.kotlin.js" version "$kotlin_version" + id "org.jetbrains.kotlin.test.fixes.android" version "$test_fixes_version" + } +} + +rootProject.name = "base2" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/base/src/main/kotlin/answer.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/base/src/main/kotlin/answer.kt new file mode 100755 index 00000000000..da859175cb7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/base/src/main/kotlin/answer.kt @@ -0,0 +1 @@ +fun answer() = 42L diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/build.gradle.kts index 59c83a087a2..d72d76d6213 100755 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/build.gradle.kts +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/build.gradle.kts @@ -34,5 +34,6 @@ rootProject.tasks dependencies { implementation(kotlin("stdlib-js")) + implementation("com.example:base2") implementation(npm("async", "2.6.2")) } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/gradle.properties b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/gradle.properties deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/settings.gradle b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/settings.gradle index 5f148e39ed9..f5f2457644f 100755 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/settings.gradle +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/settings.gradle @@ -12,4 +12,6 @@ pluginManagement { } } +includeBuild("../base") + rootProject.name = "lib2" \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/src/main/kotlin/Singleton.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/src/main/kotlin/Singleton.kt index 036066f1160..4c586b49d4d 100755 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/src/main/kotlin/Singleton.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/js-composite-build/lib/src/main/kotlin/Singleton.kt @@ -1,5 +1,5 @@ object Singleton { fun test(): Long { - return 42L + return answer() } } diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/ProcessedFilesCache.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/ProcessedFilesCache.kt index 1caa8110fd4..d371c1ff293 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/ProcessedFilesCache.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/internal/ProcessedFilesCache.kt @@ -182,6 +182,10 @@ internal open class ProcessedFilesCache( file: File, compute: () -> File? ): String? { + if (!file.exists()) { + return null + } + val hash = fileHasher.hash(file).toByteArray() val old = state[hash] diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt index 834bf561867..51382fff41a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolver/KotlinCompilationNpmResolver.kt @@ -91,13 +91,17 @@ class KotlinCompilationNpmResolver( override fun toString(): String = "KotlinCompilationNpmResolver(${npmProject.name})" + val aggregatedConfiguration: Configuration by lazy { + createAggregatedConfiguration() + } + private var _compilationNpmResolution: KotlinCompilationNpmResolution? = null val compilationNpmResolution: KotlinCompilationNpmResolution get() { return _compilationNpmResolution ?: run { val visitor = ConfigurationVisitor() - visitor.visit(createAggregatedConfiguration()) + visitor.visit(aggregatedConfiguration) visitor.toPackageJsonProducer() }.also { _compilationNpmResolution = it @@ -212,12 +216,7 @@ class KotlinCompilationNpmResolver( val artifactId = artifact.id val componentIdentifier = artifactId.componentIdentifier - if (artifactId `is` CompositeProjectComponentArtifactMetadata) { - visitCompositeProjectDependency(dependency, componentIdentifier as ProjectComponentIdentifier) - return - } - - if (componentIdentifier is ProjectComponentIdentifier) { + if (componentIdentifier is ProjectComponentIdentifier && !(artifactId `is` CompositeProjectComponentArtifactMetadata)) { visitProjectDependency(componentIdentifier) return } @@ -225,28 +224,6 @@ class KotlinCompilationNpmResolver( externalGradleDependencies.add(ExternalGradleDependency(dependency, artifact)) } - private fun visitCompositeProjectDependency( - dependency: ResolvedDependency, - componentIdentifier: ProjectComponentIdentifier - ) { - check(target is KotlinJsIrTarget) { - """ - Composite builds for Kotlin/JS are supported only for IR compiler. - Use kotlin.js.compiler=ir in gradle.properties or - js(IR) { - ... - } - """.trimIndent() - } - - (componentIdentifier as DefaultProjectComponentIdentifier).let { identifier -> - val includedBuild = project.gradle.includedBuild(identifier.identityPath.topRealPath().name!!) - internalCompositeDependencies.add( - CompositeDependency(dependency.moduleName, dependency.moduleVersion, includedBuild.projectDir, includedBuild) - ) - } - } - private fun visitProjectDependency( componentIdentifier: ProjectComponentIdentifier ) { diff --git a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt index 1b4b1a0dc08..851624b0c45 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/common/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/tasks/KotlinPackageJsonTask.kt @@ -6,8 +6,10 @@ package org.jetbrains.kotlin.gradle.targets.js.npm.tasks import org.gradle.api.DefaultTask +import org.gradle.api.file.FileCollection import org.gradle.api.provider.Property import org.gradle.api.tasks.* +import org.gradle.work.NormalizeLineEndings import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin @@ -74,6 +76,14 @@ abstract class KotlinPackageJsonTask : .sorted() } + @get:IgnoreEmptyDirectories + @get:NormalizeLineEndings + @get:InputFiles + @get:PathSensitive(PathSensitivity.RELATIVE) + internal val aggregatedConfiguration: FileCollection by lazy { + compilationResolver.aggregatedConfiguration + } + // nested inputs are processed in configuration phase // so npmResolutionManager must not be used @get:Nested