plist 4.0.0 → 5.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +176 -111
- package/dist/build-binary.d.ts +6 -0
- package/dist/build-binary.d.ts.map +1 -0
- package/dist/build-binary.js +284 -0
- package/dist/build-binary.js.map +1 -0
- package/dist/build.browser.d.ts +16 -0
- package/dist/build.browser.d.ts.map +1 -0
- package/dist/build.browser.js +101 -0
- package/dist/build.browser.js.map +1 -0
- package/dist/build.d.ts +16 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +94 -0
- package/dist/build.js.map +1 -0
- package/dist/index.browser.d.ts +7 -0
- package/dist/index.browser.d.ts.map +1 -0
- package/dist/index.browser.js +6 -0
- package/dist/index.browser.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/parse-binary.d.ts +6 -0
- package/dist/parse-binary.d.ts.map +1 -0
- package/dist/parse-binary.js +130 -0
- package/dist/parse-binary.js.map +1 -0
- package/dist/parse-openstep.d.ts +6 -0
- package/dist/parse-openstep.d.ts.map +1 -0
- package/dist/parse-openstep.js +197 -0
- package/dist/parse-openstep.js.map +1 -0
- package/dist/parse.browser.d.ts +11 -0
- package/dist/parse.browser.d.ts.map +1 -0
- package/dist/parse.browser.js +208 -0
- package/dist/parse.browser.js.map +1 -0
- package/dist/parse.d.ts +11 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +209 -0
- package/dist/parse.js.map +1 -0
- package/package.json +27 -8
- package/index.js +0 -2
- package/lib/build.js +0 -147
- package/lib/parse.js +0 -213
package/README.md
CHANGED
|
@@ -1,151 +1,216 @@
|
|
|
1
|
-
plist.js
|
|
2
|
-
========
|
|
3
|
-
### Apple's Property list parser/builder for Node.js and browsers
|
|
1
|
+
# plist.js
|
|
4
2
|
|
|
5
|
-
|
|
3
|
+
Apple property list parser/builder for Node.js and browsers. Supports **XML**, **binary** (bplist00), and **OpenStep** formats.
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
5
|
+
[](https://github.com/TooTallNate/plist.js/actions/workflows/ci.yml)
|
|
6
|
+
[](https://www.npmjs.com/package/plist)
|
|
7
|
+
[](https://bundlephobia.com/package/plist)
|
|
10
8
|
|
|
11
|
-
|
|
12
|
-
to JSON. A valid Plist file is representable as a native JavaScript Object
|
|
13
|
-
and vice-versa.
|
|
9
|
+
**[Try it in the browser →](https://plist.n8.io/)**
|
|
14
10
|
|
|
11
|
+
## Features
|
|
15
12
|
|
|
16
|
-
|
|
13
|
+
- **Parse** XML, binary, and OpenStep plists — format is auto-detected
|
|
14
|
+
- **Build** XML and binary plists from JavaScript objects
|
|
15
|
+
- **TypeScript** — written in TypeScript with full type declarations
|
|
16
|
+
- **Browser-optimized** — uses native `DOMParser` in browsers (zero dependencies)
|
|
17
|
+
- **Lightweight** — ~4 KB gzipped in the browser
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
## Install
|
|
19
20
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
``` bash
|
|
23
|
-
$ npm install plist
|
|
21
|
+
```bash
|
|
22
|
+
npm install plist
|
|
24
23
|
```
|
|
25
24
|
|
|
26
|
-
|
|
25
|
+
## Quick Start
|
|
27
26
|
|
|
28
|
-
```
|
|
27
|
+
```ts
|
|
29
28
|
import { parse, build } from 'plist';
|
|
30
29
|
|
|
31
|
-
|
|
32
|
-
|
|
30
|
+
// Parse any plist format (auto-detected)
|
|
31
|
+
const obj = parse('<plist version="1.0"><string>Hello!</string></plist>');
|
|
32
|
+
console.log(obj); // "Hello!"
|
|
33
|
+
|
|
34
|
+
// Build an XML plist from a JS object
|
|
35
|
+
const xml = build({ name: 'My App', version: 42 });
|
|
36
|
+
console.log(xml);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Parsing
|
|
40
|
+
|
|
41
|
+
### XML Plists
|
|
42
|
+
|
|
43
|
+
```ts
|
|
44
|
+
import { readFileSync } from 'node:fs';
|
|
45
|
+
import { parse } from 'plist';
|
|
46
|
+
|
|
47
|
+
const xml = readFileSync('Info.plist', 'utf8');
|
|
48
|
+
const obj = parse(xml);
|
|
33
49
|
```
|
|
34
50
|
|
|
51
|
+
### Binary Plists
|
|
35
52
|
|
|
36
|
-
|
|
53
|
+
Binary plists (bplist00) are auto-detected when passed as a `Uint8Array` or `ArrayBuffer`. You can also use `parseBinary()` directly:
|
|
37
54
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
55
|
+
```ts
|
|
56
|
+
import { readFileSync } from 'node:fs';
|
|
57
|
+
import { parse, parseBinary } from 'plist';
|
|
41
58
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
"imports": {
|
|
46
|
-
"@xmldom/xmldom": "https://esm.sh/@xmldom/xmldom",
|
|
47
|
-
"xmlbuilder": "https://esm.sh/xmlbuilder"
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
</script>
|
|
51
|
-
<script type="module">
|
|
52
|
-
import { parse, build } from './node_modules/plist/index.js';
|
|
59
|
+
// Auto-detected from binary data
|
|
60
|
+
const buf = readFileSync('Info.plist');
|
|
61
|
+
const obj = parse(new Uint8Array(buf));
|
|
53
62
|
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
</script>
|
|
63
|
+
// Or use parseBinary() directly
|
|
64
|
+
const obj2 = parseBinary(new Uint8Array(buf));
|
|
57
65
|
```
|
|
58
66
|
|
|
59
|
-
|
|
67
|
+
### OpenStep Plists
|
|
60
68
|
|
|
69
|
+
The old-style ASCII format (used by `defaults read` on macOS) is auto-detected when the input starts with `{` or `(`:
|
|
61
70
|
|
|
62
|
-
|
|
71
|
+
```ts
|
|
72
|
+
import { parse, parseOpenStep } from 'plist';
|
|
63
73
|
|
|
64
|
-
|
|
74
|
+
// Auto-detected
|
|
75
|
+
const obj = parse('{ CFBundleName = "My App"; CFBundleVersion = 42; }');
|
|
65
76
|
|
|
66
|
-
|
|
77
|
+
// Or use parseOpenStep() directly
|
|
78
|
+
const obj2 = parseOpenStep('( item1, item2, item3 )');
|
|
79
|
+
```
|
|
67
80
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
81
|
+
## Building
|
|
82
|
+
|
|
83
|
+
### XML Output
|
|
71
84
|
|
|
72
|
-
|
|
73
|
-
|
|
85
|
+
```ts
|
|
86
|
+
import { build } from 'plist';
|
|
87
|
+
|
|
88
|
+
const xml = build({
|
|
89
|
+
CFBundleName: 'My App',
|
|
90
|
+
CFBundleVersion: '1.0',
|
|
91
|
+
LSRequiresIPhoneOS: true,
|
|
92
|
+
UISupportedInterfaceOrientations: [
|
|
93
|
+
'UIInterfaceOrientationPortrait',
|
|
94
|
+
'UIInterfaceOrientationLandscapeLeft',
|
|
95
|
+
],
|
|
96
|
+
});
|
|
74
97
|
```
|
|
75
98
|
|
|
76
|
-
|
|
99
|
+
Output:
|
|
100
|
+
|
|
101
|
+
```xml
|
|
102
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
103
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
104
|
+
<plist version="1.0">
|
|
105
|
+
<dict>
|
|
106
|
+
<key>CFBundleName</key>
|
|
107
|
+
<string>My App</string>
|
|
108
|
+
<key>CFBundleVersion</key>
|
|
109
|
+
<string>1.0</string>
|
|
110
|
+
<key>LSRequiresIPhoneOS</key>
|
|
111
|
+
<true/>
|
|
112
|
+
<key>UISupportedInterfaceOrientations</key>
|
|
113
|
+
<array>
|
|
114
|
+
<string>UIInterfaceOrientationPortrait</string>
|
|
115
|
+
<string>UIInterfaceOrientationLandscapeLeft</string>
|
|
116
|
+
</array>
|
|
117
|
+
</dict>
|
|
118
|
+
</plist>
|
|
119
|
+
```
|
|
77
120
|
|
|
78
|
-
|
|
79
|
-
|
|
121
|
+
### Binary Output
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
import { writeFileSync } from 'node:fs';
|
|
125
|
+
import { buildBinary } from 'plist';
|
|
126
|
+
|
|
127
|
+
const data = buildBinary({
|
|
128
|
+
CFBundleName: 'My App',
|
|
129
|
+
CFBundleVersion: '1.0',
|
|
130
|
+
});
|
|
80
131
|
|
|
81
|
-
|
|
82
|
-
'<?xml version="1.0" encoding="UTF-8"?>' +
|
|
83
|
-
'<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' +
|
|
84
|
-
'<plist version="1.0">' +
|
|
85
|
-
'<key>metadata</key>' +
|
|
86
|
-
'<dict>' +
|
|
87
|
-
'<key>bundle-identifier</key>' +
|
|
88
|
-
'<string>com.company.app</string>' +
|
|
89
|
-
'<key>bundle-version</key>' +
|
|
90
|
-
'<string>0.1.1</string>' +
|
|
91
|
-
'<key>kind</key>' +
|
|
92
|
-
'<string>software</string>' +
|
|
93
|
-
'<key>title</key>' +
|
|
94
|
-
'<string>AppName</string>' +
|
|
95
|
-
'</dict>' +
|
|
96
|
-
'</plist>';
|
|
97
|
-
|
|
98
|
-
console.log(parse(xml));
|
|
99
|
-
|
|
100
|
-
// [
|
|
101
|
-
// "metadata",
|
|
102
|
-
// {
|
|
103
|
-
// "bundle-identifier": "com.company.app",
|
|
104
|
-
// "bundle-version": "0.1.1",
|
|
105
|
-
// "kind": "software",
|
|
106
|
-
// "title": "AppName"
|
|
107
|
-
// }
|
|
108
|
-
// ]
|
|
132
|
+
writeFileSync('Info.plist', data);
|
|
109
133
|
```
|
|
110
134
|
|
|
111
|
-
|
|
135
|
+
## Type Mapping
|
|
112
136
|
|
|
113
|
-
|
|
114
|
-
|
|
137
|
+
| Plist Type | JavaScript Type |
|
|
138
|
+
|---|---|
|
|
139
|
+
| `<string>` | `string` |
|
|
140
|
+
| `<integer>` | `number` |
|
|
141
|
+
| `<real>` | `number` |
|
|
142
|
+
| `<true/>` / `<false/>` | `boolean` |
|
|
143
|
+
| `<date>` | `Date` |
|
|
144
|
+
| `<data>` | `Uint8Array` |
|
|
145
|
+
| `<array>` | `Array` |
|
|
146
|
+
| `<dict>` | `Object` |
|
|
115
147
|
|
|
116
|
-
|
|
117
|
-
|
|
148
|
+
## Browser Usage
|
|
149
|
+
|
|
150
|
+
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):
|
|
118
151
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
{
|
|
122
|
-
"bundle-identifier": "com.company.app",
|
|
123
|
-
"bundle-version": "0.1.1",
|
|
124
|
-
"kind": "software",
|
|
125
|
-
"title": "AppName"
|
|
126
|
-
}
|
|
127
|
-
];
|
|
128
|
-
|
|
129
|
-
console.log(build(obj));
|
|
130
|
-
|
|
131
|
-
// <?xml version="1.0" encoding="UTF-8"?>
|
|
132
|
-
// <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
133
|
-
// <plist version="1.0">
|
|
134
|
-
// <key>metadata</key>
|
|
135
|
-
// <dict>
|
|
136
|
-
// <key>bundle-identifier</key>
|
|
137
|
-
// <string>com.company.app</string>
|
|
138
|
-
// <key>bundle-version</key>
|
|
139
|
-
// <string>0.1.1</string>
|
|
140
|
-
// <key>kind</key>
|
|
141
|
-
// <string>software</string>
|
|
142
|
-
// <key>title</key>
|
|
143
|
-
// <string>AppName</string>
|
|
144
|
-
// </dict>
|
|
145
|
-
// </plist>
|
|
152
|
+
```ts
|
|
153
|
+
import { parse, build } from 'plist';
|
|
146
154
|
```
|
|
147
155
|
|
|
156
|
+
The browser build uses native `DOMParser` and string-based XML building, so `@xmldom/xmldom` and `xmlbuilder` are not included in the bundle.
|
|
157
|
+
|
|
158
|
+
**[Try the interactive playground →](https://plist.n8.io/)**
|
|
159
|
+
|
|
160
|
+
## API
|
|
161
|
+
|
|
162
|
+
### `parse(input)`
|
|
163
|
+
|
|
164
|
+
Parse a plist. Format is auto-detected.
|
|
165
|
+
|
|
166
|
+
- **input**: `string | Uint8Array | ArrayBuffer`
|
|
167
|
+
- **returns**: `PlistValue`
|
|
168
|
+
|
|
169
|
+
### `parseBinary(data)`
|
|
170
|
+
|
|
171
|
+
Parse a binary plist (bplist00).
|
|
172
|
+
|
|
173
|
+
- **data**: `Uint8Array`
|
|
174
|
+
- **returns**: `PlistValue`
|
|
175
|
+
|
|
176
|
+
### `parseOpenStep(input)`
|
|
177
|
+
|
|
178
|
+
Parse an OpenStep/ASCII plist.
|
|
179
|
+
|
|
180
|
+
- **input**: `string`
|
|
181
|
+
- **returns**: `PlistValue`
|
|
182
|
+
|
|
183
|
+
### `build(obj, opts?)`
|
|
184
|
+
|
|
185
|
+
Build an XML plist string.
|
|
186
|
+
|
|
187
|
+
- **obj**: `PlistValue`
|
|
188
|
+
- **opts.pretty**: `boolean` (default: `true`) — pretty-print with indentation
|
|
189
|
+
- **opts.indent**: `string` (default: `" "`) — indentation string
|
|
190
|
+
- **opts.newline**: `string` (default: `"\n"`) — newline string
|
|
191
|
+
- **returns**: `string`
|
|
192
|
+
|
|
193
|
+
### `buildBinary(obj)`
|
|
194
|
+
|
|
195
|
+
Build a binary plist (bplist00).
|
|
196
|
+
|
|
197
|
+
- **obj**: `PlistValue`
|
|
198
|
+
- **returns**: `Uint8Array`
|
|
199
|
+
|
|
200
|
+
### `PlistValue`
|
|
201
|
+
|
|
202
|
+
```ts
|
|
203
|
+
type PlistValue =
|
|
204
|
+
| string
|
|
205
|
+
| number
|
|
206
|
+
| boolean
|
|
207
|
+
| Date
|
|
208
|
+
| Uint8Array
|
|
209
|
+
| PlistValue[]
|
|
210
|
+
| { [key: string]: PlistValue }
|
|
211
|
+
| null;
|
|
212
|
+
```
|
|
148
213
|
|
|
149
214
|
## License
|
|
150
215
|
|
|
151
|
-
[
|
|
216
|
+
[MIT](LICENSE)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-binary.d.ts","sourceRoot":"","sources":["../src/build-binary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAqQ7C;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,CAyDzD"}
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
const EPOCH_2001 = 978307200000; // ms between 1970-01-01 and 2001-01-01
|
|
2
|
+
function writeSizedInt(view, offset, size, value) {
|
|
3
|
+
switch (size) {
|
|
4
|
+
case 1:
|
|
5
|
+
view.setUint8(offset, value);
|
|
6
|
+
break;
|
|
7
|
+
case 2:
|
|
8
|
+
view.setUint16(offset, value);
|
|
9
|
+
break;
|
|
10
|
+
case 4:
|
|
11
|
+
view.setUint32(offset, value);
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function withSizeHeader(typeNibble, size, payload) {
|
|
16
|
+
if (size < 15) {
|
|
17
|
+
const buf = new Uint8Array(1 + payload.length);
|
|
18
|
+
buf[0] = (typeNibble << 4) | size;
|
|
19
|
+
buf.set(payload, 1);
|
|
20
|
+
return buf;
|
|
21
|
+
}
|
|
22
|
+
const pow = size <= 0xff ? 0 : size <= 0xffff ? 1 : 2;
|
|
23
|
+
const sizeBytes = 1 << pow;
|
|
24
|
+
const buf = new Uint8Array(1 + 1 + sizeBytes + payload.length);
|
|
25
|
+
const v = new DataView(buf.buffer);
|
|
26
|
+
buf[0] = (typeNibble << 4) | 0x0f;
|
|
27
|
+
buf[1] = 0x10 | pow;
|
|
28
|
+
if (sizeBytes === 1)
|
|
29
|
+
v.setUint8(2, size);
|
|
30
|
+
else if (sizeBytes === 2)
|
|
31
|
+
v.setUint16(2, size);
|
|
32
|
+
else
|
|
33
|
+
v.setUint32(2, size);
|
|
34
|
+
buf.set(payload, 2 + sizeBytes);
|
|
35
|
+
return buf;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Flatten a PlistValue into an object table, returning the list of entries.
|
|
39
|
+
* The root object is always at index 0.
|
|
40
|
+
*/
|
|
41
|
+
function flattenObjects(root) {
|
|
42
|
+
const objects = [];
|
|
43
|
+
// Map for deduplicating primitives (strings, numbers, booleans, null)
|
|
44
|
+
const primitiveMap = new Map();
|
|
45
|
+
function addPrimitive(val) {
|
|
46
|
+
const key = typeof val === 'string'
|
|
47
|
+
? `s:${val}`
|
|
48
|
+
: typeof val === 'number'
|
|
49
|
+
? `n:${val}`
|
|
50
|
+
: typeof val === 'boolean'
|
|
51
|
+
? `b:${val}`
|
|
52
|
+
: typeof val === 'bigint'
|
|
53
|
+
? `bi:${val}`
|
|
54
|
+
: val === null
|
|
55
|
+
? 'null'
|
|
56
|
+
: null;
|
|
57
|
+
if (key !== null) {
|
|
58
|
+
const existing = primitiveMap.get(key);
|
|
59
|
+
if (existing !== undefined)
|
|
60
|
+
return existing;
|
|
61
|
+
const idx = objects.length;
|
|
62
|
+
objects.push({ value: val });
|
|
63
|
+
primitiveMap.set(key, idx);
|
|
64
|
+
return idx;
|
|
65
|
+
}
|
|
66
|
+
// Non-deduplicable
|
|
67
|
+
const idx = objects.length;
|
|
68
|
+
objects.push({ value: val });
|
|
69
|
+
return idx;
|
|
70
|
+
}
|
|
71
|
+
function visit(val) {
|
|
72
|
+
if (val === null || typeof val === 'boolean' || typeof val === 'number' || typeof val === 'bigint' || typeof val === 'string') {
|
|
73
|
+
return addPrimitive(val);
|
|
74
|
+
}
|
|
75
|
+
if (val instanceof Date) {
|
|
76
|
+
const idx = objects.length;
|
|
77
|
+
objects.push({ value: val });
|
|
78
|
+
return idx;
|
|
79
|
+
}
|
|
80
|
+
if (val instanceof Uint8Array || val instanceof ArrayBuffer) {
|
|
81
|
+
const idx = objects.length;
|
|
82
|
+
objects.push({ value: val instanceof ArrayBuffer ? new Uint8Array(val) : val });
|
|
83
|
+
return idx;
|
|
84
|
+
}
|
|
85
|
+
if (Array.isArray(val)) {
|
|
86
|
+
const idx = objects.length;
|
|
87
|
+
objects.push({ value: val }); // placeholder
|
|
88
|
+
const childRefs = val.map((item) => visit(item));
|
|
89
|
+
objects[idx].childRefs = childRefs;
|
|
90
|
+
return idx;
|
|
91
|
+
}
|
|
92
|
+
// Check for UID
|
|
93
|
+
const obj = val;
|
|
94
|
+
if ('UID' in obj && typeof obj.UID === 'number' && Object.keys(obj).length === 1) {
|
|
95
|
+
const idx = objects.length;
|
|
96
|
+
objects.push({ value: val });
|
|
97
|
+
return idx;
|
|
98
|
+
}
|
|
99
|
+
// Dict
|
|
100
|
+
const idx = objects.length;
|
|
101
|
+
objects.push({ value: val }); // placeholder
|
|
102
|
+
const keys = Object.keys(obj);
|
|
103
|
+
const keyRefs = keys.map((k) => visit(k));
|
|
104
|
+
const valRefs = keys.map((k) => visit(obj[k]));
|
|
105
|
+
objects[idx].keyRefs = keyRefs;
|
|
106
|
+
objects[idx].valueRefs = valRefs;
|
|
107
|
+
return idx;
|
|
108
|
+
}
|
|
109
|
+
visit(root);
|
|
110
|
+
return objects;
|
|
111
|
+
}
|
|
112
|
+
function serializeObject(entry, refSize) {
|
|
113
|
+
const val = entry.value;
|
|
114
|
+
if (val === null)
|
|
115
|
+
return new Uint8Array([0x00]);
|
|
116
|
+
if (typeof val === 'boolean')
|
|
117
|
+
return new Uint8Array([val ? 0x09 : 0x08]);
|
|
118
|
+
if (typeof val === 'bigint') {
|
|
119
|
+
// Always use 8-byte int for bigint
|
|
120
|
+
const buf = new Uint8Array(9);
|
|
121
|
+
const v = new DataView(buf.buffer);
|
|
122
|
+
buf[0] = 0x13; // int, pow=3 (8 bytes)
|
|
123
|
+
const n = Number(val);
|
|
124
|
+
v.setInt32(1, Math.floor(n / 0x100000000));
|
|
125
|
+
v.setUint32(5, n >>> 0);
|
|
126
|
+
return buf;
|
|
127
|
+
}
|
|
128
|
+
if (typeof val === 'number') {
|
|
129
|
+
// Check if integer
|
|
130
|
+
if (Number.isInteger(val) && val >= -2147483648 && val <= 4294967295) {
|
|
131
|
+
const pow = val < 0 || val > 0xff
|
|
132
|
+
? (val < 0 || val > 0xffff ? (val < 0 || val > 0xffffffff ? 3 : 2) : 1)
|
|
133
|
+
: 0;
|
|
134
|
+
const byteCount = 1 << pow;
|
|
135
|
+
const buf = new Uint8Array(1 + byteCount);
|
|
136
|
+
const v = new DataView(buf.buffer);
|
|
137
|
+
buf[0] = 0x10 | pow;
|
|
138
|
+
if (byteCount === 1)
|
|
139
|
+
v.setUint8(1, val);
|
|
140
|
+
else if (byteCount === 2)
|
|
141
|
+
v.setUint16(1, val);
|
|
142
|
+
else if (byteCount === 4) {
|
|
143
|
+
if (val < 0)
|
|
144
|
+
v.setInt32(1, val);
|
|
145
|
+
else
|
|
146
|
+
v.setUint32(1, val);
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
v.setInt32(1, Math.floor(val / 0x100000000));
|
|
150
|
+
v.setUint32(5, val >>> 0);
|
|
151
|
+
}
|
|
152
|
+
return buf;
|
|
153
|
+
}
|
|
154
|
+
// Float64
|
|
155
|
+
const buf = new Uint8Array(9);
|
|
156
|
+
const v = new DataView(buf.buffer);
|
|
157
|
+
buf[0] = 0x23;
|
|
158
|
+
v.setFloat64(1, val);
|
|
159
|
+
return buf;
|
|
160
|
+
}
|
|
161
|
+
if (typeof val === 'string') {
|
|
162
|
+
// Check if ASCII
|
|
163
|
+
let isAscii = true;
|
|
164
|
+
for (let i = 0; i < val.length; i++) {
|
|
165
|
+
if (val.charCodeAt(i) > 127) {
|
|
166
|
+
isAscii = false;
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (isAscii) {
|
|
171
|
+
const bytes = new Uint8Array(val.length);
|
|
172
|
+
for (let i = 0; i < val.length; i++)
|
|
173
|
+
bytes[i] = val.charCodeAt(i);
|
|
174
|
+
return withSizeHeader(0x5, val.length, bytes);
|
|
175
|
+
}
|
|
176
|
+
// UTF-16
|
|
177
|
+
const payload = new Uint8Array(val.length * 2);
|
|
178
|
+
const pv = new DataView(payload.buffer);
|
|
179
|
+
for (let i = 0; i < val.length; i++) {
|
|
180
|
+
pv.setUint16(i * 2, val.charCodeAt(i));
|
|
181
|
+
}
|
|
182
|
+
return withSizeHeader(0x6, val.length, payload);
|
|
183
|
+
}
|
|
184
|
+
if (val instanceof Date) {
|
|
185
|
+
const buf = new Uint8Array(9);
|
|
186
|
+
const v = new DataView(buf.buffer);
|
|
187
|
+
buf[0] = 0x33;
|
|
188
|
+
v.setFloat64(1, (val.getTime() - EPOCH_2001) / 1000);
|
|
189
|
+
return buf;
|
|
190
|
+
}
|
|
191
|
+
if (val instanceof Uint8Array) {
|
|
192
|
+
return withSizeHeader(0x4, val.length, val);
|
|
193
|
+
}
|
|
194
|
+
if (Array.isArray(val)) {
|
|
195
|
+
const refs = entry.childRefs;
|
|
196
|
+
const payload = new Uint8Array(refs.length * refSize);
|
|
197
|
+
const pv = new DataView(payload.buffer);
|
|
198
|
+
for (let i = 0; i < refs.length; i++) {
|
|
199
|
+
writeSizedInt(pv, i * refSize, refSize, refs[i]);
|
|
200
|
+
}
|
|
201
|
+
return withSizeHeader(0xa, refs.length, payload);
|
|
202
|
+
}
|
|
203
|
+
// Check for UID
|
|
204
|
+
const obj = val;
|
|
205
|
+
if ('UID' in obj && typeof obj.UID === 'number' && Object.keys(obj).length === 1) {
|
|
206
|
+
const uid = obj.UID;
|
|
207
|
+
const size = uid <= 0xff ? 1 : uid <= 0xffff ? 2 : 4;
|
|
208
|
+
const buf = new Uint8Array(1 + size);
|
|
209
|
+
const v = new DataView(buf.buffer);
|
|
210
|
+
buf[0] = 0x80 | (size - 1);
|
|
211
|
+
if (size === 1)
|
|
212
|
+
v.setUint8(1, uid);
|
|
213
|
+
else if (size === 2)
|
|
214
|
+
v.setUint16(1, uid);
|
|
215
|
+
else
|
|
216
|
+
v.setUint32(1, uid);
|
|
217
|
+
return buf;
|
|
218
|
+
}
|
|
219
|
+
// Dict
|
|
220
|
+
const keyRefs = entry.keyRefs;
|
|
221
|
+
const valueRefs = entry.valueRefs;
|
|
222
|
+
const n = keyRefs.length;
|
|
223
|
+
const payload = new Uint8Array(n * 2 * refSize);
|
|
224
|
+
const pv = new DataView(payload.buffer);
|
|
225
|
+
for (let i = 0; i < n; i++) {
|
|
226
|
+
writeSizedInt(pv, i * refSize, refSize, keyRefs[i]);
|
|
227
|
+
}
|
|
228
|
+
for (let i = 0; i < n; i++) {
|
|
229
|
+
writeSizedInt(pv, (n + i) * refSize, refSize, valueRefs[i]);
|
|
230
|
+
}
|
|
231
|
+
return withSizeHeader(0xd, n, payload);
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* Serialize a PlistValue into binary plist format (bplist00).
|
|
235
|
+
*/
|
|
236
|
+
export function buildBinary(value) {
|
|
237
|
+
const entries = flattenObjects(value);
|
|
238
|
+
const objectRefSize = entries.length <= 256 ? 1 : 2;
|
|
239
|
+
// Serialize each object
|
|
240
|
+
const serialized = [];
|
|
241
|
+
for (const entry of entries) {
|
|
242
|
+
serialized.push(serializeObject(entry, objectRefSize));
|
|
243
|
+
}
|
|
244
|
+
// Build offset table
|
|
245
|
+
let currentOffset = 8; // header
|
|
246
|
+
const offsets = [];
|
|
247
|
+
for (const s of serialized) {
|
|
248
|
+
offsets.push(currentOffset);
|
|
249
|
+
currentOffset += s.length;
|
|
250
|
+
}
|
|
251
|
+
const offsetTableOffset = currentOffset;
|
|
252
|
+
const maxOffset = offsetTableOffset;
|
|
253
|
+
const offsetSize = maxOffset <= 0xff ? 1 : maxOffset <= 0xffff ? 2 : 4;
|
|
254
|
+
const totalSize = offsetTableOffset + entries.length * offsetSize + 32;
|
|
255
|
+
const buf = new Uint8Array(totalSize);
|
|
256
|
+
const view = new DataView(buf.buffer);
|
|
257
|
+
// Header
|
|
258
|
+
const header = 'bplist00';
|
|
259
|
+
for (let i = 0; i < 8; i++)
|
|
260
|
+
buf[i] = header.charCodeAt(i);
|
|
261
|
+
// Objects
|
|
262
|
+
let pos = 8;
|
|
263
|
+
for (const s of serialized) {
|
|
264
|
+
buf.set(s, pos);
|
|
265
|
+
pos += s.length;
|
|
266
|
+
}
|
|
267
|
+
// Offset table
|
|
268
|
+
for (let i = 0; i < entries.length; i++) {
|
|
269
|
+
writeSizedInt(view, pos, offsetSize, offsets[i]);
|
|
270
|
+
pos += offsetSize;
|
|
271
|
+
}
|
|
272
|
+
// Trailer (last 32 bytes)
|
|
273
|
+
const trailerStart = totalSize - 32;
|
|
274
|
+
view.setUint8(trailerStart + 6, offsetSize);
|
|
275
|
+
view.setUint8(trailerStart + 7, objectRefSize);
|
|
276
|
+
view.setUint32(trailerStart + 8, 0);
|
|
277
|
+
view.setUint32(trailerStart + 12, entries.length);
|
|
278
|
+
view.setUint32(trailerStart + 16, 0);
|
|
279
|
+
view.setUint32(trailerStart + 20, 0); // top object always 0
|
|
280
|
+
view.setUint32(trailerStart + 24, 0);
|
|
281
|
+
view.setUint32(trailerStart + 28, offsetTableOffset);
|
|
282
|
+
return buf;
|
|
283
|
+
}
|
|
284
|
+
//# sourceMappingURL=build-binary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-binary.js","sourceRoot":"","sources":["../src/build-binary.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PlistValue } from './parse.browser.js';
|
|
2
|
+
export interface BuildOptions {
|
|
3
|
+
pretty?: boolean;
|
|
4
|
+
indent?: string;
|
|
5
|
+
newline?: string;
|
|
6
|
+
[key: string]: unknown;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Generate an XML plist string from the input object `obj`.
|
|
10
|
+
*
|
|
11
|
+
* @param obj - the object to convert
|
|
12
|
+
* @param opts - optional options object
|
|
13
|
+
* @returns converted plist XML string
|
|
14
|
+
*/
|
|
15
|
+
export declare function build(obj: PlistValue, opts?: BuildOptions): string;
|
|
16
|
+
//# sourceMappingURL=build.browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.browser.d.ts","sourceRoot":"","sources":["../src/build.browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAarD,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAMD;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CA0ElE"}
|