UNPKG

@shockpkg/ria-packager

Version:

Package for creating Adobe AIR packages

1 lines 40.5 kB
{"version":3,"file":"windows.mjs","names":["copyFile","mkdir","readFile","stat","utimes","writeFile","dirname","join","pathJoin","signatureSet","PathType","createArchiveByFileStatOrThrow","IconIco","NtExecutable","NtExecutableResource","Resource","Data","pathRelativeBaseMatch","pathRelativeBase","align","pngHalfSize","PackagerBundle","IDD_RESOURCE","IDD_BASE_RELOCATION","IMAGE_SCN_CNT_CODE","IMAGE_SCN_CNT_INITIALIZED_DATA","IMAGE_SCN_CNT_UNINITIALIZED_DATA","exeAssertLastSection","exe","index","name","section","getSectionByEntry","Error","allSections","getAllSections","last","info","pointerToRawData","exeRemoveReloc","size","newHeader","optionalHeaderDataDirectory","get","setSectionByEntry","virtualAddress","set","exeUpdateSizes","optionalHeader","fileAlignment","sizeOfCode","sizeOfInitializedData","sizeOfUninitializedData","characteristics","sizeOfRawData","virtualSize","Math","max","PackagerBundleWindows","applicationIconModern","fileTypeIconModern","frameworkCleanHelpers","preserveResourceMtime","architecture","fileVersion","productVersion","versionStrings","constructor","path","getAppBinaryPath","_getFilename","getAppFrameworkPath","getSdkBinaryPath","framework","getSdkFrameworkPath","win","_getArchitecture","getVersionStrings","values","FileVersion","ProductVersion","_getFileMode","executable","_open","sdkPath","appBinaryPath","appFrameworkPath","sdkBinaryPath","sdkFrameworkPath","appBinaryPathFull","appFrameworkPathFull","extractedBinary","extractedFramework","binaryInFrameworkPath","sdk","nobrowse","read","entry","type","RESOURCE_FORK","volumePath","sdkBinaryPathRel","frameworkPathRel","dest","extract","length","st","atime","mtime","_close","appBinaryModifier","_getAppBinaryModifier","_writeResource","destination","data","options","mode","_getResourcePath","recursive","parts","_applicationInfoArchitecture","icons","Promise","all","_encodeApplicationIcon","then","d","_encodeFileTypeIcons","a","b","from","relocRestore","rsrc","IconGroupEntry","fromEntries","entries","VersionInfo","lang","codepage","resIdsNext","iconData","ico","IconFile","iconGroupId","replaceIconsForResource","map","icon","entriesById","Map","resource","id","entryInfo","iconGroup","iconInfo","iconID","generateEntry","versionInfo","createEmpty","setStringValues","uints","_peVersionInts","ms","ls","fixedInfo","fileVersionMS","fileVersionLS","productVersionMS","productVersionLS","outputToResourceEntries","outputResource","Uint8Array","generate","version","split","numbers","part","n","test","push","_uidIcon","paths","image16x16","image32x32","image48x48","image128x128","has","p","s","_getIcon","_encodeIconModern","_encodeIconReference","fileIcons","_getFileTypes","encode","r","did","Set","uid","add","readers","datas","f","addFromPng","_getIcon256x256Data","png","image512x512","image1024x1024","image","x"],"sources":["../../../src/packager/bundle/windows.ts"],"sourcesContent":["import {\n\tcopyFile,\n\tmkdir,\n\treadFile,\n\tstat,\n\tutimes,\n\twriteFile\n} from 'node:fs/promises';\nimport {dirname, join as pathJoin} from 'node:path';\n\nimport {signatureSet} from 'portable-executable-signature';\nimport {\n\tPathType,\n\tcreateArchiveByFileStatOrThrow\n} from '@shockpkg/archive-files';\nimport {IconIco} from '@shockpkg/icon-encoder';\nimport {\n\tNtExecutable,\n\tNtExecutableResource,\n\tResource,\n\tData\n} from '@shockpkg/resedit';\n\nimport {\n\tpathRelativeBaseMatch,\n\tpathRelativeBase,\n\talign,\n\tpngHalfSize\n} from '../../util.ts';\nimport {IPackagerResourceOptions} from '../../packager.ts';\nimport {IIcon, PackagerBundle} from '../bundle.ts';\n\n// IMAGE_DATA_DIRECTORY indexes.\nconst IDD_RESOURCE = 2;\nconst IDD_BASE_RELOCATION = 5;\n\n// IMAGE_SECTION_HEADER characteristics.\nconst IMAGE_SCN_CNT_CODE = 0x00000020;\nconst IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040;\nconst IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080;\n\n/**\n * Assert the given section is last section.\n *\n * @param exe NtExecutable instance.\n * @param index ImageDirectory index.\n * @param name Friendly name for messages.\n */\nfunction exeAssertLastSection(\n\texe: (typeof NtExecutable)['prototype'],\n\tindex: number,\n\tname: string\n) {\n\tconst section = exe.getSectionByEntry(index);\n\tif (!section) {\n\t\tthrow new Error(`Missing section: ${index}:${name}`);\n\t}\n\tconst allSections = exe.getAllSections();\n\tlet last = allSections[0].info;\n\tfor (const {info} of allSections) {\n\t\tif (info.pointerToRawData > last.pointerToRawData) {\n\t\t\tlast = info;\n\t\t}\n\t}\n\tconst {info} = section;\n\tif (info.pointerToRawData < last.pointerToRawData) {\n\t\tthrow new Error(`Not the last section: ${index}:${name}`);\n\t}\n}\n\n/**\n * Removes the reloc section if exists, fails if not the last section.\n *\n * @param exe NtExecutable instance.\n * @returns Restore function.\n */\nfunction exeRemoveReloc(exe: (typeof NtExecutable)['prototype']) {\n\tconst section = exe.getSectionByEntry(IDD_BASE_RELOCATION);\n\tif (!section) {\n\t\treturn () => {};\n\t}\n\tconst {size} =\n\t\texe.newHeader.optionalHeaderDataDirectory.get(IDD_BASE_RELOCATION);\n\texeAssertLastSection(exe, IDD_BASE_RELOCATION, '.reloc');\n\texe.setSectionByEntry(IDD_BASE_RELOCATION, null);\n\treturn () => {\n\t\texe.setSectionByEntry(IDD_BASE_RELOCATION, section);\n\t\tconst {virtualAddress} =\n\t\t\texe.newHeader.optionalHeaderDataDirectory.get(IDD_BASE_RELOCATION);\n\t\texe.newHeader.optionalHeaderDataDirectory.set(IDD_BASE_RELOCATION, {\n\t\t\tvirtualAddress,\n\t\t\tsize\n\t\t});\n\t};\n}\n\n/**\n * Update the sizes in EXE headers.\n *\n * @param exe NtExecutable instance.\n */\nfunction exeUpdateSizes(exe: (typeof NtExecutable)['prototype']) {\n\tconst {optionalHeader} = exe.newHeader;\n\tconst {fileAlignment} = optionalHeader;\n\tlet sizeOfCode = 0;\n\tlet sizeOfInitializedData = 0;\n\tlet sizeOfUninitializedData = 0;\n\tfor (const {\n\t\tinfo: {characteristics, sizeOfRawData, virtualSize}\n\t} of exe.getAllSections()) {\n\t\t// eslint-disable-next-line no-bitwise\n\t\tif (characteristics & IMAGE_SCN_CNT_CODE) {\n\t\t\tsizeOfCode += sizeOfRawData;\n\t\t}\n\t\t// eslint-disable-next-line no-bitwise\n\t\tif (characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA) {\n\t\t\tsizeOfInitializedData += Math.max(\n\t\t\t\tsizeOfRawData,\n\t\t\t\talign(virtualSize, fileAlignment)\n\t\t\t);\n\t\t}\n\t\t// eslint-disable-next-line no-bitwise\n\t\tif (characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA) {\n\t\t\tsizeOfUninitializedData += align(virtualSize, fileAlignment);\n\t\t}\n\t}\n\toptionalHeader.sizeOfCode = sizeOfCode;\n\toptionalHeader.sizeOfInitializedData = sizeOfInitializedData;\n\toptionalHeader.sizeOfUninitializedData = sizeOfUninitializedData;\n}\n\n/**\n * PackagerBundleWindows object.\n */\nexport class PackagerBundleWindows extends PackagerBundle {\n\t/**\n\t * Create modern application icon resource.\n\t * Enables higher resolution 256x256 icon with PNG compression.\n\t * Higher resolutions resized with lanczos from 512x512 or 1024x1024.\n\t * Default false uses the legacy formats of the official packager.\n\t */\n\tpublic applicationIconModern = false;\n\n\t/**\n\t * Create modern document type icon resource.\n\t * Enables higher resolution 256x256 icon with PNG compression.\n\t * Higher resolutions resized with lanczos from 512x512 or 1024x1024.\n\t * Default false uses the legacy formats of the official packager.\n\t */\n\tpublic fileTypeIconModern = false;\n\n\t/**\n\t * Remove unnecessary helper files from framework.\n\t * The official packages will include these.\n\t */\n\tpublic frameworkCleanHelpers = false;\n\n\t/**\n\t * Optionally preserve resource mtime.\n\t * The official packager does not preserve resource mtimes.\n\t */\n\tpublic preserveResourceMtime = false;\n\n\t/**\n\t * Optionally use specific architecture.\n\t */\n\tpublic architecture: 'x86' | 'x64' | null = null;\n\n\t/**\n\t * Version strings.\n\t *\n\t * @default null\n\t */\n\tpublic fileVersion: string | null = null;\n\n\t/**\n\t * Product version.\n\t *\n\t * @default null\n\t */\n\tpublic productVersion: string | null = null;\n\n\t/**\n\t * Version strings.\n\t *\n\t * @default null\n\t */\n\tpublic versionStrings: {[key: string]: string} | null = null;\n\n\t/**\n\t * PackagerBundleWindows constructor.\n\t *\n\t * @param path Output path.\n\t */\n\tconstructor(path: string) {\n\t\tsuper(path);\n\t}\n\n\t/**\n\t * Get app binary path.\n\t *\n\t * @returns Binary path.\n\t */\n\tpublic getAppBinaryPath() {\n\t\treturn `${this._getFilename()}.exe`;\n\t}\n\n\t/**\n\t * Get app framework path.\n\t *\n\t * @returns Framework path.\n\t */\n\tpublic getAppFrameworkPath() {\n\t\treturn 'Adobe AIR';\n\t}\n\n\t/**\n\t * Get SDK binary path.\n\t *\n\t * @returns Binary path.\n\t */\n\tpublic getSdkBinaryPath() {\n\t\tconst framework = this.getSdkFrameworkPath();\n\t\treturn `${framework}/Versions/1.0/Resources/CaptiveAppEntry.exe`;\n\t}\n\n\t/**\n\t * Get SDK framework path.\n\t *\n\t * @returns Framework path.\n\t */\n\tpublic getSdkFrameworkPath() {\n\t\tconst win = this._getArchitecture() === 'x64' ? 'win64' : 'win';\n\t\treturn `runtimes/air-captive/${win}/Adobe AIR`;\n\t}\n\n\t/**\n\t * Get all version strings, if any.\n\t *\n\t * @returns Verion strings.\n\t */\n\tpublic getVersionStrings() {\n\t\tconst {fileVersion, productVersion, versionStrings} = this;\n\t\tif (\n\t\t\tfileVersion === null &&\n\t\t\tproductVersion === null &&\n\t\t\tversionStrings === null\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\t\tconst values = {...versionStrings};\n\t\tif (fileVersion !== null) {\n\t\t\tvalues.FileVersion = fileVersion;\n\t\t}\n\t\tif (productVersion !== null) {\n\t\t\tvalues.ProductVersion = productVersion;\n\t\t}\n\t\treturn values;\n\t}\n\n\t/**\n\t * Get file mode value.\n\t *\n\t * @param executable Is the entry executable.\n\t * @returns File mode.\n\t */\n\tprotected _getFileMode(executable: boolean) {\n\t\treturn executable ? 0b111100100 : 0b110100100;\n\t}\n\n\t/**\n\t * Open implementation.\n\t */\n\tprotected async _open() {\n\t\tconst {sdkPath} = this;\n\t\tif (!sdkPath) {\n\t\t\tthrow new Error('SDK path not set');\n\t\t}\n\n\t\tconst {frameworkCleanHelpers} = this;\n\n\t\tconst appBinaryPath = this.getAppBinaryPath();\n\t\tconst appFrameworkPath = this.getAppFrameworkPath();\n\n\t\tconst sdkBinaryPath = this.getSdkBinaryPath();\n\t\tconst sdkFrameworkPath = this.getSdkFrameworkPath();\n\n\t\tconst appBinaryPathFull = pathJoin(this.path, appBinaryPath);\n\t\tconst appFrameworkPathFull = pathJoin(this.path, appFrameworkPath);\n\n\t\tlet extractedBinary = false;\n\t\tlet extractedFramework = false;\n\n\t\tlet binaryInFrameworkPath = '';\n\n\t\t// Extract everything needed from the SDK.\n\t\tconst sdk = await createArchiveByFileStatOrThrow(sdkPath, {\n\t\t\tnobrowse: this.nobrowse\n\t\t});\n\t\tawait sdk.read(async entry => {\n\t\t\t// Ignore any resource forks.\n\t\t\tif (entry.type === PathType.RESOURCE_FORK) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tconst path = entry.volumePath;\n\n\t\t\tconst sdkBinaryPathRel = pathRelativeBase(\n\t\t\t\tpath,\n\t\t\t\tsdkBinaryPath,\n\t\t\t\ttrue\n\t\t\t);\n\t\t\tconst frameworkPathRel = pathRelativeBase(\n\t\t\t\tpath,\n\t\t\t\tsdkFrameworkPath,\n\t\t\t\ttrue\n\t\t\t);\n\n\t\t\t// Extract if the framework.\n\t\t\tif (frameworkPathRel !== null) {\n\t\t\t\tconst dest = pathJoin(appFrameworkPathFull, frameworkPathRel);\n\t\t\t\textractedFramework = true;\n\n\t\t\t\t// If also the binary, remember it for later.\n\t\t\t\tif (sdkBinaryPathRel === null) {\n\t\t\t\t\tawait entry.extract(dest);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\t// If not removing framework binary, copy into framework.\n\t\t\t\t// Remember where to copy again after.\n\t\t\t\t// Otherwise let it be extracted to destination below.\n\t\t\t\tif (!frameworkCleanHelpers) {\n\t\t\t\t\t// Remember the shortest path, not empty.\n\t\t\t\t\tbinaryInFrameworkPath = binaryInFrameworkPath || dest;\n\t\t\t\t\tif (dest.length < binaryInFrameworkPath.length) {\n\t\t\t\t\t\tbinaryInFrameworkPath = dest;\n\t\t\t\t\t}\n\t\t\t\t\tawait entry.extract(dest);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Copy binary from framework if there.\n\t\t\tif (sdkBinaryPathRel !== null) {\n\t\t\t\tconst dest = pathJoin(appBinaryPathFull, sdkBinaryPathRel);\n\t\t\t\tawait entry.extract(dest);\n\t\t\t\textractedBinary = true;\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Optimization to avoid walking unrelated directories if possible.\n\t\t\treturn pathRelativeBaseMatch(sdkFrameworkPath, path, true) ||\n\t\t\t\tpathRelativeBaseMatch(sdkBinaryPath, path, true)\n\t\t\t\t? true\n\t\t\t\t: null;\n\t\t});\n\n\t\t// If the binary is in framework, copy it.\n\t\tif (binaryInFrameworkPath) {\n\t\t\tconst st = await stat(binaryInFrameworkPath);\n\t\t\tawait copyFile(binaryInFrameworkPath, appBinaryPathFull);\n\t\t\tawait utimes(binaryInFrameworkPath, st.atime, st.mtime);\n\t\t\textractedBinary = true;\n\t\t}\n\n\t\t// Check that required components were extracted.\n\t\tif (!extractedBinary) {\n\t\t\tthrow new Error(`Failed to locate binary in SDK: ${sdkBinaryPath}`);\n\t\t}\n\t\tif (!extractedFramework) {\n\t\t\tthrow new Error(\n\t\t\t\t`Failed to locate framework in SDK: ${sdkFrameworkPath}`\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Close implementation.\n\t */\n\tprotected async _close() {\n\t\tconst appBinaryModifier = await this._getAppBinaryModifier();\n\t\tif (appBinaryModifier) {\n\t\t\tconst appBinaryPath = this.getAppBinaryPath();\n\t\t\tconst appBinaryPathFull = pathJoin(this.path, appBinaryPath);\n\t\t\tawait writeFile(\n\t\t\t\tappBinaryPathFull,\n\t\t\t\tawait appBinaryModifier(await readFile(appBinaryPathFull))\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Write resource with data implementation.\n\t *\n\t * @param destination Packaged file relative destination.\n\t * @param data Resource data.\n\t * @param options Resource options.\n\t */\n\tprotected async _writeResource(\n\t\tdestination: string,\n\t\tdata: Readonly<Uint8Array>,\n\t\toptions: Readonly<IPackagerResourceOptions>\n\t) {\n\t\t// Write resource to file.\n\t\tconst mode = this._getFileMode(options.executable || false);\n\t\tconst dest = this._getResourcePath(destination);\n\t\tawait mkdir(dirname(dest), {recursive: true});\n\t\tawait writeFile(dest, data, {mode});\n\n\t\t// Optionally preserve mtime information.\n\t\tif (this.preserveResourceMtime) {\n\t\t\tconst {mtime} = options;\n\t\t\tif (mtime) {\n\t\t\t\tawait utimes(dest, mtime, mtime);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get path to a resource file.\n\t *\n\t * @param parts Path parts.\n\t * @returns Full path.\n\t */\n\tprotected _getResourcePath(...parts: string[]) {\n\t\treturn pathJoin(this.path, ...parts);\n\t}\n\n\t/**\n\t * Get the configured architecture.\n\t * Prefers the architecture option, descriptor file, then default of x86.\n\t *\n\t * @returns Architecture string.\n\t */\n\tprotected _getArchitecture() {\n\t\treturn (\n\t\t\tthis.architecture ||\n\t\t\t(this._applicationInfoArchitecture === '64' ? 'x64' : 'x86')\n\t\t);\n\t}\n\n\t/**\n\t * Get the main app binary data modifier function if any.\n\t *\n\t * @returns Modifier function or null.\n\t */\n\tprotected async _getAppBinaryModifier() {\n\t\t// Get any version strings.\n\t\tconst versionStrings = this.getVersionStrings();\n\n\t\t// Assemble all of the icons into a list.\n\t\tconst icons = await Promise.all([\n\t\t\tthis._encodeApplicationIcon().then(d => (d ? [d] : [])),\n\t\t\tthis._encodeFileTypeIcons().then(a => a || [])\n\t\t]).then(([a, b]) => [...a, ...b]);\n\n\t\t// Skip if nothing to be changed.\n\t\tif (!versionStrings && !icons.length) {\n\t\t\treturn null;\n\t\t}\n\n\t\treturn async (data: Uint8Array) => {\n\t\t\t// Parse EXE.\n\t\t\tconst exe = NtExecutable.from(signatureSet(data, null, true, true));\n\n\t\t\t// Remove reloc so rsrc can safely be resized.\n\t\t\tconst relocRestore = exeRemoveReloc(exe);\n\n\t\t\t// Remove rsrc to modify.\n\t\t\texeAssertLastSection(exe, IDD_RESOURCE, '.rsrc');\n\t\t\tconst rsrc = NtExecutableResource.from(exe);\n\t\t\texe.setSectionByEntry(IDD_RESOURCE, null);\n\n\t\t\t// Check that icons and version info not present.\n\t\t\tif (Resource.IconGroupEntry.fromEntries(rsrc.entries).length) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Executable resources contains unexpected icons'\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (Resource.VersionInfo.fromEntries(rsrc.entries).length) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Executable resources contains unexpected version info'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// The lang and codepage resource values.\n\t\t\tconst lang = 1033;\n\t\t\tconst codepage = 1252;\n\n\t\t\t// Add icons, resource ID 100 plus.\n\t\t\tlet resIdsNext = 100;\n\t\t\tfor (const iconData of icons) {\n\t\t\t\t// Parse ico.\n\t\t\t\tconst ico = Data.IconFile.from(iconData);\n\n\t\t\t\t// Get the next icon group ID.\n\t\t\t\tconst iconGroupId = resIdsNext++;\n\n\t\t\t\t// Add this group to the list.\n\t\t\t\tResource.IconGroupEntry.replaceIconsForResource(\n\t\t\t\t\trsrc.entries,\n\t\t\t\t\ticonGroupId,\n\t\t\t\t\t0,\n\t\t\t\t\tico.icons.map(icon => icon.data)\n\t\t\t\t);\n\n\t\t\t\t// List all the resources now in the list.\n\t\t\t\tconst entriesById = new Map(\n\t\t\t\t\trsrc.entries.map((resource, index) => [\n\t\t\t\t\t\tresource.id,\n\t\t\t\t\t\t{index, resource}\n\t\t\t\t\t])\n\t\t\t\t);\n\n\t\t\t\t// Get icon group info.\n\t\t\t\tconst entryInfo = entriesById.get(iconGroupId);\n\t\t\t\tif (!entryInfo) {\n\t\t\t\t\tthrow new Error('Internal error');\n\t\t\t\t}\n\n\t\t\t\t// Read icon group entry.\n\t\t\t\tconst [iconGroup] = Resource.IconGroupEntry.fromEntries([\n\t\t\t\t\tentryInfo.resource\n\t\t\t\t]);\n\n\t\t\t\t// Change individual icon resource id values.\n\t\t\t\tfor (const icon of iconGroup.icons) {\n\t\t\t\t\tconst iconInfo = entriesById.get(icon.iconID);\n\t\t\t\t\tif (!iconInfo) {\n\t\t\t\t\t\tthrow new Error('Internal error');\n\t\t\t\t\t}\n\n\t\t\t\t\ticon.iconID = iconInfo.resource.id = resIdsNext++;\n\t\t\t\t}\n\n\t\t\t\t// Update the group entry.\n\t\t\t\trsrc.entries[entryInfo.index] = iconGroup.generateEntry();\n\t\t\t}\n\n\t\t\t// Add the version info if any.\n\t\t\tif (versionStrings) {\n\t\t\t\tconst versionInfo = Resource.VersionInfo.createEmpty();\n\t\t\t\tversionInfo.setStringValues(\n\t\t\t\t\t{\n\t\t\t\t\t\tlang,\n\t\t\t\t\t\tcodepage\n\t\t\t\t\t},\n\t\t\t\t\tversionStrings\n\t\t\t\t);\n\n\t\t\t\t// Update integer values from parsed strings if possible.\n\t\t\t\tconst {FileVersion, ProductVersion} = versionStrings;\n\t\t\t\tif (FileVersion) {\n\t\t\t\t\tconst uints = this._peVersionInts(FileVersion);\n\t\t\t\t\tif (uints) {\n\t\t\t\t\t\tconst [ms, ls] = uints;\n\t\t\t\t\t\tversionInfo.fixedInfo.fileVersionMS = ms;\n\t\t\t\t\t\tversionInfo.fixedInfo.fileVersionLS = ls;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (ProductVersion) {\n\t\t\t\t\tconst uints = this._peVersionInts(ProductVersion);\n\t\t\t\t\tif (uints) {\n\t\t\t\t\t\tconst [ms, ls] = uints;\n\t\t\t\t\t\tversionInfo.fixedInfo.productVersionMS = ms;\n\t\t\t\t\t\tversionInfo.fixedInfo.productVersionLS = ls;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tversionInfo.outputToResourceEntries(rsrc.entries);\n\t\t\t}\n\n\t\t\t// Update the codepage on all resources.\n\t\t\t// Matches the behavior of official packager.\n\t\t\tfor (const entry of rsrc.entries) {\n\t\t\t\tentry.codepage = codepage;\n\t\t\t}\n\n\t\t\t// Update resources.\n\t\t\trsrc.outputResource(exe, false, true);\n\n\t\t\t// Add reloc back.\n\t\t\trelocRestore();\n\n\t\t\t// Update sizes.\n\t\t\texeUpdateSizes(exe);\n\n\t\t\t// Encode new EXE file.\n\t\t\treturn new Uint8Array(exe.generate());\n\t\t};\n\t}\n\n\t/**\n\t * Parse PE version string to integers (MS then LS bits) or null.\n\t *\n\t * @param version Version string.\n\t * @returns Version integers ([MS, LS]) or null.\n\t */\n\tprotected _peVersionInts(version: string): [number, number] | null {\n\t\tconst parts = version.split(/[,.]/);\n\t\tconst numbers = [];\n\t\tfor (const part of parts) {\n\t\t\tconst n = /^\\d+$/.test(part) ? +part : -1;\n\t\t\tif (n < 0 || n > 0xffff) {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\tnumbers.push(n);\n\t\t}\n\t\treturn numbers.length\n\t\t\t? [\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\t(((numbers[0] || 0) << 16) | (numbers[1] || 0)) >>> 0,\n\t\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\t\t(((numbers[2] || 0) << 16) | (numbers[3] || 0)) >>> 0\n\t\t\t\t]\n\t\t\t: null;\n\t}\n\n\t/**\n\t * Calculate UID for icon, or null if none of required icons set.\n\t *\n\t * @param icon Icon info.\n\t * @returns UID string or null.\n\t */\n\tprotected _uidIcon(icon: Readonly<IIcon>) {\n\t\tconst paths = [\n\t\t\ticon.image16x16,\n\t\t\ticon.image32x32,\n\t\t\ticon.image48x48,\n\t\t\ticon.image128x128\n\t\t];\n\n\t\t// If none set, skip.\n\t\tlet has = false;\n\t\tfor (const p of paths) {\n\t\t\tif (p) {\n\t\t\t\thas = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Compute a unique identifier for the used icon set paths.\n\t\treturn has\n\t\t\t? paths.map(s => `${s ? s.length : 0}:${s || ''}`).join('|')\n\t\t\t: null;\n\t}\n\n\t/**\n\t * Encode the application icon if specified.\n\t *\n\t * @returns Encoded icon.\n\t */\n\tprotected async _encodeApplicationIcon() {\n\t\tconst icon = this._getIcon();\n\t\tif (!icon || !this._uidIcon(icon)) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Encode either a modern or a reference icon.\n\t\treturn this.applicationIconModern\n\t\t\t? this._encodeIconModern(icon)\n\t\t\t: this._encodeIconReference(icon);\n\t}\n\n\t/**\n\t * Encode file type icons.\n\t * Avoids writting duplicate icons where the file/data is the same.\n\t *\n\t * @returns Encoded icons.\n\t */\n\tprotected async _encodeFileTypeIcons() {\n\t\tconst fileIcons = this._getFileTypes();\n\t\tif (!fileIcons) {\n\t\t\treturn null;\n\t\t}\n\n\t\t// Encode either a modern or a reference icon.\n\t\tconst encode = this.fileTypeIconModern\n\t\t\t? async (icon: IIcon) => this._encodeIconModern(icon)\n\t\t\t: async (icon: IIcon) => this._encodeIconReference(icon);\n\n\t\tconst r = [];\n\t\tconst did = new Set<string>();\n\t\tfor (const [, {icon}] of fileIcons) {\n\t\t\tif (!icon) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Compute a unique identifier for the used icon set paths.\n\t\t\tconst uid = this._uidIcon(icon);\n\t\t\tif (!uid) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Check if file was already generated for this icon set.\n\t\t\tif (did.has(uid)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdid.add(uid);\n\t\t\tr.push(encode(icon));\n\t\t}\n\t\treturn Promise.all(r);\n\t}\n\n\t/**\n\t * Encode icon matching official format.\n\t *\n\t * @param icon Icon info.\n\t * @returns Encoded icon.\n\t */\n\tprotected async _encodeIconReference(icon: Readonly<IIcon>) {\n\t\t// Add icons in the same order official packager would use.\n\t\tconst ico = new IconIco();\n\t\tconst readers = [];\n\t\tfor (const path of [\n\t\t\ticon.image16x16,\n\t\t\ticon.image48x48,\n\t\t\ticon.image128x128,\n\t\t\ticon.image32x32\n\t\t]) {\n\t\t\tif (path) {\n\t\t\t\treaders.push(async () => readFile(this._getResourcePath(path)));\n\t\t\t}\n\t\t}\n\t\tconst datas = await Promise.all(readers.map(async f => f()));\n\t\tfor (const data of datas) {\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tawait ico.addFromPng(data, false);\n\t\t}\n\t\treturn ico.encode();\n\t}\n\n\t/**\n\t * Encode icon using modern format.\n\t *\n\t * @param icon Icon info.\n\t * @returns Encoded icon.\n\t */\n\tprotected async _encodeIconModern(icon: Readonly<IIcon>) {\n\t\t// Add icons in the same order official packager would use, plus extra.\n\t\tconst ico = new IconIco();\n\t\tconst readers = [];\n\t\tfor (const path of [\n\t\t\ticon.image16x16,\n\t\t\ticon.image48x48,\n\t\t\ticon.image128x128,\n\t\t\ticon.image32x32\n\t\t]) {\n\t\t\tif (path) {\n\t\t\t\treaders.push(async () =>\n\t\t\t\t\treadFile(this._getResourcePath(path)).then(\n\t\t\t\t\t\td => [d, false] as [Buffer, boolean]\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\treaders.push(async () =>\n\t\t\tthis._getIcon256x256Data(icon).then(\n\t\t\t\td => [d, true] as [Uint8Array, boolean]\n\t\t\t)\n\t\t);\n\t\tconst datas = await Promise.all(readers.map(async f => f()));\n\t\tfor (const [data, png] of datas) {\n\t\t\tif (data) {\n\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\tawait ico.addFromPng(data, png);\n\t\t\t}\n\t\t}\n\t\treturn ico.encode();\n\t}\n\n\t/**\n\t * Get 256x256 icon data from icon set.\n\t * Unfortuantely the icon set does not support this icon size.\n\t * This functions will resize a larger icon instead.\n\t * Uses the lanczos algorithm to resize icon down.\n\t *\n\t * @param icon Icon info.\n\t * @returns Encoded icon or null.\n\t */\n\tprotected async _getIcon256x256Data(icon: Readonly<IIcon>) {\n\t\tconst {image512x512, image1024x1024} = icon;\n\n\t\t// Resize 512x512 or 1024x1024 icon down if available.\n\t\tlet image = image512x512;\n\t\tlet x = 1;\n\t\tif (!image) {\n\t\t\timage = image1024x1024;\n\t\t\tx = 2;\n\t\t}\n\n\t\treturn image\n\t\t\t? pngHalfSize(await readFile(this._getResourcePath(image)), x)\n\t\t\t: null;\n\t}\n}\n"],"mappings":"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","ignoreList":[]}