From 6866fdc3e1bcb8a351b654eae67cef899e71c1b7 Mon Sep 17 00:00:00 2001 From: Ilya Goncharov Date: Mon, 20 Jul 2020 20:21:14 +0300 Subject: [PATCH] [Gradle, JS] Add NodeJs template project ^KT-40527 fixed --- .../ProjectTemplateSettingComponent.kt | 1 + .../KotlinNewProjectWizardBundle.properties | 7 +- .../kotlin/tools/projectWizard/Versions.kt | 1 + .../JsModuleConfigurator.kt | 30 ++++++-- .../projectTemplates/ProjectTemplate.kt | 30 +++++++- .../templates/SimpleNodeJsTemplate.kt | 70 +++++++++++++++++++ 6 files changed, 131 insertions(+), 8 deletions(-) create mode 100644 libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleNodeJsTemplate.kt diff --git a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt index dde90958b19..8bf4f8d7f7d 100644 --- a/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt +++ b/idea/idea-new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/wizard/ui/firstStep/ProjectTemplateSettingComponent.kt @@ -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() { diff --git a/libraries/tools/new-project-wizard/resources/messages/KotlinNewProjectWizardBundle.properties b/libraries/tools/new-project-wizard/resources/messages/KotlinNewProjectWizardBundle.properties index c11fe6aef40..172cc16fc90 100644 --- a/libraries/tools/new-project-wizard/resources/messages/KotlinNewProjectWizardBundle.properties +++ b/libraries/tools/new-project-wizard/resources/messages/KotlinNewProjectWizardBundle.properties @@ -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) diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/Versions.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/Versions.kt index 7dcbb40804a..a8e8f9c6ce6 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/Versions.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/Versions.kt @@ -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 { diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt index 1b3213f16ba..25ececd916c 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/moduleConfigurators/JsModuleConfigurator.kt @@ -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> = super.getConfiguratorSettings() + - super.getConfiguratorSettings() + - JSConfigurator.cssSupport + super.getConfiguratorSettings() override val moduleKind = ModuleKind.singleplatformJs @@ -117,13 +123,27 @@ open class JsSinglePlatformModuleConfigurator : JSConfigurator, ModuleConfigurat ): List = 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> { + return super.getConfiguratorSettings() + + JSConfigurator.cssSupport + } +} + +object NodeJsSinglePlatformModuleConfigurator : JsSinglePlatformModuleConfigurator( + JsTarget.NODE +) fun GradleIRListBuilder.applicationSupport() { +"binaries.executable()" diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt index 36f8ec34737..6124d14d4e0 100644 --- a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/projectTemplates/ProjectTemplate.kt @@ -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> + get() = listOf( + KotlinPlugin::modules withValue listOf( + Module( + "nodejsApp", + NodeJsSinglePlatformModuleConfigurator, + template = SimpleNodeJsTemplate(), + sourcesets = SourcesetType.ALL.map { type -> + Sourceset(type, dependencies = emptyList()) + }, + subModules = emptyList() + ) + ) + ) } \ No newline at end of file diff --git a/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleNodeJsTemplate.kt b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleNodeJsTemplate.kt new file mode 100644 index 00000000000..1fd72421430 --- /dev/null +++ b/libraries/tools/new-project-wizard/src/org/jetbrains/kotlin/tools/projectWizard/templates/SimpleNodeJsTemplate.kt @@ -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 = 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> = listOf(useKotlinxNodejs) + + override fun Writer.getRequiredLibraries(module: ModuleIR): List = withSettingsOf(module.originalModule) { + buildList { + if (this@SimpleNodeJsTemplate.useKotlinxNodejs.reference.settingValue()) { + +ArtifactBasedLibraryDependencyIR( + MavenArtifact( + JCENTER, + "org.jetbrains.kotlinx", + "kotlinx-nodejs" + ), + Versions.KOTLINX.KOTLINX_NODEJS, + DependencyType.MAIN + ) + } + } + } +} \ No newline at end of file