From bcdc539643da31bd553bb974337ad29362852dbc Mon Sep 17 00:00:00 2001 From: Dituon <2544193782@qq.com> Date: Fri, 10 Mar 2023 21:19:59 +0800 Subject: [PATCH] 5.4-M2 & WebUI 0.1.0 --- build.gradle | 2 +- src/main/java/moe/dituon/petpet/Main.java | 4 + .../dituon/petpet/mirai/MiraiPetService.java | 7 +- .../dituon/petpet/mirai/MiraiPluginConfig.kt | 5 +- .../moe/dituon/petpet/server/PetDataDTO.kt | 22 ++- .../dituon/petpet/server/PetHttpHandler.java | 6 +- .../petpet/server/PreviewHttpHandler.java | 4 + .../petpet/server/ServerPetService.java | 10 +- .../petpet/server/ServerServiceConfig.kt | 6 +- .../moe/dituon/petpet/server/WebServer.java | 17 +- src/main/resources/config.json | 10 -- src/main/resources/index.html | 23 +++ webui/src/config.js | 2 +- webui/src/package-lock.json | 151 +++++++++++++++++- webui/src/package.json | 5 +- webui/src/vite.config.js | 10 ++ 16 files changed, 240 insertions(+), 44 deletions(-) delete mode 100644 src/main/resources/config.json create mode 100644 src/main/resources/index.html create mode 100644 webui/src/vite.config.js diff --git a/build.gradle b/build.gradle index 84ef33a4..be679f73 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ apply plugin: "java" group = 'xmmt.dituon' -version = '5.4-M1' +version = '5.4-M2' repositories { maven { url 'https://maven.aliyun.com/repository/public' } diff --git a/src/main/java/moe/dituon/petpet/Main.java b/src/main/java/moe/dituon/petpet/Main.java index 96b8899d..27238520 100644 --- a/src/main/java/moe/dituon/petpet/Main.java +++ b/src/main/java/moe/dituon/petpet/Main.java @@ -14,6 +14,10 @@ public static void main(String[] args) { return; } List param = Arrays.asList(args); + if (param.contains("-preview")) { + WebServer server = new WebServer(); + server.service.usePreview = true; + } if (param.contains("-gocq")) { try { GoCQPetpet goCQPetpet = GoCQPetpet.getInstance(); diff --git a/src/main/java/moe/dituon/petpet/mirai/MiraiPetService.java b/src/main/java/moe/dituon/petpet/mirai/MiraiPetService.java index 74c05dfa..d4bdb551 100644 --- a/src/main/java/moe/dituon/petpet/mirai/MiraiPetService.java +++ b/src/main/java/moe/dituon/petpet/mirai/MiraiPetService.java @@ -3,6 +3,7 @@ import moe.dituon.petpet.plugin.Cooler; import moe.dituon.petpet.plugin.DataUpdater; import moe.dituon.petpet.plugin.PluginPetService; +import moe.dituon.petpet.server.WebServer; import moe.dituon.petpet.share.BaseConfigFactory; import moe.dituon.petpet.share.GifAvatarExtraDataProvider; import moe.dituon.petpet.share.TextExtraData; @@ -74,6 +75,8 @@ public void readConfigByPluginAutoSave() { break; } + if (config.getStartWebServer()) new WebServer(); + super.readPluginServiceConfig(config.toPluginServiceConfig()); } @@ -81,8 +84,8 @@ public void readConfigByPluginAutoSave() { public void readData(File dir){ if (dir.listFiles() == null) { System.out.println(autoUpdate ? - "o((>ω< ))o 你这头懒猪, 没有下载petData!\n\\^o^/ 还好我冰雪聪明, 帮你自动更新了⭐" : - "(゚Д゚*)ノ 没有petData! 你自己手动更新吧x\n(☆-v-) 笨蛋! 让你不开自动更新⭐"); + "o((>ω< ))o 你这头懒猪, 没有下载petpet模板!\n\\^o^/ 还好我冰雪聪明, 帮你自动更新了⭐" : + "(゚Д゚*)ノ 没有petpet模板! 你自己手动更新吧x\n(☆-v-) 笨蛋! 让你不开自动更新⭐"); return; } super.readData(dir); diff --git a/src/main/java/moe/dituon/petpet/mirai/MiraiPluginConfig.kt b/src/main/java/moe/dituon/petpet/mirai/MiraiPluginConfig.kt index 520a802c..e29e04d8 100644 --- a/src/main/java/moe/dituon/petpet/mirai/MiraiPluginConfig.kt +++ b/src/main/java/moe/dituon/petpet/mirai/MiraiPluginConfig.kt @@ -90,9 +90,12 @@ object MiraiPluginConfig : AutoSavePluginConfig("PetPet") @ValueDescription("触发图片生成后的群聊冷却时长") val groupCoolDown: Long by value(Cooler.DEFAULT_GROUP_COOLDOWN) - @ValueDescription("触发冷却后的回复消息, '[nudge]'为戳一戳") + @ValueDescription("触发冷却后的回复消息, '[nudge]'为戳一戳, 可使用消息注入") val inCoolDownMessage: String by value(Cooler.DEFAULT_MESSAGE) + @ValueDescription("启动WebServer (详见文档)") + val startWebServer: Boolean by value(false) + fun toPluginServiceConfig() = PluginServiceConfig( command = command, disabled = disabled, diff --git a/src/main/java/moe/dituon/petpet/server/PetDataDTO.kt b/src/main/java/moe/dituon/petpet/server/PetDataDTO.kt index c5e9d784..66a10688 100644 --- a/src/main/java/moe/dituon/petpet/server/PetDataDTO.kt +++ b/src/main/java/moe/dituon/petpet/server/PetDataDTO.kt @@ -15,15 +15,16 @@ data class PetDataDTO( ) { companion object { @JvmStatic - fun stringify(dataMap: Map): String{ + fun stringify(dataMap: Map): String { val dataList: ArrayList = ArrayList() dataMap.forEach { (key, data) -> - dataList.add(PetDataObject( - key, - data.avatar.stream().map { a -> a.type }.toList(), - data.alias ?: emptyList(), - PreviewType.GIF - )) + if (data.hidden == false) dataList.add( + PetDataObject( + key, + data.avatar.stream().map { a -> a.type }.toList(), + data.alias ?: emptyList() + ) + ) } return Json.encodeToString( PetDataDTO(VERSION, dataList) @@ -36,12 +37,7 @@ data class PetDataDTO( data class PetDataObject( val key: String, val types: List, - val alias: List, - val previewType: PreviewType + val alias: List ) -enum class PreviewType { - PNG, GIF -} - diff --git a/src/main/java/moe/dituon/petpet/server/PetHttpHandler.java b/src/main/java/moe/dituon/petpet/server/PetHttpHandler.java index 2aaa2e34..f1d1b45a 100644 --- a/src/main/java/moe/dituon/petpet/server/PetHttpHandler.java +++ b/src/main/java/moe/dituon/petpet/server/PetHttpHandler.java @@ -79,9 +79,9 @@ private void handleResponse(HttpExchange httpExchange, int rCode) { } } - private void handleResponse(HttpExchange httpExchange, InputStream input, String type) throws IOException { + static public void handleResponse(HttpExchange httpExchange, InputStream input, String mime) throws IOException { input.reset(); - httpExchange.getResponseHeaders().add("Content-Type", "image/" + type); + httpExchange.getResponseHeaders().add("Content-Type", mime); httpExchange.sendResponseHeaders(200, input.available()); OutputStream out = httpExchange.getResponseBody(); input.transferTo(out); @@ -100,7 +100,7 @@ private void handleResponseIndex(HttpExchange httpExchange) throws IOException { } private void finish(HttpExchange httpExchange, RequestParser parser) throws IOException { - handleResponse(httpExchange, parser.getImagePair().getFirst(), parser.getImagePair().getSecond()); + handleResponse(httpExchange, parser.getImagePair().getFirst(), ("image/" + parser.getImagePair().getSecond()).intern()); parser.close(); } } diff --git a/src/main/java/moe/dituon/petpet/server/PreviewHttpHandler.java b/src/main/java/moe/dituon/petpet/server/PreviewHttpHandler.java index 77a59a53..05615beb 100644 --- a/src/main/java/moe/dituon/petpet/server/PreviewHttpHandler.java +++ b/src/main/java/moe/dituon/petpet/server/PreviewHttpHandler.java @@ -31,6 +31,10 @@ public class PreviewHttpHandler implements HttpHandler { if (!configFile.exists()) { Files.write(configFile.toPath(), new PreviewConfigDTO().stringify().getBytes()); } + File destDir = new File(PREVIEW_ROOT); + if(!(destDir.exists()&& destDir.isDirectory())) { + if (!destDir.mkdirs()) System.out.println("can not mkdir " + PREVIEW_ROOT); + } PreviewConfigDTO config = PreviewConfigDTO.decodeFromString(service.getFileStr(configFile)); // mimeMap = new HashMap<>(service.getDataMap().size()); diff --git a/src/main/java/moe/dituon/petpet/server/ServerPetService.java b/src/main/java/moe/dituon/petpet/server/ServerPetService.java index 42ac3d93..f70d6a72 100644 --- a/src/main/java/moe/dituon/petpet/server/ServerPetService.java +++ b/src/main/java/moe/dituon/petpet/server/ServerPetService.java @@ -9,12 +9,12 @@ public class ServerPetService extends BasePetService { public static final int DEFAULT_PORT = 2333; public static final String DEFAULT_DATA_PATH = "data/xmmt.dituon.petpet/"; - public static final String CONFIG_NAME = "config.json"; + public static final String CONFIG_NAME = "server-config.json"; public static final int DEFAULT_SERVER_THREAD_POOL_SIZE = 10; public int port = DEFAULT_PORT; public String path = DEFAULT_DATA_PATH; public int webServerThreadPoolSize = DEFAULT_SERVER_THREAD_POOL_SIZE; - public boolean usePreview = true; + public boolean usePreview = false; private String indexJson; public void readConfig(ServerServiceConfig config) { @@ -28,10 +28,12 @@ public void readConfig(ServerServiceConfig config) { } public void readConfig() { - File configFile = new File(CONFIG_NAME); + File configFile = new File("./" + CONFIG_NAME); try { if (!configFile.exists()) { //save default config - Files.write(configFile.toPath(), new ServerServiceConfig().stringify().getBytes()); + var defaultConfig = new ServerServiceConfig(); + defaultConfig.setPreview(usePreview); + Files.write(configFile.toPath(), defaultConfig.stringify().getBytes()); } ServerServiceConfig config = ServerServiceConfig.parse(getFileStr(configFile)); diff --git a/src/main/java/moe/dituon/petpet/server/ServerServiceConfig.kt b/src/main/java/moe/dituon/petpet/server/ServerServiceConfig.kt index ef10b27f..7560b90b 100644 --- a/src/main/java/moe/dituon/petpet/server/ServerServiceConfig.kt +++ b/src/main/java/moe/dituon/petpet/server/ServerServiceConfig.kt @@ -20,7 +20,7 @@ data class ServerServiceConfig( val port: Int = ServerPetService.DEFAULT_PORT, val dataPath: String = ServerPetService.DEFAULT_DATA_PATH, val webServerThreadPoolSize: Int = ServerPetService.DEFAULT_SERVER_THREAD_POOL_SIZE, - val preview: Boolean = false, + var preview: Boolean = false, val antialias: Boolean = true, val resampling: Boolean = true, @@ -58,8 +58,8 @@ data class ServerServiceConfig( data class PreviewConfigDTO( val form: TargetDTO = TargetDTO("form", "https://q1.qlogo.cn/g?b=qq&nk=2544193782&s=640"), val to: TargetDTO = TargetDTO("to", "https://q1.qlogo.cn/g?b=qq&nk=2544193782&s=640"), - val group: TargetDTO = TargetDTO("group", "file:./example-data/input/avatar1.png"), - val bot: TargetDTO = TargetDTO("bot", "file:./example-data/input/avatar2.png"), + val group: TargetDTO = TargetDTO("group", "https://q1.qlogo.cn/g?b=qq&nk=2544193782&s=640"), + val bot: TargetDTO = TargetDTO("bot", "https://q1.qlogo.cn/g?b=qq&nk=2544193782&s=640"), val randomAvatarList: List = emptyList(), val textList: List = listOf("petpet!") ) { diff --git a/src/main/java/moe/dituon/petpet/server/WebServer.java b/src/main/java/moe/dituon/petpet/server/WebServer.java index 01412541..246c3912 100644 --- a/src/main/java/moe/dituon/petpet/server/WebServer.java +++ b/src/main/java/moe/dituon/petpet/server/WebServer.java @@ -2,8 +2,10 @@ import com.sun.net.httpserver.HttpServer; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.net.InetSocketAddress; import java.util.concurrent.Executors; @@ -26,12 +28,25 @@ private void init() { try { HttpServer httpServer = HttpServer.create(new InetSocketAddress(service.port), 0); + System.out.println("PetpetWebServer started in port " + service.port); + httpServer.createContext("/petpet", new PetHttpHandler(service)); httpServer.createContext("/preview", new PreviewHttpHandler(service)); + + try(InputStream stream = this.getClass().getResourceAsStream("/index.html")) { + if (stream == null) throw new Exception(); + InputStream html = new ByteArrayInputStream(stream.readAllBytes()); + httpServer.createContext("/", exchange -> PetHttpHandler.handleResponse(exchange, html, "text/html")); + + System.out.println("WebUI-URL: http://127.0.0.1:" + service.port + '/'); + if (!service.usePreview) System.out.println("Warn: WebUI preview is disabled"); + } catch (Exception e){ + System.out.println("Petpet WebUI is disabled"); + } + httpServer.setExecutor(Executors.newFixedThreadPool(service.webServerThreadPoolSize)); httpServer.start(); - System.out.println("PetpetWebServer started in port " + service.port); apiUrl = ("http://127.0.0.1:" + service.port + "/petpet").intern(); System.out.println("API-URL: " + apiUrl); } catch (IOException ex) { diff --git a/src/main/resources/config.json b/src/main/resources/config.json deleted file mode 100644 index e3fa2f17..00000000 --- a/src/main/resources/config.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "port": 2333, - "webServerThreadPoolSize": 10, - "dataPath": "data/xmmt.dituon.petpet", - "gifMaxSize": [200, 200, 32], - "gifEncoder": "ANIMATED_LIB", - "gifQuality": 10, - "gifMakerThreadPoolSize": 0, - "headless": true -} \ No newline at end of file diff --git a/src/main/resources/index.html b/src/main/resources/index.html new file mode 100644 index 00000000..012de255 --- /dev/null +++ b/src/main/resources/index.html @@ -0,0 +1,23 @@ + + + + + + Vite App + + + + +

Petpet

+
+ + + diff --git a/webui/src/config.js b/webui/src/config.js index 3eb0ea2e..a2746a59 100644 --- a/webui/src/config.js +++ b/webui/src/config.js @@ -1,6 +1,6 @@ export default { server: [ - 'http://127.0.0.1:2333', + window.location.origin, 'http://api.xmmt.fun', 'http://api.d2n.moe' ] diff --git a/webui/src/package-lock.json b/webui/src/package-lock.json index 8131e670..9d19ad84 100644 --- a/webui/src/package-lock.json +++ b/webui/src/package-lock.json @@ -1,14 +1,15 @@ { "name": "petpet-webui", - "version": "0.0.1", + "version": "0.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "petpet-webui", - "version": "0.0.1", + "version": "0.1.0", "devDependencies": { - "vite": "^4.0.0" + "vite": "^4.0.0", + "vite-plugin-singlefile": "^0.13.3" } }, "node_modules/@esbuild/android-arm": { @@ -363,6 +364,18 @@ "node": ">=12" } }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/esbuild": { "version": "0.16.17", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", @@ -400,6 +413,18 @@ "@esbuild/win32-x64": "0.16.17" } }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -444,6 +469,28 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -468,6 +515,18 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -546,6 +605,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/vite": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", @@ -594,6 +665,22 @@ "optional": true } } + }, + "node_modules/vite-plugin-singlefile": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-0.13.3.tgz", + "integrity": "sha512-5rfYJKnFa4h1E/uas6k7f8Ku9NRdL4SCPYaVlAwt4khYJ5yzQcs9xRRIha/OXVyVL2iDSPRMRqoijjGPVURR0w==", + "dev": true, + "dependencies": { + "micromatch": "^4.0.5" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "rollup": ">=2.79.0", + "vite": ">=3.2.0" + } } }, "dependencies": { @@ -751,6 +838,15 @@ "dev": true, "optional": true }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, "esbuild": { "version": "0.16.17", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", @@ -781,6 +877,15 @@ "@esbuild/win32-x64": "0.16.17" } }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -812,6 +917,22 @@ "has": "^1.0.3" } }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, "nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -830,6 +951,12 @@ "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, "postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -873,6 +1000,15 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, "vite": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/vite/-/vite-4.0.4.tgz", @@ -885,6 +1021,15 @@ "resolve": "^1.22.1", "rollup": "^3.7.0" } + }, + "vite-plugin-singlefile": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/vite-plugin-singlefile/-/vite-plugin-singlefile-0.13.3.tgz", + "integrity": "sha512-5rfYJKnFa4h1E/uas6k7f8Ku9NRdL4SCPYaVlAwt4khYJ5yzQcs9xRRIha/OXVyVL2iDSPRMRqoijjGPVURR0w==", + "dev": true, + "requires": { + "micromatch": "^4.0.5" + } } } } diff --git a/webui/src/package.json b/webui/src/package.json index 690446c9..939674e2 100644 --- a/webui/src/package.json +++ b/webui/src/package.json @@ -9,6 +9,7 @@ "preview": "vite preview" }, "devDependencies": { - "vite": "^4.0.0" + "vite": "^4.0.0", + "vite-plugin-singlefile": "^0.13.3" } -} \ No newline at end of file +} diff --git a/webui/src/vite.config.js b/webui/src/vite.config.js new file mode 100644 index 00000000..8f11f9be --- /dev/null +++ b/webui/src/vite.config.js @@ -0,0 +1,10 @@ +import { defineConfig } from 'vite' +import { viteSingleFile } from 'vite-plugin-singlefile' + +export default defineConfig({ + base: './', + plugins: [viteSingleFile()], + build: { + outDir: '../../src/main/resources' + } +}) \ No newline at end of file