[Gradle, JS] Add NodeJs template project

^KT-40527 fixed
This commit is contained in:
Ilya Goncharov
2020-07-20 20:21:14 +03:00
parent 4de31da0f3
commit 6866fdc3e1
6 changed files with 131 additions and 8 deletions
@@ -87,6 +87,7 @@ private val ProjectTemplate.icon: Icon
FrontendApplicationProjectTemplate -> KotlinIcons.Wizard.JS
MultiplatformMobileApplicationProjectTemplate -> KotlinIcons.Wizard.MULTIPLATFORM_MOBILE
MultiplatformMobileLibraryProjectTemplate -> KotlinIcons.Wizard.MULTIPLATFORM_MOBILE_LIBRARY
NodeJsApplicationProjectTemplate -> KotlinIcons.Wizard.NODE_JS
}
class TemplateDescriptionComponent : Component() {
@@ -125,6 +125,9 @@ project.template.native.console.description=Application with Kotlin/Native that
project.template.frontend.title=Frontend Application
project.template.frontend.description=Frontend application with Kotlin/JS if you already have a backend.
project.template.nodejs.title=Node.JS Application
project.template.nodejs.description=A blank application targeting Node.js
project.template.mpp.mobile.title=Mobile Application
project.template.mpp.mobile.description=Mobile applications for iOS and Android with Kotlin Multiplatform Mobile, which supports sharing common code between platforms.
@@ -154,5 +157,7 @@ module.template.js.simple.setting.rendering.kotlinx.html=Use statically-typed Ko
module.template.js.simple.setting.rendering.react=Use Kotlin-wrapped React library
module.template.js.simple.setting.rendering.react.styled=Use Kotlin-wrapped React framework with Styled Components
module.template.simple.nodejs.title=Node.JS Application
module.template.simple.nodejs.description=A blank application targeting Node.js
module.template.simple.nodejs.use.kotlinx.nodejs=Use experimental Node.js API (kotlinx-nodejs)
@@ -21,6 +21,7 @@ object Versions {
object KOTLINX {
val KOTLINX_HTML: (kotlinVersion: Version) -> Version = { kotlinVersion -> version("0.7.1-$kotlinVersion") }
val KOTLINX_NODEJS: Version = version("0.0.3")
}
object JS_WRAPPERS {
@@ -84,12 +84,18 @@ interface JSConfigurator : ModuleConfiguratorWithModuleType, ModuleConfiguratorW
}
}
open class JsSinglePlatformModuleConfigurator : JSConfigurator, ModuleConfiguratorWithTests, SinglePlatformModuleConfigurator,
enum class JsTarget {
BROWSER,
NODE;
}
open class JsSinglePlatformModuleConfigurator(
private val jsTarget: JsTarget
) : JSConfigurator, ModuleConfiguratorWithTests, SinglePlatformModuleConfigurator,
ModuleConfiguratorWithSettings {
override fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> =
super<ModuleConfiguratorWithTests>.getConfiguratorSettings() +
super<JSConfigurator>.getConfiguratorSettings() +
JSConfigurator.cssSupport
super<JSConfigurator>.getConfiguratorSettings()
override val moduleKind = ModuleKind.singleplatformJs
@@ -117,13 +123,27 @@ open class JsSinglePlatformModuleConfigurator : JSConfigurator, ModuleConfigurat
): List<BuildSystemIR> = irsList {
"kotlin" {
"js" {
browserSubTarget(module, reader)
when (jsTarget) {
JsTarget.BROWSER -> browserSubTarget(module, reader)
JsTarget.NODE -> nodejsSubTarget(module, reader)
}
}
}
}
}
object BrowserJsSinglePlatformModuleConfigurator : JsSinglePlatformModuleConfigurator()
object BrowserJsSinglePlatformModuleConfigurator : JsSinglePlatformModuleConfigurator(
JsTarget.BROWSER
) {
override fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> {
return super.getConfiguratorSettings() +
JSConfigurator.cssSupport
}
}
object NodeJsSinglePlatformModuleConfigurator : JsSinglePlatformModuleConfigurator(
JsTarget.NODE
)
fun GradleIRListBuilder.applicationSupport() {
+"binaries.executable()"
@@ -77,7 +77,8 @@ sealed class ProjectTemplate : DisplayableSettingItem {
MultiplatformLibraryProjectTemplate,
NativeApplicationProjectTemplate,
FrontendApplicationProjectTemplate,
FullStackWebApplicationProjectTemplate
FullStackWebApplicationProjectTemplate,
NodeJsApplicationProjectTemplate
)
fun byId(id: String): ProjectTemplate? = ALL.firstOrNull {
@@ -290,7 +291,7 @@ object FrontendApplicationProjectTemplate : ProjectTemplate() {
KotlinPlugin::modules withValue listOf(
Module(
"frontend",
JsSingleplatformModuleConfigurator,
BrowserJsSinglePlatformModuleConfigurator,
template = SimpleJsClientTemplate(),
sourcesets = SourcesetType.ALL.map { type ->
Sourceset(type, dependencies = emptyList())
@@ -393,4 +394,29 @@ object MultiplatformMobileLibraryProjectTemplate : ProjectTemplate() {
)
)
)
}
object NodeJsApplicationProjectTemplate : ProjectTemplate() {
override val title = KotlinNewProjectWizardBundle.message("project.template.nodejs.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.nodejs.description")
override val id = "nodejsApplication"
@NonNls
override val suggestedProjectName = "myKotlinJsApplication"
override val projectKind = ProjectKind.Js
override val setsPluginSettings: List<SettingWithValue<*, *>>
get() = listOf(
KotlinPlugin::modules withValue listOf(
Module(
"nodejsApp",
NodeJsSinglePlatformModuleConfigurator,
template = SimpleNodeJsTemplate(),
sourcesets = SourcesetType.ALL.map { type ->
Sourceset(type, dependencies = emptyList())
},
subModules = emptyList()
)
)
)
}
@@ -0,0 +1,70 @@
/*
* Copyright 2010-2020 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.tools.projectWizard.templates
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.core.Reader
import org.jetbrains.kotlin.tools.projectWizard.core.Writer
import org.jetbrains.kotlin.tools.projectWizard.core.buildList
import org.jetbrains.kotlin.tools.projectWizard.core.entity.settings.TemplateSetting
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ArtifactBasedLibraryDependencyIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyIR
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.DependencyType
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.ModuleIR
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.JsNodeTargetConfigurator
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.NodeJsSinglePlatformModuleConfigurator
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.DefaultRepository.Companion.JCENTER
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.Module
class SimpleNodeJsTemplate : Template() {
override val title: String = KotlinNewProjectWizardBundle.message("module.template.simple.nodejs.title")
override val description: String = KotlinNewProjectWizardBundle.message("module.template.simple.nodejs.description")
override val moduleTypes: Set<ModuleType> = setOf(ModuleType.js)
@NonNls
override val id: String = "simpleNodeJs"
override fun isApplicableTo(
reader: Reader,
module: Module
): Boolean = when (module.configurator) {
JsNodeTargetConfigurator, NodeJsSinglePlatformModuleConfigurator -> true
else -> false
}
val useKotlinxNodejs by booleanSetting(
KotlinNewProjectWizardBundle.message("module.template.simple.nodejs.use.kotlinx.nodejs"),
GenerationPhase.PROJECT_GENERATION
) {
defaultValue = value(false)
}
override val settings: List<TemplateSetting<*, *>> = listOf(useKotlinxNodejs)
override fun Writer.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = withSettingsOf(module.originalModule) {
buildList {
if (this@SimpleNodeJsTemplate.useKotlinxNodejs.reference.settingValue()) {
+ArtifactBasedLibraryDependencyIR(
MavenArtifact(
JCENTER,
"org.jetbrains.kotlinx",
"kotlinx-nodejs"
),
Versions.KOTLINX.KOTLINX_NODEJS,
DependencyType.MAIN
)
}
}
}
}