# node-plist
**Repository Path**: mirrors_TooTallNate/node-plist
## Basic Information
- **Project Name**: node-plist
- **Description**: Mac OS X Plist parser/builder for Node.js and browsers
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-05-27
- **Last Updated**: 2026-07-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# plist.js
Apple property list parser/builder for Node.js and browsers. Supports **XML**, **binary** (bplist00), and **OpenStep** formats.
[](https://github.com/TooTallNate/plist.js/actions/workflows/ci.yml)
[](https://www.npmjs.com/package/plist)
[](https://bundlephobia.com/package/plist)
**[Try it in the browser →](https://plist.n8.io/)**
## Features
- **Parse** XML, binary, and OpenStep plists — format is auto-detected
- **Build** XML and binary plists from JavaScript objects
- **TypeScript** — written in TypeScript with full type declarations
- **Browser-optimized** — uses native `DOMParser` in browsers (zero dependencies)
- **Lightweight** — ~4 KB gzipped in the browser
## Install
```bash
npm install plist
```
## Quick Start
```ts
import { parse, build } from 'plist';
// Parse any plist format (auto-detected)
const obj = parse('Hello!');
console.log(obj); // "Hello!"
// Build an XML plist from a JS object
const xml = build({ name: 'My App', version: 42 });
console.log(xml);
```
## Parsing
### XML Plists
```ts
import { readFileSync } from 'node:fs';
import { parse } from 'plist';
const xml = readFileSync('Info.plist', 'utf8');
const obj = parse(xml);
```
### Binary Plists
Binary plists (bplist00) are auto-detected when passed as a `Uint8Array` or `ArrayBuffer`. You can also use `parseBinary()` directly:
```ts
import { readFileSync } from 'node:fs';
import { parse, parseBinary } from 'plist';
// Auto-detected from binary data
const buf = readFileSync('Info.plist');
const obj = parse(new Uint8Array(buf));
// Or use parseBinary() directly
const obj2 = parseBinary(new Uint8Array(buf));
```
### OpenStep Plists
The old-style ASCII format (used by `defaults read` on macOS) is auto-detected when the input starts with `{` or `(`:
```ts
import { parse, parseOpenStep } from 'plist';
// Auto-detected
const obj = parse('{ CFBundleName = "My App"; CFBundleVersion = 42; }');
// Or use parseOpenStep() directly
const obj2 = parseOpenStep('( item1, item2, item3 )');
```
## Building
### XML Output
```ts
import { build } from 'plist';
const xml = build({
CFBundleName: 'My App',
CFBundleVersion: '1.0',
LSRequiresIPhoneOS: true,
UISupportedInterfaceOrientations: [
'UIInterfaceOrientationPortrait',
'UIInterfaceOrientationLandscapeLeft',
],
});
```
Output:
```xml
CFBundleName
My App
CFBundleVersion
1.0
LSRequiresIPhoneOS
UISupportedInterfaceOrientations
UIInterfaceOrientationPortrait
UIInterfaceOrientationLandscapeLeft
```
### Binary Output
```ts
import { writeFileSync } from 'node:fs';
import { buildBinary } from 'plist';
const data = buildBinary({
CFBundleName: 'My App',
CFBundleVersion: '1.0',
});
writeFileSync('Info.plist', data);
```
## Type Mapping
| Plist Type | JavaScript Type |
|---|---|
| `` | `string` |
| `` | `number` |
| `` | `number` |
| `` / `` | `boolean` |
| `` | `Date` |
| `` | `Uint8Array` |
| `` | `Array` |
| `` | `Object` |
## Browser Usage
In bundled applications (Vite, webpack, etc.), just import normally — the browser-optimized build is selected automatically via [conditional exports](https://nodejs.org/api/packages.html#conditional-exports):
```ts
import { parse, build } from 'plist';
```
The browser build uses native `DOMParser` and string-based XML building, so `@xmldom/xmldom` and `xmlbuilder` are not included in the bundle.
**[Try the interactive playground →](https://plist.n8.io/)**
## API
### `parse(input)`
Parse a plist. Format is auto-detected.
- **input**: `string | Uint8Array | ArrayBuffer`
- **returns**: `PlistValue`
### `parseBinary(data)`
Parse a binary plist (bplist00).
- **data**: `Uint8Array`
- **returns**: `PlistValue`
### `parseOpenStep(input)`
Parse an OpenStep/ASCII plist.
- **input**: `string`
- **returns**: `PlistValue`
### `build(obj, opts?)`
Build an XML plist string.
- **obj**: `PlistValue`
- **opts.pretty**: `boolean` (default: `true`) — pretty-print with indentation
- **opts.indent**: `string` (default: `" "`) — indentation string
- **opts.newline**: `string` (default: `"\n"`) — newline string
- **returns**: `string`
### `buildBinary(obj)`
Build a binary plist (bplist00).
- **obj**: `PlistValue`
- **returns**: `Uint8Array`
### `PlistValue`
```ts
type PlistValue =
| string
| number
| boolean
| Date
| Uint8Array
| PlistValue[]
| { [key: string]: PlistValue }
| null;
```
## License
[MIT](LICENSE)