UNPKG

@shockpkg/dir-projector

Version:

Package for creating Shockwave Director projectors

1 lines 14.1 kB
{"version":3,"sources":["util/mac.ts"],"names":["Plist","ValueDict","ValueString","fse","once","launcher","FAT_MAGIC","MH_MAGIC","MH_CIGAM","MH_MAGIC_64","MH_CIGAM_64","CPU_TYPE_POWERPC","CPU_TYPE_POWERPC64","CPU_TYPE_I386","CPU_TYPE_X86_64","launcherMappings","Map","plistParse","data","plist","fromXml","plistRead","path","readFile","infoPlistDict","getValue","castAs","infoPlistDictGetValue","key","infoPlistDictSet","value","dict","set","delete","infoPlistBundleExecutableGet","infoPlistBundleExecutableSet","v","infoPlistBundleIconFileGet","infoPlistBundleIconFileSet","infoPlistBundleNameSet","machoTypesData","le","uint32","offset","readUInt32LE","readUInt32BE","type","cpuType","cpuSubtype","magic","r","count","i","push","Error","toString","machoTypesFile","machoAppLauncherThin","id","get","machoAppLauncherFat","types","align","alignSize","head","Buffer","alloc","writeUInt32BE","length","pieces","total","add","pad","over","parts","body","concat","machoAppLauncher","Array","isArray"],"mappings":"AAAA,SACCA,KADD,EAGCC,SAHD,EAICC,WAJD,QAKO,gCALP;AAMA,OAAOC,GAAP,MAAgB,UAAhB;AAEA,SACCC,IADD,EAECC,QAFD,QAGO,aAHP;AAKA,MAAMC,SAAS,GAAG,UAAlB;AACA,MAAMC,QAAQ,GAAG,UAAjB;AACA,MAAMC,QAAQ,GAAG,UAAjB;AACA,MAAMC,WAAW,GAAG,UAApB;AACA,MAAMC,WAAW,GAAG,UAApB;AAEA,MAAMC,gBAAgB,GAAG,UAAzB;AACA,MAAMC,kBAAkB,GAAG,UAA3B;AACA,MAAMC,aAAa,GAAG,UAAtB;AACA,MAAMC,eAAe,GAAG,UAAxB;AAEA,MAAMC,gBAAgB,GAAGX,IAAI,CAAC,MAAM,IAAIY,GAAJ,CAAQ,CAC3C,CAACL,gBAAD,EAAmB,aAAnB,CAD2C,EAE3C,CAACC,kBAAD,EAAqB,eAArB,CAF2C,EAG3C,CAACC,aAAD,EAAgB,cAAhB,CAH2C,EAI3C,CAACC,eAAD,EAAkB,gBAAlB,CAJ2C,CAAR,CAAP,CAA7B;;AAoBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeG,UAAf,CAA0BC,IAA1B,EAAwC;AAC9C,QAAMC,KAAK,GAAG,IAAInB,KAAJ,EAAd;AACAmB,EAAAA,KAAK,CAACC,OAAN,CAAcF,IAAd;AACA,SAAOC,KAAP;AACA;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,eAAeE,SAAf,CAAyBC,IAAzB,EAAuC;AAC7C,SAAOL,UAAU,CAAC,MAAMd,GAAG,CAACoB,QAAJ,CAAaD,IAAb,EAAmB,MAAnB,CAAP,CAAjB;AACA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASE,aAAT,CAAuBL,KAAvB,EAAqC;AAC3C,SAAOA,KAAK,CAACM,QAAN,GAAiBC,MAAjB,CAAwBzB,SAAxB,CAAP;AACA;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAAS0B,qBAAT,CAA+BR,KAA/B,EAA6CS,GAA7C,EAA0D;AAChE,SAAOJ,aAAa,CAACL,KAAD,CAAb,CAAqBM,QAArB,CAA8BG,GAA9B,CAAP;AACA;AAED;AACA;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASC,gBAAT,CACNV,KADM,EAENS,GAFM,EAGNE,KAHM,EAIL;AACD,QAAMC,IAAI,GAAGP,aAAa,CAACL,KAAD,CAA1B;;AACA,MAAIW,KAAJ,EAAW;AACVC,IAAAA,IAAI,CAACC,GAAL,CAASJ,GAAT,EAAcE,KAAd;AACA,GAFD,MAGK;AACJC,IAAAA,IAAI,CAACE,MAAL,CAAYL,GAAZ;AACA;AACD;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASM,4BAAT,CAAsCf,KAAtC,EAAoD;AAC1D,SAAOQ,qBAAqB,CAACR,KAAD,EAAQ,oBAAR,CAArB,CACLO,MADK,CACExB,WADF,EACe4B,KADtB;AAEA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASK,4BAAT,CACNhB,KADM,EAENW,KAFM,EAGL;AACD,QAAMM,CAAC,GAAGN,KAAK,KAAK,IAAV,GAAiB,IAAjB,GAAwB,IAAI5B,WAAJ,CAAgB4B,KAAhB,CAAlC;AACAD,EAAAA,gBAAgB,CAACV,KAAD,EAAQ,oBAAR,EAA8BiB,CAA9B,CAAhB;AACA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASC,0BAAT,CAAoClB,KAApC,EAAkD;AACxD,SAAOQ,qBAAqB,CAACR,KAAD,EAAQ,kBAAR,CAArB,CACLO,MADK,CACExB,WADF,EACe4B,KADtB;AAEA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASQ,0BAAT,CAAoCnB,KAApC,EAAkDW,KAAlD,EAAwE;AAC9E,QAAMM,CAAC,GAAGN,KAAK,KAAK,IAAV,GAAiB,IAAjB,GAAwB,IAAI5B,WAAJ,CAAgB4B,KAAhB,CAAlC;AACAD,EAAAA,gBAAgB,CAACV,KAAD,EAAQ,kBAAR,EAA4BiB,CAA5B,CAAhB;AACA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASG,sBAAT,CAAgCpB,KAAhC,EAA8CW,KAA9C,EAAoE;AAC1E,QAAMM,CAAC,GAAGN,KAAK,KAAK,IAAV,GAAiB,IAAjB,GAAwB,IAAI5B,WAAJ,CAAgB4B,KAAhB,CAAlC;AACAD,EAAAA,gBAAgB,CAACV,KAAD,EAAQ,cAAR,EAAwBiB,CAAxB,CAAhB;AACA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,SAASI,cAAT,CAAwBtB,IAAxB,EAAgD;AACtD,MAAIuB,EAAE,GAAG,KAAT;;AACA,QAAMC,MAAM,GAAIC,MAAD,IACdF,EAAE,GAAGvB,IAAI,CAAC0B,YAAL,CAAkBD,MAAlB,CAAH,GAA+BzB,IAAI,CAAC2B,YAAL,CAAkBF,MAAlB,CADlC;;AAGA,QAAMG,IAAI,GAAIH,MAAD,KAAiC;AAC7CI,IAAAA,OAAO,EAAEL,MAAM,CAACC,MAAD,CAD8B;AAE7CK,IAAAA,UAAU,EAAEN,MAAM,CAACC,MAAM,GAAG,CAAV;AAF2B,GAAjC,CAAb;;AAIA,QAAMM,KAAK,GAAGP,MAAM,CAAC,CAAD,CAApB;;AACA,UAAQO,KAAR;AACC,SAAK3C,SAAL;AAAgB;AACf,cAAM4C,CAAC,GAAG,EAAV;AACA,cAAMC,KAAK,GAAGT,MAAM,CAAC,CAAD,CAApB;AACA,YAAIC,MAAM,GAAG,CAAb;;AACA,aAAK,IAAIS,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGD,KAApB,EAA2BC,CAAC,EAA5B,EAAgC;AAC/BF,UAAAA,CAAC,CAACG,IAAF,CAAOP,IAAI,CAACH,MAAD,CAAX;AACAA,UAAAA,MAAM,IAAI,EAAV;AACA;;AACD,eAAOO,CAAP;AACA;;AACD,SAAK3C,QAAL;AACA,SAAKE,WAAL;AAAkB;AACjB,eAAOqC,IAAI,CAAC,CAAD,CAAX;AACA;;AACD,SAAKtC,QAAL;AACA,SAAKE,WAAL;AAAkB;AACjB+B,QAAAA,EAAE,GAAG,IAAL;AACA,eAAOK,IAAI,CAAC,CAAD,CAAX;AACA;;AACD;AAAS;AACR,cAAM,IAAIQ,KAAJ,CAAW,2BAA0BL,KAAK,CAACM,QAAN,CAAe,EAAf,CAAmB,EAAxD,CAAN;AACA;AAtBF;AAwBA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,eAAeC,cAAf,CAA8BlC,IAA9B,EAA4C;AAClD,SAAOkB,cAAc,CAAC,MAAMrC,GAAG,CAACoB,QAAJ,CAAaD,IAAb,CAAP,CAArB;AACA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,eAAemC,oBAAf,CAAoCX,IAApC,EAAgE;AACtE,QAAM;AAACC,IAAAA;AAAD,MAAYD,IAAlB;AACA,QAAMY,EAAE,GAAG3C,gBAAgB,GAAG4C,GAAnB,CAAuBZ,OAAvB,CAAX;;AACA,MAAI,CAACW,EAAL,EAAS;AACR,UAAM,IAAIJ,KAAJ,CAAW,uBAAsBP,OAAO,CAACQ,QAAR,CAAiB,EAAjB,CAAqB,EAAtD,CAAN;AACA;;AACD,SAAOlD,QAAQ,CAACqD,EAAD,CAAf;AACA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,eAAeE,mBAAf,CACNC,KADM,EAEL;AACD;AACA,QAAMC,KAAK,GAAG,EAAd,CAFC,CAGD;;AACA,QAAMC,SAAS,GAAI,KAAKD,KAAN,KAAiB,CAAnC,CAJC,CAMD;;AACA,QAAME,IAAI,GAAGC,MAAM,CAACC,KAAP,CAAa,CAAb,CAAb;AACAF,EAAAA,IAAI,CAACG,aAAL,CAAmB7D,SAAnB,EAA8B,CAA9B;AACA0D,EAAAA,IAAI,CAACG,aAAL,CAAmBN,KAAK,CAACO,MAAzB,EAAiC,CAAjC,EATC,CAWD;;AACA,QAAMC,MAAM,GAAG,CAACL,IAAD,CAAf;AACA,MAAIM,KAAK,GAAGN,IAAI,CAACI,MAAjB,CAbC,CAeD;;AACA,QAAMG,GAAG,GAAIrD,IAAD,IAAkB;AAC7BmD,IAAAA,MAAM,CAAChB,IAAP,CAAYnC,IAAZ;AACAoD,IAAAA,KAAK,IAAIpD,IAAI,CAACkD,MAAd;AACA,GAHD;;AAIA,QAAMI,GAAG,GAAG,MAAM;AACjB,UAAMC,IAAI,GAAGH,KAAK,GAAGP,SAArB;;AACA,QAAIU,IAAJ,EAAU;AACTF,MAAAA,GAAG,CAACN,MAAM,CAACC,KAAP,CAAaH,SAAS,GAAGU,IAAzB,CAAD,CAAH;AACA;AACD,GALD,CApBC,CA2BD;;;AACA,QAAMC,KAAK,GAAG,EAAd;;AACA,OAAK,MAAM5B,IAAX,IAAmBe,KAAnB,EAA0B;AACzB,UAAMG,IAAI,GAAGC,MAAM,CAACC,KAAP,CAAa,EAAb,CAAb;AACAF,IAAAA,IAAI,CAACG,aAAL,CAAmBrB,IAAI,CAACC,OAAxB,EAAiC,CAAjC;AACAiB,IAAAA,IAAI,CAACG,aAAL,CAAmBrB,IAAI,CAACE,UAAxB,EAAoC,CAApC;AACAgB,IAAAA,IAAI,CAACG,aAAL,CAAmBL,KAAnB,EAA0B,EAA1B;AACAY,IAAAA,KAAK,CAACrB,IAAN,CAAW;AACVW,MAAAA,IADU;AAEV;AACAW,MAAAA,IAAI,EAAE,MAAMlB,oBAAoB,CAACX,IAAD;AAHtB,KAAX;AAKAyB,IAAAA,GAAG,CAACP,IAAD,CAAH;AACA,GAxCA,CA0CD;;;AACA,OAAK,MAAM;AAACA,IAAAA,IAAD;AAAOW,IAAAA;AAAP,GAAX,IAA2BD,KAA3B,EAAkC;AACjCF,IAAAA,GAAG;AACHR,IAAAA,IAAI,CAACG,aAAL,CAAmBG,KAAnB,EAA0B,CAA1B;AACAN,IAAAA,IAAI,CAACG,aAAL,CAAmBQ,IAAI,CAACP,MAAxB,EAAgC,EAAhC;AACAG,IAAAA,GAAG,CAACI,IAAD,CAAH;AACA,GAhDA,CAkDD;;;AACA,SAAOV,MAAM,CAACW,MAAP,CAAcP,MAAd,EAAsBC,KAAtB,CAAP;AACA;AAED;AACA;AACA;AACA;AACA;AACA;;AACA,OAAO,eAAeO,gBAAf,CACNhB,KADM,EAEL;AACD,SAAOiB,KAAK,CAACC,OAAN,CAAclB,KAAd,IACND,mBAAmB,CAACC,KAAD,CADb,GAENJ,oBAAoB,CAACI,KAAD,CAFrB;AAGA","sourcesContent":["import {\n\tPlist,\n\tValue,\n\tValueDict,\n\tValueString\n} from '@shockpkg/plist-dom';\nimport fse from 'fs-extra';\n\nimport {\n\tonce,\n\tlauncher\n} from '../util';\n\nconst FAT_MAGIC = 0xCAFEBABE;\nconst MH_MAGIC = 0xFEEDFACE;\nconst MH_CIGAM = 0xCEFAEDFE;\nconst MH_MAGIC_64 = 0xFEEDFACF;\nconst MH_CIGAM_64 = 0xCFFAEDFE;\n\nconst CPU_TYPE_POWERPC = 0x00000012;\nconst CPU_TYPE_POWERPC64 = 0x01000012;\nconst CPU_TYPE_I386 = 0x00000007;\nconst CPU_TYPE_X86_64 = 0x01000007;\n\nconst launcherMappings = once(() => new Map([\n\t[CPU_TYPE_POWERPC, 'mac-app-ppc'],\n\t[CPU_TYPE_POWERPC64, 'mac-app-ppc64'],\n\t[CPU_TYPE_I386, 'mac-app-i386'],\n\t[CPU_TYPE_X86_64, 'mac-app-x86_64']\n]));\n\nexport interface IMachoType {\n\n\t/**\n\t * CPU type.\n\t */\n\tcpuType: number;\n\n\t/**\n\t * CPU subtype.\n\t */\n\tcpuSubtype: number;\n}\n\n/**\n * Parse plist data.\n * Currently only supports XML plist.\n *\n * @param data Plist XML.\n * @returns Plist document.\n */\nexport async function plistParse(data: string) {\n\tconst plist = new Plist();\n\tplist.fromXml(data);\n\treturn plist;\n}\n\n/**\n * Read plist file.\n * Currently only supports XML plist.\n *\n * @param path Plist file.\n * @returns Plist document.\n */\nexport async function plistRead(path: string) {\n\treturn plistParse(await fse.readFile(path, 'utf8'));\n}\n\n/**\n * Get Info.plist dictionary or throw.\n *\n * @param plist Plist document.\n * @returns Dictionary object.\n */\nexport function infoPlistDict(plist: Plist) {\n\treturn plist.getValue().castAs(ValueDict);\n}\n\n/**\n * Get Info.plist dictionary value or throw.\n *\n * @param plist Plist document.\n * @param key Dictionary key.\n * @returns Value object.\n */\nexport function infoPlistDictGetValue(plist: Plist, key: string) {\n\treturn infoPlistDict(plist).getValue(key);\n}\n\n/**\n * Set Info.plist dictionary value or throw.\n *\n * @param plist Plist document.\n * @param key Dictionary key.\n * @param value Value object.\n */\nexport function infoPlistDictSet(\n\tplist: Plist,\n\tkey: string,\n\tvalue: Value | null\n) {\n\tconst dict = infoPlistDict(plist);\n\tif (value) {\n\t\tdict.set(key, value);\n\t}\n\telse {\n\t\tdict.delete(key);\n\t}\n}\n\n/**\n * Get Info.plist bundle executable.\n *\n * @param plist Plist document.\n * @returns Executable name.\n */\nexport function infoPlistBundleExecutableGet(plist: Plist) {\n\treturn infoPlistDictGetValue(plist, 'CFBundleExecutable')\n\t\t.castAs(ValueString).value;\n}\n\n/**\n * Set Info.plist bundle executable.\n *\n * @param plist Plist document.\n * @param value Executable name.\n */\nexport function infoPlistBundleExecutableSet(\n\tplist: Plist,\n\tvalue: string | null\n) {\n\tconst v = value === null ? null : new ValueString(value);\n\tinfoPlistDictSet(plist, 'CFBundleExecutable', v);\n}\n\n/**\n * Get Info.plist bundle icon.\n *\n * @param plist Plist document.\n * @returns Icon name.\n */\nexport function infoPlistBundleIconFileGet(plist: Plist) {\n\treturn infoPlistDictGetValue(plist, 'CFBundleIconFile')\n\t\t.castAs(ValueString).value;\n}\n\n/**\n * Set Info.plist bundle icon.\n *\n * @param plist Plist document.\n * @param value Icon name.\n */\nexport function infoPlistBundleIconFileSet(plist: Plist, value: string | null) {\n\tconst v = value === null ? null : new ValueString(value);\n\tinfoPlistDictSet(plist, 'CFBundleIconFile', v);\n}\n\n/**\n * Set Info.plist bundle name.\n *\n * @param plist Plist document.\n * @param value Icon name.\n */\nexport function infoPlistBundleNameSet(plist: Plist, value: string | null) {\n\tconst v = value === null ? null : new ValueString(value);\n\tinfoPlistDictSet(plist, 'CFBundleName', v);\n}\n\n/**\n * Get types of Mach-O data, array if FAT binary, else a single object.\n *\n * @param data Mach-O data.\n * @returns Mach-O types.\n */\nexport function machoTypesData(data: Readonly<Buffer>) {\n\tlet le = false;\n\tconst uint32 = (offset: number) => (\n\t\tle ? data.readUInt32LE(offset) : data.readUInt32BE(offset)\n\t);\n\tconst type = (offset: number): IMachoType => ({\n\t\tcpuType: uint32(offset),\n\t\tcpuSubtype: uint32(offset + 4)\n\t});\n\tconst magic = uint32(0);\n\tswitch (magic) {\n\t\tcase FAT_MAGIC: {\n\t\t\tconst r = [];\n\t\t\tconst count = uint32(4);\n\t\t\tlet offset = 8;\n\t\t\tfor (let i = 0; i < count; i++) {\n\t\t\t\tr.push(type(offset));\n\t\t\t\toffset += 20;\n\t\t\t}\n\t\t\treturn r;\n\t\t}\n\t\tcase MH_MAGIC:\n\t\tcase MH_MAGIC_64: {\n\t\t\treturn type(4);\n\t\t}\n\t\tcase MH_CIGAM:\n\t\tcase MH_CIGAM_64: {\n\t\t\tle = true;\n\t\t\treturn type(4);\n\t\t}\n\t\tdefault: {\n\t\t\tthrow new Error(`Unknown header magic: 0x${magic.toString(16)}`);\n\t\t}\n\t}\n}\n\n/**\n * Get types of Mach-O file, array if FAT binary, else a single object.\n *\n * @param path Mach-O file.\n * @returns Mach-O types.\n */\nexport async function machoTypesFile(path: string) {\n\treturn machoTypesData(await fse.readFile(path));\n}\n\n/**\n * Get Mach-O app launcher for a single type.\n *\n * @param type Mach-O type.\n * @returns Launcher data.\n */\nexport async function machoAppLauncherThin(type: Readonly<IMachoType>) {\n\tconst {cpuType} = type;\n\tconst id = launcherMappings().get(cpuType);\n\tif (!id) {\n\t\tthrow new Error(`Unknown CPU type: 0x${cpuType.toString(16)}`);\n\t}\n\treturn launcher(id);\n}\n\n/**\n * Get Mach-O app launcher for a type list.\n *\n * @param types Mach-O types.\n * @returns Launcher data.\n */\nexport async function machoAppLauncherFat(\n\ttypes: Readonly<Readonly<IMachoType>[]>\n) {\n\t// The lipo utility always uses 12/4096 for ppc, ppc64, i386, and x86_64.\n\tconst align = 12;\n\t// eslint-disable-next-line no-bitwise\n\tconst alignSize = (1 << align) >>> 0;\n\n\t// Create the FAT header.\n\tconst head = Buffer.alloc(8);\n\thead.writeUInt32BE(FAT_MAGIC, 0);\n\thead.writeUInt32BE(types.length, 4);\n\n\t// The pieces and their total length.\n\tconst pieces = [head];\n\tlet total = head.length;\n\n\t// Helpers for add and pad pieces, updating the total length.\n\tconst add = (data: Buffer) => {\n\t\tpieces.push(data);\n\t\ttotal += data.length;\n\t};\n\tconst pad = () => {\n\t\tconst over = total % alignSize;\n\t\tif (over) {\n\t\t\tadd(Buffer.alloc(alignSize - over));\n\t\t}\n\t};\n\n\t// Create a head and get the body for each type.\n\tconst parts = [];\n\tfor (const type of types) {\n\t\tconst head = Buffer.alloc(20);\n\t\thead.writeUInt32BE(type.cpuType, 0);\n\t\thead.writeUInt32BE(type.cpuSubtype, 4);\n\t\thead.writeUInt32BE(align, 16);\n\t\tparts.push({\n\t\t\thead,\n\t\t\t// eslint-disable-next-line no-await-in-loop\n\t\t\tbody: await machoAppLauncherThin(type)\n\t\t});\n\t\tadd(head);\n\t}\n\n\t// Add binaries aligned, updating their headers.\n\tfor (const {head, body} of parts) {\n\t\tpad();\n\t\thead.writeUInt32BE(total, 8);\n\t\thead.writeUInt32BE(body.length, 12);\n\t\tadd(body);\n\t}\n\n\t// Merge all the pieces.\n\treturn Buffer.concat(pieces, total);\n}\n\n/**\n * Get Mach-O app launcher for a single or multiple types.\n *\n * @param types Mach-O types.\n * @returns Launcher data.\n */\nexport async function machoAppLauncher(\n\ttypes: Readonly<IMachoType> | Readonly<Readonly<IMachoType>[]>\n) {\n\treturn Array.isArray(types) ?\n\t\tmachoAppLauncherFat(types) :\n\t\tmachoAppLauncherThin(types as IMachoType);\n}\n"],"file":"mac.mjs","sourceRoot":"../../src"}