org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension.kt Maven / Gradle / Ivy
package org.jetbrains.kotlin.gradle.targets.js.nodejs
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.internal.isInIdeaSync
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
import org.jetbrains.kotlin.gradle.plugin.PropertiesProvider
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.targets.js.NpmVersions
import org.jetbrains.kotlin.gradle.targets.js.npm.KotlinNpmResolutionManager
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinRootNpmResolver
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
import org.jetbrains.kotlin.gradle.targets.js.yarn.Yarn
import java.io.File
open class NodeJsRootExtension(val rootProject: Project) {
init {
check(rootProject.rootProject == rootProject)
}
private val gradleHome = rootProject.gradle.gradleUserHomeDir.also {
rootProject.logger.kotlinInfo("Storing cached files in $it")
}
var installationDir = gradleHome.resolve("nodejs")
var download = true
var nodeDownloadBaseUrl = "https://nodejs.org/dist"
var nodeVersion = "10.15.3"
var nodeCommand = "node"
var packageManager: NpmApi = Yarn
private val projectProperties = PropertiesProvider(rootProject)
inner class Experimental {
val generateKotlinExternals: Boolean
get() = projectProperties.jsGenerateExternals == true
val discoverTypes: Boolean
get() = projectProperties.jsDiscoverTypes == true
}
val experimental = Experimental()
val nodeJsSetupTask: NodeJsSetupTask
get() = rootProject.tasks.getByName(NodeJsSetupTask.NAME) as NodeJsSetupTask
val npmInstallTask: KotlinNpmInstallTask
get() = rootProject.tasks.getByName(KotlinNpmInstallTask.NAME) as KotlinNpmInstallTask
val rootPackageDir: File
get() = rootProject.buildDir.resolve("js")
internal val rootNodeModulesStateFile: File
get() = rootPackageDir.resolve("node_modules.state")
val projectPackagesDir: File
get() = rootPackageDir.resolve("packages")
val nodeModulesGradleCacheDir: File
get() = rootPackageDir.resolve("packages_imported")
internal val environment: NodeJsEnv
get() {
val platform = NodeJsPlatform.name
val architecture = NodeJsPlatform.architecture
val nodeDir = installationDir.resolve("node-v$nodeVersion-$platform-$architecture")
val isWindows = NodeJsPlatform.name == NodeJsPlatform.WIN
val nodeBinDir = if (isWindows) nodeDir else nodeDir.resolve("bin")
fun getExecutable(command: String, customCommand: String, windowsExtension: String): String {
val finalCommand = if (isWindows && customCommand == command) "$command.$windowsExtension" else customCommand
return if (download) File(nodeBinDir, finalCommand).absolutePath else finalCommand
}
fun getIvyDependency(): String {
val type = if (isWindows) "zip" else "tar.gz"
return "org.nodejs:node:$nodeVersion:$platform-$architecture@$type"
}
return NodeJsEnv(
nodeDir = nodeDir,
nodeBinDir = nodeBinDir,
nodeExecutable = getExecutable("node", nodeCommand, "exe"),
platformName = platform,
architectureName = architecture,
ivyDependency = getIvyDependency()
)
}
internal fun executeSetup() {
val nodeJsEnv = environment
if (download) {
if (!nodeJsEnv.nodeBinDir.isDirectory) {
nodeJsSetupTask.exec()
}
}
}
val versions = NpmVersions()
internal val npmResolutionManager = KotlinNpmResolutionManager(this)
companion object {
const val EXTENSION_NAME: String = "kotlinNodeJs"
}
}