diff --git a/package.json b/package.json index af9dc9f..d4c02e4 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "version": "1.2.5", "scripts": { "dev": "nuxt dev --dotenv env/.env.dev --host 0.0.0.0", - "build": "nuxt generate --dotenv env/.env.prod" + "build": "nuxt generate --dotenv env/.env.prod", + "release": "node zip.js" }, "devDependencies": { "@element-plus/icons-vue": "^2.3.1", @@ -26,6 +27,7 @@ "@types/lodash-es": "^4.17.12", "@vitejs/plugin-vue-jsx": "^4.1.0", "@vueuse/core": "^11.2.0", + "archiver": "^7.0.1", "element-plus": "^2.8.7", "less": "^4.2.0", "lodash-es": "^4.17.21", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 201f945..2798256 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -59,6 +59,9 @@ importers: '@vueuse/core': specifier: ^11.2.0 version: 11.2.0(vue@3.5.12(typescript@5.6.3)) + archiver: + specifier: ^7.0.1 + version: 7.0.1 element-plus: specifier: ^2.8.7 version: 2.8.7(vue@3.5.12(typescript@5.6.3)) diff --git a/zip.js b/zip.js new file mode 100644 index 0000000..4b5f1f5 --- /dev/null +++ b/zip.js @@ -0,0 +1,59 @@ +const releaseDir = "./src-tauri/target/release"; +const releaseDirEasytier = `${releaseDir}/easytier/`; +const releaseExe = `${releaseDir}/easytier-game.exe`; +const deleteEasytierFiles = ["logs/", "guiLogs/"] +const pkg = require("./package.json"); +const fileName = `easytier-game_windows_x86_64_${pkg.version}.zip`; +const releaseZipDir = "./release"; +const releaseZip = `${releaseZipDir}/${fileName}`; + +const fs = require("fs"); +const path = require("path"); +const archiver = require("archiver"); + +const output = fs.createWriteStream(path.join(__dirname, releaseZip)); +const archive = archiver("zip", { + zlib: { level: 8 } // Sets the compression level. +}); + +// listen for all archive data to be written +// 'close' event is fired only when a file descriptor is involved +output.on("close", function () { + console.log(archive.pointer() + " total bytes"); + console.log(`archiver has been finalized and the output ${releaseZip}`); +}); + +// This event is fired when the data source is drained no matter what was the data source. +// It is not part of this library but rather from the NodeJS Stream API. +// @see: https://nodejs.org/api/stream.html#stream_event_end +output.on("end", function () { + console.log("Data has been drained"); +}); + +// good practice to catch warnings (ie stat failures and other non-blocking errors) +archive.on("warning", function (err) { + if (err.code === "ENOENT") { + // log warning + } else { + // throw error + throw err; + } +}); + +archive.on("error", function (err) { + throw err; +}); + +for(const f of deleteEasytierFiles) { + fs.rmSync(path.join(__dirname, releaseDirEasytier + f), { recursive: true, force: true }); +} +const r = path.join(__dirname, releaseZipDir) +if(!fs.existsSync(r)) { + fs.mkdirSync(r); +} + +// pipe archive data to the file +archive.pipe(output); +archive + .append(fs.createReadStream(path.join(__dirname, releaseExe)), { name: "easytier-game.exe" }) + .directory(path.join(__dirname, releaseDirEasytier), "easytier").finalize();