{"version":3,"file":"resEdit.js","sourceRoot":"","sources":["../../src/util/resEdit.ts"],"names":[],"mappings":"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","sourcesContent":["import { log } from \"builder-util\"\nimport { readFile, writeFile } from \"fs/promises\"\nimport { Data, NtExecutable, NtExecutableResource, Resource } from \"resedit\"\nimport { RequestedExecutionLevel } from \"../options/winOptions\"\n\nexport interface ResourceEditOptions {\n  file: string\n  versionStrings: Record<string, string>\n  fileVersion: string\n  productVersion: string\n  requestedExecutionLevel?: RequestedExecutionLevel | null\n  iconPath?: string | null\n}\n\nexport async function editWindowsResources(opts: ResourceEditOptions): Promise<void> {\n  const buffer = await readFile(opts.file)\n  const executable = NtExecutable.from(buffer)\n  const res = NtExecutableResource.from(executable)\n\n  const viList = Resource.VersionInfo.fromEntries(res.entries)\n  // Mirror rcedit: create version info from scratch if none exists; use first if multiple\n  const vi = viList.length > 0 ? viList[0] : Resource.VersionInfo.createEmpty()\n  // Mirror rcedit: default to en-US (1033) if no languages present; use first if multiple\n  const languages = vi.getAllLanguagesForStringValues()\n  const lang = languages.length > 0 ? languages[0] : { lang: 0x0409, codepage: 1200 }\n\n  vi.setStringValues(lang, opts.versionStrings)\n  vi.setFileVersion(opts.fileVersion)\n  vi.setProductVersion(opts.productVersion)\n  // resedit normalizes the string to 4-part numeric; restore the original (e.g. \"1.1.0\" or \"3.0.0-beta.2\")\n  vi.setStringValues(lang, { FileVersion: opts.fileVersion })\n  vi.outputToResourceEntries(res.entries)\n\n  if (opts.iconPath) {\n    const iconBuf = await readFile(opts.iconPath)\n    const iconFile = Data.IconFile.from(iconBuf)\n    Resource.IconGroupEntry.replaceIconsForResource(\n      res.entries,\n      1,\n      lang.lang,\n      iconFile.icons.map(i => i.data)\n    )\n  }\n\n  if (opts.requestedExecutionLevel && opts.requestedExecutionLevel !== \"asInvoker\") {\n    patchManifestExecutionLevel(res, opts.requestedExecutionLevel, opts.file)\n  }\n\n  res.outputResource(executable)\n  await writeFile(opts.file, Buffer.from(executable.generate()))\n}\n\nfunction patchManifestExecutionLevel(res: NtExecutableResource, level: string, file: string): void {\n  const manifestEntry = res.entries.find(e => e.type === 24 && e.id === 1)\n  if (!manifestEntry) {\n    log.warn({ file }, \"no RT_MANIFEST resource found; requestedExecutionLevel will not be applied\")\n    return\n  }\n  const originalXml = Buffer.from(manifestEntry.bin).toString(\"utf-8\")\n  const updatedXml = originalXml.replace(/(<requestedExecutionLevel[^>]*\\blevel=\")[^\"]*(\")/i, `$1${level}$2`)\n  if (updatedXml === originalXml) {\n    log.warn({ file, requestedExecutionLevel: level }, \"requestedExecutionLevel node not found in manifest; execution level not updated\")\n    return\n  }\n  const newBuf = Buffer.from(updatedXml, \"utf-8\")\n  manifestEntry.bin = newBuf.buffer.slice(newBuf.byteOffset, newBuf.byteOffset + newBuf.byteLength)\n}\n"]}