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.
- package/README.md +180 -110
- 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 +30 -12
- package/.github/workflows/ci.yml +0 -24
- package/.jshintrc +0 -4
- package/History.md +0 -201
- package/Makefile +0 -75
- package/dist/plist-build.js +0 -5348
- package/dist/plist-parse.js +0 -10709
- package/dist/plist.js +0 -15918
- package/examples/browser/index.html +0 -14
- package/index.js +0 -13
- package/lib/build.js +0 -143
- package/lib/parse.js +0 -208
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type PlistValue = string | number | boolean | Date | Uint8Array | PlistValue[] | {
|
|
2
|
+
[key: string]: PlistValue;
|
|
3
|
+
} | null;
|
|
4
|
+
/**
|
|
5
|
+
* Parses a Plist XML string. Returns an Object.
|
|
6
|
+
*
|
|
7
|
+
* @param xml - the XML String to decode
|
|
8
|
+
* @returns the decoded value from the Plist XML
|
|
9
|
+
*/
|
|
10
|
+
export declare function parse(xml: string | Uint8Array | ArrayBuffer): PlistValue;
|
|
11
|
+
//# sourceMappingURL=parse.browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.browser.d.ts","sourceRoot":"","sources":["../src/parse.browser.ts"],"names":[],"mappings":"AAoDA,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,UAAU,GACV,UAAU,EAAE,GACZ;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,GAC7B,IAAI,CAAC;AAET;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAuCxE"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { parseBinary } from './parse-binary.js';
|
|
2
|
+
import { parseOpenStep } from './parse-openstep.js';
|
|
3
|
+
/**
|
|
4
|
+
* Decode a base64 string into a Uint8Array.
|
|
5
|
+
*/
|
|
6
|
+
function base64ToUint8Array(base64) {
|
|
7
|
+
const binary = atob(base64);
|
|
8
|
+
const bytes = new Uint8Array(binary.length);
|
|
9
|
+
for (let i = 0; i < binary.length; i++) {
|
|
10
|
+
bytes[i] = binary.charCodeAt(i);
|
|
11
|
+
}
|
|
12
|
+
return bytes;
|
|
13
|
+
}
|
|
14
|
+
const TEXT_NODE = 3;
|
|
15
|
+
const CDATA_NODE = 4;
|
|
16
|
+
const COMMENT_NODE = 8;
|
|
17
|
+
/**
|
|
18
|
+
* We ignore raw text (usually whitespace), <!-- xml comments -->,
|
|
19
|
+
* and raw CDATA nodes.
|
|
20
|
+
*/
|
|
21
|
+
function shouldIgnoreNode(node) {
|
|
22
|
+
return (node.nodeType === TEXT_NODE ||
|
|
23
|
+
node.nodeType === COMMENT_NODE ||
|
|
24
|
+
node.nodeType === CDATA_NODE);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if the node is empty. Some plist file has such node:
|
|
28
|
+
* <key />
|
|
29
|
+
* this node should be ignored.
|
|
30
|
+
*
|
|
31
|
+
* @see https://github.com/TooTallNate/plist.js/issues/66
|
|
32
|
+
*/
|
|
33
|
+
function isEmptyNode(node) {
|
|
34
|
+
if (!node.childNodes || node.childNodes.length === 0) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function invariant(test, message) {
|
|
42
|
+
if (!test) {
|
|
43
|
+
throw new Error(message);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Parses a Plist XML string. Returns an Object.
|
|
48
|
+
*
|
|
49
|
+
* @param xml - the XML String to decode
|
|
50
|
+
* @returns the decoded value from the Plist XML
|
|
51
|
+
*/
|
|
52
|
+
export function parse(xml) {
|
|
53
|
+
// Handle binary plist input
|
|
54
|
+
if (xml instanceof ArrayBuffer) {
|
|
55
|
+
return parseBinary(new Uint8Array(xml));
|
|
56
|
+
}
|
|
57
|
+
if (xml instanceof Uint8Array) {
|
|
58
|
+
return parseBinary(xml);
|
|
59
|
+
}
|
|
60
|
+
if (typeof xml === 'string' && xml.startsWith('bplist')) {
|
|
61
|
+
const encoder = new TextEncoder();
|
|
62
|
+
return parseBinary(encoder.encode(xml));
|
|
63
|
+
}
|
|
64
|
+
// Detect OpenStep/ASCII plist format
|
|
65
|
+
if (typeof xml === 'string') {
|
|
66
|
+
const trimmed = xml.trimStart();
|
|
67
|
+
if ((trimmed[0] === '{' || trimmed[0] === '(') &&
|
|
68
|
+
!trimmed.startsWith('<?xml') &&
|
|
69
|
+
!trimmed.startsWith('<!DOCTYPE') &&
|
|
70
|
+
!trimmed.startsWith('<plist')) {
|
|
71
|
+
return parseOpenStep(xml);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const doc = new DOMParser().parseFromString(xml, "text/xml");
|
|
75
|
+
const root = doc.documentElement;
|
|
76
|
+
invariant(root !== null && root.nodeName === "plist", "malformed document. First element should be <plist>");
|
|
77
|
+
let plist = parsePlistXML(root);
|
|
78
|
+
// the root <plist> node gets interpreted as an Array,
|
|
79
|
+
// so pull out the inner data first
|
|
80
|
+
if (Array.isArray(plist) && plist.length == 1)
|
|
81
|
+
plist = plist[0];
|
|
82
|
+
return plist;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Convert an XML based plist document into a JSON representation.
|
|
86
|
+
*/
|
|
87
|
+
function parsePlistXML(node) {
|
|
88
|
+
if (!node)
|
|
89
|
+
return null;
|
|
90
|
+
if (node.nodeName === "plist") {
|
|
91
|
+
const new_arr = [];
|
|
92
|
+
if (isEmptyNode(node)) {
|
|
93
|
+
return new_arr;
|
|
94
|
+
}
|
|
95
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
96
|
+
if (!shouldIgnoreNode(node.childNodes[i])) {
|
|
97
|
+
new_arr.push(parsePlistXML(node.childNodes[i]));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return new_arr;
|
|
101
|
+
}
|
|
102
|
+
else if (node.nodeName === "dict") {
|
|
103
|
+
const new_obj = {};
|
|
104
|
+
let key = null;
|
|
105
|
+
let counter = 0;
|
|
106
|
+
if (isEmptyNode(node)) {
|
|
107
|
+
return new_obj;
|
|
108
|
+
}
|
|
109
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
110
|
+
if (shouldIgnoreNode(node.childNodes[i]))
|
|
111
|
+
continue;
|
|
112
|
+
if (counter % 2 === 0) {
|
|
113
|
+
invariant(node.childNodes[i].nodeName === "key", "Missing key while parsing <dict/>.");
|
|
114
|
+
key = parsePlistXML(node.childNodes[i]);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
invariant(node.childNodes[i].nodeName !== "key", "Unexpected <key> while parsing <dict/>. Keys and values must alternate.");
|
|
118
|
+
new_obj[key] = parsePlistXML(node.childNodes[i]);
|
|
119
|
+
}
|
|
120
|
+
counter += 1;
|
|
121
|
+
}
|
|
122
|
+
if (counter % 2 === 1) {
|
|
123
|
+
new_obj[key] = "";
|
|
124
|
+
}
|
|
125
|
+
return new_obj;
|
|
126
|
+
}
|
|
127
|
+
else if (node.nodeName === "array") {
|
|
128
|
+
const new_arr = [];
|
|
129
|
+
if (isEmptyNode(node)) {
|
|
130
|
+
return new_arr;
|
|
131
|
+
}
|
|
132
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
133
|
+
if (!shouldIgnoreNode(node.childNodes[i])) {
|
|
134
|
+
const res = parsePlistXML(node.childNodes[i]);
|
|
135
|
+
if (null != res)
|
|
136
|
+
new_arr.push(res);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
return new_arr;
|
|
140
|
+
}
|
|
141
|
+
else if (node.nodeName === "#text") {
|
|
142
|
+
// TODO: what should we do with text types? (CDATA sections)
|
|
143
|
+
}
|
|
144
|
+
else if (node.nodeName === "key") {
|
|
145
|
+
if (isEmptyNode(node)) {
|
|
146
|
+
return "";
|
|
147
|
+
}
|
|
148
|
+
invariant(node.childNodes[0].nodeValue !== "__proto__", "__proto__ keys can lead to prototype pollution. More details on CVE-2022-22912");
|
|
149
|
+
return node.childNodes[0].nodeValue;
|
|
150
|
+
}
|
|
151
|
+
else if (node.nodeName === "string") {
|
|
152
|
+
let res = "";
|
|
153
|
+
if (isEmptyNode(node)) {
|
|
154
|
+
return res;
|
|
155
|
+
}
|
|
156
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
157
|
+
const type = node.childNodes[i].nodeType;
|
|
158
|
+
if (type === TEXT_NODE || type === CDATA_NODE) {
|
|
159
|
+
res += node.childNodes[i].nodeValue;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return res;
|
|
163
|
+
}
|
|
164
|
+
else if (node.nodeName === "integer") {
|
|
165
|
+
invariant(!isEmptyNode(node), 'Cannot parse "" as integer.');
|
|
166
|
+
return parseInt(node.childNodes[0].nodeValue, 10);
|
|
167
|
+
}
|
|
168
|
+
else if (node.nodeName === "real") {
|
|
169
|
+
invariant(!isEmptyNode(node), 'Cannot parse "" as real.');
|
|
170
|
+
let res = "";
|
|
171
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
172
|
+
if (node.childNodes[i].nodeType === TEXT_NODE) {
|
|
173
|
+
res += node.childNodes[i].nodeValue;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return parseFloat(res);
|
|
177
|
+
}
|
|
178
|
+
else if (node.nodeName === "data") {
|
|
179
|
+
let res = "";
|
|
180
|
+
if (isEmptyNode(node)) {
|
|
181
|
+
return base64ToUint8Array(res);
|
|
182
|
+
}
|
|
183
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
184
|
+
if (node.childNodes[i].nodeType === TEXT_NODE) {
|
|
185
|
+
res += node.childNodes[i].nodeValue.replace(/\s+/g, "");
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return base64ToUint8Array(res);
|
|
189
|
+
}
|
|
190
|
+
else if (node.nodeName === "date") {
|
|
191
|
+
invariant(!isEmptyNode(node), 'Cannot parse "" as Date.');
|
|
192
|
+
return new Date(node.childNodes[0].nodeValue);
|
|
193
|
+
}
|
|
194
|
+
else if (node.nodeName === "null") {
|
|
195
|
+
return null;
|
|
196
|
+
}
|
|
197
|
+
else if (node.nodeName === "true") {
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
else if (node.nodeName === "false") {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
else {
|
|
204
|
+
throw new Error("Invalid PLIST tag " + node.nodeName);
|
|
205
|
+
}
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=parse.browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.browser.js","sourceRoot":"","sources":["../src/parse.browser.ts"],"names":[],"mappings":"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"}
|
package/dist/parse.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type PlistValue = string | number | boolean | Date | Uint8Array | PlistValue[] | {
|
|
2
|
+
[key: string]: PlistValue;
|
|
3
|
+
} | null;
|
|
4
|
+
/**
|
|
5
|
+
* Parses a Plist XML string. Returns an Object.
|
|
6
|
+
*
|
|
7
|
+
* @param xml - the XML String to decode
|
|
8
|
+
* @returns the decoded value from the Plist XML
|
|
9
|
+
*/
|
|
10
|
+
export declare function parse(xml: string | Uint8Array | ArrayBuffer): PlistValue;
|
|
11
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAqDA,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,UAAU,GACV,UAAU,EAAE,GACZ;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,GAC7B,IAAI,CAAC;AAET;;;;;GAKG;AACH,wBAAgB,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAuCxE"}
|
package/dist/parse.js
ADDED
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { DOMParser } from '@xmldom/xmldom';
|
|
2
|
+
import { parseBinary } from './parse-binary.js';
|
|
3
|
+
import { parseOpenStep } from './parse-openstep.js';
|
|
4
|
+
/**
|
|
5
|
+
* Decode a base64 string into a Uint8Array.
|
|
6
|
+
*/
|
|
7
|
+
function base64ToUint8Array(base64) {
|
|
8
|
+
const binary = atob(base64);
|
|
9
|
+
const bytes = new Uint8Array(binary.length);
|
|
10
|
+
for (let i = 0; i < binary.length; i++) {
|
|
11
|
+
bytes[i] = binary.charCodeAt(i);
|
|
12
|
+
}
|
|
13
|
+
return bytes;
|
|
14
|
+
}
|
|
15
|
+
const TEXT_NODE = 3;
|
|
16
|
+
const CDATA_NODE = 4;
|
|
17
|
+
const COMMENT_NODE = 8;
|
|
18
|
+
/**
|
|
19
|
+
* We ignore raw text (usually whitespace), <!-- xml comments -->,
|
|
20
|
+
* and raw CDATA nodes.
|
|
21
|
+
*/
|
|
22
|
+
function shouldIgnoreNode(node) {
|
|
23
|
+
return (node.nodeType === TEXT_NODE ||
|
|
24
|
+
node.nodeType === COMMENT_NODE ||
|
|
25
|
+
node.nodeType === CDATA_NODE);
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Check if the node is empty. Some plist file has such node:
|
|
29
|
+
* <key />
|
|
30
|
+
* this node should be ignored.
|
|
31
|
+
*
|
|
32
|
+
* @see https://github.com/TooTallNate/plist.js/issues/66
|
|
33
|
+
*/
|
|
34
|
+
function isEmptyNode(node) {
|
|
35
|
+
if (!node.childNodes || node.childNodes.length === 0) {
|
|
36
|
+
return true;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function invariant(test, message) {
|
|
43
|
+
if (!test) {
|
|
44
|
+
throw new Error(message);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Parses a Plist XML string. Returns an Object.
|
|
49
|
+
*
|
|
50
|
+
* @param xml - the XML String to decode
|
|
51
|
+
* @returns the decoded value from the Plist XML
|
|
52
|
+
*/
|
|
53
|
+
export function parse(xml) {
|
|
54
|
+
// Handle binary plist input
|
|
55
|
+
if (xml instanceof ArrayBuffer) {
|
|
56
|
+
return parseBinary(new Uint8Array(xml));
|
|
57
|
+
}
|
|
58
|
+
if (xml instanceof Uint8Array) {
|
|
59
|
+
return parseBinary(xml);
|
|
60
|
+
}
|
|
61
|
+
if (typeof xml === 'string' && xml.startsWith('bplist')) {
|
|
62
|
+
const encoder = new TextEncoder();
|
|
63
|
+
return parseBinary(encoder.encode(xml));
|
|
64
|
+
}
|
|
65
|
+
// Detect OpenStep/ASCII plist format
|
|
66
|
+
if (typeof xml === 'string') {
|
|
67
|
+
const trimmed = xml.trimStart();
|
|
68
|
+
if ((trimmed[0] === '{' || trimmed[0] === '(') &&
|
|
69
|
+
!trimmed.startsWith('<?xml') &&
|
|
70
|
+
!trimmed.startsWith('<!DOCTYPE') &&
|
|
71
|
+
!trimmed.startsWith('<plist')) {
|
|
72
|
+
return parseOpenStep(xml);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const doc = new DOMParser().parseFromString(xml, "text/xml");
|
|
76
|
+
const root = doc.documentElement;
|
|
77
|
+
invariant(root !== null && root.nodeName === "plist", "malformed document. First element should be <plist>");
|
|
78
|
+
let plist = parsePlistXML(root);
|
|
79
|
+
// the root <plist> node gets interpreted as an Array,
|
|
80
|
+
// so pull out the inner data first
|
|
81
|
+
if (Array.isArray(plist) && plist.length == 1)
|
|
82
|
+
plist = plist[0];
|
|
83
|
+
return plist;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Convert an XML based plist document into a JSON representation.
|
|
87
|
+
*/
|
|
88
|
+
function parsePlistXML(node) {
|
|
89
|
+
if (!node)
|
|
90
|
+
return null;
|
|
91
|
+
if (node.nodeName === "plist") {
|
|
92
|
+
const new_arr = [];
|
|
93
|
+
if (isEmptyNode(node)) {
|
|
94
|
+
return new_arr;
|
|
95
|
+
}
|
|
96
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
97
|
+
if (!shouldIgnoreNode(node.childNodes[i])) {
|
|
98
|
+
new_arr.push(parsePlistXML(node.childNodes[i]));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return new_arr;
|
|
102
|
+
}
|
|
103
|
+
else if (node.nodeName === "dict") {
|
|
104
|
+
const new_obj = {};
|
|
105
|
+
let key = null;
|
|
106
|
+
let counter = 0;
|
|
107
|
+
if (isEmptyNode(node)) {
|
|
108
|
+
return new_obj;
|
|
109
|
+
}
|
|
110
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
111
|
+
if (shouldIgnoreNode(node.childNodes[i]))
|
|
112
|
+
continue;
|
|
113
|
+
if (counter % 2 === 0) {
|
|
114
|
+
invariant(node.childNodes[i].nodeName === "key", "Missing key while parsing <dict/>.");
|
|
115
|
+
key = parsePlistXML(node.childNodes[i]);
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
invariant(node.childNodes[i].nodeName !== "key", "Unexpected <key> while parsing <dict/>. Keys and values must alternate.");
|
|
119
|
+
new_obj[key] = parsePlistXML(node.childNodes[i]);
|
|
120
|
+
}
|
|
121
|
+
counter += 1;
|
|
122
|
+
}
|
|
123
|
+
if (counter % 2 === 1) {
|
|
124
|
+
new_obj[key] = "";
|
|
125
|
+
}
|
|
126
|
+
return new_obj;
|
|
127
|
+
}
|
|
128
|
+
else if (node.nodeName === "array") {
|
|
129
|
+
const new_arr = [];
|
|
130
|
+
if (isEmptyNode(node)) {
|
|
131
|
+
return new_arr;
|
|
132
|
+
}
|
|
133
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
134
|
+
if (!shouldIgnoreNode(node.childNodes[i])) {
|
|
135
|
+
const res = parsePlistXML(node.childNodes[i]);
|
|
136
|
+
if (null != res)
|
|
137
|
+
new_arr.push(res);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
return new_arr;
|
|
141
|
+
}
|
|
142
|
+
else if (node.nodeName === "#text") {
|
|
143
|
+
// TODO: what should we do with text types? (CDATA sections)
|
|
144
|
+
}
|
|
145
|
+
else if (node.nodeName === "key") {
|
|
146
|
+
if (isEmptyNode(node)) {
|
|
147
|
+
return "";
|
|
148
|
+
}
|
|
149
|
+
invariant(node.childNodes[0].nodeValue !== "__proto__", "__proto__ keys can lead to prototype pollution. More details on CVE-2022-22912");
|
|
150
|
+
return node.childNodes[0].nodeValue;
|
|
151
|
+
}
|
|
152
|
+
else if (node.nodeName === "string") {
|
|
153
|
+
let res = "";
|
|
154
|
+
if (isEmptyNode(node)) {
|
|
155
|
+
return res;
|
|
156
|
+
}
|
|
157
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
158
|
+
const type = node.childNodes[i].nodeType;
|
|
159
|
+
if (type === TEXT_NODE || type === CDATA_NODE) {
|
|
160
|
+
res += node.childNodes[i].nodeValue;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return res;
|
|
164
|
+
}
|
|
165
|
+
else if (node.nodeName === "integer") {
|
|
166
|
+
invariant(!isEmptyNode(node), 'Cannot parse "" as integer.');
|
|
167
|
+
return parseInt(node.childNodes[0].nodeValue, 10);
|
|
168
|
+
}
|
|
169
|
+
else if (node.nodeName === "real") {
|
|
170
|
+
invariant(!isEmptyNode(node), 'Cannot parse "" as real.');
|
|
171
|
+
let res = "";
|
|
172
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
173
|
+
if (node.childNodes[i].nodeType === TEXT_NODE) {
|
|
174
|
+
res += node.childNodes[i].nodeValue;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return parseFloat(res);
|
|
178
|
+
}
|
|
179
|
+
else if (node.nodeName === "data") {
|
|
180
|
+
let res = "";
|
|
181
|
+
if (isEmptyNode(node)) {
|
|
182
|
+
return base64ToUint8Array(res);
|
|
183
|
+
}
|
|
184
|
+
for (let i = 0; i < node.childNodes.length; i++) {
|
|
185
|
+
if (node.childNodes[i].nodeType === TEXT_NODE) {
|
|
186
|
+
res += node.childNodes[i].nodeValue.replace(/\s+/g, "");
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return base64ToUint8Array(res);
|
|
190
|
+
}
|
|
191
|
+
else if (node.nodeName === "date") {
|
|
192
|
+
invariant(!isEmptyNode(node), 'Cannot parse "" as Date.');
|
|
193
|
+
return new Date(node.childNodes[0].nodeValue);
|
|
194
|
+
}
|
|
195
|
+
else if (node.nodeName === "null") {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
else if (node.nodeName === "true") {
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
else if (node.nodeName === "false") {
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
throw new Error("Invalid PLIST tag " + node.nodeName);
|
|
206
|
+
}
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "plist",
|
|
3
3
|
"description": "Apple's property list parser/builder for Node.js and browsers",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "5.0.0",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"author": "Nathan Rajlich <nathan@tootallnate.net>",
|
|
6
7
|
"contributors": [
|
|
7
8
|
"Hans Huebner <hans.huebner@gmail.com>",
|
|
@@ -12,7 +13,7 @@
|
|
|
12
13
|
],
|
|
13
14
|
"repository": {
|
|
14
15
|
"type": "git",
|
|
15
|
-
"url": "
|
|
16
|
+
"url": "https://github.com/TooTallNate/plist.js.git"
|
|
16
17
|
},
|
|
17
18
|
"license": "MIT",
|
|
18
19
|
"keywords": [
|
|
@@ -23,21 +24,38 @@
|
|
|
23
24
|
"parser",
|
|
24
25
|
"xml"
|
|
25
26
|
],
|
|
26
|
-
"
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"browser": {
|
|
30
|
+
"types": "./dist/index.d.ts",
|
|
31
|
+
"default": "./dist/index.browser.js"
|
|
32
|
+
},
|
|
33
|
+
"import": {
|
|
34
|
+
"types": "./dist/index.d.ts",
|
|
35
|
+
"default": "./dist/index.js"
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"main": "./dist/index.js",
|
|
40
|
+
"types": "./dist/index.d.ts",
|
|
41
|
+
"files": [
|
|
42
|
+
"dist"
|
|
43
|
+
],
|
|
27
44
|
"dependencies": {
|
|
28
45
|
"@xmldom/xmldom": "^0.9.10",
|
|
29
|
-
"base64-js": "^1.5.1",
|
|
30
46
|
"xmlbuilder": "^15.1.1"
|
|
31
47
|
},
|
|
32
48
|
"devDependencies": {
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
},
|
|
37
|
-
"scripts": {
|
|
38
|
-
"test": "make test"
|
|
49
|
+
"@changesets/cli": "^2.29.4",
|
|
50
|
+
"typescript": "^5.8.3",
|
|
51
|
+
"vitest": "^3.1.3"
|
|
39
52
|
},
|
|
40
53
|
"engines": {
|
|
41
|
-
"node": ">=
|
|
54
|
+
"node": ">=18"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "tsc",
|
|
58
|
+
"test": "vitest run",
|
|
59
|
+
"ci:publish": "pnpm publish --provenance --access public && pnpm changeset tag"
|
|
42
60
|
}
|
|
43
|
-
}
|
|
61
|
+
}
|
package/.github/workflows/ci.yml
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
name: ci
|
|
2
|
-
|
|
3
|
-
on:
|
|
4
|
-
push:
|
|
5
|
-
pull_request:
|
|
6
|
-
|
|
7
|
-
jobs:
|
|
8
|
-
build:
|
|
9
|
-
runs-on: ubuntu-latest
|
|
10
|
-
|
|
11
|
-
strategy:
|
|
12
|
-
matrix:
|
|
13
|
-
node-version: [ '14', '16', '18' ]
|
|
14
|
-
|
|
15
|
-
steps:
|
|
16
|
-
- uses: actions/checkout@v2
|
|
17
|
-
|
|
18
|
-
- name: Use Node.js ${{ matrix.node-version }}
|
|
19
|
-
uses: actions/setup-node@v1
|
|
20
|
-
with:
|
|
21
|
-
node-version: ${{ matrix.node-version }}
|
|
22
|
-
|
|
23
|
-
- run: npm install
|
|
24
|
-
- run: npm test
|
package/.jshintrc
DELETED