diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt index f2e39b2e1e3..742fd24630a 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/NodeJsRootExtension.kt @@ -51,8 +51,7 @@ open class NodeJsRootExtension(@Transient val rootProject: Project) : Configurat val experimental = Experimental() - @Transient - val taskRequirements = TasksRequirements() + val taskRequirements: TasksRequirements = TasksRequirements() val nodeJsSetupTaskProvider: TaskProvider get() = rootProject.tasks.withType(NodeJsSetupTask::class.java).named(NodeJsSetupTask.NAME) diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/TasksRequirements.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/TasksRequirements.kt index 7339324692e..5679b63de25 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/TasksRequirements.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/nodejs/TasksRequirements.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies import org.jetbrains.kotlin.gradle.targets.js.npm.toDeclaration class TasksRequirements { - @Transient private val _byTask = mutableMapOf>() private val byCompilation = mutableMapOf>() diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt index 83c879f4066..c598f1df086 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/KotlinNpmResolutionManager.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.gradle.targets.js.npm import org.gradle.api.Incubating +import org.gradle.api.Project import org.gradle.api.Task import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.logging.Logger @@ -120,8 +121,9 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension @Incubating internal fun requireInstalled( services: ServiceRegistry, - logger: Logger - ) = installIfNeeded(reason = "", services = services, logger = logger) + logger: Logger, + reason: String = "" + ) = installIfNeeded(reason = reason, services = services, logger = logger) internal fun requireConfiguringState(): KotlinRootNpmResolver = (this.state as? ResolutionState.Configuring ?: error("NPM Dependencies already resolved and installed")).resolver @@ -156,9 +158,6 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension } } -// internal fun requireAlreadyInstalled(project: Project, reason: String = ""): KotlinProjectNpmResolution = -// installIfNeeded(reason = reason)[project.path] - internal val packageJsonFiles: Collection get() = state.npmProjects.map { it.packageJsonFile } @@ -230,18 +229,18 @@ class KotlinNpmResolutionManager(private val nodeJsSettings: NodeJsRootExtension return resolvedProject.npmProjectsByNpmDependency[npmDependency] ?: error("NPM project resolved without $this") } - internal fun checkRequiredDependencies(task: T) + internal fun checkRequiredDependencies(task: T, services: ServiceRegistry, logger: Logger, projectPath: String) where T : RequiresNpmDependencies, T : Task { -// val project = task.project -// val requestedTaskDependencies = requireAlreadyInstalled(project, "before $task execution").taskRequirements -// val targetRequired = requestedTaskDependencies[task]?.toSet() ?: setOf() -// -// task.requiredNpmDependencies.forEach { -// check(it in targetRequired) { -// "${it.createDependency(project)} required by $task was not found resolved at the time of nodejs package manager call. " + -// "This may be caused by changing $task configuration after npm dependencies resolution." -// } -// } + val project = task.project + val requestedTaskDependencies = requireInstalled(services, logger, "before $task execution")[projectPath].taskRequirements + val targetRequired = requestedTaskDependencies[task]?.toSet() ?: setOf() + + task.requiredNpmDependencies.forEach { + check(it in targetRequired) { + "${it.createDependency(project)} required by $task was not found resolved at the time of nodejs package manager call. " + + "This may be caused by changing $task configuration after npm dependencies resolution." + } + } } } \ No newline at end of file diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinProjectNpmResolution.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinProjectNpmResolution.kt index dd4ec78a944..4c28940dcf1 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinProjectNpmResolution.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/npm/resolved/KotlinProjectNpmResolution.kt @@ -18,7 +18,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies class KotlinProjectNpmResolution( val project: String, val npmProjects: List, - val taskRequirements: Map>? + val taskRequirements: Map> ) { val npmProjectsByNpmDependency: Map by lazy { mutableMapOf().also { result -> diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt index f6212ed6b8b..aac6d775761 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/testing/KotlinJsTest.kt @@ -35,6 +35,8 @@ constructor( RequiresNpmDependencies { private val nodeJs get() = NodeJsRootPlugin.apply(project.rootProject) + private val projectPath = project.path + @get:Internal var testFramework: KotlinJsTestFramework? = null set(value) { @@ -134,7 +136,7 @@ constructor( } override fun executeTests() { - nodeJs.npmResolutionManager.checkRequiredDependencies(this) + nodeJs.npmResolutionManager.checkRequiredDependencies(task = this, services = services, logger = logger, projectPath = projectPath) super.executeTests() } diff --git a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt index 8bbaf8adac2..c2bb17b3cfc 100644 --- a/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt +++ b/libraries/tools/kotlin-gradle-plugin/src/main/kotlin/org/jetbrains/kotlin/gradle/targets/js/webpack/KotlinWebpack.kt @@ -10,7 +10,6 @@ import org.gradle.api.Incubating import org.gradle.api.file.FileCollection import org.gradle.api.file.RegularFileProperty import org.gradle.api.internal.file.FileResolver -import org.gradle.api.internal.project.ProjectInternal import org.gradle.api.plugins.BasePluginConvention import org.gradle.api.provider.Provider import org.gradle.api.tasks.* @@ -50,6 +49,8 @@ constructor( private val npmProject = compilation.npmProject + private val projectPath = project.path + @get:Inject open val fileResolver: FileResolver get() = injected @@ -106,6 +107,9 @@ constructor( @Input var saveEvaluatedConfigFile: Boolean = true + @Transient + private val baseConventions: BasePluginConvention? = project.convention.plugins["base"] as BasePluginConvention? + @Nested val output: KotlinWebpackOutput = KotlinWebpackOutput( library = baseConventions?.archivesBaseName, @@ -118,22 +122,27 @@ constructor( val outputPath: File get() = destinationDirectory - private val baseConventions: BasePluginConvention? - get() = project.convention.plugins["base"] as BasePluginConvention? - @get:Internal internal var _destinationDirectory: File? = null + private val defaultDestinationDirectory by lazy { + project.buildDir.resolve(baseConventions!!.distsDirName) + } + @get:Internal var destinationDirectory: File - get() = _destinationDirectory ?: project.buildDir.resolve(baseConventions!!.distsDirName) + get() = _destinationDirectory ?: defaultDestinationDirectory set(value) { _destinationDirectory = value } + private val defaultOutputFileName by lazy { + baseConventions?.archivesBaseName + ".js" + } + @get:Internal var outputFileName: String by property { - baseConventions?.archivesBaseName + ".js" + defaultOutputFileName } @get:OutputFile @@ -250,7 +259,7 @@ constructor( @TaskAction fun doExecute() { -// nodeJs.npmResolutionManager?.checkRequiredDependencies(this) + nodeJs.npmResolutionManager.checkRequiredDependencies(task = this, services = services, logger = logger, projectPath = projectPath) val runner = createRunner()