1import plist from '@expo/plist'; 2import binaryPlist from 'bplist-parser'; 3import fs from 'fs/promises'; 4 5import * as Log from '../log'; 6import { CommandError } from './errors'; 7 8const CHAR_CHEVRON_OPEN = 60; 9const CHAR_B_LOWER = 98; 10// .mobileprovision 11// const CHAR_ZERO = 30; 12 13export async function parsePlistAsync(plistPath: string) { 14 Log.debug(`Parse plist: ${plistPath}`); 15 16 return parsePlistBuffer(await fs.readFile(plistPath)); 17} 18 19export function parsePlistBuffer(contents: Buffer) { 20 if (contents[0] === CHAR_CHEVRON_OPEN) { 21 const info = plist.parse(contents.toString()); 22 if (Array.isArray(info)) return info[0]; 23 return info; 24 } else if (contents[0] === CHAR_B_LOWER) { 25 // @ts-expect-error 26 const info = binaryPlist.parseBuffer(contents); 27 if (Array.isArray(info)) return info[0]; 28 return info; 29 } else { 30 throw new CommandError( 31 'PLIST', 32 `Cannot parse plist of type byte (0x${contents[0].toString(16)})` 33 ); 34 } 35} 36