From bc858ebf222ae10248b7743e5304ac367e9307b5 Mon Sep 17 00:00:00 2001 From: 00Fjongl <65314359+00Fjongl@users.noreply.github.com> Date: Wed, 7 Aug 2024 13:16:29 -0500 Subject: [PATCH] Move a lot of shell stuff over to Node so that Windows users need not install git bash. --- build-assets.sh | 8 ------ package.json | 12 ++++---- run-command.mjs | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ shutdown.mjs | 21 -------------- 4 files changed, 82 insertions(+), 34 deletions(-) delete mode 100755 build-assets.sh create mode 100644 run-command.mjs delete mode 100644 shutdown.mjs diff --git a/build-assets.sh b/build-assets.sh deleted file mode 100755 index b9e437b7..00000000 --- a/build-assets.sh +++ /dev/null @@ -1,8 +0,0 @@ -# File created to force npm execution in shell (instead of potentially Windows batch). -# This script can be run manually if esbuild is replaced by the following: -# ./node_modules/.bin/esbuild - -# Make the ./views/dist directory in case it doesn't exist, and also make it empty. -dist='./views/dist'; mkdir "$dist"; find "$dist" -mindepth 1 -delete && -# Curly bracket wildcards are not supported by some clients, so this is quite long. -esbuild --platform=browser --sourcemap --minify --bundle --external:*.png --external:*.jpg --external:*.jpeg --external:*.webp --external:*.svg --outdir="$dist" ./views/uv/*.js ./views/assets/js/*.js ./views/assets/js/*/*.js ./views/assets/css/*.css diff --git a/package.json b/package.json index 2a00d45b..4f380975 100644 --- a/package.json +++ b/package.json @@ -6,12 +6,14 @@ "main": "backend.js", "scripts": { "start": "npm install && npm run build && npm run manual-start", - "restart": "npm stop; npm run manual-start", - "stop": "( pm2 stop ecosystem.config.js ) ; node shutdown.mjs", + "restart": "npm stop ; npm run manual-start", + "stop": "node run-command.mjs stop", "test": "npm run proxy-validator", - "monit": "pm2 monit", - "manual-start": "node read-config.mjs 'production' && ( pm2 start ecosystem.config.js --env production ) || ( node backend.js & pkill -n npm || true )", - "build": "sh ./build-assets.sh && cd lib/rammerhead && npm install && npm run build", + "pm2-start": "pm2 start ecosystem.config.js --env production", + "pm2-stop": "pm2 stop ecosystem.config.js", + "pm2-monit": "pm2 monit", + "manual-start": "node run-command.mjs start", + "build": "node run-command.mjs build && cd lib/rammerhead && npm install && npm run build", "start-test-server": "timeout 5 node backend.js; test $? -eq 124 && ( npm run manual-start & ) || exit 1", "proxy-validator": "node proxyServiceValidator.js" }, diff --git a/run-command.mjs b/run-command.mjs new file mode 100644 index 00000000..737b6a93 --- /dev/null +++ b/run-command.mjs @@ -0,0 +1,75 @@ +import { readFile, writeFile, unlink, mkdir, rm } from 'node:fs/promises'; +import { exec, fork } from 'node:child_process'; +import { fileURLToPath } from 'node:url'; +import { build } from 'esbuild'; + +const config = Object.freeze(JSON.parse(await readFile(new URL("./src/config.json", import.meta.url)))); + +const serverUrl = (base => { + try { + base = new URL(config.host); + } catch (e) { + base = new URL("http://a"); + base.host = config.host; + } + base.port = process.env.PORT || config.port; + return Object.freeze(base); +})(); + +const shutdown = new URL("./src/.shutdown", import.meta.url); + +for(let i = 2; i < process.argv.length; i++) + switch (process.argv[i]) { + case "start": { + if (config.production) + exec("npm run pm2-start", (error, stdout) => { + if (error) throw error; + console.log(stdout); + }); + else { + const server = fork( + new URL("./backend.js", import.meta.url), + {detached: true} + ); + server.unref(); + server.disconnect(); + } + break; + } + + case "stop": + await writeFile(shutdown, ""); + try {await fetch(new URL("/test-shutdown", serverUrl))} + catch (e) {await unlink(shutdown)} + if (config.production) + exec("npm run pm2-stop", (error, stdout) => { + if (error) throw error; + console.log(stdout); + }); + break; + + case "build": { + const dist = fileURLToPath(new URL("./views/dist", import.meta.url)); + await rm(dist, {force: true, recursive: true}); + await mkdir(dist); + await build({ + entryPoints: [ + "./views/uv/**/*.js", + "./views/assets/js/**/*.js", + "./views/assets/css/**/*.css" + ], + platform: "browser", + sourcemap: true, + bundle: true, + minify: true, + external: ["*.png", "*.jpg", "*.jpeg", "*.webp", "*.svg"], + outdir: dist + }); + break; + } + +// No default case. + } + + +process.exitCode = 0; diff --git a/shutdown.mjs b/shutdown.mjs deleted file mode 100644 index 1a399f20..00000000 --- a/shutdown.mjs +++ /dev/null @@ -1,21 +0,0 @@ -import { readFile, writeFile, unlink } from 'node:fs/promises'; - -const config = Object.freeze(JSON.parse(await readFile(new URL("./src/config.json", import.meta.url)))); - -const serverUrl = (base => { - try { - base = new URL(config.host); - } catch (e) { - base = new URL("http://a"); - base.host = config.host; - } - base.port = process.env.PORT || config.port; - return Object.freeze(base); -})(); - -const shutdown = new URL("./src/.shutdown", import.meta.url); - -await writeFile(shutdown, ""); -try {await fetch(new URL("/test-shutdown", serverUrl))} -catch (e) {await unlink(shutdown)} -process.exitCode = 0;