monitor/scripts/build/utils.ts
2025-04-16 22:30:27 +07:00

123 lines
4.4 KiB
TypeScript

import fs from 'node:fs';
import path from 'node:path';
import { SemVer } from 'semver';
import config from './config';
/**
* txAdmin in ASCII
*/
export const txAdminASCII = () => {
//NOTE: precalculating the ascii art for efficiency
// const figlet = require('figlet');
// let ascii = figlet.textSync('txAdmin');
// let b64 = Buffer.from(ascii).toString('base64');
// console.log(b64);
const preCalculated = `ICBfICAgICAgICAgICAgXyAgICAgICBfICAgICAgICAgICBfICAgICAgIAogfCB8X19fICBfX
yAgIC8gXCAgIF9ffCB8XyBfXyBfX18gKF8pXyBfXyAgCiB8IF9fXCBcLyAvICAvIF8gXCAvIF9gIHwgJ18gYCBfIFx8IHwg
J18gXCAKIHwgfF8gPiAgPCAgLyBfX18gXCAoX3wgfCB8IHwgfCB8IHwgfCB8IHwgfAogIFxfXy9fL1xfXC9fLyAgIFxfXF9
fLF98X3wgfF98IHxffF98X3wgfF98CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA=`;
return Buffer.from(preCalculated, 'base64').toString('ascii');
};
/**
* txAdmin + license banner for bundled files
*/
export const licenseBanner = (baseDir = '.', isBundledFile = false) => {
const licensePath = path.join(baseDir, 'LICENSE');
const rootPrefix = isBundledFile ? '../' : '';
const lineSep = '%'.repeat(80);
const logoPad = ' '.repeat(18);
const contentLines = [
lineSep,
...txAdminASCII().split('\n').map((x) => logoPad + x),
lineSep,
'Author: André Tabarra (https://github.com/tabarra)',
'Repository: https://github.com/tabarra/txAdmin',
'txAdmin is a free open source software provided under the license below.',
lineSep,
...fs.readFileSync(licensePath, 'utf8').trim().split('\n'),
lineSep,
'This distribution also includes third party code under their own licenses, which',
`can be found in ${rootPrefix}THIRD-PARTY-LICENSES.txt or their respective repositories.`,
`Attribution for non-code assets can be found at the bottom of ${rootPrefix}README.md or at`,
'the top of the respective file.',
lineSep,
];
if (isBundledFile) {
const flattened = contentLines.join('\n * ');
return `/*!\n * ${flattened}\n */`;
} else {
return contentLines.join('\n');
}
};
/**
* Processes a fxserver path to validate it as well as the monitor folder.
* NOTE: this function is windows only, but could be easily adapted.
*/
export const getFxsPaths = (fxserverPath: string) => {
const root = path.normalize(fxserverPath);
//Process fxserver path
const bin = path.join(root, 'FXServer.exe');
const binStat = fs.statSync(bin);
if (!binStat.isFile()) {
throw new Error(`${bin} is not a file.`);
}
//Process monitor path
const monitor = path.join(root, 'citizen', 'system_resources', 'monitor');
const monitorStat = fs.statSync(monitor);
if (!monitorStat.isDirectory()) {
throw new Error(`${monitor} is not a directory.`);
}
return { root, bin, monitor };
};
/**
* Extracts the version from the GITHUB_REF env var and detects if pre-release
* NOTE: to run locally: `GITHUB_REF="refs/tags/v9.9.9" npm run build`
*/
export const getPublishVersion = (isOptional: boolean) => {
return {
txVersion: '9.9.9-dev',
isPreRelease: true,
preReleaseExpiration: '0',
};
};
/**
* Edits the ./dist/fxmanifest.lua to include the txAdmin version.
* TODO: set up *_scripts automagically
*/
const setupDistFxmanifest = (targetPath: string, txVersion: string) => {
// console.log('[BUILDER] Setting up fxmanifest.lua: ' + txVersion);
const fxManifestPath = path.join(targetPath, 'fxmanifest.lua');
let fxManifestContent = fs.readFileSync(fxManifestPath, 'utf8');
fxManifestContent = fxManifestContent.replace(/^version 'REPLACE-VERSION'$/m, `version '${txVersion}'`);
fs.writeFileSync(fxManifestPath, fxManifestContent);
};
/**
* Sync the files from local path to target path.
* This function tried to remove the files before copying new ones,
* therefore, first make sure the path is correct.
* NOTE: each change, it resets the entire target path.
*/
export const copyStaticFiles = (targetPath: string, txVersion: string, eventName: string) => {
console.log(`[COPIER][${eventName}] Syncing ${targetPath}.`);
for (const srcPath of config.copy) {
const destPath = path.join(targetPath, srcPath);
fs.rmSync(destPath, { recursive: true, force: true });
fs.cpSync(srcPath, destPath, { recursive: true });
}
setupDistFxmanifest(targetPath, txVersion);
};