resedit-cli
Version:
Command-line tool for editing Windows Resource data in executable binaries
57 lines (56 loc) • 2.3 kB
JavaScript
import { readFile } from '../fs.js';
import * as log from '../log.js';
function arrayBufferViewToArrayBuffer(view) {
return view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength);
}
export default async function emitRawResources(res, lang, raw) {
var _a;
if (!raw || raw.length === 0) {
return false;
}
log.info(`[raw] Emit raw resources. (count = ${raw.length})`);
for (let i = 0, len = raw.length; i < len; ++i) {
const item = raw[i];
const type = item.type;
const id = item.id;
const itemLang = typeof item.lang === 'undefined' ? lang : item.lang;
let value;
if (typeof item.value !== 'undefined') {
if (typeof item.value === 'string') {
log.debug(`[raw] Use string resource data (type = ${type}, ID = ${id}, lang = ${itemLang})`);
value = arrayBufferViewToArrayBuffer(Buffer.from(item.value, 'utf8'));
}
else if (ArrayBuffer.isView(item.value)) {
log.debug(`[raw] Use ArrayBufferView resource data (type = ${type}, ID = ${id}, lang = ${itemLang})`);
value = arrayBufferViewToArrayBuffer(item.value);
}
else {
log.debug(`[raw] Use ArrayBuffer resource data (type = ${type}, ID = ${id}, lang = ${itemLang})`);
value = item.value;
}
}
else {
log.debug(`[raw] Load resource data from file '${(_a = item.file) !== null && _a !== void 0 ? _a : ''}' (type = ${type}, ID = ${id}, lang = ${itemLang})`);
value = arrayBufferViewToArrayBuffer(await readFile(item.file));
}
const ent = res.entries
.filter((e) => e.type === type && e.id === id && e.lang === itemLang)
.shift();
if (ent) {
log.debug(`[raw] Replace existing resource data.`);
ent.bin = value;
}
else {
log.debug(`[raw] Add resource data.`);
res.entries.push({
type,
id,
lang: itemLang,
codepage: 1200,
bin: value,
});
}
}
log.info(`[raw] Done.`);
return true;
}