Gradle, JS: rework nodejs extensions and plugins
Get rid of Project.nodeJs
This commit is contained in:
+1
-2
@@ -46,12 +46,11 @@ open class NodeJsExec : AbstractExecTask<NodeJsExec>(NodeJsExec::class.java), Re
|
|||||||
fun create(
|
fun create(
|
||||||
compilation: KotlinJsCompilation,
|
compilation: KotlinJsCompilation,
|
||||||
name: String,
|
name: String,
|
||||||
providedNodeJs: NodeJsRootExtension? = null,
|
|
||||||
configuration: NodeJsExec.() -> Unit = {}
|
configuration: NodeJsExec.() -> Unit = {}
|
||||||
): TaskHolder<NodeJsExec> {
|
): TaskHolder<NodeJsExec> {
|
||||||
val target = compilation.target
|
val target = compilation.target
|
||||||
val project = target.project
|
val project = target.project
|
||||||
val nodeJs = providedNodeJs ?: NodeJsRootPlugin.apply(project).root
|
val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
|
||||||
return project.createOrRegisterTask(name) {
|
return project.createOrRegisterTask(name) {
|
||||||
it.nodeJs = nodeJs
|
it.nodeJs = nodeJs
|
||||||
|
|||||||
+1
-13
@@ -9,23 +9,11 @@ import org.gradle.api.Project
|
|||||||
import org.jetbrains.kotlin.gradle.targets.js.NpmVersions
|
import org.jetbrains.kotlin.gradle.targets.js.NpmVersions
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
|
import org.jetbrains.kotlin.gradle.targets.js.npm.PackageJson
|
||||||
|
|
||||||
open class NodeJsExtension(val project: Project, root: NodeJsRootExtension?) {
|
open class NodeJsExtension(val project: Project) {
|
||||||
@Suppress("LeakingThis")
|
|
||||||
val root: NodeJsRootExtension = root ?: this as NodeJsRootExtension
|
|
||||||
|
|
||||||
internal val packageJsonHandlers = mutableListOf<PackageJson.() -> Unit>()
|
internal val packageJsonHandlers = mutableListOf<PackageJson.() -> Unit>()
|
||||||
|
|
||||||
val versions = NpmVersions()
|
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
fun packageJson(handler: PackageJson.() -> Unit) {
|
fun packageJson(handler: PackageJson.() -> Unit) {
|
||||||
packageJsonHandlers.add(handler)
|
packageJsonHandlers.add(handler)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val Project.nodeJs: NodeJsExtension
|
|
||||||
get() {
|
|
||||||
val project = this
|
|
||||||
project.plugins.apply(NodeJsPlugin::class.java)
|
|
||||||
return project.extensions.getByName(NodeJsRootExtension.EXTENSION_NAME) as NodeJsExtension
|
|
||||||
}
|
|
||||||
+9
-2
@@ -10,12 +10,19 @@ import org.gradle.api.Project
|
|||||||
|
|
||||||
class NodeJsPlugin : Plugin<Project> {
|
class NodeJsPlugin : Plugin<Project> {
|
||||||
override fun apply(target: Project) {
|
override fun apply(target: Project) {
|
||||||
val root = NodeJsRootPlugin.apply(target.rootProject) as NodeJsRootExtension
|
val root = NodeJsRootPlugin.apply(target.rootProject)
|
||||||
|
|
||||||
if (target != target.rootProject) {
|
if (target != target.rootProject) {
|
||||||
target.extensions.create(NodeJsRootExtension.EXTENSION_NAME, NodeJsExtension::class.java, target, root)
|
target.extensions.create(NodeJsRootExtension.EXTENSION_NAME, NodeJsExtension::class.java, target)
|
||||||
}
|
}
|
||||||
|
|
||||||
root.requireResolver().addProject(target)
|
root.requireResolver().addProject(target)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
fun apply(project: Project): NodeJsExtension {
|
||||||
|
project.plugins.apply(NodeJsPlugin::class.java)
|
||||||
|
return project.extensions.getByName(NodeJsRootExtension.EXTENSION_NAME) as NodeJsExtension
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
+4
-1
@@ -3,6 +3,7 @@ package org.jetbrains.kotlin.gradle.targets.js.nodejs
|
|||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
|
import org.jetbrains.kotlin.gradle.logging.kotlinInfo
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.NpmVersions
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi
|
import org.jetbrains.kotlin.gradle.targets.js.npm.NpmApi
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
|
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution
|
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinRootNpmResolution
|
||||||
@@ -12,7 +13,7 @@ import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinNpmInstallTask
|
|||||||
import org.jetbrains.kotlin.gradle.targets.js.yarn.Yarn
|
import org.jetbrains.kotlin.gradle.targets.js.yarn.Yarn
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
open class NodeJsRootExtension(project: Project) : NodeJsExtension(project, null) {
|
open class NodeJsRootExtension(project: Project) : NodeJsExtension(project) {
|
||||||
init {
|
init {
|
||||||
check(project.rootProject == project)
|
check(project.rootProject == project)
|
||||||
}
|
}
|
||||||
@@ -84,6 +85,8 @@ open class NodeJsRootExtension(project: Project) : NodeJsExtension(project, null
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val versions = NpmVersions()
|
||||||
|
|
||||||
internal val resolutionState: ResolutionState
|
internal val resolutionState: ResolutionState
|
||||||
get() = _resolutionState
|
get() = _resolutionState
|
||||||
|
|
||||||
|
|||||||
+4
-4
@@ -15,7 +15,7 @@ open class NodeJsRootPlugin : Plugin<Project> {
|
|||||||
"NodeJsRootPlugin can be applied only to root project"
|
"NodeJsRootPlugin can be applied only to root project"
|
||||||
}
|
}
|
||||||
|
|
||||||
val root = this.extensions.create(EXTENSION_NAME, NodeJsRootExtension::class.java, this)
|
this.extensions.create(EXTENSION_NAME, NodeJsRootExtension::class.java, this)
|
||||||
|
|
||||||
val setupTask = tasks.create(NodeJsSetupTask.NAME, NodeJsSetupTask::class.java) {
|
val setupTask = tasks.create(NodeJsSetupTask.NAME, NodeJsSetupTask::class.java) {
|
||||||
it.group = TASKS_GROUP_NAME
|
it.group = TASKS_GROUP_NAME
|
||||||
@@ -32,10 +32,10 @@ open class NodeJsRootPlugin : Plugin<Project> {
|
|||||||
companion object {
|
companion object {
|
||||||
const val TASKS_GROUP_NAME: String = "nodeJs"
|
const val TASKS_GROUP_NAME: String = "nodeJs"
|
||||||
|
|
||||||
fun apply(project: Project): NodeJsExtension {
|
fun apply(rootProject: Project): NodeJsRootExtension {
|
||||||
val rootProject = project.rootProject
|
check(rootProject == rootProject.rootProject)
|
||||||
rootProject.plugins.apply(NodeJsRootPlugin::class.java)
|
rootProject.plugins.apply(NodeJsRootPlugin::class.java)
|
||||||
return rootProject.extensions.getByName(EXTENSION_NAME) as NodeJsExtension
|
return rootProject.extensions.getByName(EXTENSION_NAME) as NodeJsRootExtension
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -11,7 +11,7 @@ import java.io.File
|
|||||||
import java.net.URI
|
import java.net.URI
|
||||||
|
|
||||||
open class NodeJsSetupTask : DefaultTask() {
|
open class NodeJsSetupTask : DefaultTask() {
|
||||||
private val settings get() = project.nodeJs.root
|
private val settings get() = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
private val env by lazy { settings.environment }
|
private val env by lazy { settings.environment }
|
||||||
|
|
||||||
val ivyDependency: String
|
val ivyDependency: String
|
||||||
|
|||||||
+1
-1
@@ -21,7 +21,7 @@ internal class GradleNodeModulesCache(val nodeJs: NodeJsRootExtension) : AutoClo
|
|||||||
}
|
}
|
||||||
|
|
||||||
val project: Project get() = nodeJs.project
|
val project: Project get() = nodeJs.project
|
||||||
internal val dir = nodeJs.root.nodeModulesGradleCacheDir
|
internal val dir = nodeJs.nodeModulesGradleCacheDir
|
||||||
private val cache = ProcessedFilesCache(project, dir, STATE_FILE_NAME, "9")
|
private val cache = ProcessedFilesCache(project, dir, STATE_FILE_NAME, "9")
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
|
|||||||
+3
-4
@@ -16,10 +16,9 @@ import org.gradle.api.internal.artifacts.dependencies.SelfResolvingDependencyInt
|
|||||||
import org.gradle.api.tasks.TaskDependency
|
import org.gradle.api.tasks.TaskDependency
|
||||||
import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier
|
import org.gradle.internal.component.local.model.DefaultLibraryBinaryIdentifier
|
||||||
import org.jetbrains.kotlin.gradle.internal.isInIdeaSync
|
import org.jetbrains.kotlin.gradle.internal.isInIdeaSync
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
|
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinRootNpmResolver
|
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinProjectNpmResolution
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
data class NpmDependency(
|
data class NpmDependency(
|
||||||
@@ -85,7 +84,7 @@ data class NpmDependency(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun resolveProject(): KotlinCompilationNpmResolution? {
|
private fun resolveProject(): KotlinCompilationNpmResolution? {
|
||||||
val nodeJs = project.nodeJs.root
|
val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
|
||||||
val resolvedProject =
|
val resolvedProject =
|
||||||
if (isInIdeaSync) nodeJs.resolveIfNeeded(project)
|
if (isInIdeaSync) nodeJs.resolveIfNeeded(project)
|
||||||
|
|||||||
+2
-2
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinCompilation
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName
|
import org.jetbrains.kotlin.gradle.plugin.mpp.disambiguateName
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask
|
import org.jetbrains.kotlin.gradle.targets.js.npm.tasks.KotlinPackageJsonTask
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ open class NpmProject(val compilation: KotlinJsCompilation) {
|
|||||||
get() = buildNpmProjectName()
|
get() = buildNpmProjectName()
|
||||||
|
|
||||||
val nodeJs
|
val nodeJs
|
||||||
get() = project.nodeJs.root
|
get() = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
|
||||||
val dir: File
|
val dir: File
|
||||||
get() = nodeJs.projectPackagesDir.resolve(name)
|
get() = nodeJs.projectPackagesDir.resolve(name)
|
||||||
|
|||||||
-1
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.gradle.targets.js.npm
|
|||||||
import com.google.gson.stream.JsonWriter
|
import com.google.gson.stream.JsonWriter
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootExtension
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
|
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
|
||||||
import java.io.ByteArrayInputStream
|
import java.io.ByteArrayInputStream
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|||||||
+6
-5
@@ -9,9 +9,8 @@ import org.gradle.api.DefaultTask
|
|||||||
import org.gradle.api.tasks.InputFiles
|
import org.gradle.api.tasks.InputFiles
|
||||||
import org.gradle.api.tasks.OutputFile
|
import org.gradle.api.tasks.OutputFile
|
||||||
import org.gradle.api.tasks.TaskAction
|
import org.gradle.api.tasks.TaskAction
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinRootNpmResolver
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
open class KotlinNpmInstallTask : DefaultTask() {
|
open class KotlinNpmInstallTask : DefaultTask() {
|
||||||
@@ -19,18 +18,20 @@ open class KotlinNpmInstallTask : DefaultTask() {
|
|||||||
check(project == project.rootProject)
|
check(project == project.rootProject)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private val nodeJs get() = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
|
||||||
@Suppress("unused")
|
@Suppress("unused")
|
||||||
@get:InputFiles
|
@get:InputFiles
|
||||||
val packageJsonFiles: Collection<File>
|
val packageJsonFiles: Collection<File>
|
||||||
get() = project.nodeJs.root.resolutionState.compilations.map { it.npmProject.packageJsonFile }
|
get() = nodeJs.resolutionState.compilations.map { it.npmProject.packageJsonFile }
|
||||||
|
|
||||||
@get:OutputFile
|
@get:OutputFile
|
||||||
val yarnLock: File
|
val yarnLock: File
|
||||||
get() = project.nodeJs.root.rootPackageDir.resolve("yarn.lock")
|
get() = nodeJs.rootPackageDir.resolve("yarn.lock")
|
||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
fun resolve() {
|
fun resolve() {
|
||||||
project.nodeJs.root.resolveIfNeeded(project)
|
nodeJs.resolveIfNeeded(project)
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
+2
-3
@@ -15,7 +15,6 @@ import org.jetbrains.kotlin.gradle.plugin.TaskHolder
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
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.NodeJsRootExtension
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
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.npm.npmProject
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver
|
import org.jetbrains.kotlin.gradle.targets.js.npm.resolver.KotlinCompilationNpmResolver
|
||||||
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
|
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
|
||||||
@@ -41,7 +40,7 @@ open class KotlinPackageJsonTask : DefaultTask() {
|
|||||||
val target = compilation.target
|
val target = compilation.target
|
||||||
val project = target.project
|
val project = target.project
|
||||||
val npmProject = compilation.npmProject
|
val npmProject = compilation.npmProject
|
||||||
val nodeJs = project.nodeJs.root
|
val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
|
||||||
val rootClean = project.rootProject.tasks.getByName(BasePlugin.CLEAN_TASK_NAME)
|
val rootClean = project.rootProject.tasks.getByName(BasePlugin.CLEAN_TASK_NAME)
|
||||||
val npmInstallTask = nodeJs.npmInstallTask
|
val npmInstallTask = nodeJs.npmInstallTask
|
||||||
@@ -53,7 +52,7 @@ open class KotlinPackageJsonTask : DefaultTask() {
|
|||||||
task.group = NodeJsRootPlugin.TASKS_GROUP_NAME
|
task.group = NodeJsRootPlugin.TASKS_GROUP_NAME
|
||||||
|
|
||||||
@Suppress("UnstableApiUsage")
|
@Suppress("UnstableApiUsage")
|
||||||
task.dependsOn(target.project.provider{ task.findDependentTasks() })
|
task.dependsOn(target.project.provider { task.findDependentTasks() })
|
||||||
task.mustRunAfter(rootClean)
|
task.mustRunAfter(rootClean)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+4
-3
@@ -9,7 +9,7 @@ import org.gradle.language.base.plugins.LifecycleBasePlugin
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsBrowserDsl
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
|
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.KotlinWebpack
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfigWriter
|
import org.jetbrains.kotlin.gradle.targets.js.webpack.KotlinWebpackConfigWriter
|
||||||
@@ -40,11 +40,12 @@ class KotlinBrowserJs(target: KotlinJsTarget) :
|
|||||||
|
|
||||||
override fun configureRun(compilation: KotlinJsCompilation) {
|
override fun configureRun(compilation: KotlinJsCompilation) {
|
||||||
val project = compilation.target.project
|
val project = compilation.target.project
|
||||||
|
val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
|
||||||
project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("webpack")) {
|
project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("webpack")) {
|
||||||
val compileKotlinTask = compilation.compileKotlinTask
|
val compileKotlinTask = compilation.compileKotlinTask
|
||||||
it.dependsOn(
|
it.dependsOn(
|
||||||
target.project.nodeJs.root.npmInstallTask,
|
nodeJs.npmInstallTask,
|
||||||
compileKotlinTask
|
compileKotlinTask
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -57,7 +58,7 @@ class KotlinBrowserJs(target: KotlinJsTarget) :
|
|||||||
val run = project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("run")) {
|
val run = project.createOrRegisterTask<KotlinWebpack>(disambiguateCamelCased("run")) {
|
||||||
val compileKotlinTask = compilation.compileKotlinTask
|
val compileKotlinTask = compilation.compileKotlinTask
|
||||||
it.dependsOn(
|
it.dependsOn(
|
||||||
target.project.nodeJs.root.npmInstallTask,
|
nodeJs.npmInstallTask,
|
||||||
compileKotlinTask,
|
compileKotlinTask,
|
||||||
target.project.tasks.getByName(compilation.processResourcesTaskName)
|
target.project.tasks.getByName(compilation.processResourcesTaskName)
|
||||||
)
|
)
|
||||||
|
|||||||
+4
-6
@@ -11,8 +11,8 @@ import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
|
import org.jetbrains.kotlin.gradle.plugin.whenEvaluated
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetDsl
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsSubTargetDsl
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
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.npm.npmProject
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
|
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTest
|
||||||
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
|
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
|
||||||
@@ -25,12 +25,13 @@ abstract class KotlinJsSubTarget(
|
|||||||
private val disambiguationClassifier: String
|
private val disambiguationClassifier: String
|
||||||
) : KotlinJsSubTargetDsl {
|
) : KotlinJsSubTargetDsl {
|
||||||
val project get() = target.project
|
val project get() = target.project
|
||||||
|
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
|
||||||
val runTaskName = disambiguateCamelCased("run")
|
val runTaskName = disambiguateCamelCased("run")
|
||||||
val testTaskName = disambiguateCamelCased("test")
|
val testTaskName = disambiguateCamelCased("test")
|
||||||
|
|
||||||
fun configure() {
|
fun configure() {
|
||||||
project.nodeJs
|
NodeJsPlugin.apply(project)
|
||||||
|
|
||||||
configureTests()
|
configureTests()
|
||||||
configureRun()
|
configureRun()
|
||||||
@@ -67,16 +68,13 @@ abstract class KotlinJsSubTarget(
|
|||||||
abstract val testTaskDescription: String
|
abstract val testTaskDescription: String
|
||||||
|
|
||||||
private fun configureTests(compilation: KotlinJsCompilation) {
|
private fun configureTests(compilation: KotlinJsCompilation) {
|
||||||
// apply plugin (cannot be done at task instantiation time)
|
|
||||||
val nodeJs = NodeJsRootPlugin.apply(target.project).root
|
|
||||||
|
|
||||||
val testJs = project.createOrRegisterTask<KotlinJsTest>(testTaskName) { testJs ->
|
val testJs = project.createOrRegisterTask<KotlinJsTest>(testTaskName) { testJs ->
|
||||||
val compileTask = compilation.compileKotlinTask
|
val compileTask = compilation.compileKotlinTask
|
||||||
|
|
||||||
testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP
|
testJs.group = LifecycleBasePlugin.VERIFICATION_GROUP
|
||||||
testJs.description = testTaskDescription
|
testJs.description = testTaskDescription
|
||||||
|
|
||||||
testJs.dependsOn(target.project.nodeJs.root.npmInstallTask, compileTask, nodeJs.nodeJsSetupTask)
|
testJs.dependsOn(nodeJs.npmInstallTask, compileTask, nodeJs.nodeJsSetupTask)
|
||||||
|
|
||||||
testJs.onlyIf {
|
testJs.onlyIf {
|
||||||
compileTask.outputFile.exists()
|
compileTask.outputFile.exists()
|
||||||
|
|||||||
-4
@@ -5,15 +5,11 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.gradle.targets.js.subtargets
|
package org.jetbrains.kotlin.gradle.targets.js.subtargets
|
||||||
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.TaskHolder
|
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
import org.jetbrains.kotlin.gradle.targets.js.KotlinJsTarget
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl
|
import org.jetbrains.kotlin.gradle.targets.js.dsl.KotlinJsNodeDsl
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsExec
|
||||||
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.testing.KotlinJsTest
|
||||||
import org.jetbrains.kotlin.gradle.tasks.createOrRegisterTask
|
|
||||||
|
|
||||||
class KotlinNodeJs(target: KotlinJsTarget) :
|
class KotlinNodeJs(target: KotlinJsTarget) :
|
||||||
KotlinJsSubTarget(target, "node"),
|
KotlinJsSubTarget(target, "node"),
|
||||||
|
|||||||
+4
-3
@@ -14,7 +14,6 @@ import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecuti
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
|
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
|
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.testing.karma.KotlinKarma
|
import org.jetbrains.kotlin.gradle.targets.js.testing.karma.KotlinKarma
|
||||||
@@ -23,6 +22,8 @@ import org.jetbrains.kotlin.gradle.targets.js.testing.nodejs.KotlinNodeJsTestRun
|
|||||||
import org.jetbrains.kotlin.gradle.tasks.KotlinTest
|
import org.jetbrains.kotlin.gradle.tasks.KotlinTest
|
||||||
|
|
||||||
open class KotlinJsTest : KotlinTest(), RequiresNpmDependencies {
|
open class KotlinJsTest : KotlinTest(), RequiresNpmDependencies {
|
||||||
|
private val nodeJs get() = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
|
||||||
@get:Internal
|
@get:Internal
|
||||||
internal var testFramework: KotlinJsTestFramework? = null
|
internal var testFramework: KotlinJsTestFramework? = null
|
||||||
|
|
||||||
@@ -92,14 +93,14 @@ open class KotlinJsTest : KotlinTest(), RequiresNpmDependencies {
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun executeTests() {
|
override fun executeTests() {
|
||||||
project.nodeJs.root.checkRequiredDependencies(project, this)
|
nodeJs.checkRequiredDependencies(project, this)
|
||||||
super.executeTests()
|
super.executeTests()
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun createTestExecutionSpec(): TCServiceMessagesTestExecutionSpec {
|
override fun createTestExecutionSpec(): TCServiceMessagesTestExecutionSpec {
|
||||||
val forkOptions = DefaultProcessForkOptions(fileResolver)
|
val forkOptions = DefaultProcessForkOptions(fileResolver)
|
||||||
forkOptions.workingDir = compilation.npmProject.dir
|
forkOptions.workingDir = compilation.npmProject.dir
|
||||||
forkOptions.executable = NodeJsRootPlugin.apply(project).root.environment.nodeExecutable
|
forkOptions.executable = nodeJs.environment.nodeExecutable
|
||||||
|
|
||||||
val nodeJsArgs = mutableListOf<String>()
|
val nodeJsArgs = mutableListOf<String>()
|
||||||
|
|
||||||
|
|||||||
+5
-5
@@ -18,9 +18,9 @@ import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecuti
|
|||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.appendConfigsFromDir
|
import org.jetbrains.kotlin.gradle.targets.js.appendConfigsFromDir
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
|
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion
|
import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
|
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
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.KotlinJsTest
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
|
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
|
||||||
@@ -31,13 +31,13 @@ import org.slf4j.Logger
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestFramework {
|
class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestFramework {
|
||||||
val project: Project
|
private val project: Project = compilation.target.project
|
||||||
get() = compilation.target.project
|
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
private val versions = nodeJs.versions
|
||||||
|
|
||||||
private val config: KarmaConfig = KarmaConfig()
|
private val config: KarmaConfig = KarmaConfig()
|
||||||
private val requiredDependencies = mutableSetOf<NpmPackageVersion>()
|
private val requiredDependencies = mutableSetOf<NpmPackageVersion>()
|
||||||
|
|
||||||
private val versions = project.nodeJs.versions
|
|
||||||
private val configurators = mutableListOf<(KotlinJsTest) -> Unit>()
|
private val configurators = mutableListOf<(KotlinJsTest) -> Unit>()
|
||||||
private val confJsWriters = mutableListOf<(Appendable) -> Unit>()
|
private val confJsWriters = mutableListOf<(Appendable) -> Unit>()
|
||||||
private var sourceMaps = false
|
private var sourceMaps = false
|
||||||
@@ -119,7 +119,7 @@ class KotlinKarma(override val compilation: KotlinJsCompilation) : KotlinJsTestF
|
|||||||
sourceMaps = true,
|
sourceMaps = true,
|
||||||
export = false,
|
export = false,
|
||||||
progressReporter = true,
|
progressReporter = true,
|
||||||
progressReporterPathFilter = project.nodeJs.root.rootPackageDir.absolutePath
|
progressReporterPathFilter = nodeJs.rootPackageDir.absolutePath
|
||||||
).appendTo(it)
|
).appendTo(it)
|
||||||
|
|
||||||
it.appendln(" return config;")
|
it.appendln(" return config;")
|
||||||
|
|||||||
+4
-5
@@ -11,18 +11,17 @@ import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesClientSetti
|
|||||||
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
import org.jetbrains.kotlin.gradle.internal.testing.TCServiceMessagesTestExecutionSpec
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
|
import org.jetbrains.kotlin.gradle.targets.js.internal.parseNodeJsStackTraceAsJvm
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.KotlinGradleNpmPackage
|
import org.jetbrains.kotlin.gradle.targets.js.KotlinGradleNpmPackage
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
|
import org.jetbrains.kotlin.gradle.targets.js.RequiredKotlinJsDependency
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
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.KotlinJsTest
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
|
import org.jetbrains.kotlin.gradle.targets.js.testing.KotlinJsTestFramework
|
||||||
|
|
||||||
class KotlinMocha(override val compilation: KotlinJsCompilation) : KotlinJsTestFramework {
|
class KotlinMocha(override val compilation: KotlinJsCompilation) : KotlinJsTestFramework {
|
||||||
val project: Project
|
private val project: Project = compilation.target.project
|
||||||
get() = compilation.target.project
|
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
private val versions = nodeJs.versions
|
||||||
private val versions = project.nodeJs.versions
|
|
||||||
|
|
||||||
override val settingsState: String
|
override val settingsState: String
|
||||||
get() = "mocha"
|
get() = "mocha"
|
||||||
|
|||||||
+5
-4
@@ -15,8 +15,8 @@ import org.gradle.deployment.internal.DeploymentRegistry
|
|||||||
import org.gradle.process.internal.ExecHandle
|
import org.gradle.process.internal.ExecHandle
|
||||||
import org.gradle.process.internal.ExecHandleFactory
|
import org.gradle.process.internal.ExecHandleFactory
|
||||||
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinJsCompilation
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
|
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion
|
import org.jetbrains.kotlin.gradle.targets.js.NpmPackageVersion
|
||||||
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
|
import org.jetbrains.kotlin.gradle.targets.js.npm.RequiresNpmDependencies
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
import org.jetbrains.kotlin.gradle.targets.js.npm.npmProject
|
||||||
import org.jetbrains.kotlin.gradle.testing.internal.reportsDir
|
import org.jetbrains.kotlin.gradle.testing.internal.reportsDir
|
||||||
@@ -25,7 +25,8 @@ import java.io.File
|
|||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
|
open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
|
||||||
private val versions by lazy { project.nodeJs.versions }
|
private val nodeJs = NodeJsRootPlugin.apply(project.rootProject)
|
||||||
|
private val versions = nodeJs.versions
|
||||||
|
|
||||||
@get:Inject
|
@get:Inject
|
||||||
open val fileResolver: FileResolver
|
open val fileResolver: FileResolver
|
||||||
@@ -126,7 +127,7 @@ open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
|
|||||||
|
|
||||||
@TaskAction
|
@TaskAction
|
||||||
fun doExecute() {
|
fun doExecute() {
|
||||||
project.nodeJs.root.checkRequiredDependencies(project, this)
|
nodeJs.checkRequiredDependencies(project, this)
|
||||||
|
|
||||||
val runner = createRunner()
|
val runner = createRunner()
|
||||||
|
|
||||||
@@ -142,7 +143,7 @@ open class KotlinWebpack : DefaultTask(), RequiresNpmDependencies {
|
|||||||
runner.copy(
|
runner.copy(
|
||||||
configWriter = runner.configWriter.copy(
|
configWriter = runner.configWriter.copy(
|
||||||
progressReporter = true,
|
progressReporter = true,
|
||||||
progressReporterPathFilter = project.nodeJs.root.rootPackageDir.absolutePath
|
progressReporterPathFilter = nodeJs.rootPackageDir.absolutePath
|
||||||
)
|
)
|
||||||
).execute()
|
).execute()
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -23,7 +23,8 @@ abstract class YarnBasics : NpmApi {
|
|||||||
description: String,
|
description: String,
|
||||||
vararg args: String
|
vararg args: String
|
||||||
) {
|
) {
|
||||||
val nodeJsEnv = NodeJsRootPlugin.apply(project).root.environment
|
val nodeJs = NodeJsRootPlugin.apply(project)
|
||||||
|
val nodeJsEnv = nodeJs.environment
|
||||||
val yarnEnv = YarnPlugin.apply(project).environment
|
val yarnEnv = YarnPlugin.apply(project).environment
|
||||||
|
|
||||||
project.execWithProgress(description) { exec ->
|
project.execWithProgress(description) { exec ->
|
||||||
|
|||||||
+1
-1
@@ -15,7 +15,7 @@ open class YarnPlugin : Plugin<Project> {
|
|||||||
"YarnPlugin can be applied only to root project"
|
"YarnPlugin can be applied only to root project"
|
||||||
}
|
}
|
||||||
|
|
||||||
val nodeJs = NodeJsRootPlugin.apply(this).root
|
val nodeJs = NodeJsRootPlugin.apply(this)
|
||||||
|
|
||||||
this.extensions.create(YarnRootExtension.YARN, YarnRootExtension::class.java, this)
|
this.extensions.create(YarnRootExtension.YARN, YarnRootExtension::class.java, this)
|
||||||
tasks.create(YarnSetupTask.NAME, YarnSetupTask::class.java) {
|
tasks.create(YarnSetupTask.NAME, YarnSetupTask::class.java) {
|
||||||
|
|||||||
+5
-1
@@ -10,6 +10,10 @@ import org.jetbrains.kotlin.gradle.logging.kotlinInfo
|
|||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
|
|
||||||
open class YarnRootExtension(val project: Project) {
|
open class YarnRootExtension(val project: Project) {
|
||||||
|
init {
|
||||||
|
check(project == project.rootProject)
|
||||||
|
}
|
||||||
|
|
||||||
private val gradleHome = project.gradle.gradleUserHomeDir.also {
|
private val gradleHome = project.gradle.gradleUserHomeDir.also {
|
||||||
project.logger.kotlinInfo("Storing cached files in $it")
|
project.logger.kotlinInfo("Storing cached files in $it")
|
||||||
}
|
}
|
||||||
@@ -28,7 +32,7 @@ open class YarnRootExtension(val project: Project) {
|
|||||||
get() = !disableWorkspaces
|
get() = !disableWorkspaces
|
||||||
|
|
||||||
internal fun executeSetup() {
|
internal fun executeSetup() {
|
||||||
NodeJsRootPlugin.apply(project).root.executeSetup()
|
NodeJsRootPlugin.apply(project).executeSetup()
|
||||||
|
|
||||||
val env = environment
|
val env = environment
|
||||||
if (!env.home.isDirectory) {
|
if (!env.home.isDirectory) {
|
||||||
|
|||||||
+4
-3
@@ -6,7 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.gradle.targets.js.yarn
|
package org.jetbrains.kotlin.gradle.targets.js.yarn
|
||||||
|
|
||||||
import org.gradle.api.Project
|
import org.gradle.api.Project
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.nodejs.nodeJs
|
import org.jetbrains.kotlin.gradle.targets.js.nodejs.NodeJsRootPlugin
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.*
|
import org.jetbrains.kotlin.gradle.targets.js.npm.*
|
||||||
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
|
import org.jetbrains.kotlin.gradle.targets.js.npm.resolved.KotlinCompilationNpmResolution
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -30,7 +30,7 @@ object YarnWorkspaces : YarnBasics() {
|
|||||||
|
|
||||||
if (upToDateChecks.all { it.upToDate }) return
|
if (upToDateChecks.all { it.upToDate }) return
|
||||||
|
|
||||||
val nodeJsWorldDir = rootProject.nodeJs.root.rootPackageDir
|
val nodeJsWorldDir = NodeJsRootPlugin.apply(rootProject).rootPackageDir
|
||||||
|
|
||||||
saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, nodeJsWorldDir)
|
saveRootProjectWorkspacesPackageJson(rootProject, npmProjects, nodeJsWorldDir)
|
||||||
|
|
||||||
@@ -55,7 +55,8 @@ object YarnWorkspaces : YarnBasics() {
|
|||||||
|
|
||||||
rootPackageJson.workspaces = npmProjectWorkspaces + importedProjectWorkspaces
|
rootPackageJson.workspaces = npmProjectWorkspaces + importedProjectWorkspaces
|
||||||
|
|
||||||
rootProject.nodeJs.packageJsonHandlers.forEach {
|
val nodeJs = NodeJsRootPlugin.apply(rootProject)
|
||||||
|
nodeJs.packageJsonHandlers.forEach {
|
||||||
it(rootPackageJson)
|
it(rootPackageJson)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user