xref: /expo/packages/@expo/cli/src/utils/plist.ts (revision bb5069cd)
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