[JS, Wizard] Separate browser application without react

^KT-41417 fixed
This commit is contained in:
Ilya Goncharov
2020-08-24 16:17:55 +03:00
parent 491eb5e366
commit 96e1b1c0e0
3 changed files with 22 additions and 51 deletions
@@ -126,8 +126,8 @@ project.template.full.stack.description=Fully-functional web application using K
project.template.native.console.title=Native Application project.template.native.console.title=Native Application
project.template.native.console.description=Application with Kotlin/Native that works as a standalone application under a specific platform. project.template.native.console.description=Application with Kotlin/Native that works as a standalone application under a specific platform.
project.template.frontend.title=Frontend Application project.template.browser.title=Browser Application
project.template.frontend.description=Frontend application with Kotlin/JS if you already have a backend. project.template.browser.description=A blank application targeting the browser
project.template.nodejs.title=Node.JS Application project.template.nodejs.title=Node.JS Application
project.template.nodejs.description=A blank application targeting Node.js project.template.nodejs.description=A blank application targeting Node.js
@@ -152,14 +152,11 @@ module.template.ktor.server.setting.engine.jetty=Jetty
module.template.native.console.title=Native Application module.template.native.console.title=Native Application
module.template.native.console.description=Simple Kotlin/Native application for your operating system module.template.native.console.description=Simple Kotlin/Native application for your operating system
module.template.js.simple.title=Frontend Application module.template.js.simple.title=Browser Application
module.template.js.simple.description=Configurable Kotlin/JS frontend application module.template.js.simple.description=A blank application targeting the browser
module.template.js.simple.run.configuration.dev=BrowserDevelopmentRun in continuous mode module.template.js.simple.run.configuration.dev=BrowserDevelopmentRun in continuous mode
module.template.js.simple.run.configuration.prod=BrowserProductionRun in continuous mode module.template.js.simple.run.configuration.prod=BrowserProductionRun in continuous mode
module.template.js.simple.setting.rendering.engine=Rendering engine module.template.simple.use.kotlinx.html=Use kotlinx.html
module.template.js.simple.setting.rendering.kotlinx.html=Use statically-typed Kotlinx.html DSL
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.title=Node.JS Application
module.template.simple.nodejs.description=A blank application targeting Node.js module.template.simple.nodejs.description=A blank application targeting Node.js
@@ -274,8 +274,8 @@ object NativeApplicationProjectTemplate : ProjectTemplate() {
} }
object FrontendApplicationProjectTemplate : ProjectTemplate() { object FrontendApplicationProjectTemplate : ProjectTemplate() {
override val title = KotlinNewProjectWizardBundle.message("project.template.frontend.title") override val title = KotlinNewProjectWizardBundle.message("project.template.browser.title")
override val description = KotlinNewProjectWizardBundle.message("project.template.frontend.description") override val description = KotlinNewProjectWizardBundle.message("project.template.browser.description")
override val id = "frontendApplication" override val id = "frontendApplication"
@NonNls @NonNls
@@ -6,8 +6,9 @@
package org.jetbrains.kotlin.tools.projectWizard.templates package org.jetbrains.kotlin.tools.projectWizard.templates
import org.jetbrains.annotations.Nls
import org.jetbrains.annotations.NonNls 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.WizardGradleRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardGradleRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration import org.jetbrains.kotlin.tools.projectWizard.WizardRunConfiguration
import org.jetbrains.kotlin.tools.projectWizard.core.* import org.jetbrains.kotlin.tools.projectWizard.core.*
@@ -16,18 +17,15 @@ import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.* import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.*
import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR import org.jetbrains.kotlin.tools.projectWizard.ir.buildsystem.gradle.multiplatform.DefaultTargetConfigurationIR
import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact import org.jetbrains.kotlin.tools.projectWizard.library.MavenArtifact
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase import org.jetbrains.kotlin.tools.projectWizard.phases.GenerationPhase
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleSubType
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.ModuleType
import org.jetbrains.kotlin.tools.projectWizard.settings.DisplayableSettingItem
import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.* import org.jetbrains.kotlin.tools.projectWizard.settings.buildsystem.*
import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version import org.jetbrains.kotlin.tools.projectWizard.settings.version.Version
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.TemplateInterceptor import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.TemplateInterceptor
import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.interceptTemplate import org.jetbrains.kotlin.tools.projectWizard.transformers.interceptors.interceptTemplate
import org.jetbrains.kotlin.tools.projectWizard.KotlinNewProjectWizardBundle
import org.jetbrains.kotlin.tools.projectWizard.Versions
import org.jetbrains.kotlin.tools.projectWizard.moduleConfigurators.*
import org.jetbrains.kotlin.tools.projectWizard.plugins.kotlin.KotlinPlugin
class SimpleJsClientTemplate : Template() { class SimpleJsClientTemplate : Template() {
override val title: String = KotlinNewProjectWizardBundle.message("module.template.js.simple.title") override val title: String = KotlinNewProjectWizardBundle.message("module.template.js.simple.title")
@@ -53,14 +51,14 @@ class SimpleJsClientTemplate : Template() {
else -> false else -> false
} }
val renderEngine by enumSetting<RenderEngine>( val useKotlinxHtml by booleanSetting(
KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.engine"), KotlinNewProjectWizardBundle.message("module.template.simple.use.kotlinx.html"),
GenerationPhase.PROJECT_GENERATION GenerationPhase.PROJECT_GENERATION
) { ) {
defaultValue = value(RenderEngine.REACT_WITH_STYLED) defaultValue = value(false)
} }
override val settings: List<TemplateSetting<*, *>> = listOf(renderEngine) override val settings: List<TemplateSetting<*, *>> = listOf(useKotlinxHtml)
override fun Reader.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = buildList { override fun Reader.createRunConfigurations(module: ModuleIR): List<WizardRunConfiguration> = buildList {
if (module.originalModule.kind == ModuleKind.singleplatformJsBrowser) { if (module.originalModule.kind == ModuleKind.singleplatformJsBrowser) {
@@ -79,19 +77,12 @@ class SimpleJsClientTemplate : Template() {
override fun Writer.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = withSettingsOf(module.originalModule) { override fun Writer.getRequiredLibraries(module: ModuleIR): List<DependencyIR> = withSettingsOf(module.originalModule) {
buildList { buildList {
+ArtifactBasedLibraryDependencyIR( if (useKotlinxHtml.reference.settingValue()) {
MavenArtifact(Repositories.KOTLINX, "org.jetbrains.kotlinx", "kotlinx-html-js"), +ArtifactBasedLibraryDependencyIR(
Versions.KOTLINX.KOTLINX_HTML(KotlinPlugin.version.propertyValue.version), MavenArtifact(Repositories.KOTLINX, "org.jetbrains.kotlinx", "kotlinx-html"),
DependencyType.MAIN Versions.KOTLINX.KOTLINX_HTML(KotlinPlugin.version.propertyValue.version),
) DependencyType.MAIN
)
val kotlinVersion = KotlinPlugin.version.propertyValue
if (renderEngine.reference.settingValue != RenderEngine.KOTLINX_HTML) {
+Dependencies.KOTLIN_REACT(kotlinVersion.version)
+Dependencies.KOTLIN_REACT_DOM(kotlinVersion.version)
if (renderEngine.reference.settingValue == RenderEngine.REACT_WITH_STYLED) {
+Dependencies.KOTLIN_STYLED(kotlinVersion.version)
}
} }
} }
} }
@@ -109,24 +100,13 @@ class SimpleJsClientTemplate : Template() {
if (!hasKtorServNeighbourTarget) { if (!hasKtorServNeighbourTarget) {
+(FileTemplateDescriptor("$id/index.html.vm") asResourceOf SourcesetType.main) +(FileTemplateDescriptor("$id/index.html.vm") asResourceOf SourcesetType.main)
} }
if (renderEngine.reference.settingValue == RenderEngine.KOTLINX_HTML) { if (useKotlinxHtml.reference.settingValue()) {
+(FileTemplateDescriptor("$id/client.kt.vm") asSrcOf SourcesetType.main) +(FileTemplateDescriptor("$id/client.kt.vm") asSrcOf SourcesetType.main)
+(FileTemplateDescriptor("$id/TestClient.kt.vm", "TestClient.kt".asPath()) asSrcOf SourcesetType.test) +(FileTemplateDescriptor("$id/TestClient.kt.vm", "TestClient.kt".asPath()) asSrcOf SourcesetType.test)
} else {
+(FileTemplateDescriptor("$id/reactClient.kt.vm", "client.kt".asPath()) asSrcOf SourcesetType.main)
+(FileTemplateDescriptor("$id/reactComponent.kt.vm", "welcome.kt".asPath()) asSrcOf SourcesetType.main)
}
if (renderEngine.reference.settingValue == RenderEngine.REACT_WITH_STYLED) {
+(FileTemplateDescriptor("$id/WelcomeStyles.kt.vm") asSrcOf SourcesetType.main)
} }
} }
} }
override fun Reader.getAdditionalSettings(module: Module): Map<String, Any> = withSettingsOf(module) {
mapOf("useStyledComponents" to (renderEngine.reference.settingValue == RenderEngine.REACT_WITH_STYLED))
}
override fun createInterceptors(module: ModuleIR): List<TemplateInterceptor> = buildList { override fun createInterceptors(module: ModuleIR): List<TemplateInterceptor> = buildList {
+interceptTemplate(KtorServerTemplate()) { +interceptTemplate(KtorServerTemplate()) {
applicableIf { buildFileIR -> applicableIf { buildFileIR ->
@@ -273,10 +253,4 @@ class SimpleJsClientTemplate : Template() {
) )
} }
} }
enum class RenderEngine(@Nls override val text: String) : DisplayableSettingItem {
KOTLINX_HTML(KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.kotlinx.html")),
REACT(KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.react")),
REACT_WITH_STYLED(KotlinNewProjectWizardBundle.message("module.template.js.simple.setting.rendering.react.styled"))
}
} }