1
0
mirror of https://github.com/tobspr/shapez.io.git synced 2026-09-24 04:44:59 +00:00
Files
tobspr_shapez.io/gulp/win32-resources.js
2026-09-05 15:33:20 +02:00

56 lines
2.0 KiB
JavaScript

// Sets icon and version info on a packaged Windows executable without rcedit/wine,
// so Windows builds can be produced from macOS or Linux hosts.
const fs = require("fs");
const ResEdit = require("resedit");
const LANG_EN_US = 1033;
const CODEPAGE_UNICODE = 1200;
const ICON_GROUP_ID = 1;
/**
* @param {string} exePath
* @param {{ icon: string, version: string, productName: string, company: string }} opts
*/
function applyWin32Resources(exePath, opts) {
const exe = ResEdit.NtExecutable.from(fs.readFileSync(exePath));
const res = ResEdit.NtExecutableResource.from(exe);
const iconFile = ResEdit.Data.IconFile.from(fs.readFileSync(opts.icon));
ResEdit.Resource.IconGroupEntry.replaceIconsForResource(
res.entries,
ICON_GROUP_ID,
LANG_EN_US,
iconFile.icons.map(icon => icon.data)
);
const parts = opts.version.split(".").map(part => parseInt(part, 10) || 0);
while (parts.length < 4) {
parts.push(0);
}
const [major, minor, patch, build] = parts;
const existing = ResEdit.Resource.VersionInfo.fromEntries(res.entries);
const versionInfo = existing.length > 0 ? existing[0] : ResEdit.Resource.VersionInfo.createEmpty();
versionInfo.setFileVersion(major, minor, patch, build, LANG_EN_US);
versionInfo.setProductVersion(major, minor, patch, build, LANG_EN_US);
versionInfo.setStringValues(
{ lang: LANG_EN_US, codepage: CODEPAGE_UNICODE },
{
FileDescription: opts.productName,
ProductName: opts.productName,
CompanyName: opts.company,
LegalCopyright: opts.company,
OriginalFilename: "shapezio.exe",
InternalName: "shapezio",
FileVersion: opts.version,
ProductVersion: opts.version,
}
);
versionInfo.outputToResourceEntries(res.entries);
res.outputResource(exe);
fs.writeFileSync(exePath, Buffer.from(exe.generate()));
}
module.exports = { applyWin32Resources };