plist 3.1.1 → 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.
Files changed (49) hide show
  1. package/README.md +180 -110
  2. package/dist/build-binary.d.ts +6 -0
  3. package/dist/build-binary.d.ts.map +1 -0
  4. package/dist/build-binary.js +284 -0
  5. package/dist/build-binary.js.map +1 -0
  6. package/dist/build.browser.d.ts +16 -0
  7. package/dist/build.browser.d.ts.map +1 -0
  8. package/dist/build.browser.js +101 -0
  9. package/dist/build.browser.js.map +1 -0
  10. package/dist/build.d.ts +16 -0
  11. package/dist/build.d.ts.map +1 -0
  12. package/dist/build.js +94 -0
  13. package/dist/build.js.map +1 -0
  14. package/dist/index.browser.d.ts +7 -0
  15. package/dist/index.browser.d.ts.map +1 -0
  16. package/dist/index.browser.js +6 -0
  17. package/dist/index.browser.js.map +1 -0
  18. package/dist/index.d.ts +7 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +6 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/parse-binary.d.ts +6 -0
  23. package/dist/parse-binary.d.ts.map +1 -0
  24. package/dist/parse-binary.js +130 -0
  25. package/dist/parse-binary.js.map +1 -0
  26. package/dist/parse-openstep.d.ts +6 -0
  27. package/dist/parse-openstep.d.ts.map +1 -0
  28. package/dist/parse-openstep.js +197 -0
  29. package/dist/parse-openstep.js.map +1 -0
  30. package/dist/parse.browser.d.ts +11 -0
  31. package/dist/parse.browser.d.ts.map +1 -0
  32. package/dist/parse.browser.js +208 -0
  33. package/dist/parse.browser.js.map +1 -0
  34. package/dist/parse.d.ts +11 -0
  35. package/dist/parse.d.ts.map +1 -0
  36. package/dist/parse.js +209 -0
  37. package/dist/parse.js.map +1 -0
  38. package/package.json +30 -12
  39. package/.github/workflows/ci.yml +0 -24
  40. package/.jshintrc +0 -4
  41. package/History.md +0 -201
  42. package/Makefile +0 -75
  43. package/dist/plist-build.js +0 -5348
  44. package/dist/plist-parse.js +0 -10709
  45. package/dist/plist.js +0 -15918
  46. package/examples/browser/index.html +0 -14
  47. package/index.js +0 -13
  48. package/lib/build.js +0 -143
  49. package/lib/parse.js +0 -208
package/README.md CHANGED
@@ -1,146 +1,216 @@
1
- plist.js
2
- ========
3
- ### Apple's Property list parser/builder for Node.js and browsers
1
+ # plist.js
4
2
 
