{"version":3,"file":"windows.mjs","names":["stat","readFile","writeFile","mkdir","basename","dirname","ArchiveDir","PathType","createArchiveByFileExtensionOrThrow","windowsProjectorPatch","ProjectorSa","concat","ProjectorSaWindows","iconData","iconFile","versionStrings","removeCodeSignature","patchWindowTitle","patchOutOfDateDisable","constructor","path","extension","getIconData","d","Uint8Array","buffer","byteOffset","byteLength","_writePlayer","player","extLower","toLowerCase","archive","isPlayer","st","endsWith","isFile","name","subpaths","isDirectory","nobrowse","patches","_getPatches","extract","entry","dest","type","FILE","data","patch","match","volumePath","read","Error","modify","recursive","setAttributes","ignoreTimes","playerPath","Promise","all","map","p","after","_getPatchBinary","_getPatchMovie","filter","Boolean","file","movieData","getMovieData","_encodeMovieData"],"sources":["../../../src/projector/sa/windows.ts"],"sourcesContent":["import {stat, readFile, writeFile, mkdir} from 'node:fs/promises';\nimport {basename, dirname} from 'node:path';\n\nimport {\n\tArchiveDir,\n\tEntry,\n\tPathType,\n\tcreateArchiveByFileExtensionOrThrow\n} from '@shockpkg/archive-files';\n\nimport {windowsProjectorPatch} from '../../util/windows.ts';\nimport {IFilePatch, ProjectorSa} from '../sa.ts';\nimport {concat} from '../../util/internal/data.ts';\n\n/**\n * ProjectorSaWindows object.\n */\nexport class ProjectorSaWindows extends ProjectorSa {\n\t/**\n\t * Icon data.\n\t */\n\tpublic iconData:\n\t\t| Readonly<Uint8Array>\n\t\t| (() => Readonly<Uint8Array>)\n\t\t| (() => Promise<Readonly<Uint8Array>>)\n\t\t| null = null;\n\n\t/**\n\t * Icon file.\n\t */\n\tpublic iconFile: string | null = null;\n\n\t/**\n\t * Version strings.\n\t */\n\tpublic versionStrings: Readonly<{[key: string]: string}> | null = null;\n\n\t/**\n\t * Remove the code signature.\n\t */\n\tpublic removeCodeSignature = false;\n\n\t/**\n\t * Attempt to patch the window title with a custom title.\n\t * Set to string to automatically patch the binary if possible.\n\t */\n\tpublic patchWindowTitle: string | null = null;\n\n\t/**\n\t * Disable the out-of-date check introduced in version 30.\n\t * Important since version 35 where there are 90 and 180 day defaults.\n\t */\n\tpublic patchOutOfDateDisable = false;\n\n\t/**\n\t * ProjectorSaWindows 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 * @inheritdoc\n\t */\n\tpublic get extension() {\n\t\treturn '.exe';\n\t}\n\n\t/**\n\t * Get icon data if any specified, from data or file.\n\t *\n\t * @returns Icon data or null.\n\t */\n\tpublic async getIconData() {\n\t\tconst {iconData, iconFile} = this;\n\t\tif (iconData) {\n\t\t\treturn typeof iconData === 'function' ? iconData() : iconData;\n\t\t}\n\t\tif (iconFile) {\n\t\t\tconst d = await readFile(iconFile);\n\t\t\treturn new Uint8Array(d.buffer, d.byteOffset, d.byteLength);\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * @inheritdoc\n\t */\n\tprotected async _writePlayer(player: string) {\n\t\tconst {path, extension} = this;\n\t\tconst extLower = extension.toLowerCase();\n\n\t\tlet archive;\n\t\tlet isPlayer: (path: string) => boolean;\n\t\tlet st = player.toLowerCase().endsWith(extLower)\n\t\t\t? await stat(player)\n\t\t\t: null;\n\t\tif (st?.isFile()) {\n\t\t\tconst name = basename(player);\n\t\t\tarchive = new ArchiveDir(dirname(player));\n\t\t\tarchive.subpaths = [name];\n\t\t\t// eslint-disable-next-line jsdoc/require-jsdoc\n\t\t\tisPlayer = (path: string) => path === name;\n\t\t} else {\n\t\t\tst ??= await stat(player);\n\t\t\tarchive = st.isDirectory()\n\t\t\t\t? new ArchiveDir(player)\n\t\t\t\t: createArchiveByFileExtensionOrThrow(player, {\n\t\t\t\t\t\tnobrowse: this.nobrowse\n\t\t\t\t\t});\n\t\t\t// eslint-disable-next-line jsdoc/require-jsdoc\n\t\t\tisPlayer = (path: string) => path.toLowerCase().endsWith(extLower);\n\t\t}\n\n\t\tconst patches = await this._getPatches();\n\n\t\t/**\n\t\t * Extract entry, and also apply patches if any.\n\t\t *\n\t\t * @param entry Archive entry.\n\t\t * @param dest Output path.\n\t\t */\n\t\tconst extract = async (entry: Entry, dest: string) => {\n\t\t\tif (entry.type === PathType.FILE) {\n\t\t\t\tlet data: Uint8Array | null = null;\n\t\t\t\tfor (const patch of patches) {\n\t\t\t\t\t// eslint-disable-next-line unicorn/prefer-regexp-test\n\t\t\t\t\tif (patch.match(entry.volumePath)) {\n\t\t\t\t\t\tif (!data) {\n\t\t\t\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\t\t\t\tconst d = await entry.read();\n\t\t\t\t\t\t\tif (!d) {\n\t\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t\t`Failed to read: ${entry.volumePath}`\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdata = new Uint8Array(\n\t\t\t\t\t\t\t\td.buffer,\n\t\t\t\t\t\t\t\td.byteOffset,\n\t\t\t\t\t\t\t\td.byteLength\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\t\t\t\tdata = await patch.modify(data);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (data) {\n\t\t\t\t\tawait mkdir(dirname(dest), {recursive: true});\n\t\t\t\t\tawait writeFile(dest, data);\n\t\t\t\t\tawait entry.setAttributes(dest, null, {\n\t\t\t\t\t\tignoreTimes: true\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tawait entry.extract(dest);\n\t\t};\n\n\t\tlet playerPath = '';\n\t\tawait archive.read(async entry => {\n\t\t\tconst {volumePath, type} = entry;\n\n\t\t\t// Only looking for regular files, no resource forks.\n\t\t\tif (type !== PathType.FILE) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Ignore files that are not the player file.\n\t\t\tif (!isPlayer(volumePath)) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (playerPath) {\n\t\t\t\tthrow new Error(`Found multiple players in: ${player}`);\n\t\t\t}\n\t\t\tplayerPath = volumePath;\n\n\t\t\tawait extract(entry, path);\n\t\t\treturn true;\n\t\t});\n\n\t\tif (!playerPath) {\n\t\t\tthrow new Error(`Failed to locate player in: ${player}`);\n\t\t}\n\n\t\tawait Promise.all(patches.map(async p => p.after()));\n\t}\n\n\t/**\n\t * Get patches to apply.\n\t *\n\t * @returns Patches list.\n\t */\n\tprotected async _getPatches() {\n\t\treturn (\n\t\t\tawait Promise.all([this._getPatchBinary(), this._getPatchMovie()])\n\t\t).filter(Boolean) as IFilePatch[];\n\t}\n\n\t/**\n\t * Get patch for binary.\n\t *\n\t * @returns Patch spec.\n\t */\n\tprotected async _getPatchBinary() {\n\t\tconst {\n\t\t\tversionStrings,\n\t\t\tremoveCodeSignature,\n\t\t\tpatchWindowTitle,\n\t\t\tpatchOutOfDateDisable\n\t\t} = this;\n\t\tconst iconData = await this.getIconData();\n\t\tif (\n\t\t\t!(\n\t\t\t\ticonData ||\n\t\t\t\tversionStrings ||\n\t\t\t\tremoveCodeSignature ||\n\t\t\t\tpatchWindowTitle !== null ||\n\t\t\t\tpatchOutOfDateDisable\n\t\t\t)\n\t\t) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst patch: IFilePatch = {\n\t\t\t/**\n\t\t\t * @inheritdoc\n\t\t\t */\n\t\t\tmatch: (file: string) => true,\n\n\t\t\t/**\n\t\t\t * @inheritdoc\n\t\t\t */\n\t\t\tmodify: (data: Uint8Array) =>\n\t\t\t\twindowsProjectorPatch(data, {\n\t\t\t\t\ticonData,\n\t\t\t\t\tversionStrings,\n\t\t\t\t\tremoveCodeSignature,\n\t\t\t\t\tpatchWindowTitle,\n\t\t\t\t\tpatchOutOfDateDisable\n\t\t\t\t}),\n\n\t\t\t/**\n\t\t\t * @inheritdoc\n\t\t\t */\n\t\t\tafter: () => {}\n\t\t};\n\t\treturn patch;\n\t}\n\n\t/**\n\t * Get patch for movie.\n\t *\n\t * @returns Patch spec.\n\t */\n\tprotected async _getPatchMovie() {\n\t\tconst movieData = await this.getMovieData();\n\t\tif (!movieData) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst patch: IFilePatch = {\n\t\t\t/**\n\t\t\t * @inheritdoc\n\t\t\t */\n\t\t\tmatch: (file: string) => true,\n\n\t\t\t/**\n\t\t\t * @inheritdoc\n\t\t\t */\n\t\t\tmodify: (data: Uint8Array) =>\n\t\t\t\tconcat([data, this._encodeMovieData(movieData, 'dms')]),\n\n\t\t\t/**\n\t\t\t * @inheritdoc\n\t\t\t */\n\t\t\tafter: () => {}\n\t\t};\n\t\treturn patch;\n\t}\n}\n"],"mappings":"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","ignoreList":[]}