Gradle, JS: extract npm package constants

#KT-30530
This commit is contained in:
Sergey Rostov
2019-05-13 08:49:28 +03:00
parent 3797ec9255
commit 5ec501dce0
6 changed files with 116 additions and 111 deletions
@@ -8,17 +8,23 @@ package org.jetbrains.kotlin.gradle.targets.js
import org.gradle.language.base.plugins.LifecycleBasePlugin
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpack
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfig
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
class KotlinJsBrowser(
class KotlinBrowserJs(
target: KotlinOnlyTarget<KotlinJsCompilation>
) : KotlinJsInnerTargetConfigurator(target) {
private val versions = project.nodeJs.versions
override fun configureDefaultTestFramework(it: KotlinJsTest) {
it.useNodeJs { }
it.useKarma {
useWebpack()
useChromeHeadless()
}
}
override fun configureRun(compilation: KotlinJsCompilation) {
@@ -27,13 +33,13 @@ class KotlinJsBrowser(
val compileKotlinTask = compilation.compileKotlinTask
compilation.dependencies {
runtimeOnly(npm("webpack", "4.29.6"))
runtimeOnly(npm("webpack-cli", "3.3.0"))
runtimeOnly(npm("webpack-bundle-analyzer", "3.3.2"))
runtimeOnly(versions.webpack)
runtimeOnly(versions.webpackCli)
runtimeOnly(versions.webpackBundleAnalyzer)
// for source map support only
runtimeOnly(npm("source-map-loader", "0.2.4"))
runtimeOnly(npm("source-map-support", "0.5.12"))
// for source map support
runtimeOnly(versions.sourceMapLoader.npm(project))
runtimeOnly(versions.sourceMapSupport.npm(project))
}
project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("webpack")) {
@@ -5,47 +5,32 @@
package org.jetbrains.kotlin.gradle.targets.js
import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinOnlyTarget
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsCompilationTestsConfigurator
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTargetConfigurator
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
class KotlinNodeJs(kotlinPluginVersion: String) :
KotlinJsTargetConfigurator(kotlinPluginVersion) {
class KotlinNodeJs(target: KotlinOnlyTarget<KotlinJsCompilation>) :
KotlinJsInnerTargetConfigurator(target) {
override fun configureTarget(target: KotlinOnlyTarget<KotlinJsCompilation>) {
super.configureTarget(target)
configureApplication(target)
override fun configureDefaultTestFramework(it: KotlinJsTest) {
it.useNodeJs { }
}
private fun configureApplication(target: KotlinOnlyTarget<KotlinJsCompilation>) {
target.compilations.all { compilation ->
if (compilation.name == KotlinCompilation.MAIN_COMPILATION_NAME) {
// source maps support
compilation.dependencies {
runtimeOnly(kotlin("test-nodejs-runner"))
}
override fun configureRun(compilation: KotlinJsCompilation) {
// source maps support
compilation.dependencies {
runtimeOnly(kotlin("test-nodejs-runner"))
}
val project = target.project
project.createOrRegisterTask<NodeJsExec>("run") {
it.args(
project.npmProject.compileOutput(compilation.compileKotlinTask),
"--require", "kotlin-test-nodejs-runner/kotlin-nodejs-source-map-support.js"
)
}
}
val project = target.project
project.createOrRegisterTask<NodeJsExec>("run") {
it.args(project.npmProject.compileOutput(compilation.compileKotlinTask))
// source maps support
it.args("--require", "kotlin-test-nodejs-runner/kotlin-nodejs-source-map-support.js")
}
}
override fun newTestsConfigurator(compilation: KotlinJsCompilation) =
object : KotlinJsCompilationTestsConfigurator(compilation) {
override fun configureDefaultTestFramework(it: KotlinJsTest) {
it.useNodeJs { }
}
}
}
@@ -1,20 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.targets.js
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmDependency
val karmaChromeLauncher = NpmPackageVersion("karma-chrome-launcher", "2.2.0")
val karmaPhantomjsLauncher = NpmPackageVersion("karma-phantomjs-launcher", "*")
// karma-firefox-launcher
// karma-opera-launcher
// karma-ie-launcher
// karma-safari-launcher
data class NpmPackageVersion(val name: String, val version: String) {
fun npm(project: Project) = NpmDependency(project, null, name, version)
}
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.gradle.targets.js.nodejs
import org.gradle.api.Project
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmPackages
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
open class NodeJsExtension(val project: Project) {
@@ -14,6 +15,9 @@ open class NodeJsExtension(val project: Project) {
internal val packageJsonHandlers = mutableListOf<PackageJson.() -> Unit>()
val versions = NpmPackages()
@Suppress("unused")
fun packageJson(handler: PackageJson.() -> Unit) {
packageJsonHandlers.add(handler)
}
@@ -0,0 +1,39 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.gradle.targets.js.npm
import org.gradle.api.Project
class NpmPackages {
val webpack = NpmPackageVersion("webpack", "4.29.6")
val webpackCli = NpmPackageVersion("webpack-cli", "3.3.0")
val webpackBundleAnalyzer = NpmPackageVersion("webpack-bundle-analyzer", "3.3.2")
val webpackDevServer = NpmPackageVersion("webpack-dev-server", "3.3.1")
val sourceMapLoader = NpmPackageVersion("source-map-loader", "0.2.4")
val sourceMapSupport = NpmPackageVersion("source-map-support", "0.5.12")
val mocha = NpmPackageVersion("mocha", "6.1.2")
val karma = NpmPackageVersion("karma", "4.0.1")
val karmaTeamcityReporter = NpmPackageVersion("karma-teamcity-reporter", "1.1.0")
val karmaChromeLauncher = NpmPackageVersion("karma-chrome-launcher", "2.2.0")
val karmaPhantomJsLauncher = NpmPackageVersion("karma-phantomjs-launcher", "*")
val karmaFirefoxLauncher = NpmPackageVersion("karma-firefox-launcher", "*")
val karmaOperaLauncher = NpmPackageVersion("karma-opera-launcher", "*")
val karmaIeLauncher = NpmPackageVersion("karma-ie-launcher", "*")
val karmaSafariLauncher = NpmPackageVersion("karma-safari-launcher", "*")
val karmaMocha = NpmPackageVersion("karma-mocha", "1.3.0")
val karmaWebpack = NpmPackageVersion("karma-webpack", "*")
val karmaSourceMapSupport = NpmPackageVersion("karma-source-map-support", "1.4.0")
}
data class NpmPackageVersion(val name: String, var version: String) {
fun npm(project: Project) = NpmDependency(project, null, name, version)
}
@@ -7,16 +7,14 @@ package org.jetbrains.kotlin.gradle.targets.js.testing.karma
import com.google.gson.GsonBuilder
import org.gradle.api.Project
import org.gradle.api.tasks.Input
import org.gradle.process.ProcessForkOptions
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSettings
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
import org.jetbrains.kotlin.gradle.plugin.HasKotlinDependencies
import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
import org.jetbrains.kotlin.gradle.targets.js.karmaChromeLauncher
import org.jetbrains.kotlin.gradle.targets.js.karmaPhantomjsLauncher
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmProject
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmPackageVersion
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
@@ -24,15 +22,32 @@ class KotlinKarma(val project: Project) : KotlinJsTestFramework {
private val config: KarmaConfig = KarmaConfig()
private val requiredDependencies = mutableSetOf<NpmPackageVersion>()
fun useChrome() = useBrowser("Chrome", karmaChromeLauncher)
private val versions = project.nodeJs.versions
fun useChromeCanary() = useBrowser("ChromeCanary", karmaChromeLauncher)
init {
requiredDependencies.add(versions.karma)
fun useChromeHeadless() = useBrowser("ChromeHeadless", karmaChromeLauncher)
requiredDependencies.add(versions.karmaTeamcityReporter)
config.reporters.add("teamcity")
fun usePhantomJS() = useBrowser("PhantomJS", karmaPhantomjsLauncher)
config.singleRun = true
}
fun useFirefox() = useBrowser("Firefox", TODO())
fun useChrome() = useBrowser("Chrome", versions.karmaChromeLauncher)
fun useChromeCanary() = useBrowser("ChromeCanary", versions.karmaChromeLauncher)
fun useChromeHeadless() = useBrowser("ChromeHeadless", versions.karmaChromeLauncher)
fun usePhantomJS() = useBrowser("PhantomJS", versions.karmaPhantomJsLauncher)
fun useFirefox() = useBrowser("Firefox", versions.karmaFirefoxLauncher)
fun useOpera() = useBrowser("Opera", versions.karmaOperaLauncher)
fun useSafari() = useBrowser("Safari", versions.karmaSafariLauncher)
fun useIe() = useBrowser("Ie", versions.karmaIeLauncher)
fun useBrowser(id: String, dependency: NpmPackageVersion) {
config.browsers.add(id)
@@ -40,24 +55,24 @@ class KotlinKarma(val project: Project) : KotlinJsTestFramework {
}
fun useMocha() {
requiredDependencies.add(versions.karmaMocha)
requiredDependencies.add(versions.mocha)
}
fun useWebpack() {
requiredDependencies.add(versions.karmaWebpack)
}
fun useSourceMapSupport() {
config.frameworks.add("source-map-support")
requiredDependencies.add(versions.karmaSourceMapSupport)
}
override fun configure(dependenciesHolder: HasKotlinDependencies) {
dependenciesHolder.dependencies {
runtimeOnly(npm("karma", "4.0.1"))
runtimeOnly(npm("karma-chrome-launcher", "2.2.0"))
runtimeOnly(npm("puppeteer", "1.14.0"))
runtimeOnly(npm("karma-source-map-support", "1.4.0"))
runtimeOnly(npm("karma-browserify", "6.0.0"))
runtimeOnly(npm("browserify", "16.2.3"))
runtimeOnly(npm("karma-mocha", "1.3.0"))
runtimeOnly(npm("mocha", "6.1.2"))
runtimeOnly(npm("karma-teamcity-reporter", "1.1.0"))
requiredDependencies.forEach {
npm(it.name, it.version)
}
}
}
@@ -74,48 +89,24 @@ class KotlinKarma(val project: Project) : KotlinJsTestFramework {
ignoreOutOfRootNodes = true
)
val npmProjectLayout = NpmProject[task.project]
val npmProject = task.project.npmProject
val files = task.nodeModulesToLoad.map {
npmProjectLayout.nodeModulesDir.resolve(it).also { file ->
check(file.isFile) { "Cannot find ${file.canonicalPath}" }
}.canonicalPath
}.let {
GsonBuilder().create().toJson(it)
}
config.files.addAll(task.nodeModulesToLoad.map {
npmProject.getModuleEntryPath(it)
})
val karmaConfJs = npmProjectLayout.nodeWorkDir.resolve("karma.conf.js")
config.basePath = npmProject.nodeModulesDir.absolutePath
val karmaConfJs = npmProject.nodeWorkDir.resolve("karma.conf.js")
karmaConfJs.printWriter().use {
//language=JavaScript
it.println(
"""
process.env.CHROME_BIN = require('puppeteer').executablePath();
module.exports = (config) => {
config.set({
basePath: 'node_modules',
files: $files,
frameworks: ['browserify', 'source-map-support', 'mocha'],
browsers: ['ChromeHeadless'],
reporters: ['teamcity'],
singleRun: true,
preprocessors: {
'*.js': [ 'browserify' ]
},
browserify: {
debug: true
}
});
}
""".trimIndent()
)
GsonBuilder().setPrettyPrinting().create().toJson(config, it)
}
val nodeModules = listOf("karma/bin/karma")
val args = nodeJsArgs +
nodeModules.map {
npmProjectLayout.nodeModulesDir.resolve(it).also { file ->
npmProject.nodeModulesDir.resolve(it).also { file ->
check(file.isFile) { "Cannot find ${file.canonicalPath}" }
}.canonicalPath
} +