5
- [![ci](https://github.com/TooTallNate/plist.js/actions/workflows/ci.yml/badge.svg)](https://github.com/TooTallNate/plist.js/actions/workflows/ci.yml)
3
+ Apple property list parser/builder for Node.js and browsers. Supports **XML**, **binary** (bplist00), and **OpenStep** formats.
6
4
 
7
- Provides facilities for reading and writing Plist (property list) files.
8
- These are often used in programming OS X and iOS applications, as well
9
- as the iTunes configuration XML file.
5
+ [![CI](https://github.com/TooTallNate/plist.js/actions/workflows/ci.yml/badge.svg)](https://github.com/TooTallNate/plist.js/actions/workflows/ci.yml)
6
+ [![npm](https://img.shields.io/npm/v/plist)](https://www.npmjs.com/package/plist)
7
+ [![npm bundle size](https://img.shields.io/bundlephobia/minzip/plist)](https://bundlephobia.com/package/plist)
10
8
 
11
- Plist files represent stored programming "object"s. They are very similar
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
- ## Usage
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
- ### Node.js
19
+ ## Install
19
20
 
20
- Install using `npm`:
21
+ ```bash
22
+ npm install plist
23
+ ```
24
+
25
+ ## Quick Start
26
+
27
+ ```ts
28
+ import { parse, build } from 'plist';
21
29
 
22
- ``` bash
23
- $ npm install --save plist
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);
24
37
  ```
25
38
 
26
- Then `require()` the _plist_ module in your file:
39
+ ## Parsing
40
+
41
+ ### XML Plists
27
42
 
28
- ``` js
29
- var plist = require('plist');
43
+ ```ts
44
+ import { readFileSync } from 'node:fs';
45
+ import { parse } from 'plist';
30
46
 
31
- // now use the `parse()` and `build()` functions
32
- var val = plist.parse('<plist><string>Hello World!</string></plist>');
33
- console.log(val); // "Hello World!"
47
+ const xml = readFileSync('Info.plist', 'utf8');
48
+ const obj = parse(xml);
34
49
  ```
35
50
 
51
+ ### Binary Plists
36
52
 
37
- ### Browser
53
+ Binary plists (bplist00) are auto-detected when passed as a `Uint8Array` or `ArrayBuffer`. You can also use `parseBinary()` directly:
38
54
 
39
- Include the `dist/plist.js` in a `<script>` tag in your HTML file:
55
+ ```ts
56
+ import { readFileSync } from 'node:fs';
57
+ import { parse, parseBinary } from 'plist';
40
58
 
41
- ``` html
42
- <script src="plist.js"></script>
43
- <script>
44
- // now use the `parse()` and `build()` functions
45
- var val = plist.parse('<plist><string>Hello World!</string></plist>');
46
- console.log(val); // "Hello World!"
47
- </script>
59
+ // Auto-detected from binary data
60
+ const buf = readFileSync('Info.plist');
61
+ const obj = parse(new Uint8Array(buf));
62
+
63
+ // Or use parseBinary() directly
64
+ const obj2 = parseBinary(new Uint8Array(buf));
48
65
  ```
49
66
 
67
+ ### OpenStep Plists
50
68
 
51
- ## API
69
+ The old-style ASCII format (used by `defaults read` on macOS) is auto-detected when the input starts with `{` or `(`:
70
+
71
+ ```ts
72
+ import { parse, parseOpenStep } from 'plist';
52
73
 
53
- ### Parsing
74
+ // Auto-detected
75
+ const obj = parse('{ CFBundleName = "My App"; CFBundleVersion = 42; }');
76
+
77
+ // Or use parseOpenStep() directly
78
+ const obj2 = parseOpenStep('( item1, item2, item3 )');
79
+ ```
54
80
 
55
- Parsing a plist from filename:
81
+ ## Building
56
82
 
57
- ``` javascript
58
- var fs = require('fs');
59
- var plist = require('plist');
83
+ ### XML Output
60
84
 
61
- var obj = plist.parse(fs.readFileSync('myPlist.plist', 'utf8'));
62
- console.log(JSON.stringify(obj));
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
+ });
63
97
  ```
64
98
 
65
- Parsing a plist from string payload:
66
-
67
- ``` javascript
68
- var plist = require('plist');
69
-
70
- var xml =
71
- '<?xml version="1.0" encoding="UTF-8"?>' +
72
- '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">' +
73
- '<plist version="1.0">' +
74
- '<key>metadata</key>' +
75
- '<dict>' +
76
- '<key>bundle-identifier</key>' +
77
- '<string>com.company.app</string>' +
78
- '<key>bundle-version</key>' +
79
- '<string>0.1.1</string>' +
80
- '<key>kind</key>' +
81
- '<string>software</string>' +
82
- '<key>title</key>' +
83
- '<string>AppName</string>' +
84
- '</dict>' +
85
- '</plist>';
86
-
87
- console.log(plist.parse(xml));
88
-
89
- // [
90
- // "metadata",
91
- // {
92
- // "bundle-identifier": "com.company.app",
93
- // "bundle-version": "0.1.1",
94
- // "kind": "software",
95
- // "title": "AppName"
96
- // }
97
- // ]
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>
98
119
  ```
99
120
 
100
- ### Building
101
-
102
- Given an existing JavaScript Object, you can turn it into an XML document
103
- that complies with the plist DTD:
104
-
105
- ``` javascript
106
- var plist = require('plist');
107
-
108
- var json = [
109
- "metadata",
110
- {
111
- "bundle-identifier": "com.company.app",
112
- "bundle-version": "0.1.1",
113
- "kind": "software",
114
- "title": "AppName"
115
- }
116
- ];
117
-
118
- console.log(plist.build(json));
119
-
120
- // <?xml version="1.0" encoding="UTF-8"?>
121
- // <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
122
- // <plist version="1.0">
123
- // <key>metadata</key>
124
- // <dict>
125
- // <key>bundle-identifier</key>
126
- // <string>com.company.app</string>
127
- // <key>bundle-version</key>
128
- // <string>0.1.1</string>
129
- // <key>kind</key>
130
- // <string>software</string>
131
- // <key>title</key>
132
- // <string>AppName</string>
133
- // </dict>
134
- // </plist>
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
+ });
131
+
132
+ writeFileSync('Info.plist', data);
133
+ ```
134
+
135
+ ## Type Mapping
136
+
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` |
147
+
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):
151
+
152
+ ```ts
153
+ import { parse, build } from 'plist';
135
154
  ```
136
155
 
137
- ## Cross Platform Testing Credits
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`
138
175
 
139
- Much thanks to Sauce Labs for providing free resources that enable cross-browser testing on this project!
176
+ ### `parseOpenStep(input)`
140
177
 
141
- [![Testing Powered By SauceLabs](https://opensource.saucelabs.com/images/opensauce/powered-by-saucelabs-badge-red.png?sanitize=true "Testing Powered By SauceLabs")](https://saucelabs.com)
178
+ Parse an OpenStep/ASCII plist.
142
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
+ ```
143
213
 
144
214
  ## License
145
215
 
146
- [(The MIT License)](LICENSE)
216
+ [MIT](LICENSE)
@@ -0,0 +1,6 @@
1
+ import type { PlistValue } from './parse.js';
2
+ /**
3
+ * Serialize a PlistValue into binary plist format (bplist00).
4
+ */
5
+ export declare function buildBinary(value: PlistValue): Uint8Array;
6
+ //# sourceMappingURL=build-binary.d.ts.map
@@ -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"}