Compare commits
12 Commits
zip
..
0d47b51f3f
| Author | SHA1 | Date | |
|---|---|---|---|
| 0d47b51f3f | |||
| cd628f48b7 | |||
| dc6377179c | |||
| 2c0a1e44ec | |||
| 6f691fcd75 | |||
| 3155a2bbe8 | |||
| 91a82c3736 | |||
| 8ea5207cde | |||
| deb086f4b9 | |||
| c7a199fb2f | |||
| 658ac10375 | |||
| 94269c7a87 |
@@ -39,3 +39,4 @@ node_modules/
|
||||
.yarn-integrity
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
*.zip
|
||||
|
||||
+35
-1
@@ -16,6 +16,14 @@ display = "Java Version"
|
||||
default = "1.4.10"
|
||||
display = "Kotlin Version"
|
||||
|
||||
[repositories]
|
||||
|
||||
[repositories.jcenter]
|
||||
url = "https://jcenter.bintray.com"
|
||||
|
||||
[repositories.arrow]
|
||||
url = "https://dl.bintray.com/arrow-kt/arrow-kt/"
|
||||
|
||||
[dependencies]
|
||||
|
||||
[dependencies.http4k]
|
||||
@@ -31,6 +39,7 @@ artifactId = "http4k-server-jetty"
|
||||
version = "3.260.0"
|
||||
category = "server"
|
||||
default = true
|
||||
logger = "org.eclipse.jetty"
|
||||
|
||||
[dependencies.http4k-server-apache]
|
||||
groupId = "org.http4k"
|
||||
@@ -40,7 +49,7 @@ category = "server"
|
||||
|
||||
[dependencies.http4k-client-apache]
|
||||
groupId = "org.http4k"
|
||||
artifactId = "http4k-server-apache"
|
||||
artifactId = "http4k-client-apache"
|
||||
version = "3.260.0"
|
||||
category = "server"
|
||||
|
||||
@@ -49,12 +58,14 @@ groupId = "io.javalin"
|
||||
artifactId = "javalin"
|
||||
version = "3.10.1"
|
||||
category = "server"
|
||||
logger = "org.eclipse.jetty"
|
||||
|
||||
[dependencies.pebble]
|
||||
groupId = "io.pebbletemplates"
|
||||
artifactId = "pebble"
|
||||
version = "3.1.4"
|
||||
default = true
|
||||
logger = "com.mitchellbosecke.pebble"
|
||||
|
||||
[dependencies.logback]
|
||||
groupId = "ch.qos.logback"
|
||||
@@ -79,18 +90,21 @@ groupId = "org.flywaydb"
|
||||
artifactId = "flyway-core"
|
||||
version = "6.5.4"
|
||||
category = "database"
|
||||
logger = "org.flywaydb.core"
|
||||
|
||||
[dependencies.HikariCP]
|
||||
groupId = "com.zaxxer"
|
||||
artifactId = "HikariCP"
|
||||
version = "3.4.5"
|
||||
category = "database"
|
||||
logger = "com.zaxxer.hikari"
|
||||
|
||||
[dependencies.Ktorm]
|
||||
groupId = "me.liuwj.ktorm"
|
||||
artifactId = "ktorm-core"
|
||||
version = "3.0.0"
|
||||
category = "database"
|
||||
logger = "me.liuwj.ktorm.database"
|
||||
|
||||
[dependencies.Ktorm-Mysql]
|
||||
groupId = "me.liuwj.ktorm"
|
||||
@@ -141,10 +155,30 @@ groupId = "org.kodein.di"
|
||||
artifactId = "kodein-di-jvm"
|
||||
version = "7.0.0"
|
||||
category = "injection"
|
||||
repository = "jcenter"
|
||||
|
||||
[dependencies.Koin]
|
||||
groupId = "org.koin"
|
||||
artifactId = "koin-core"
|
||||
version = "2.1.6"
|
||||
category = "injection"
|
||||
repository = "jcenter"
|
||||
default = true
|
||||
|
||||
[dependencies.Jackson]
|
||||
groupId = "com.fasterxml.jackson.module"
|
||||
artifactId = "jackson-module-kotlin"
|
||||
version = "2.11.2"
|
||||
category = "serialization"
|
||||
|
||||
[dependencies.Kotlinx-serialization]
|
||||
groupId = "org.jetbrains.kotlinx"
|
||||
artifactId = "kotlinx-serialization-runtime"
|
||||
version = "1.0-M1-1.4.0-rc"
|
||||
category = "serialization"
|
||||
|
||||
[dependencies.Arrow-core]
|
||||
groupId = "io.arrow-kt"
|
||||
artifactId = "arrow-core"
|
||||
version = "0.10.5"
|
||||
repository = "arrow"
|
||||
|
||||
@@ -3,33 +3,47 @@ package starter
|
||||
import com.electronwill.nightconfig.core.file.FileConfig
|
||||
import com.electronwill.nightconfig.core.Config as NightConfig
|
||||
|
||||
data class StarterConfig(val dependencies: List<Dependency>, val inputs: List<Input>)
|
||||
data class StarterConfig(
|
||||
val dependencies: List<Dependency>,
|
||||
val inputs: List<Input>,
|
||||
val repositories: List<Repository>,
|
||||
)
|
||||
|
||||
class Config {
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
private fun FileConfig.configMap(key: String) = this.get<NightConfig>(key).valueMap() as Map<String, NightConfig>
|
||||
|
||||
fun load(): StarterConfig {
|
||||
val cfg = FileConfig.of("config.toml")
|
||||
cfg.load()
|
||||
val dependenciesNode: NightConfig = cfg["dependencies"]
|
||||
@Suppress("UNCHECKED_CAST") val dependenciesMap = dependenciesNode.valueMap() as Map<String, NightConfig>
|
||||
val dependencies = dependenciesMap.map { (name, values) ->
|
||||
Dependency(
|
||||
name,
|
||||
values["groupId"],
|
||||
values["artifactId"],
|
||||
values["version"],
|
||||
values.getOrElse("default", false),
|
||||
values.getEnumOrElse("category", Category.Other),
|
||||
values.getEnumOrElse("scope", Scope.Compile),
|
||||
)
|
||||
}
|
||||
|
||||
val inputsNode: NightConfig = cfg["inputs"]
|
||||
@Suppress("UNCHECKED_CAST") val inputMap = inputsNode.valueMap() as Map<String, NightConfig>
|
||||
val inputs = inputMap.map { (name, values) ->
|
||||
Input(name, values["display"], values["default"])
|
||||
}
|
||||
val dependencies = cfg.configMap("dependencies")
|
||||
.map { (name, values) ->
|
||||
Dependency(
|
||||
name,
|
||||
values["groupId"],
|
||||
values["artifactId"],
|
||||
values["version"],
|
||||
values.getOrElse("default", false),
|
||||
values.getEnumOrElse("category", Category.Other),
|
||||
values.getEnumOrElse("scope", Scope.Compile),
|
||||
values["logger"],
|
||||
values["repository"],
|
||||
)
|
||||
}
|
||||
|
||||
return StarterConfig(dependencies, inputs)
|
||||
val inputs = cfg.configMap("inputs")
|
||||
.map { (name, values) ->
|
||||
Input(name, values["display"], values["default"])
|
||||
}
|
||||
|
||||
val repositories = cfg.configMap("repositories")
|
||||
.map { (name, values) ->
|
||||
Repository(name, values["url"])
|
||||
}
|
||||
|
||||
return StarterConfig(dependencies, inputs, repositories)
|
||||
}
|
||||
|
||||
}
|
||||
@@ -3,6 +3,7 @@ package starter
|
||||
import org.koin.core.context.startKoin
|
||||
import org.koin.dsl.bind
|
||||
import org.koin.dsl.module
|
||||
import starter.templates.LogbackTemplate
|
||||
import starter.templates.MainTemplate
|
||||
import starter.templates.PomTemplate
|
||||
import starter.templates.Template
|
||||
@@ -18,6 +19,7 @@ val mainModule = module {
|
||||
val templateModule = module {
|
||||
single { PomTemplate(get()) } bind Template::class
|
||||
single { MainTemplate(get()) } bind Template::class
|
||||
single { LogbackTemplate(get()) } bind Template::class
|
||||
}
|
||||
|
||||
fun main() {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package starter
|
||||
|
||||
enum class Category {
|
||||
Server, Injection, Database, Test, Other
|
||||
Server, Injection, Database, Serialization, Test, Other
|
||||
}
|
||||
|
||||
enum class Scope {
|
||||
@@ -15,9 +15,13 @@ data class Dependency(
|
||||
val version: String,
|
||||
val default: Boolean,
|
||||
val category: Category,
|
||||
val scope: Scope
|
||||
val scope: Scope,
|
||||
val logger: String?,
|
||||
val repository: String?,
|
||||
)
|
||||
|
||||
data class Repository(val name: String, val url: String)
|
||||
|
||||
data class Input(val name: String, val display: String, val value: String? = null)
|
||||
|
||||
data class Project(
|
||||
@@ -25,4 +29,5 @@ data class Project(
|
||||
val basePackage: String,
|
||||
val inputs: List<Input>,
|
||||
val dependencies: List<Dependency>,
|
||||
val repositories: List<Repository>,
|
||||
)
|
||||
|
||||
@@ -9,11 +9,12 @@ class ProjectZip(private val templates: List<Template>) {
|
||||
fun createZip(project: Project): String {
|
||||
val name: String
|
||||
|
||||
ZipOutput(sanitizeFilename(project.name)).use {
|
||||
name = it.name
|
||||
val projectName = sanitizeFilename(project.name)
|
||||
ZipOutput(projectName).use { zip ->
|
||||
name = zip.name
|
||||
|
||||
templates.forEach { template ->
|
||||
it.write(template.path(project), template.render(project))
|
||||
templates.filter { it.enabled(project) }.forEach { template ->
|
||||
zip.write(projectName + "/" + template.path(project), template.render(project))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,17 @@ class Server(
|
||||
|
||||
val projectName = inputs.find { it.name == "name" }!!.value!!
|
||||
val basePackage = inputs.find { it.name == "basePackage" }!!.value!!
|
||||
val project = Project(projectName, basePackage, inputs, deps)
|
||||
|
||||
if (basePackage.contains("/") || basePackage.contains("..")) {
|
||||
ctx.status(400)
|
||||
ctx.result("Invalid Base Package")
|
||||
return@post
|
||||
}
|
||||
|
||||
val repositories = conf.repositories
|
||||
.filter { repo -> repo.name in deps.mapNotNull { it.repository } }
|
||||
|
||||
val project = Project(projectName, basePackage, inputs, deps, repositories)
|
||||
|
||||
ctx.contentType("application/zip")
|
||||
ctx.header("Content-Disposition", "attachment; filename=\"${sanitizeFilename(projectName)}.zip\"")
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
package starter.templates
|
||||
|
||||
import com.mitchellbosecke.pebble.PebbleEngine
|
||||
import starter.Project
|
||||
import starter.utils.prettyPrintXml
|
||||
import starter.utils.render
|
||||
|
||||
class LogbackTemplate(private val engine: PebbleEngine) : Template {
|
||||
override fun path(project: Project) = "src/main/resources/logback.xml"
|
||||
|
||||
override fun enabled(project: Project) = project.dependencies.any { it.name == "logback" }
|
||||
|
||||
override fun render(project: Project): String {
|
||||
val args = mapOf(
|
||||
"loggers" to project.dependencies.mapNotNull { it.logger }.toSet()
|
||||
)
|
||||
val rendered = engine.render("starter/logback/index", args)
|
||||
return prettyPrintXml(rendered)
|
||||
}
|
||||
}
|
||||
@@ -6,8 +6,8 @@ import starter.utils.render
|
||||
|
||||
class MainTemplate(private val engine: PebbleEngine) : Template {
|
||||
override fun path(project: Project) =
|
||||
project.basePackage.replace('.', '/') + "/" + project.name.toLowerCase().capitalize() + ".kt"
|
||||
"src/main/kotlin/" + project.basePackage.replace('.', '/') + "/" + project.name.toLowerCase().capitalize() + ".kt"
|
||||
|
||||
override fun render(project: Project) =
|
||||
engine.render("starter/main/main", mapOf("basePackage" to project.basePackage))
|
||||
engine.render("starter/main/index", mapOf("basePackage" to project.basePackage))
|
||||
}
|
||||
|
||||
@@ -11,13 +11,15 @@ class PomTemplate(private val engine: PebbleEngine) : Template {
|
||||
override fun render(project: Project): String {
|
||||
val args: MutableMap<String, Any?> = mutableMapOf(
|
||||
"dependencies" to project.dependencies.sortedBy { it.scope },
|
||||
"repositories" to project.repositories,
|
||||
"kotlinxSerialization" to project.dependencies.any { it.name == "Kotlinx-serialization" },
|
||||
)
|
||||
|
||||
project.inputs.forEach {
|
||||
args[it.name] = it.value
|
||||
}
|
||||
|
||||
val rendered = engine.render("starter/pom/pom", args)
|
||||
val rendered = engine.render("starter/pom/index", args)
|
||||
return prettyPrintXml(rendered)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,5 +4,6 @@ import starter.Project
|
||||
|
||||
interface Template {
|
||||
fun path(project: Project): String
|
||||
fun enabled(project: Project): Boolean = true
|
||||
fun render(project: Project): String
|
||||
}
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
<configuration>
|
||||
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
|
||||
<withJansi>true</withJansi>
|
||||
<encoder>
|
||||
<pattern>%cyan(%d{YYYY-MM-dd HH:mm:ss.SSS}) [%thread] %highlight(%-5level) %green(%logger{36}) - %msg%n
|
||||
</pattern>
|
||||
</encoder>
|
||||
</appender>
|
||||
<root level="DEBUG">
|
||||
<appender-ref ref="STDOUT"/>
|
||||
</root>
|
||||
{% for logger in loggers %}
|
||||
<logger name="{{ logger }}" level="INFO"/>
|
||||
{% endfor %}
|
||||
</configuration>
|
||||
@@ -1,4 +1,9 @@
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-stdlib-jdk8</artifactId>
|
||||
<version>${kotlin.version}</version>
|
||||
</dependency>
|
||||
{% for dep in dependencies %}
|
||||
<dependency>
|
||||
<groupId>{{ dep.groupId }}</groupId>
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
{% if repositories is not empty %}
|
||||
<repositories>
|
||||
<repository>
|
||||
<id>jcenter</id>
|
||||
<name>jcenter</name>
|
||||
<url>https://jcenter.bintray.com</url>
|
||||
</repository>
|
||||
{% for repo in repositories %}
|
||||
<repository>
|
||||
<id>{{ repo.name }}</id>
|
||||
<url>{{ repo.url }}</url>
|
||||
</repository>
|
||||
{% endfor %}
|
||||
</repositories>
|
||||
{% endif %}
|
||||
|
||||
@@ -20,5 +20,19 @@
|
||||
</executions>
|
||||
<configuration>
|
||||
<jvmTarget>${java.version}</jvmTarget>
|
||||
{% if kotlinxSerialization %}
|
||||
<compilerPlugins>
|
||||
<plugin>kotlinx-serialization</plugin>
|
||||
</compilerPlugins>
|
||||
{% endif %}
|
||||
</configuration>
|
||||
{% if kotlinxSerialization %}
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.jetbrains.kotlin</groupId>
|
||||
<artifactId>kotlin-maven-serialization</artifactId>
|
||||
<version>${kotlin.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
{% endif %}
|
||||
</plugin>
|
||||
Reference in New Issue
Block a user