[Gradle, JS] Add NodeJs template project
^KT-40527 fixed
This commit is contained in:
+1
@@ -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() {
|
||||
|
||||
+6
-1
@@ -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)
|
||||
|
||||
|
||||
+1
@@ -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 {
|
||||
|
||||
+25
-5
@@ -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()"
|
||||
|
||||
+28
-2
@@ -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()
|
||||
)
|
||||
)
|
||||
)
|
||||
}
|
||||
+70
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user