[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
|
FrontendApplicationProjectTemplate -> KotlinIcons.Wizard.JS
|
||||||
MultiplatformMobileApplicationProjectTemplate -> KotlinIcons.Wizard.MULTIPLATFORM_MOBILE
|
MultiplatformMobileApplicationProjectTemplate -> KotlinIcons.Wizard.MULTIPLATFORM_MOBILE
|
||||||
MultiplatformMobileLibraryProjectTemplate -> KotlinIcons.Wizard.MULTIPLATFORM_MOBILE_LIBRARY
|
MultiplatformMobileLibraryProjectTemplate -> KotlinIcons.Wizard.MULTIPLATFORM_MOBILE_LIBRARY
|
||||||
|
NodeJsApplicationProjectTemplate -> KotlinIcons.Wizard.NODE_JS
|
||||||
}
|
}
|
||||||
|
|
||||||
class TemplateDescriptionComponent : Component() {
|
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.title=Frontend Application
|
||||||
project.template.frontend.description=Frontend application with Kotlin/JS if you already have a backend.
|
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.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.
|
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=Use Kotlin-wrapped React library
|
||||||
module.template.js.simple.setting.rendering.react.styled=Use Kotlin-wrapped React framework with Styled Components
|
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 {
|
object KOTLINX {
|
||||||
val KOTLINX_HTML: (kotlinVersion: Version) -> Version = { kotlinVersion -> version("0.7.1-$kotlinVersion") }
|
val KOTLINX_HTML: (kotlinVersion: Version) -> Version = { kotlinVersion -> version("0.7.1-$kotlinVersion") }
|
||||||
|
val KOTLINX_NODEJS: Version = version("0.0.3")
|
||||||
}
|
}
|
||||||
|
|
||||||
object JS_WRAPPERS {
|
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 {
|
ModuleConfiguratorWithSettings {
|
||||||
override fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> =
|
override fun getConfiguratorSettings(): List<ModuleConfiguratorSetting<*, *>> =
|
||||||
super<ModuleConfiguratorWithTests>.getConfiguratorSettings() +
|
super<ModuleConfiguratorWithTests>.getConfiguratorSettings() +
|
||||||
super<JSConfigurator>.getConfiguratorSettings() +
|
super<JSConfigurator>.getConfiguratorSettings()
|
||||||
JSConfigurator.cssSupport
|
|
||||||
|
|
||||||
override val moduleKind = ModuleKind.singleplatformJs
|
override val moduleKind = ModuleKind.singleplatformJs
|
||||||
|
|
||||||
@@ -117,13 +123,27 @@ open class JsSinglePlatformModuleConfigurator : JSConfigurator, ModuleConfigurat
|
|||||||
): List<BuildSystemIR> = irsList {
|
): List<BuildSystemIR> = irsList {
|
||||||
"kotlin" {
|
"kotlin" {
|
||||||
"js" {
|
"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() {
|
fun GradleIRListBuilder.applicationSupport() {
|
||||||
+"binaries.executable()"
|
+"binaries.executable()"
|
||||||
|
|||||||
+28
-2
@@ -77,7 +77,8 @@ sealed class ProjectTemplate : DisplayableSettingItem {
|
|||||||
MultiplatformLibraryProjectTemplate,
|
MultiplatformLibraryProjectTemplate,
|
||||||
NativeApplicationProjectTemplate,
|
NativeApplicationProjectTemplate,
|
||||||
FrontendApplicationProjectTemplate,
|
FrontendApplicationProjectTemplate,
|
||||||
FullStackWebApplicationProjectTemplate
|
FullStackWebApplicationProjectTemplate,
|
||||||
|
NodeJsApplicationProjectTemplate
|
||||||
)
|
)
|
||||||
|
|
||||||
fun byId(id: String): ProjectTemplate? = ALL.firstOrNull {
|
fun byId(id: String): ProjectTemplate? = ALL.firstOrNull {
|
||||||
@@ -290,7 +291,7 @@ object FrontendApplicationProjectTemplate : ProjectTemplate() {
|
|||||||
KotlinPlugin::modules withValue listOf(
|
KotlinPlugin::modules withValue listOf(
|
||||||
Module(
|
Module(
|
||||||
"frontend",
|
"frontend",
|
||||||
JsSingleplatformModuleConfigurator,
|
BrowserJsSinglePlatformModuleConfigurator,
|
||||||
template = SimpleJsClientTemplate(),
|
template = SimpleJsClientTemplate(),
|
||||||
sourcesets = SourcesetType.ALL.map { type ->
|
sourcesets = SourcesetType.ALL.map { type ->
|
||||||
Sourceset(type, dependencies = emptyList())
|
Sourceset(type, dependencies = emptyList())
|
||||||
@@ -394,3 +395,28 @@ 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