From 9f927b1ef578af0e2c32652e1264a2d63af743cd Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sun, 26 Jul 2026 23:27:08 +0100 Subject: [PATCH] Enhance build process and server version management Refactor build-linux-bundle.mjs to include package version and build number from environment variables and package.json. Update headless.js to streamline initialization and improve error handling. Introduce serverVersion.js to centralize version information retrieval, replacing redundant code in localserver.js. Enhance logging in index.js to display build number and version more clearly. --- scripts/build-linux-bundle.mjs | 16 +++++++++++++++- src/headless.js | 13 ++++++++----- src/index.js | 15 ++++++++++++--- src/localserver/localserver.js | 23 +---------------------- src/serverVersion.js | 29 +++++++++++++++++++++++++++++ 5 files changed, 65 insertions(+), 31 deletions(-) create mode 100644 src/serverVersion.js diff --git a/scripts/build-linux-bundle.mjs b/scripts/build-linux-bundle.mjs index 67aeefa..fa64e56 100644 --- a/scripts/build-linux-bundle.mjs +++ b/scripts/build-linux-bundle.mjs @@ -1,8 +1,20 @@ +import { readFileSync } from 'node:fs' import * as esbuild from 'esbuild' import { fileURLToPath } from 'node:url' import path from 'node:path' const rootDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..') +const packageJson = JSON.parse( + readFileSync(path.join(rootDir, 'package.json'), 'utf8') +) + +let buildNumber = process.env.BUILD_NUMBER || process.env.VITE_BUILD_NUMBER || 'dev' +try { + const buildInfo = JSON.parse( + readFileSync(path.join(rootDir, 'src/buildInfo.json'), 'utf8') + ) + buildNumber = buildInfo.buildNumber ?? buildNumber +} catch {} await esbuild.build({ entryPoints: [path.join(rootDir, 'src/headless.js')], @@ -21,7 +33,9 @@ await esbuild.build({ ], inject: [path.join(rootDir, 'scripts/import-meta-url.js')], define: { - 'import.meta.url': 'import_meta_url' + 'import.meta.url': 'import_meta_url', + 'process.env.FC_PACKAGE_VERSION': JSON.stringify(packageJson.version), + 'process.env.FC_BUILD_NUMBER': JSON.stringify(buildNumber) }, logLevel: 'info' }) diff --git a/src/headless.js b/src/headless.js index dc744bb..fd2d96e 100644 --- a/src/headless.js +++ b/src/headless.js @@ -1,6 +1,9 @@ -import { init } from "./index.js"; +process.env.FC_HEADLESS_ENTRY = "1"; -init({ headless: true }).catch((err) => { - console.error(err.message); - process.exit(1); -}); +import("./index.js") + .then(({ init }) => + init({ headless: true }).catch((err) => { + console.error(err.message); + process.exit(1); + }), + ); diff --git a/src/index.js b/src/index.js index 2867e5b..ce4fa40 100644 --- a/src/index.js +++ b/src/index.js @@ -95,9 +95,18 @@ export async function init(options = {}) { } if (isInfo) { + const buildNumber = + runningServer.buildNumber ?? runningServer.build ?? "n/a"; + logger.info("-----FarmControl Server-----"); - logger.info("Version:", "v" + runningServer.version || "n/a"); - logger.info("Build:", runningServer.build || "n/a"); + logger.info( + "Version:", + runningServer.version ? `v${runningServer.version}` : "n/a", + ); + logger.info( + "Build:", + buildNumber === "dev" ? "dev" : `b${buildNumber}`, + ); logger.info( "Authenticated:", runningServer.authenticated == true ? "Yes" : "No", @@ -167,7 +176,7 @@ const isMainModule = process.argv[1] && fileURLToPath(import.meta.url) === path.resolve(process.argv[1]); -if (isMainModule) { +if (isMainModule && !process.env.FC_HEADLESS_ENTRY) { init().catch((err) => { logger.error(err.message); process.exit(1); diff --git a/src/localserver/localserver.js b/src/localserver/localserver.js index 16a217d..062dd5f 100644 --- a/src/localserver/localserver.js +++ b/src/localserver/localserver.js @@ -1,29 +1,8 @@ -import { readFileSync } from "node:fs"; import express from "express"; import log4js from "log4js"; import { notPrompting } from "../utils.js"; import { loadConfig } from "../config.js"; - -const readJsonFile = (fileUrl) => { - try { - return JSON.parse(readFileSync(fileUrl, "utf8")); - } catch { - return {}; - } -}; - -const packageJsonUrl = new URL("../../package.json", import.meta.url); -const buildInfoUrl = new URL("../buildInfo.json", import.meta.url); - -const getServerVersionInfo = () => { - const packageJson = readJsonFile(packageJsonUrl); - const buildInfo = readJsonFile(buildInfoUrl); - - return { - version: packageJson.version ?? "dev", - buildNumber: buildInfo.buildNumber ?? "dev", - }; -}; +import { getServerVersionInfo } from "../serverVersion.js"; export const LOCAL_SERVER_PORT = 47291; diff --git a/src/serverVersion.js b/src/serverVersion.js new file mode 100644 index 0000000..0dcc629 --- /dev/null +++ b/src/serverVersion.js @@ -0,0 +1,29 @@ +import { readFileSync } from "node:fs"; + +const readJsonFile = (fileUrl) => { + try { + return JSON.parse(readFileSync(fileUrl, "utf8")); + } catch { + return {}; + } +}; + +const packageJsonUrl = new URL("../package.json", import.meta.url); +const buildInfoUrl = new URL("./buildInfo.json", import.meta.url); + +export const getServerVersionInfo = () => { + if (process.env.FC_PACKAGE_VERSION && process.env.FC_BUILD_NUMBER) { + return { + version: process.env.FC_PACKAGE_VERSION, + buildNumber: process.env.FC_BUILD_NUMBER, + }; + } + + const packageJson = readJsonFile(packageJsonUrl); + const buildInfo = readJsonFile(buildInfoUrl); + + return { + version: packageJson.version ?? "dev", + buildNumber: buildInfo.buildNumber ?? "dev", + }; +};