@plist/openstep.serialize
Version:
TypeScript library for serializing OpenStep/NEXTStep Property Lists, in browser and node.js.
66 lines (65 loc) • 2.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.serialize = void 0;
const UNQUOTED_STRING_REGEX = /^[A-Za-z0-9_.-]+$/;
const escapeString = (string) => JSON.stringify(string)
.slice(1, -1)
.replace(/[^\x20-\x7F]/g, x => '\\u' + x.codePointAt(0).toString(16).padStart(4, '0'));
const pad = (n) => {
return n < 10 ? '0' + n : n;
};
const ISODateString = (d) => {
return (d.getUTCFullYear() +
'-' +
pad(d.getUTCMonth() + 1) +
'-' +
pad(d.getUTCDate()) +
'T' +
pad(d.getUTCHours()) +
':' +
pad(d.getUTCMinutes()) +
':' +
pad(d.getUTCSeconds()) +
'Z');
};
const serialize = (value) => {
if (value === null) {
throw new Error('Unsupported null value');
}
switch (typeof value) {
case 'string':
if (UNQUOTED_STRING_REGEX.test(value)) {
return value;
}
else {
return `"${escapeString(value)}"`;
}
case 'bigint':
case 'number':
return value.toString();
case 'boolean':
return value ? '1' : '0';
case 'object':
if (Array.isArray(value)) {
return `(${value.map(exports.serialize).join(',')})`;
}
else if (value instanceof Date) {
return ISODateString(value);
}
else if (value instanceof ArrayBuffer) {
return `<${new Uint8Array(value).reduce((str, byte) => {
return str + byte.toString(16).padStart(2, '0');
}, '')}>`;
}
else {
if (Object.keys(value).length === 0) {
return '{}';
}
return `{${Object.keys(value)
.map(key => `${(0, exports.serialize)(key)}=${(0, exports.serialize)(value[key])}`)
.join(';')};}`;
}
}
throw new Error(`Unsupported value type ${typeof value}`);
};
exports.serialize = serialize;