diff --git a/config.toml b/config.toml index ab98b13..b9559e1 100644 --- a/config.toml +++ b/config.toml @@ -22,11 +22,13 @@ display = "Kotlin Version" groupId = "org.http4k" artifactId = "http4k-core" version = "3.260.0" +category = "server" [dependencies.javalin] groupId = "io.javalin" artifactId = "javalin" version = "3.10.1" +category = "server" [dependencies.pebble] groupId = "io.pebbletemplates" @@ -43,28 +45,34 @@ default = true groupId = "org.mariadb.jdbc" artifactId = "mariadb-java-client" version = "2.6.2" +category = "database" [dependencies.h2] groupId = "com.h2database" artifactId = "h2" version = "1.4.200" +category = "database" [dependencies.flyway] groupId = "org.flywaydb" artifactId = "flyway-core" version = "6.5.4" +category = "database" [dependencies.HikariCP] groupId = "com.zaxxer" artifactId = "HikariCP" version = "3.4.5" +category = "database" [dependencies.Ktorm] groupId = "me.liuwj.ktorm" artifactId = "ktorm-core" version = "3.0.0" +category = "database" [dependencies.Ktorm-Mysql] groupId = "me.liuwj.ktorm" artifactId = "ktorm-support-mysql" -version = "3.0.0" \ No newline at end of file +version = "3.0.0" +category = "database" \ No newline at end of file diff --git a/src/css/src/category.pcss b/src/css/src/category.pcss new file mode 100644 index 0000000..abb625c --- /dev/null +++ b/src/css/src/category.pcss @@ -0,0 +1,3 @@ +.category{ + @apply text-lg inline-block text-center font-semibold text-gray-800 bg-green-300 rounded-full px-3 py-1 my-2; +} \ No newline at end of file diff --git a/src/css/src/styles.pcss b/src/css/src/styles.pcss index c7c0023..a214681 100644 --- a/src/css/src/styles.pcss +++ b/src/css/src/styles.pcss @@ -5,6 +5,7 @@ @import "tailwindcss/components"; @import "button.pcss"; +@import "category.pcss"; @import "inputs.pcss"; /*noinspection CssUnknownTarget*/ diff --git a/src/main/kotlin/starter/Config.kt b/src/main/kotlin/starter/Config.kt index 879ec0a..5041821 100644 --- a/src/main/kotlin/starter/Config.kt +++ b/src/main/kotlin/starter/Config.kt @@ -12,7 +12,14 @@ class Config { val dependenciesNode: NightConfig = cfg["dependencies"] @Suppress("UNCHECKED_CAST") val dependenciesMap = dependenciesNode.valueMap() as Map val dependencies = dependenciesMap.map { (name, values) -> - Dependency(name, values["groupId"], values["artifactId"], values["version"], values.getOrElse("default", false)) + Dependency( + name, + values["groupId"], + values["artifactId"], + values["version"], + values.getOrElse("default", false), + values.getEnumOrElse("category", Category.Other) + ) } val inputsNode: NightConfig = cfg["inputs"] diff --git a/src/main/kotlin/starter/Models.kt b/src/main/kotlin/starter/Models.kt index 1b5b911..8a89511 100644 --- a/src/main/kotlin/starter/Models.kt +++ b/src/main/kotlin/starter/Models.kt @@ -1,4 +1,15 @@ package starter -data class Dependency(val name: String, val groupId: String, val artifactId: String, val version: String, val default: Boolean) +enum class Category { + Server, Database, Other +} + +data class Dependency( + val name: String, + val groupId: String, + val artifactId: String, + val version: String, + val default: Boolean, + val category: Category, +) data class Input(val name: String, val display: String, val value: String? = null) \ No newline at end of file diff --git a/src/main/kotlin/starter/Views.kt b/src/main/kotlin/starter/Views.kt index 4aa16f0..0ee7fd9 100644 --- a/src/main/kotlin/starter/Views.kt +++ b/src/main/kotlin/starter/Views.kt @@ -14,11 +14,15 @@ private fun PebbleEngine.render(name: String, args: Map = mapOf()) class Views(private val engine: PebbleEngine) { private val logger = LoggerFactory.getLogger(javaClass) - fun index(dependencies: List, inputs: List) = engine.render("views/index", - mapOf("dependencies" to dependencies, "inputs" to inputs) - ) + fun index(dependencies: List, inputs: List): String { + val dependenciesByCategory = dependencies.groupBy { it.category }.toSortedMap() + return engine.render("views/index", + mapOf("dependencies" to dependenciesByCategory, "inputs" to inputs) + ) + } fun pom(dependencies: List, inputs: List): String { + val args: MutableMap = mutableMapOf( "dependencies" to dependencies, ) @@ -27,8 +31,6 @@ class Views(private val engine: PebbleEngine) { args[it.name] = it.value } - logger.debug(args.toString()) - return engine.render("starter/pom", args ) diff --git a/src/main/resources/assets/styles.css b/src/main/resources/assets/styles.css index 2fed956..1717fd4 100644 --- a/src/main/resources/assets/styles.css +++ b/src/main/resources/assets/styles.css @@ -1 +1 @@ -html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox]{box-sizing:border-box;padding:0}details{display:block}summary{display:list-item}template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.btn{font-weight:600;padding:.5rem 1rem;border-radius:.25rem}.btn:focus{outline:0;box-shadow:0 0 0 3px rgba(66,153,225,.5)}.btn:hover{font-weight:800}.btn-purple{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity));--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.btn-purple:focus,.btn-purple:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.input{background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity));-webkit-appearance:none;-moz-appearance:none;appearance:none;border-width:2px;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity));border-radius:.25rem;width:100%;padding:.5rem 1rem;--text-opacity:1;color:#4a5568;color:rgba(74,85,104,var(--text-opacity));line-height:1.25}.input,.input:focus{--bg-opacity:1;--border-opacity:1}.input:focus{outline:0;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.input-label{display:block;--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity));font-weight:700;margin-bottom:.25rem;padding-right:1rem}@media (min-width:768px){.input-label{text-align:right;margin-bottom:0}}.block{display:block}.flex{display:flex}.table{display:table}.flex-wrap{flex-wrap:wrap}.font-bold{font-weight:700}.text-2xl{font-size:1.5rem}.m-2{margin:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.max-w-sm{max-width:24rem}.text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.w-full{width:100%}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@media (min-width:768px){.md\:flex{display:flex}.md\:items-center{align-items:center}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}} \ No newline at end of file +html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox]{box-sizing:border-box;padding:0}details{display:block}summary{display:list-item}template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{box-sizing:border-box;border:0 solid #e2e8f0}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.btn{font-weight:600;padding:.5rem 1rem;border-radius:.25rem}.btn:focus{outline:0;box-shadow:0 0 0 3px rgba(66,153,225,.5)}.btn:hover{font-weight:800}.btn-purple{--bg-opacity:1;background-color:#b794f4;background-color:rgba(183,148,244,var(--bg-opacity));--text-opacity:1;color:#2d3748;color:rgba(45,55,72,var(--text-opacity))}.btn-purple:focus,.btn-purple:hover{--bg-opacity:1;background-color:#805ad5;background-color:rgba(128,90,213,var(--bg-opacity))}.category{font-size:1.125rem;display:inline-block;text-align:center;font-weight:600;color:#2d3748;color:rgba(45,55,72,var(--text-opacity));background-color:#9ae6b4;background-color:rgba(154,230,180,var(--bg-opacity));border-radius:9999px;padding:.25rem .75rem;margin-top:.5rem;margin-bottom:.5rem}.category,.input{--text-opacity:1;--bg-opacity:1}.input{background-color:#edf2f7;background-color:rgba(237,242,247,var(--bg-opacity));-webkit-appearance:none;-moz-appearance:none;appearance:none;border-width:2px;--border-opacity:1;border-color:#edf2f7;border-color:rgba(237,242,247,var(--border-opacity));border-radius:.25rem;width:100%;padding:.5rem 1rem;color:#4a5568;color:rgba(74,85,104,var(--text-opacity));line-height:1.25}.input:focus{outline:0;--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));--border-opacity:1;border-color:#9f7aea;border-color:rgba(159,122,234,var(--border-opacity))}.input-label{display:block;--text-opacity:1;color:#a0aec0;color:rgba(160,174,192,var(--text-opacity));font-weight:700;margin-bottom:.25rem;padding-right:1rem}@media (min-width:768px){.input-label{text-align:right;margin-bottom:0}}.block{display:block}.table{display:table}.font-bold{font-weight:700}.text-2xl{font-size:1.5rem}.m-2{margin:.5rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-4{margin-top:1rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.max-w-sm{max-width:24rem}.text-purple-800{--text-opacity:1;color:#553c9a;color:rgba(85,60,154,var(--text-opacity))}.w-full{width:100%}@-webkit-keyframes spin{to{transform:rotate(1turn)}}@keyframes spin{to{transform:rotate(1turn)}}@-webkit-keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@keyframes bounce{0%,to{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}@media (min-width:768px){.md\:flex{display:flex}.md\:items-center{align-items:center}.md\:w-1\/3{width:33.333333%}.md\:w-2\/3{width:66.666667%}} \ No newline at end of file diff --git a/src/main/resources/views/index.twig b/src/main/resources/views/index.twig index b5c09ef..54fced9 100644 --- a/src/main/resources/views/index.twig +++ b/src/main/resources/views/index.twig @@ -8,10 +8,17 @@ {% for input in inputs %} {{ input(input) }} {% endfor %} -
-
- {% for dependency in dependencies %} - {{ dependency(dependency) }} + +
+ {% for category in dependencies %} +
+

{{ category.key }}

+
    + {% for dependency in category.value %} +
  • {{ dependency(dependency) }}
  • + {% endfor %} +
+
{% endfor %}