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
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Encode a Uint8Array into a base64 string.
3
+ */
4
+ function uint8ArrayToBase64(bytes) {
5
+ let binary = '';
6
+ for (let i = 0; i < bytes.length; i++) {
7
+ binary += String.fromCharCode(bytes[i]);
8
+ }
9
+ return btoa(binary);
10
+ }
11
+ const XML_DECLARATION = '<?xml version="1.0" encoding="UTF-8"?>';
12
+ const DOCTYPE = '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">';
13
+ /**
14
+ * Generate an XML plist string from the input object `obj`.
15
+ *
16
+ * @param obj - the object to convert
17
+ * @param opts - optional options object
18
+ * @returns converted plist XML string
19
+ */
20
+ export function build(obj, opts) {
21
+ const pretty = !opts || opts.pretty !== false;
22
+ const indent = opts?.indent ?? ' ';
23
+ const newline = opts?.newline ?? '\n';
24
+ const lines = [];
25
+ function emit(depth, line) {
26
+ if (pretty) {
27
+ lines.push(indent.repeat(depth) + line);
28
+ }
29
+ else {
30
+ lines.push(line);
31
+ }
32
+ }
33
+ function walk(value, depth) {
34
+ if (typeof value === 'undefined') {
35
+ return;
36
+ }
37
+ else if (Array.isArray(value)) {
38
+ emit(depth, '<array>');
39
+ for (let i = 0; i < value.length; i++) {
40
+ walk(value[i], depth + 1);
41
+ }
42
+ emit(depth, '</array>');
43
+ }
44
+ else if (value instanceof ArrayBuffer) {
45
+ emit(depth, '<data>' + uint8ArrayToBase64(new Uint8Array(value)) + '</data>');
46
+ }
47
+ else if (ArrayBuffer.isView(value)) {
48
+ const bytes = value instanceof Uint8Array
49
+ ? value
50
+ : new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
51
+ emit(depth, '<data>' + uint8ArrayToBase64(bytes) + '</data>');
52
+ }
53
+ else if (typeof value === 'object' && value !== null && !(value instanceof Date)) {
54
+ emit(depth, '<dict>');
55
+ for (const prop in value) {
56
+ if (Object.hasOwn(value, prop)) {
57
+ const val = value[prop];
58
+ if (val === undefined || val === null)
59
+ continue;
60
+ emit(depth + 1, '<key>' + escapeXml(prop) + '</key>');
61
+ walk(val, depth + 1);
62
+ }
63
+ }
64
+ emit(depth, '</dict>');
65
+ }
66
+ else if (typeof value === 'number') {
67
+ const tag = value % 1 === 0 ? 'integer' : 'real';
68
+ emit(depth, '<' + tag + '>' + value.toString() + '</' + tag + '>');
69
+ }
70
+ else if (typeof value === 'bigint') {
71
+ emit(depth, '<integer>' + value.toString() + '</integer>');
72
+ }
73
+ else if (value instanceof Date) {
74
+ emit(depth, '<date>' + new Date(value).toISOString().replace(/\.\d{3}Z$/, 'Z') + '</date>');
75
+ }
76
+ else if (typeof value === 'boolean') {
77
+ emit(depth, value ? '<true/>' : '<false/>');
78
+ }
79
+ else if (typeof value === 'string') {
80
+ emit(depth, '<string>' + escapeXml(value) + '</string>');
81
+ }
82
+ }
83
+ walk(obj, 2);
84
+ const sep = pretty ? newline : '';
85
+ const innerContent = lines.join(sep);
86
+ const parts = [
87
+ XML_DECLARATION,
88
+ DOCTYPE,
89
+ '<plist version="1.0">',
90
+ innerContent,
91
+ '</plist>',
92
+ ];
93
+ return parts.join(sep);
94
+ }
95
+ function escapeXml(str) {
96
+ return str
97
+ .replace(/&/g, '&amp;')
98
+ .replace(/</g, '&lt;')
99
+ .replace(/>/g, '&gt;');
100
+ }
101
+ //# sourceMappingURL=build.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.browser.js","sourceRoot":"","sources":["../src/build.browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { PlistValue } from './parse.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.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAa7C,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;AAED;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,YAAY,GAAG,MAAM,CAuBlE"}
package/dist/build.js ADDED
@@ -0,0 +1,94 @@
1
+ import xmlbuilder from 'xmlbuilder';
2
+ /**
3
+ * Encode a Uint8Array into a base64 string.
4
+ */
5
+ function uint8ArrayToBase64(bytes) {
6
+ let binary = '';
7
+ for (let i = 0; i < bytes.length; i++) {
8
+ binary += String.fromCharCode(bytes[i]);
9
+ }
10
+ return btoa(binary);
11
+ }
12
+ /**
13
+ * Generate an XML plist string from the input object `obj`.
14
+ *
15
+ * @param obj - the object to convert
16
+ * @param opts - optional options object
17
+ * @returns converted plist XML string
18
+ */
19
+ export function build(obj, opts) {
20
+ const XMLHDR = {
21
+ version: '1.0',
22
+ encoding: 'UTF-8',
23
+ };
24
+ const XMLDTD = {
25
+ pubid: '-//Apple//DTD PLIST 1.0//EN',
26
+ sysid: 'http://www.apple.com/DTDs/PropertyList-1.0.dtd',
27
+ };
28
+ const doc = xmlbuilder.create('plist');
29
+ doc.dec(XMLHDR.version, XMLHDR.encoding);
30
+ doc.dtd(XMLDTD.pubid, XMLDTD.sysid);
31
+ doc.att('version', '1.0');
32
+ walk_obj(obj, doc);
33
+ if (!opts)
34
+ opts = {};
35
+ // default `pretty` to `true`
36
+ opts.pretty = opts.pretty !== false;
37
+ return doc.end(opts);
38
+ }
39
+ /**
40
+ * depth first, recursive traversal of a javascript object. when complete,
41
+ * next_child contains a reference to the build XML object.
42
+ */
43
+ function walk_obj(next, next_child) {
44
+ if (typeof next === 'undefined') {
45
+ return;
46
+ }
47
+ else if (Array.isArray(next)) {
48
+ next_child = next_child.ele('array');
49
+ for (let i = 0; i < next.length; i++) {
50
+ walk_obj(next[i], next_child);
51
+ }
52
+ }
53
+ else if (next instanceof ArrayBuffer) {
54
+ next_child.ele('data').raw(uint8ArrayToBase64(new Uint8Array(next)));
55
+ }
56
+ else if (ArrayBuffer.isView(next)) {
57
+ // Handles Uint8Array, Buffer, and all typed arrays
58
+ const bytes = next instanceof Uint8Array
59
+ ? next
60
+ : new Uint8Array(next.buffer, next.byteOffset, next.byteLength);
61
+ next_child.ele('data').raw(uint8ArrayToBase64(bytes));
62
+ }
63
+ else if (typeof next === 'object' && next !== null && !(next instanceof Date)) {
64
+ next_child = next_child.ele('dict');
65
+ for (const prop in next) {
66
+ if (Object.hasOwn(next, prop)) {
67
+ const val = next[prop];
68
+ if (val === undefined || val === null)
69
+ continue;
70
+ next_child.ele('key').txt(prop);
71
+ walk_obj(val, next_child);
72
+ }
73
+ }
74
+ }
75
+ else if (typeof next === 'number') {
76
+ const tag_type = next % 1 === 0 ? 'integer' : 'real';
77
+ next_child.ele(tag_type).txt(next.toString());
78
+ }
79
+ else if (typeof next === 'bigint') {
80
+ next_child.ele('integer').txt(next.toString());
81
+ }
82
+ else if (next instanceof Date) {
83
+ next_child
84
+ .ele('date')
85
+ .txt(new Date(next).toISOString().replace(/\.\d{3}Z$/, 'Z'));
86
+ }
87
+ else if (typeof next === 'boolean') {
88
+ next_child.ele(next ? 'true' : 'false');
89
+ }
90
+ else if (typeof next === 'string') {
91
+ next_child.ele('string').txt(next);
92
+ }
93
+ }
94
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../src/build.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,YAAY,CAAC;AAGpC;;GAEG;AACH,SAAS,kBAAkB,CAAC,KAAiB;IAC3C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC;AACtB,CAAC;AASD;;;;;;GAMG;AACH,MAAM,UAAU,KAAK,CAAC,GAAe,EAAE,IAAmB;IACxD,MAAM,MAAM,GAAG;QACb,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,OAAO;KAClB,CAAC;IAEF,MAAM,MAAM,GAAG;QACb,KAAK,EAAE,6BAA6B;QACpC,KAAK,EAAE,gDAAgD;KACxD,CAAC;IAEF,MAAM,GAAG,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEvC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IACpC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAE1B,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAEnB,IAAI,CAAC,IAAI;QAAE,IAAI,GAAG,EAAE,CAAC;IACrB,6BAA6B;IAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC;IACpC,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,IAAa,EAAE,UAAiC;IAChE,IAAI,OAAO,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;SAAM,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;QACvC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvE,CAAC;SAAM,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,mDAAmD;QACnD,MAAM,KAAK,GACT,IAAI,YAAY,UAAU;YACxB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,MAAqB,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACnF,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC;IACxD,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QAChF,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,IAA+B,EAAE,CAAC;YACnD,IAAI,MAAM,CAAC,MAAM,CAAC,IAA+B,EAAE,IAAI,CAAC,EAAE,CAAC;gBACzD,MAAM,GAAG,GAAI,IAAgC,CAAC,IAAI,CAAC,CAAC;gBACpD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI;oBAAE,SAAS;gBAChD,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBAChC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QACrD,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IAChD,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpC,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;SAAM,IAAI,IAAI,YAAY,IAAI,EAAE,CAAC;QAChC,UAAU;aACP,GAAG,CAAC,MAAM,CAAC;aACX,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,SAAS,EAAE,CAAC;QACrC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACpC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { parse } from './parse.browser.js';
2
+ export { parseOpenStep } from './parse-openstep.js';
3
+ export type { PlistValue } from './parse.browser.js';
4
+ export { parseBinary } from './parse-binary.js';
5
+ export { build } from './build.browser.js';
6
+ export { buildBinary } from './build-binary.js';
7
+ //# sourceMappingURL=index.browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.d.ts","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { parse } from './parse.browser.js';
2
+ export { parseOpenStep } from './parse-openstep.js';
3
+ export { parseBinary } from './parse-binary.js';
4
+ export { build } from './build.browser.js';
5
+ export { buildBinary } from './build-binary.js';
6
+ //# sourceMappingURL=index.browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.browser.js","sourceRoot":"","sources":["../src/index.browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,7 @@
1
+ export { parse } from './parse.js';
2
+ export { parseOpenStep } from './parse-openstep.js';
3
+ export type { PlistValue } from './parse.js';
4
+ export { parseBinary } from './parse-binary.js';
5
+ export { build } from './build.js';
6
+ export { buildBinary } from './build-binary.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,6 @@
1
+ export { parse } from './parse.js';
2
+ export { parseOpenStep } from './parse-openstep.js';
3
+ export { parseBinary } from './parse-binary.js';
4
+ export { build } from './build.js';
5
+ export { buildBinary } from './build-binary.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { PlistValue } from './parse.js';
2
+ /**
3
+ * Parse a binary plist (bplist00 format) into a PlistValue.
4
+ */
5
+ export declare function parseBinary(data: Uint8Array): PlistValue;
6
+ //# sourceMappingURL=parse-binary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-binary.d.ts","sourceRoot":"","sources":["../src/parse-binary.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAoB7C;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAyHxD"}
@@ -0,0 +1,130 @@
1
+ const EPOCH_2001 = 978307200000; // ms between 1970-01-01 and 2001-01-01
2
+ function readSizedInt(view, offset, size) {
3
+ switch (size) {
4
+ case 1: return view.getUint8(offset);
5
+ case 2: return view.getUint16(offset);
6
+ case 4: return view.getUint32(offset);
7
+ case 8: {
8
+ const hi = view.getUint32(offset);
9
+ const lo = view.getUint32(offset + 4);
10
+ // For values that fit in safe integer range
11
+ return hi * 0x100000000 + lo;
12
+ }
13
+ default:
14
+ throw new Error(`Unsupported int size: ${size}`);
15
+ }
16
+ }
17
+ /**
18
+ * Parse a binary plist (bplist00 format) into a PlistValue.
19
+ */
20
+ export function parseBinary(data) {
21
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
22
+ const len = data.byteLength;
23
+ // Validate header
24
+ const header = String.fromCharCode(...data.subarray(0, 8));
25
+ if (header !== 'bplist00') {
26
+ throw new Error('Invalid binary plist: bad magic');
27
+ }
28
+ // Read trailer (last 32 bytes)
29
+ const trailerOffset = len - 32;
30
+ const offsetTableOffsetSize = view.getUint8(trailerOffset + 6);
31
+ const objectRefSize = view.getUint8(trailerOffset + 7);
32
+ const numObjects = readSizedInt(view, trailerOffset + 8, 8);
33
+ const topObject = readSizedInt(view, trailerOffset + 16, 8);
34
+ const offsetTableOffset = readSizedInt(view, trailerOffset + 24, 8);
35
+ // Read offset table
36
+ const offsets = [];
37
+ for (let i = 0; i < numObjects; i++) {
38
+ offsets.push(readSizedInt(view, offsetTableOffset + i * offsetTableOffsetSize, offsetTableOffsetSize));
39
+ }
40
+ function parseObject(index) {
41
+ let offset = offsets[index];
42
+ const marker = view.getUint8(offset);
43
+ const type = marker >> 4;
44
+ let size = marker & 0x0f;
45
+ offset++;
46
+ // Read extended size
47
+ if (type !== 0 && type !== 8 && size === 0x0f) {
48
+ const extMarker = view.getUint8(offset);
49
+ offset++;
50
+ const extSize = 1 << (extMarker & 0x0f);
51
+ size = readSizedInt(view, offset, extSize);
52
+ offset += extSize;
53
+ }
54
+ switch (type) {
55
+ case 0x0: // singletons
56
+ if (marker === 0x00)
57
+ return null;
58
+ if (marker === 0x08)
59
+ return false;
60
+ if (marker === 0x09)
61
+ return true;
62
+ throw new Error(`Unknown singleton: 0x${marker.toString(16)}`);
63
+ case 0x1: { // int
64
+ const byteCount = 1 << size;
65
+ if (byteCount <= 4) {
66
+ return readSizedInt(view, offset, byteCount);
67
+ }
68
+ // 8-byte int
69
+ const hi = view.getInt32(offset);
70
+ const lo = view.getUint32(offset + 4);
71
+ return hi * 0x100000000 + lo;
72
+ }
73
+ case 0x2: { // real
74
+ const byteCount = 1 << size;
75
+ if (byteCount === 4)
76
+ return view.getFloat32(offset);
77
+ if (byteCount === 8)
78
+ return view.getFloat64(offset);
79
+ throw new Error(`Unsupported real size: ${byteCount}`);
80
+ }
81
+ case 0x3: { // date
82
+ const timestamp = view.getFloat64(offset);
83
+ return new Date(timestamp * 1000 + EPOCH_2001);
84
+ }
85
+ case 0x4: { // data
86
+ return new Uint8Array(data.buffer, data.byteOffset + offset, size);
87
+ }
88
+ case 0x5: { // ASCII string
89
+ let s = '';
90
+ for (let i = 0; i < size; i++) {
91
+ s += String.fromCharCode(view.getUint8(offset + i));
92
+ }
93
+ return s;
94
+ }
95
+ case 0x6: { // UTF-16BE string
96
+ let s = '';
97
+ for (let i = 0; i < size; i++) {
98
+ s += String.fromCharCode(view.getUint16(offset + i * 2));
99
+ }
100
+ return s;
101
+ }
102
+ case 0x8: { // UID
103
+ const byteCount = size + 1;
104
+ return { UID: readSizedInt(view, offset, byteCount) };
105
+ }
106
+ case 0xa: { // array
107
+ const arr = [];
108
+ for (let i = 0; i < size; i++) {
109
+ const ref = readSizedInt(view, offset + i * objectRefSize, objectRefSize);
110
+ arr.push(parseObject(ref));
111
+ }
112
+ return arr;
113
+ }
114
+ case 0xd: { // dict
115
+ const dict = {};
116
+ for (let i = 0; i < size; i++) {
117
+ const keyRef = readSizedInt(view, offset + i * objectRefSize, objectRefSize);
118
+ const valRef = readSizedInt(view, offset + (size + i) * objectRefSize, objectRefSize);
119
+ const key = parseObject(keyRef);
120
+ dict[key] = parseObject(valRef);
121
+ }
122
+ return dict;
123
+ }
124
+ default:
125
+ throw new Error(`Unknown object type: 0x${type.toString(16)}`);
126
+ }
127
+ }
128
+ return parseObject(topObject);
129
+ }
130
+ //# sourceMappingURL=parse-binary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-binary.js","sourceRoot":"","sources":["../src/parse-binary.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { PlistValue } from './parse.js';
2
+ /**
3
+ * Parses an OpenStep/ASCII plist string into a PlistValue.
4
+ */
5
+ export declare function parseOpenStep(input: string): PlistValue;
6
+ //# sourceMappingURL=parse-openstep.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-openstep.d.ts","sourceRoot":"","sources":["../src/parse-openstep.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA4L7C;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,CAIvD"}
@@ -0,0 +1,197 @@
1
+ class OpenStepParser {
2
+ input;
3
+ pos;
4
+ constructor(input) {
5
+ this.input = input;
6
+ this.pos = 0;
7
+ }
8
+ skipWhitespaceAndComments() {
9
+ while (this.pos < this.input.length) {
10
+ const ch = this.input[this.pos];
11
+ if (/\s/.test(ch)) {
12
+ this.pos++;
13
+ continue;
14
+ }
15
+ if (ch === '/' &&
16
+ this.pos + 1 < this.input.length &&
17
+ this.input[this.pos + 1] === '*') {
18
+ this.pos += 2;
19
+ const end = this.input.indexOf('*/', this.pos);
20
+ if (end === -1)
21
+ throw new Error('Unterminated block comment');
22
+ this.pos = end + 2;
23
+ continue;
24
+ }
25
+ if (ch === '/' &&
26
+ this.pos + 1 < this.input.length &&
27
+ this.input[this.pos + 1] === '/') {
28
+ this.pos += 2;
29
+ const end = this.input.indexOf('\n', this.pos);
30
+ this.pos = end === -1 ? this.input.length : end + 1;
31
+ continue;
32
+ }
33
+ break;
34
+ }
35
+ }
36
+ parseValue() {
37
+ this.skipWhitespaceAndComments();
38
+ if (this.pos >= this.input.length) {
39
+ throw new Error('Unexpected end of input');
40
+ }
41
+ const ch = this.input[this.pos];
42
+ if (ch === '{')
43
+ return this.parseDict();
44
+ if (ch === '(')
45
+ return this.parseArray();
46
+ if (ch === '<')
47
+ return this.parseData();
48
+ if (ch === '"')
49
+ return this.parseQuotedString();
50
+ return this.parseUnquotedString();
51
+ }
52
+ parseDict() {
53
+ this.pos++; // skip {
54
+ const obj = {};
55
+ while (true) {
56
+ this.skipWhitespaceAndComments();
57
+ if (this.pos >= this.input.length)
58
+ throw new Error('Unterminated dictionary');
59
+ if (this.input[this.pos] === '}') {
60
+ this.pos++;
61
+ return obj;
62
+ }
63
+ const key = this.parseValue();
64
+ this.skipWhitespaceAndComments();
65
+ if (this.pos >= this.input.length || this.input[this.pos] !== '=')
66
+ throw new Error(`Expected '=' after key "${key}" at position ${this.pos}`);
67
+ this.pos++; // skip =
68
+ const value = this.parseValue();
69
+ obj[key] = value;
70
+ this.skipWhitespaceAndComments();
71
+ if (this.pos < this.input.length && this.input[this.pos] === ';') {
72
+ this.pos++;
73
+ }
74
+ }
75
+ }
76
+ parseArray() {
77
+ this.pos++; // skip (
78
+ const arr = [];
79
+ this.skipWhitespaceAndComments();
80
+ if (this.pos < this.input.length && this.input[this.pos] === ')') {
81
+ this.pos++;
82
+ return arr;
83
+ }
84
+ while (true) {
85
+ arr.push(this.parseValue());
86
+ this.skipWhitespaceAndComments();
87
+ if (this.pos >= this.input.length)
88
+ throw new Error('Unterminated array');
89
+ if (this.input[this.pos] === ')') {
90
+ this.pos++;
91
+ return arr;
92
+ }
93
+ if (this.input[this.pos] === ',') {
94
+ this.pos++;
95
+ // Allow trailing comma before )
96
+ this.skipWhitespaceAndComments();
97
+ if (this.pos < this.input.length && this.input[this.pos] === ')') {
98
+ this.pos++;
99
+ return arr;
100
+ }
101
+ }
102
+ else {
103
+ throw new Error(`Expected ',' or ')' in array at position ${this.pos}`);
104
+ }
105
+ }
106
+ }
107
+ parseData() {
108
+ this.pos++; // skip <
109
+ let hex = '';
110
+ while (this.pos < this.input.length) {
111
+ const ch = this.input[this.pos];
112
+ if (ch === '>') {
113
+ this.pos++;
114
+ // Parse hex pairs
115
+ const clean = hex.replace(/\s+/g, '');
116
+ const bytes = new Uint8Array(clean.length / 2);
117
+ for (let i = 0; i < clean.length; i += 2) {
118
+ bytes[i / 2] = parseInt(clean.substring(i, i + 2), 16);
119
+ }
120
+ return bytes;
121
+ }
122
+ hex += ch;
123
+ this.pos++;
124
+ }
125
+ throw new Error('Unterminated data');
126
+ }
127
+ parseQuotedString() {
128
+ this.pos++; // skip opening "
129
+ let result = '';
130
+ while (this.pos < this.input.length) {
131
+ const ch = this.input[this.pos];
132
+ if (ch === '\\') {
133
+ this.pos++;
134
+ if (this.pos >= this.input.length)
135
+ throw new Error('Unterminated string escape');
136
+ const esc = this.input[this.pos];
137
+ switch (esc) {
138
+ case '"':
139
+ result += '"';
140
+ break;
141
+ case '\\':
142
+ result += '\\';
143
+ break;
144
+ case 'n':
145
+ result += '\n';
146
+ break;
147
+ case 't':
148
+ result += '\t';
149
+ break;
150
+ case 'r':
151
+ result += '\r';
152
+ break;
153
+ case '0':
154
+ result += '\0';
155
+ break;
156
+ default:
157
+ result += esc;
158
+ break;
159
+ }
160
+ this.pos++;
161
+ continue;
162
+ }
163
+ if (ch === '"') {
164
+ this.pos++;
165
+ return result;
166
+ }
167
+ result += ch;
168
+ this.pos++;
169
+ }
170
+ throw new Error('Unterminated string');
171
+ }
172
+ parseUnquotedString() {
173
+ const start = this.pos;
174
+ while (this.pos < this.input.length) {
175
+ const ch = this.input[this.pos];
176
+ if (/[a-zA-Z0-9._\/$:-]/.test(ch)) {
177
+ this.pos++;
178
+ }
179
+ else {
180
+ break;
181
+ }
182
+ }
183
+ if (this.pos === start) {
184
+ throw new Error(`Unexpected character '${this.input[this.pos]}' at position ${this.pos}`);
185
+ }
186
+ return this.input.substring(start, this.pos);
187
+ }
188
+ }
189
+ /**
190
+ * Parses an OpenStep/ASCII plist string into a PlistValue.
191
+ */
192
+ export function parseOpenStep(input) {
193
+ const parser = new OpenStepParser(input);
194
+ const value = parser.parseValue();
195
+ return value;
196
+ }
197
+ //# sourceMappingURL=parse-openstep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-openstep.js","sourceRoot":"","sources":["../src/parse-openstep.ts"],"names":[],"mappings":"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"}